Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Manufacturing Technology >> Processo de manufatura

Temporizador de cozinha Arduino

Componentes e suprimentos

Arduino UNO
× 1
Adafruit LCD padrão - 16x2 branco em azul
× 1
SparkFun Botão de pressão 12 mm
× 4
Resistor 10k ohm
× 4
Resistor 221 ohm
Bem, 220 ohm ...
× 2
Potenciômetro de volta única - 100k ohms
× 1
Buzzer
× 1
Breadboard (genérico)
× 1
Fios de jumpers (genérico)
× 1

Sobre este projeto


No princípio, Deus criou o céu e a terra. E seres humanos. E os seres humanos criaram cronômetros digitais de cozinha, como este.

E os seres humanos diziam:Legal, mas um pouco sombrio. Vamos fazer um melhor!

E Deus disse:Eu ouvi o seu chamado, que haja Arduinos:e havia Arduinos por toda a terra, e isso era bom.

E os seres humanos pegaram um Arduino e criaram um cronômetro de cozinha melhor, como este.

E Deus viu o novo cronômetro de cozinha e disse:eu vi seu novo cronômetro de cozinha e parece horrível , mas parece muito divertido ! E isso é bom . :-)





O que você precisa ter


Agora que você sabe de onde veio tudo isso, vamos aprofundar.

Todos os componentes que usei vieram do Arduino Starter Kit , incluindo a pequena placa de ensaio que você vê nas fotos e no vídeo. Sinta-se à vontade para acomodar o projeto em um maior , se você desejar.

Você também precisará de uma fonte de alimentação:durante as brincadeiras, a porta e o cabo USB do PC serão suficientes.





O que você precisa fazer


Primeiro:reúna todos os componentes necessários do Starter Kit ou de sua caixa de componentes preferida; se você não tiver um, não entre em pânico. Há muitos na internet. Você pode encontrar a lista de componentes abaixo.

E, bem, você também precisará do código. Está em sua caixa, embaixo novamente.





Como funciona


Basicamente, como qualquer outro dispositivo semelhante, você pode comprar por um dólar em qualquer loja perto de você. Mas isso é seu . E isso mostrará a você como esses pequenos aparelhos realmente funcionam.

A palavra-chave aqui é: modo atual . O próprio cronômetro pode ser executado em apenas um dos quatro modos de cada vez:
  • IDLE - o cronômetro está aguardando sua entrada, mostrando o tempo atualmente definido; este também é o modo inicial após ligar ou reiniciar.
  • CONFIGURAÇÃO - você pode entrar neste modo pressionando longamente S4 (no código também é chamado de "botão de reinicialização"); aqui, usando o S3 ("botão start stop"), você pode escolher qual valor alterar para definir o tempo decorrido a ser contado posteriormente; finalmente, usando S2 ("botão para baixo") e S1 ("botão para cima") respectivamente, você pode diminuir ou aumentar o valor escolhido (horas, minutos ou segundos).
  • RUNNING - Você pode entrar neste modo pressionando S3, mas sair exigirá S3 ou S4 (que o levará para o modo IDLE).
  • TOQUE - Quando o tempo desejado é decorrido, este modo é ativado automaticamente; você pode deixar (ou seja, fazer o garotinho parar de tocar) pressionando qualquer botão.





O código


Primeiro, precisamos incluir as bibliotecas adequadas:
  #include  
#include

Se ainda não os tiver, você precisará fazer o download e instalá-los:
  • Paul Stoffregen's Tempo Biblioteca (faça download do ZIP no botão verde "Clonar ou baixar")
  • Biblioteca Arduino LiquidCrystal

A seguir, vamos inicializar aquele módulo de LCD legal:
  LiquidCrystal lcd (12, 11, 5, 4, 3, 2);  

Fique à vontade para embaralhar os pinos à sua vontade para obter um belo layout de fiação:não me siga nisto, porque eu fiz um péssimo plano de fiação! :D Por exemplo, você pode inverter os últimos quatro pinos na declaração acima para evitar que os fios amarelos se cruzem como você pode ver no esquema abaixo (obviamente, você terá que ajustar as constantes dos pinos do botão de acordo, veja abaixo). Jogue, divirta-se! A vida com Arduinos começa logo depois desse copiar / colar!

As próximas 51 linhas de código contêm a declaração e inicialização das variáveis ​​estáticas. Fique à vontade para navegar por eles, seus nomes claros e alguns comentários esparsos irão guiá-lo na compreensão de tudo.

A função setup () executa as etapas preliminares usuais que você viu zilhões de vezes em qualquer esboço do Arduino por aí e até agora. A única declaração notável é a primeira, que definirá a posição inicial do cursor da tela LCD. Pois, sim:este módulo requer que você configure uma posição ao longo de suas linhas e colunas e, em seguida, "imprima" algo, que aparecerá a partir dessa posição.

Agora vamos passar para a função loop ().

Em primeiro lugar, vamos descobrir os status do switch. Para conseguir isso, o seguinte bloco de código é usado para quase cada um deles:
  / * 
* Gerenciamento do botão Iniciar / Parar
* /
startStopButtonPressed =false;
startStopButtonState =digitalRead (startStopButtonPin);
if (startStopButtonState ! =startStopButtonPrevState)
{
startStopButtonPressed =startStopButtonState ==HIGH;
startStopButtonPrevState =startStopButtonState;
}

Um digitalRead é emitido contra o pino relacionado e o resultado é comparado a um valor lido anteriormente:se algo mudou, o novo valor é armazenado para referência futura e a variável estática bool "xxxButtonPressed" é definida como verdadeira se o botão for pressionado.

Olhando para o diagrama de circuito abaixo, você notará que cada pino de entrada é forçado a LOW por um resistor de 10k, a menos que a chave correspondente seja pressionada e o próprio pino esteja diretamente conectado a + 5V. Um cenário bastante clássico, hein?

Anteriormente, eu disse " quase cada um deles "porque há um botão que atua de forma diferente dos outros:S4. Seu bloco de códigos é capaz de detectar o pressionamento longo acima mencionado para entrar no modo SETUP.

Em seguida, vem a chave de bloqueio de gerenciamento de modo:cada caso olha para os gatilhos de estado do botão ("xxxButtonPressed") e redireciona o fluxo para o novo estado adequado ou executa a ação adequada.
  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)
{
// STARTING TIMER!
startTime =now ();
}
}
quebrar;

O trecho de código anterior mostra como o modo IDLE é gerenciado e é bastante autoexplicativo. Outro exemplo mostra como qualquer botão pressionado enquanto toca o interromperá:
  case MODE_RINGING:
if (resetButtonPressed || startStopButtonPressed || downButtonPressed || upButtonPressed)
{
currentMode =MODE_IDLE;
}
break;

Parece fácil, não é? :-) Isto é.

O próximo bloco - "Gerenciamento de tempo" - executa o cálculo da diferença de tempo real, aciona o modo RINGING e realmente toca o zumbido quando é hora de fazer isso.

O último bloco - "gerenciamento de LCD" - gerencia o display LCD para cada modo, imprimindo as sequências apropriadas em seus locais apropriados.

É isso.





Conclua e ação!


Agora que este cachorrinho não tem mais segredos para você, vamos vê-lo em ação. Obrigado por assistir e divirta-se!



Código

  • ArduinoSketch
