Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Manufacturing Technology >> Proceso de manufactura

Temporizador de cocina Arduino

Componentes y suministros

Arduino UNO
× 1
LCD estándar Adafruit - 16x2 blanco sobre azul
× 1
Interruptor de botón SparkFun de 12 mm
× 4
Resistencia de 10k ohmios
× 4
Resistencia 221 ohm
Bueno, 220 ohmios ...
× 2
Potenciómetro de una sola vuelta - 100k ohmios
× 1
Buzzer
× 1
Breadboard (genérico)
× 1
Cables de puente (genéricos)
× 1

Acerca de este proyecto

En el principio, Dios creó el cielo y la tierra. Y seres humanos. Y los seres humanos crearon temporizadores de cocina digitales, como este.

Y los seres humanos dijeron:Genial pero un poco lúgubre. ¡Hagamos uno mejor!

Y Dios dijo:Escuché tu llamado, que haya Arduinos:y había Arduinos por toda la tierra, y eso estuvo bien.

Y los seres humanos tomaron un Arduino y crearon un mejor temporizador de cocina, como este.

Y Dios vio el nuevo temporizador de cocina y dijo:Vi tu nuevo temporizador de cocina y se ve horrible , pero parece demasiado divertido ! Y eso es bueno . :-)

Qué necesitas tener

Ahora que sabe de dónde vino todo esto, profundicemos en él.

Todos los componentes que utilicé provienen del Arduino Starter Kit , incluida la pequeña placa que ves en las fotos y en el video. No dudes en adaptar el proyecto a uno más grande , si lo desea.

También necesitará una fuente de alimentación:mientras juega, el puerto USB y el cable de la PC serán suficientes.

Qué debes hacer

Primero:reúna todos los componentes necesarios del Starter Kit o de su contenedor de componentes preferido; si no tiene uno, no se asuste. Hay muchos En Internet. Puede encontrar la lista de componentes a continuación.

Y, bueno, también necesitará el código. Está en su caja, debajo de nuevo.

Cómo funciona

Básicamente, como cualquier otro dispositivo similar, puedes comprarlo por un dólar en cualquier tienda cercana. Pero esto es tuyo . Y esto le mostrará cómo esos pequeños artilugios realmente funcionan.

La palabra clave aquí es: modo actual . El temporizador en sí solo puede funcionar en uno de los cuatro modos a la vez:

  • INACTIVO:el temporizador está esperando su entrada y muestra la cantidad de tiempo establecida actualmente; este es también el modo inicial después de encender o reiniciar.
  • CONFIGURACIÓN:puede ingresar a este modo presionando prolongadamente S4 (en el código, esto también se denomina "botón de reinicio"); aquí, usando S3 ("botón de inicio y parada"), puede elegir qué valor cambiar para configurar el tiempo transcurrido que se contará más tarde; finalmente, usando S2 ("botón abajo") y S1 ("botón arriba") respectivamente, puede disminuir o aumentar el valor elegido (horas, minutos o segundos).
  • EN EJECUCIÓN:puede ingresar a este modo presionando S3, mientras que dejarlo requerirá tanto S3 como S4 (lo que lo llevará al modo IDLE).
  • TIMBRE - Cuando transcurre la cantidad de tiempo deseada, este modo se activa automáticamente; puede dejarlo (es decir, hacer que el niño deje de sonar) presionando cualquier interruptor.

El código

Primero, necesitamos incluir las bibliotecas adecuadas:

  #include  
#include

Si aún no los tiene, deberá descargarlos e instalarlos:

  • Paul Stoffregen's Hora Biblioteca (descargue el ZIP desde el botón verde "Clonar o descargar")
  • Biblioteca Arduino LiquidCrystal

A continuación, inicialicemos ese bonito módulo LCD:

  LiquidCrystal lcd (12, 11, 5, 4, 3, 2);  

Siéntase libre de mezclar los pines a su voluntad para obtener un buen diseño de cableado:¡no me siga en esto, ya que hice un plan de cableado terrible! :D Por ejemplo, puede invertir los últimos cuatro pines en la declaración anterior para evitar que los cables amarillos se crucen como puede ver en el esquema a continuación (obviamente, tendrá que ajustar las constantes de los pines del botón en consecuencia, ver más abajo). ¡Juega, diviértete! ¡La vida con Arduinos comienza justo después de copiar / pegar!

Las siguientes 51 líneas de código contienen la declaración e inicialización de variables estáticas. Siéntase libre de explorarlos, sus nombres claros y algunos comentarios dispersos lo guiarán a comprender todo.

La función setup () lleva a cabo los pasos preliminares habituales que ha visto miles de veces en cualquier boceto de Arduino hasta ahora. La única declaración notable es la primera, que establecerá la posición inicial del cursor de la pantalla LCD. Porque, sí:este módulo requiere que configure una posición a lo largo de sus filas y columnas y luego "imprima" algo, que aparecerá a partir de esa posición.

Ahora pasemos a la función loop ().

En primer lugar, descubramos los estados de los conmutadores. Para lograr esto, el siguiente bloque de código se utiliza para casi cada uno de ellos:

  / * 
* Gestión de botones de inicio / parada
* /
startStopButtonPressed =false;
startStopButtonState =digitalRead (startStopButtonPin);
if (startStopButtonState ! =startStopButtonPrevState)
{
startStopButtonPressed =startStopButtonState ==HIGH;
startStopButtonPrevState =startStopButtonState;
}

Se emite un digitalRead contra el pin relacionado y el resultado se compara con un valor leído previamente:si algo ha cambiado, el nuevo valor se almacena para referencia futura y la variable estática bool "xxxButtonPressed" se establece en verdadera si se presiona el botón.

Si observa el diagrama del circuito a continuación, notará que cada pin de entrada está forzado a BAJO por una resistencia de 10k a menos que se presione el interruptor correspondiente y el pin en sí esté conectado directamente a + 5V. Un escenario bastante clásico, ¿eh?

Anteriormente, dije " casi cada uno de ellos "porque hay un botón que actúa de forma diferente a los demás:S4. Su bloque de código es capaz de detectar la pulsación larga antes mencionada para entrar en el modo SETUP.

Luego viene el cambio de bloque de administración de modo:cada caso mira los disparadores del estado del botón ("xxxButtonPressed") y redirige el flujo hacia el nuevo estado apropiado, o realiza la acción adecuada.

  case MODE_IDLE:
if (resetButtonPressed)
{
Reset ();
}
if (resetButtonLongPressed)
{
currentMode =MODE_SETUP;
}
if (startStopButtonPressed)
{
currentMode =currentMode ==MODE_IDLE? MODE_RUNNING:MODE_IDLE;
if (currentMode ==MODE_RUNNING)
{
// ¡TEMPORIZADOR DE INICIO!
startTime =now ();
}
}
romper;

El fragmento de código anterior muestra cómo se administra el modo IDLE, y es bastante evidente. Otro ejemplo muestra cómo cualquier botón que se presione mientras suena lo detendrá:

  case MODE_RINGING:
if (resetButtonPressed || startStopButtonPressed || downButtonPressed || upButtonPressed)
{
currentMode =MODE_IDLE;
}
break;

Parece fácil, ¿no? :-) Lo es.

El siguiente bloque, "Gestión del tiempo", realiza el cálculo de la diferencia de tiempo real, activa el modo RINGING y, de hecho, suena el rumor cuando llega el momento de hacerlo.

El último bloque, "Gestión de LCD", gestiona la pantalla LCD para cada modo imprimiendo las cadenas adecuadas en sus ubicaciones adecuadas.

Eso es todo.

¡Termina y acción!

Ahora que este cachorrito no tiene más secretos para ti, veámoslo en acción. ¡Gracias por vernos y diviértete!


Código

  • ArduinoSketch
