Cronômetro Arduino simples
Componentes e suprimentos
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
Aplicativos e serviços online
|
Sobre este projeto
Estou prestes a fazer um projeto divertido e precisava de um cronômetro Arduino que funcionasse sempre que pressiono um botão. Não é uma coisa complexa, mas achei que esse pedaço de código seria útil para projetos de outras pessoas.
Provavelmente economizei 1h de sua vida codificando.
EEPROM:
Memória do Arduino que não perde sua informação quando você desliga a energia ou reinicializa a placa. (Informação). Estou usando
#include
biblioteca que basicamente faz tudo e já está instalada por padrão.
INTERRUPTS:
Coisas estão acontecendo dentro de nosso Arduino, mas queremos que ele pare de fazer o que estava acontecendo e atenda a nossa função ISR quando algum pino é puxado para ALTO, por exemplo. Nenhuma biblioteca extra necessária aqui:
O código do projeto:
- Define e inclui:
#include #define interruptPin 2 #define eeAddress 0 // ENDEREÇO PARA ARDUINO´S EEPROM (memória interna não volátil) float starttime =0; // Variáveis para fazer a matemática float endtime =0; float resulttime =0, oldresulttime =0;
Nada de novo aqui, incluímos a biblioteca EEPROM, decidimos onde o botão será anexado (pin2).
Então eu decidi que vou usar o endereço 0 de nossa memória EEPROM para armazenar nosso tempo (float =4 bytes). O Arduino UNO tem 1024 bytes (chip ATmega328) mas escolhi o endereço 0 porque estava tentando me organizar para uma vez na vida.
- configuração ()
void setup () {Serial.begin (9600); while (! Serial) {; // aguarde a conexão da porta serial. Necessário apenas para porta USB nativa} Serial.println ("Comunicações seriais prontas, senhor!:.. bip bip"); attachInterrupt (digitalPinToInterrupt (interruptPin), refreshTime, CHANGE);}
Coisas normais, iniciamos comunicações seriais entre o Arduino e nosso PC (9600 bauds):
attachInterrupt (digitalPinToInterrupt (interruptPin), refreshTime, CHANGE);
Attachinterrupt ativa a função quando o nível lógico de interruptPin muda, então:
(____________- AQUI ------------------_ AQUI____________).
Desta forma, ele dispara duas vezes no início de nossa prensagem e no final. Se nada acontecer, nosso valor de interruptPin permanece BAIXO por causa de nosso resistor suspenso "forçando-o" a permanecer baixo.
- loop ()
void loop () {}
Nenhuma coisa. Coloque suas coisas lá!
- Outras funções:
void refreshTime () {if (digitalRead (interruptPin)) {starttime =millis (); Serial.print ("Hora de início:"); Serial.println (hora de início); } else if (digitalRead (interruptPin) ==LOW) {endtime =millis (); resulttime =endtime-starttime; Serial.print ("Hora de término:"); Serial.println (hora de término); Serial.print ("Tempo do resultado:"); Serial.println (resulttime); WhatsNewEeprom (); // armazena eeprom}
Esta é a função que será executada quando ocorrer a interrupção no pin (interruptPin).
A interrupção é acionada toda vez que o status no interruptPin muda (HIGH para LOW ou LOW para HIGH), aqueles se (...) são para detectar se é a mudança HIGH-> LOW ou LOW-> high.
Armazena o tempo registrado pelo relógio interno do Arduino millis () e faz a diferença por ter nosso tempo de resultado pronto. No final, ele armazena novas informações na eeprom:
void WhatsNewEeprom () {Serial.println ("----------- verificar eeprom"); EEPROM.get (eeAddress, oldresulttime); Serial.print ("oldresulttime"); Serial.println (oldresulttime); Serial.print ("resulttime"); Serial.println (resulttime); if (resulttime! =oldresulttime) {EEPROM.put (eeAddress, resulttime); Serial.print ("----- Ding! Novo horário registrado no eeprom:"); Serial.println (resulttime); } else {Serial.println ("Nenhum novo horário encontrado, eeprom não foi perturbado"); }
Este verifica se o valor de tempo armazenado na eeprom é o mesmo que temos em nossa variável "resulttime", se for o caso não o alteramos, então não faça nada.
Extra! Retirando nosso botão:
Nós, humanos, somos extremamente lentos para o tempo de processamento do Arduino, um toque no botão parece rápido para nós, mas para o Arduino é muito lento, o que faz o sinal "saltar" como alternar alto-baixo-alto-baixo-baixo algumas vezes antes de definir o verdadeiro status.
Se quisermos (não quis), podemos consertar por meio de hardware ou software:
- Debounce via software
- Debounce via hardware, use um capacitor !!! :D
Vou apenas adicionar 220nF em paralelo (de sensepin para GND)
O capacitor "come" variação rápida de voltagem.
Código
- cronômetro arduino
cronômetro arduino Arduino
usa eeprom e interrupções, facilmente hackeáveis // codificado por Javier Muñoz 23/10/2017 // perguntas e telegramas isolados para [email protected]#include#define interruptPin 2 # define eeAddress 0 // ENDEREÇO PARA ARDUINO'S EEPROM (memória interna não volátil) float starttime =0; // Variáveis para fazer a matemática float endtime =0; float resulttime =0, oldresulttime =0; void setup () {Serial.begin (9600); while (! Serial) {; // aguarde a conexão da porta serial. Necessário apenas para porta USB nativa} Serial.println ("Comunicações seriais prontas, senhor!:.. bip bip"); attachInterrupt (digitalPinToInterrupt (interruptPin), refreshTime, CHANGE); // ativa a função quando o nível lógico de interruptPin muda, então:(__- HERE ------------------_ HERE____) dessa forma, ele armazena o tempo que nosso dedo pressionou o botão} void loop () {// suas coisas aqui // (eeprom armazenado) da última vez medido em milissegundos "float resulttime"} void refreshTime () {if (digitalRead (interruptPin) ) {hora de início =milis (); Serial.print ("Hora de início:"); Serial.println (hora de início); } else if (digitalRead (interruptPin) ==LOW) {endtime =millis (); resulttime =endtime-starttime; Serial.print ("Hora de término:"); Serial.println (hora de término); Serial.print ("Tempo do resultado:"); Serial.println (tempo de resultado); WhatsNewEeprom (); }} void WhatsNewEeprom () {Serial.println ("----------- verificando eeprom"); EEPROM.get (eeAddress, oldresulttime); Serial.print ("oldresulttime"); Serial.println (oldresulttime); Serial.print ("resulttime"); Serial.println (resulttime); if (resulttime! =oldresulttime) {EEPROM.put (eeAddress, resulttime); Serial.print ("----- Ding! Novo horário registrado no eeprom:"); Serial.println (resulttime); } else {Serial.println ("Nenhum novo horário encontrado, eeprom não foi perturbado"); }}
Esquemas
conexão simples de um botão com um resistor suspenso chronometer_APM32Y9FoM.fzzProcesso de manufatura