ArduinoSketch Arduino
 / ********************************************** **** * Arduino Kitchen Timer v1.0 - 2016/01/27 * Por Angelo Fiorillo (Roma, IT) * Este trabalho é distribuído sob a GNU General * Public License versão 3 ou posterior (GPL3 +) * Inclua este crédito observe se você deseja * reutilizar qualquer parte deste esboço. Respeite meu trabalho * assim como farei com o seu. * Sinta-se à vontade para entrar em contato comigo:[email protected] * ************************************* *********** / # include  #include  // FIX 2018-08-12 Esta correção «'agora' não foi declarada neste escopo» 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; // Quantas horas serão contadas regressivamente quando startedint setupMinutes =0; // Quantos minutos serão contados regressivamente quando startedint setupSeconds =0; // Quantos segundos vão contar regressivamente quando startedtime_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; longo resetButtonLongPressCounter =0; int startStopButtonState =LOW; int upButtonState =LOW; int downButtonState =LOW; int resetButtonPrevState =LOW; int startStopButtonPrevState =LOW; int upButtonPrevState =LOW; int downButtonState =LOW; int resetButtonPrevState =LOW; int startStopButtonPrevState =LOW; int upButtonPrevState =redefinirButtonButton; startStopButtonPressed =false; bool upButtonPressed =false; bool downButtonPressed =false; 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 =inativo 1 =configuração 2 =executando 3 =tocando // Ligar -> inativo // Reinicializar -> inativo // Iniciar / Parar -> iniciar ou parar o contador // Subir / Descer -> NOP // Reiniciar (toque longo) -> entrar na configuração // Iniciar / Parar -> selecionar dados // Para cima -> aumentar o valor dos dados atuais // Para baixo -> diminuir o valor dos dados atuais // Reiniciar -> sair da configuração (inativo) int dataSelection =0; // Dados atualmente selecionados para edição (modo de configuração, alterações com Iniciar / Parar) // 0 =horas (00-99) 1 =minutos (00-59) 2 =segundos (00-59) configuração void () {// coloque seu código de configuração aqui, para executar uma vez:lcd.begin (16, 2); pinMode (resetButtonPin, INPUT); pinMode (startStopButtonPin, INPUT); pinMode (upButtonPin, INPUT); pinMode (downButtonPin, INPUT); pinMode (buzzerPin, OUTPUT); Serial.begin (9600);} void loop () {// coloque seu código principal aqui, para executar repetidamente:startStopButtonPressed =false; upButtonPressed =false; downButtonPressed =false; / * * Gerenciamento do botão de redefinição * / resetButtonPressed =false; resetButtonLongPressed =false; resetButtonState =digitalRead (resetButtonPin); if (resetButtonState! =resetButtonPrevState) {resetButtonPressed =resetButtonState ==HIGH; resetButtonPrevState =resetButtonState; } else // Gerenciamento de pressionamento longo ... {if (resetButtonState ==HIGH) {resetButtonLongPressCounter ++; if (resetButtonLongPressCounter ==100) {resetButtonPressed =false; resetButtonLongPressed =true; resetButtonLongPressCounter =0; }} else {resetButtonLongPressCounter =0; resetButtonPressed =false; resetButtonLongPressed =false; }} / * * Gerenciamento do botão Iniciar / Parar * / startStopButtonPressed =false; startStopButtonState =digitalRead (startStopButtonPin); if (startStopButtonState! =startStopButtonPrevState) {startStopButtonPressed =startStopButtonState ==HIGH; startStopButtonPrevState =startStopButtonState; } / * * Gerenciamento do botão para baixo * / downButtonPressed =false; downButtonState =digitalRead (downButtonPin); if (downButtonState! =downButtonPrevState) {downButtonPressed =downButtonState ==HIGH; downButtonPrevState =downButtonState; } / * * Gerenciamento do botão para cima * / upButtonPressed =false; upButtonState =digitalRead (upButtonPin); if (upButtonState! =upButtonPrevState) {upButtonPressed =upButtonState ==HIGH; upButtonPrevState =upButtonState; } / * * Gerenciamento 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) {// STARTING TIMER! startTime =now (); } } pausa; case MODE_SETUP:if (resetButtonPressed) {// Sai do modo de configuração setupTime =setupSeconds + (60 * setupMinutes) + (3600 * setupHours); currentHours =setupHours; currentMinutes =setupMinutes; currentSeconds =setupSeconds; dataSelection =0; currentMode =MODE_IDLE; } if (startStopButtonPressed) {// Selecione os próximos dados para ajustar dataSelection ++; if (dataSelection ==3) {dataSelection =0; }} if (downButtonPressed) {switch (dataSelection) {case 0:// horas setupHours--; if (setupHours ==-1) {setupHours =99; } pausa; case 1:// minutos setupMinutes--; if (setupMinutes ==-1) {setupMinutes =59; } pausa; case 2:// segundos setupSeconds--; if (setupSeconds ==-1) {setupSeconds =59; } pausa; }} if (upButtonPressed) {switch (dataSelection) {case 0:// horas setupHours ++; if (setupHours ==100) {setupHours =0; } pausa; caso 1:// minutos setupMinutes ++; if (setupMinutes ==60) {setupMinutes =0; } pausa; case 2:// segundos setupSeconds ++; if (setupSeconds ==60) {setupSeconds =0; } pausa; } } pausa; case MODE_RUNNING:if (startStopButtonPressed) {currentMode =MODE_IDLE; } if (resetButtonPressed) {Reset (); currentMode =MODE_IDLE; } pausa; case MODE_RINGING:if (resetButtonPressed || startStopButtonPressed || downButtonPressed || upButtonPressed) {currentMode =MODE_IDLE; } pausa; } / * * Gerenciamento de tempo * / switch (currentMode) {case MODE_IDLE:case MODE_SETUP:// NOP break; case MODE_RUNNING:currentTime =setupTime - (now () - startTime); if (currentTime <=0) {currentMode =MODE_RINGING; } pausa; case MODE_RINGING:analogWrite (buzzerPin, 20); atraso (20); analogWrite (buzzerPin, 0); atraso (40); pausa; } / * * Gerenciamento de LCD * / //lcd.clear (); lcd.setCursor (0, 0); switch (currentMode) {case MODE_IDLE:lcd.print ("Timer pronto"); lcd.setCursor (0, 1); lcd.print (currentHours); lcd.print (""); lcd.print (currentMinutes); lcd.print (""); lcd.print (currentSeconds); lcd.print (""); pausa; case MODE_SETUP:lcd.print ("Modo de configuração:"); switch (dataSelection) {case 0:lcd.print ("HRS"); pausa; caso 1:lcd.print ("MINS"); pausa; caso 2:lcd.print ("SECS"); pausa; } lcd.setCursor (0, 1); lcd.print (setupHours); lcd.print (""); lcd.print (setupMinutes); lcd.print (""); lcd.print (setupSeconds); lcd.print (""); pausa; case MODE_RUNNING:lcd.print ("Contagem regressiva ..."); lcd.setCursor (0, 1); if (hour (currentTime) <10) lcd.print ("0"); lcd.print (hora (hora atual)); lcd.print (":"); if (minuto (hora atual) <10) lcd.print ("0"); lcd.print (minuto (hora atual)); lcd.print (":"); if (second (currentTime) <10) lcd.print ("0"); lcd.print (segundo (hora atual)); pausa; case MODE_RINGING:lcd.print ("RING-RING!"); lcd.setCursor (0, 1); lcd.print (""); pausa; } atraso (10);} void Reset () {currentMode =MODE_IDLE; currentHours =setupHours; currentMinutes =setupMinutes; currentSeconds =setupSeconds;} 

Esquemas

Você pode usar qualquer placa de ensaio de uso geral, incluindo o Starter Kit que é menor do que o mostrado aqui (a campainha pode ser colocada sob os fios amarelos, veja o vídeo e as fotos).

Processo de manufatura

  1. Alarme de planta de alerta de sede
  2. DIY Simple 20 kHz Arduino Oscilloscope no Nokia 5110 LCD
  3. Smart Blinds
  4. Word Clock italiano
  5. Cronômetro de contagem regressiva do Arduino
  6. Medidor Sigfox kWh
  7. Monitor de temperatura Bluetooth
  8. Bloqueio controlado por gestos
  9. Uma entrada analógica isolada para Arduino
  10. Meça seu tempo de reação