ArduinoSketch Arduino
 / ******************************************** **** * Arduino Kitchen Timer v1.0 - 2016/01/27 * Por Angelo Fiorillo (Roma, IT) * Este trabajo se distribuye bajo GNU General * Public License versión 3 o posterior (GPL3 +) * Incluya este crédito tenga en cuenta si desea * reutilizar cualquier parte de este boceto. Respeta mi trabajo * como yo haré con el tuyo. * No dudes en contactarme:[email protected] * *********************************** *********** / # include  #include  // FIX 2018-08-12 Esto corrige «'ahora' no se declaró en este ámbito» errorLiquidCrystal lcd ( 12, 11, 5, 4, 3, 2); const int buzzerPin =10; const int resetButtonPin =6; const int startStopButtonPin =7; const int downButtonPin =8; const int upButtonPin =9; int setupHours =0; // Cuántas horas contará hacia atrás cuando se inicie en setupMinutes =0; // Cuántos minutos contará hacia atrás cuando se inicie en setupSeconds =0; // ¿Cuántos segundos contará hacia atrás cuando se inicietime_t setupTime =0; int currentHours =0; int currentMinutes =0; int currentSeconds =0; time_t currentTime =0; time_t startTime =0; time_t elapsedTime =0; int resetButtonState =LOW; long resetButtonLongPressCounter =0; int startStopButtonState =LOW; int upButtonState =LOW; int downButtonState =LOW; int resetButtonPrevState =LOW; int startStopButtonPrevState =LOW; int upButtonPrevState =LOWPulse boedButton =reset startStopButtonPressed =falso; bool upButtonPressed =falso; bool downButtonPressed =falso; const int MODE_IDLE =0; const int MODE_SETUP =1; const int MODE_RUNNING =2; const int MODE_RINGING =3; int currentMode =MODE_IDLE; // 0 =inactivo 1 =configuración 2 =en funcionamiento 3 =sonando // Encendido -> inactivo // Restablecer -> inactivo // Inicio / Parada -> iniciar o detener el contador // Arriba / Abajo -> NOP // Restablecer (pulsación larga) -> ingresar a la configuración // Iniciar / Detener -> seleccionar datos // Arriba -> aumentar el valor de los datos actuales // Abajo -> disminuir el valor de los datos actuales // Restablecer -> salir de la configuración (inactivo) int dataSelection =0; // Datos seleccionados actualmente para editar (modo de configuración, cambios con Start / Stop) // 0 =horas (00-99) 1 =minutos (00-59) 2 =segundos (00-59) void setup () {// ponga su código de configuración aquí, para que se ejecute una vez:lcd.begin (16, 2); pinMode (resetButtonPin, ENTRADA); pinMode (startStopButtonPin, INPUT); pinMode (upButtonPin, INPUT); pinMode (downButtonPin, INPUT); pinMode (buzzerPin, SALIDA); Serial.begin (9600);} void loop () {// ponga su código principal aquí, para que se ejecute repetidamente:startStopButtonPressed =false; upButtonPressed =falso; downButtonPressed =falso; / * * Gestión del botón de reinicio * / resetButtonPressed =false; resetButtonLongPressed =falso; resetButtonState =digitalRead (resetButtonPin); if (resetButtonState! =resetButtonPrevState) {resetButtonPressed =resetButtonState ==HIGH; resetButtonPrevState =resetButtonState; } else // Gestión de pulsaciones prolongadas ... {if (resetButtonState ==HIGH) {resetButtonLongPressCounter ++; if (resetButtonLongPressCounter ==100) {resetButtonPressed =falso; resetButtonLongPressed =verdadero; resetButtonLongPressCounter =0; }} else {resetButtonLongPressCounter =0; resetButtonPressed =falso; resetButtonLongPressed =falso; }} / * * Gestión del botón Iniciar / Detener * / startStopButtonPressed =false; startStopButtonState =digitalRead (startStopButtonPin); if (startStopButtonState! =startStopButtonPrevState) {startStopButtonPressed =startStopButtonState ==HIGH; startStopButtonPrevState =startStopButtonState; } / * * Gestión del botón Abajo * / downButtonPressed =false; downButtonState =digitalRead (downButtonPin); if (downButtonState! =downButtonPrevState) {downButtonPressed =downButtonState ==HIGH; downButtonPrevState =downButtonState; } / * * Gestión del botón arriba * / upButtonPressed =false; upButtonState =digitalRead (upButtonPin); if (upButtonState! =upButtonPrevState) {upButtonPressed =upButtonState ==HIGH; upButtonPrevState =upButtonState; } / * * Gestión de modo * / switch (currentMode) {case MODE_IDLE:if (resetButtonPressed) {Reset (); } if (resetButtonLongPressed) {currentMode =MODE_SETUP; } if (startStopButtonPressed) {currentMode =currentMode ==MODE_IDLE? MODE_RUNNING:MODE_IDLE; if (currentMode ==MODE_RUNNING) {// ¡TEMPORIZADOR DE INICIO! startTime =ahora (); } } descanso; case MODE_SETUP:if (resetButtonPressed) {// Salir del modo de configuración setupTime =setupSeconds + (60 * setupMinutes) + (3600 * setupHours); currentHours =setupHours; currentMinutes =setupMinutes; currentSeconds =setupSeconds; dataSelection =0; currentMode =MODE_IDLE; } if (startStopButtonPressed) {// Seleccione los siguientes datos para ajustar dataSelection ++; if (selección de datos ==3) {selección de datos =0; }} if (downButtonPressed) {switch (dataSelection) {case 0:// horas setupHours--; if (setupHours ==-1) {setupHours =99; } descanso; caso 1:// minutos setupMinutes--; if (setupMinutes ==-1) {setupMinutes =59; } descanso; caso 2:// segundos setupSeconds--; if (setupSeconds ==-1) {setupSeconds =59; } descanso; }} if (upButtonPressed) {switch (dataSelection) {case 0:// horas setupHours ++; if (setupHours ==100) {setupHours =0; } descanso; caso 1:// minutos setupMinutes ++; if (setupMinutes ==60) {setupMinutes =0; } descanso; caso 2:// segundos setupSeconds ++; if (setupSeconds ==60) {setupSeconds =0; } descanso; } } descanso; case MODE_RUNNING:if (startStopButtonPressed) {currentMode =MODE_IDLE; } if (resetButtonPressed) {Reset (); currentMode =MODE_IDLE; } descanso; case MODE_RINGING:if (resetButtonPressed || startStopButtonPressed || downButtonPressed || upButtonPressed) {currentMode =MODE_IDLE; } descanso; } / * * Gestión de tiempo * / switch (currentMode) {case MODE_IDLE:case MODE_SETUP:// descanso NOP; case MODE_RUNNING:currentTime =setupTime - (ahora () - startTime); if (currentTime <=0) {currentMode =MODE_RINGING; } descanso; caso MODE_RINGING:analogWrite (buzzerPin, 20); retraso (20); analogWrite (buzzerPin, 0); retraso (40); descanso; } / * * Gestión de LCD * / //lcd.clear (); lcd.setCursor (0, 0); switch (currentMode) {case MODE_IDLE:lcd.print ("Temporizador listo"); lcd.setCursor (0, 1); lcd.print (currentHours); lcd.print (""); lcd.print (currentMinutes); lcd.print (""); lcd.print (currentSeconds); lcd.print (""); descanso; case MODE_SETUP:lcd.print ("Modo de configuración:"); switch (dataSelection) {caso 0:lcd.print ("HRS"); descanso; caso 1:lcd.print ("MINS"); descanso; caso 2:lcd.print ("SECS"); descanso; } lcd.setCursor (0, 1); lcd.print (setupHours); lcd.print (""); lcd.print (setupMinutes); lcd.print (""); lcd.print (setupSeconds); lcd.print (""); descanso; case MODE_RUNNING:lcd.print ("Contando regresivamente ..."); lcd.setCursor (0, 1); if (hora (hora actual) <10) lcd.print ("0"); lcd.print (hora (hora actual)); lcd.print (":"); if (minuto (tiempo actual) <10) lcd.print ("0"); lcd.print (minuto (hora actual)); lcd.print (":"); if (second (currentTime) <10) lcd.print ("0"); lcd.print (segundo (hora actual)); descanso; case MODE_RINGING:lcd.print ("¡RING-RING!"); lcd.setCursor (0, 1); lcd.print (""); descanso; } delay (10);} void Reset () {currentMode =MODE_IDLE; currentHours =setupHours; currentMinutes =setupMinutes; currentSeconds =setupSeconds;} 

Esquemas

Puede usar cualquier tablero de uso general, incluido el Starter Kit, que es más pequeño que el que se muestra aquí (el timbre se puede colocar debajo de los cables amarillos, vea el video y las fotos).

Proceso de manufactura

  1. Alerta de sed Alarma de planta
  2. DIY Osciloscopio Arduino simple de 20 kHz en Nokia 5110 LCD
  3. Persianas inteligentes
  4. Reloj Word en italiano
  5. Temporizador de cuenta atrás de Arduino
  6. Medidor de kWh Sigfox
  7. Monitor de temperatura Bluetooth
  8. Bloqueo controlado por gestos
  9. El IC complementario
  10. Una entrada analógica aislada para Arduino
  11. Mide tu tiempo de reacción