Einfacher Arduino-Chronometer
Komponenten und Verbrauchsmaterialien
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
Apps und Onlinedienste
|
Über dieses Projekt
Ich bin auf dem Weg, ein lustiges Projekt zu machen, und ich brauchte einen Arduino-Chronometer, der immer dann funktioniert, wenn ich einen Knopf drücke. Es ist keine komplexe Sache, aber ich dachte, dass dieses Stück Code für die Projekte anderer Leute nützlich sein würde.
Ich habe dir wahrscheinlich 1 Stunde deines Lebens beim Programmieren gerettet.
EEPROM:
Speicher von Arduino, der seine Informationen nicht verliert, wenn Sie die Stromversorgung trennen oder das Board zurücksetzen. (Info). Ich verwende #include
Bibliothek, die im Grunde alles macht und standardmäßig bereits installiert ist.
UNTERBRECHUNGEN:
Dinge passieren in unserem Arduino, aber wir möchten, dass es aufhört zu tun, was auch immer vor sich ging, und sich unserer ISR-Funktion zuwenden, wenn beispielsweise ein Pin auf HIGH gezogen wird. Hier ist keine zusätzliche Bibliothek erforderlich:
Der Code des Projekts:
- Definiert und beinhaltet:
#include #define interruptPin 2 #define eeAddress 0 //ADRESSE FÜR DAS ARDUINOS EEPROM (interner nichtflüchtiger Speicher) float starttime =0; //Variablen für die Berechnung float endtime=0; float resulttime=0, oldresulttime=0;
Nichts Neues hier, wir binden die EEPROM-Bibliothek ein, wir entscheiden, wo der Taster angeschlossen wird (Pin2).
Dann habe ich beschlossen, dass ich die Adresse 0 unseres EEPROM-Speichers verwenden werde, um unsere Zeit zu speichern (float =4 Byte). Arduino UNO hat 1024 Bytes (Chip ATmega328), aber ich wähle die Adresse 0, weil ich einmal in meinem Leben versucht habe, organisiert zu sein.
- setup()
void setup () { Serial.begin (9600); while (!Seriell) {; // Warten Sie, bis der serielle Port eine Verbindung herstellt. Wird nur für den nativen USB-Port benötigt } Serial.println("Serial comms are ready sir!:.. bip bip"); attachInterrupt(digitalPinToInterrupt(interruptPin), refreshTime, CHANGE);}
Üblicherweise initiieren wir serielle Kommunikation zwischen dem Arduino und unserem PC (9600 Baud):
attachInterrupt(digitalPinToInterrupt(interruptPin), refreshTime, CHANGE);
Attachinterrupt aktiviert die Funktion, wenn sich der Logikpegel von InterruptPin so ändert:(____________-HERE-----------------_HERE____________).
Auf diese Weise löst es zweimal zu Beginn unserer Pressung und am Ende aus. Wenn nichts passiert, bleibt unser InterruptPin-Wert LOW, da unser Pulldown-Widerstand ihn "zwingt", niedrig zu bleiben.
- Schleife()
void loop() { }
Gar nichts. Pack deine Sachen da rein!
- Weitere Funktionen:
void refreshTime(){ if(digitalRead(interruptPin)){ starttime=millis(); Serial.print ( "Startzeit:"); Serial.println (Startzeit); } Sonst if (digitalRead (interruptPin) ==LOW) { endtime =millis (); Ergebniszeit=Endzeit-Startzeit; Serial.print ( "Endzeit:"); Serial.println (Endzeit); Serial.print ( "Ergebniszeit:"); Serial.println (Ergebniszeit); WhatsNewEeprom(); // speichert eeprom }
Dies ist die Funktion, die ausgeführt wird, wenn die Unterbrechung im Pin (interruptPin) auftritt.
Die Unterbrechung wird jedes Mal ausgelöst, wenn sich der Status im InterruptPin ändert (HIGH nach LOW oder LOW nach HIGH), die if(...) dienen zur Erkennung, ob es sich um HIGH->LOW oder LOW->high ändert.
Speichert die von der internen Uhr von Arduino millis () aufgezeichnete Zeit und macht den Unterschied, dass unsere Ergebniszeit bereit ist. Am Ende speichert es neue Informationen im eeprom:
void WhatsNewEeprom () {Serial.println ( "-----------eeprom überprüfen"); 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! Neue Zeit im eeprom aufgezeichnet:"); Serial.println (resulttime); } sonst { Serial.println ( "Keine neue Zeit gefunden, Eeprom wurde nicht gestört"); }
Dieser prüft, ob der im eeprom gespeicherte Zeitwert derselbe ist, den wir in unserer Variablen "resulttime" haben. Wenn ja, haben wir ihn nicht geändert, also tun Sie nichts.
Extra! Entprellen unserer Taste:
Wir Menschen sind extrem langsam für die Arduino-Verarbeitungszeit, ein Tastendruck scheint für uns schnell zu sein, aber für Arduino ist es wirklich langsam, was dazu führt, dass das Signal "abprallt", wie beim Umschalten von highlowhighlowhighlow ein paar Mal, bevor der wahre Status eingestellt wird.
Wenn wir wollen (ich wollte es nicht), können wir es per Hardware oder Software reparieren:
- Entprellung über Software
- Entprellen über Hardware, Kondensator verwenden!!! :D
Ich werde nur 220 nF parallel hinzufügen (von Sensepin zu GND)
Der Kondensator "frisst" schnelle Spannungsschwankungen.
Code
- Arduino-Chronometer
Arduino-ChronometerArduino
verwendet Eeprom und Unterbrechungen, leicht hackbar//codiert von Javier Muñoz 23.10.2017//Fragen und gesungene Telegramme an [email protected]#include#define interruptPin 2#define eeAddress 0 // ADRESSE FÜR DAS ARDUINO'S EEPROM (interner nichtflüchtiger Speicher) float starttime =0; //Variablen für die Berechnung float endtime=0; float resulttime=0, oldresulttime=0; Void setup () { Serial.begin (9600); while (!Seriell) {; // Warten Sie, bis der serielle Port eine Verbindung herstellt. Wird nur für den nativen USB-Port benötigt } Serial.println("Serial comms are ready sir!:.. bip bip"); attachInterrupt(digitalPinToInterrupt(interruptPin), refreshTime, CHANGE); // aktiviert die Funktion, wenn sich der Logikpegel von InterruptPin so ändert:(__-HIER-----------------_HERE____) Auf diese Weise wird die Zeit gespeichert, in der unser Finger die Taste gedrückt hat}void loop () {//Ihre Sachen hier // (eeprom gespeichert) das letzte Mal in Millisekunden gemessen "float resulttime"}void refreshTime () { if (digitalRead (interruptPin) ) { Startzeit =Millis (); Serial.print ( "Startzeit:"); Serial.println (Startzeit); } Sonst if (digitalRead (interruptPin) ==LOW) { endtime =millis (); Ergebniszeit=Endzeit-Startzeit; Serial.print ( "Endzeit:"); Serial.println (Endzeit); Serial.print ( "Ergebniszeit:"); Serial.println (resulttime); WhatsNewEeprom (); }} ungültig WhatsNewEeprom () {Serial.println ( "-----------eeprom überprüfen"); 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! Neue Zeit im eeprom aufgezeichnet:"); Serial.println (resulttime); } sonst { Serial.println ( "Keine neue Zeit gefunden, Eeprom wurde nicht gestört"); }}
Schaltpläne
einfache Verbindung eines Tasters mit einem Pulldown-Widerstand chronometer_APM32Y9FoM.fzzHerstellungsprozess