Arduino 'time-out' - Funktion mit einem timer-millis
Habe ich nicht die Programmierung für lange, und ich möchte nur erweitern von electronic engineering mit einem Arduino UNO board.
Habe ich begonnen ein neues Projekt basierend auf der Secret Knock Detecting Door Lock von Steve Hoefer auf Grathio und ich möchte die Umsetzung der folgenden:
(http://grathio.com/2009/11/secret_knock_detecting_door_lock/)
(http://grathio.com/assets/secret_knock_detector.pde)
Implementierung
Wenn der Globale Wert gleich 0 und der gültige knock-Sprüche wahr ist, dann blinkt eine gelbe LED 4 mal mit millis statt delay so, dass es immer noch 'hören'.
Wenn andere gültige knock-Muster ist nicht zu hören, die innerhalb von 6 Sekunden wird die Zeit aus und reset global auf 0, so dass es kann bestätigen, die ersten Muster und blinkt die gelbe LED.
Wenn andere gültige knock-Muster gehört wird innerhalb von 6 Sekunden, Inkrementieren eines Zählers.
Wenn der Zähler gleich 1 ist, warten Sie, bis eine andere gültige knock-Muster und wenn Sie wahr Sie innerhalb von 6 Sekunden, erhöht sich der Zähler wieder und nicht blinkt die gelbe LED.
Ansonsten Zeit und setzen Sie alle Werte.
Und so weiter, bis, wenn der Zähler größer als oder gleich 4 trigger-master-LED-array.
Einmal bekommt 4 erfolgreiche klopft, möchte ich es zum auslösen der master-LED-array habe ich gebaut.
Probleme
Dieses Projekt wurde inspiriert durch die test-panels verwendet, die auf Passagier-Flugzeuge. Ich habe gesehen, wie Sie eine Menge, und dachte, es wäre ein guter Ort, um zu starten und lernen, über das timing.
Gibt es ein paar Probleme, da ich nicht zurücksetzen möchten, millis() und jedes mal bin ich über einen button anstatt den booleschen innerhalb der knock-detection-Skript, damit ich nicht verloren im code.
Verstehe ich das nicht reagieren, 50 Sekunden später und es ist ein Anfänger-Fehler, sondern beweist, was ich habe, wenn ich die Taste gedrückt halten. Der code unten auch nicht haben, ein time-out nach dem 1. digitalRead HIGH oder true boolean (ich bin mit diesen zu kämpfen).
Arduino-sketch
int inPin = 2; //input pin switch
int outPin = 3; //output pin LED
long currentTime = 0; //counter
long nextTime = 0; //counter
long lastTime = 0; //counter
int patternCounter = 0; //build up
int globalValue = 0; //lock out
int breakIn = 0; //waste of time?
void setup()
{
pinMode(inPin, INPUT);
pinMode(outPin, OUTPUT);
Serial.begin(9600);
Serial.println("GO");
}
void loop(){
//boolean true, switch just for testing
if (digitalRead(inPin)==HIGH&&globalValue==0&&breakIn==0) {
Serial.println("CLEARED 1st");
delay (500); //flood protection
globalValue++;
breakIn++;
if (globalValue>0&&breakIn>0){
currentTime = millis(); //start a 'new' counter and 'listen'
if (currentTime<6000) { //less than
if (digitalRead(inPin)==HIGH) { //and true
Serial.println("CLEARED 2nd"); //cleared the stage
delay (500); //flood protection
patternCounter++;
} //if counter less
} //if true or high
if (currentTime>6000) {
Serial.println("TIMEOUT waiting 2nd"); //timed out
globalValue = 0;
patternCounter = 0;
breakIn = 0;
} //if more than
} //global master
}
//3rd attempt
if (globalValue==1&&patternCounter==1){ //third round
nextTime = millis(); //start a 'new' counter and 'listen'
if (nextTime<6000) { //less than
if (digitalRead(inPin)==HIGH) { //and true
Serial.println("CLEARED 3rd");
delay (500); //flood protection
patternCounter++;
} //if counter less
} //if true or high
if (nextTime>6000) {
Serial.println("TIMEOUT waiting 3rd"); //timed out
globalValue = 0;
patternCounter = 0;
} //if more than
} //global master
//4th attempt and latch
if (globalValue==1&&patternCounter==2){ //last round
lastTime = millis(); //start a 'new' counter and 'listen'
if (lastTime<6000) { //less than
if (digitalRead(inPin)==HIGH) { //and true
digitalWrite(outPin, HIGH); //LED on
Serial.println("CLEARED 4th ARRAY"); //cleared the stage
delay(500); //flood protection
} //true or high
} //counter
if (lastTime>6000) {
Serial.println("TIMEOUT waiting 4th"); //timed out
globalValue = 0;
patternCounter = 0;
} //if more than
} //global and alarm
} //loop end
Das ist der aktuelle sketch, verstehe ich die Schalter, die ich verwendet habe, sind in der Nähe sinnlos.
Jede Hilfe wäre sehr geschätzt werden!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist das ein viel zu Durchwaten, so kann ich Ihre Frage nicht verstanden, aber der code unten steht als ein problem:
Verstehen Sie, dass es kein "zurücksetzen" des
millis()
möglich und das ist nur eine Funktion, liefert die Anzahl der Millisekunden seit das Programm gestartet? Es wird sich weiter erhöhen, solange das Programm läuft (bis es rollt vorbei, aber das ist ein anderes problem). So in dem obigen code 'currentTime' ist nur " < 6000 sehr, sehr kurz (6 Sekunden) und dann nie wieder (außer für den rollover-Zustand, wo millis setzt).So eine typische Art und Weise
millis()
wird verwendet, um zu verfolgen die Zeit, insetup
zu speichern den aktuellen Wert in eine variable und fügen Sie Ihre timeout-Wert:Dann in
loop
können Sie den check:Seien Sie auch vorsichtig mit
delay()
- es ist einfach zu benutzen für flow-control, aber für jedes Programm mit mehr als eine Sache geht kann es verwirrend und schwierig, Probleme zu lösen.Oh - es gibt mehr raffinierte Möglichkeiten, das timing mit dem eingebauten Timer auf dem chip auslösen, unterbricht aber besser zu bekommen den hang der Dinge zuerst.
nextUpdate
und ja, es wäre ein unsigned long.Habe ich die folgende Skizze nach zu spielen, um mit Ihrer Hilfe.
Die Skizze wird fast alles tun, was ich wollte...
Wenn es mal out (T/O) nach der 1., 2. (inCount = 1) oder 3. (inCount = 2) - Taste drücken, ich möchte es wieder zurück an den start ohne zu drücken, es wieder und Schleife triggerFlash zweimal.
Entweder das, oder die Umsetzung der weiteren "warten und lauschen" innerhalb des time-out, um es in die 2. (inCount = 1) e.t.c. aber ich denke, dass kann zu Problemen führen.
Ich weiß, dass es eine Verzögerung innerhalb der blinkt, aber das wird geändert, um millis(), ich versuche nur, um die grundsätzliche Funktion und Verständnis.
const int switchPin = 2; //die Anzahl der input-pin
const int BswitchPin = 4; //Anzahl der Eingabe-pin
const int outPin = 3;
const int thePin = 5;
Alle Ideen sind sehr willkommen! (herausgegeben mit verbesserter zählen)
Dem obigen code ist eigentlich FALSCH. Bitte seien Sie vorsichtig mit millis() wie Sie rollover nach einiger Zeit. es ist nur so lange geben. Also, wenn die millis+timeout ist in der Nähe von max () und millis() wird rollover und starten Sie das zählen von null, die millis()>= " nextupdate wird falsch sein, auch wenn das timeout Auftritt eigentlich.
Den richtigen Weg, dies zu tun ist: