Hallo zusammen,
ich bin blutige Anfängerin beim Thema Programmierung und Arduino und beiße mir beim Thema Timer mit verschiedenen Phasen gerade die Zähne aus. Ich habe mittlerweile so viele verschiedene Codes gelesen, die mit Timern arbeiten, aber andere Hardware verbaut haben als ich, und die Variablen verwirren mich so sehr, dass ich es nicht schaffe, es auf mein Projekt zu übertragen. Ich wäre euch wirklich sehr dankbar, wenn ihr mir bitte weiterhelfen könntet.
Die Hardware ist fertig und funktioniert. Ich verwendet einen Arduino Nano, einen Ultraschallsensor, einen Buzzer, einen Neopixel-Stick mit 8 Neopixels und einen Button.
Mein Grundkonzept kurz erklärt: Mein Gerät soll den Arbeiter am Bildschirm daran erinnern, dass er min. 50 cm Abstand zum Bildschirm haben sollte, und alle 20 Minuten für 2 Minuten in die Ferne schauen soll (Stichwort Augenstress mindern).
Das Gerät wird auf dem Bildschirm platziert. Betätigt man den Button, wird die "Bildschirmphase" gestartet und der 20-Minuten-Timer fängt an. Die Abstandsmessung zum Bildschirm soll nur in dieser Phase stattfinden (die funktioniert schon). Nach 20 Minuten wird die "PausePhase" gestartet. Die Neopixels sollen kurz aufleuchten und der Buzzer gibt einen Signalton ab. Nach Ablauf der 2-minütigen "Pausephase" soll das Ganze wieder von vorne beginnen.
Unterbrochen wird der Loop durch erneutes Drücken des Buttons, dann ist quasi alles wieder auf "Off" und es wird gewartet, bis der Button wieder auf "On" gestellt wird.
Ich hoffe es ist verständlich, was ich meine. Falls es hilft, poste ich hier noch eine der vielen Code-Varianten, die nicht funktionieren. xD Da funktioniert das mit der Bildschirmphase schon, aber wenn er dann in die Pausephase springt, bleibt er da und geht nicht wieder zurück. Dass der Button beim erneuten Drücken auf Off geht, ist da auch noch nicht integriert.
.
.
.
//Einrichten des Timer-Buttons
#define buttonPin 12
int buttonState = 0;
boolean oldState = HIGH;
bool buttonPressed = false;
int switchVar;
boolean newState;
//MILLIS
int eyeTimer = 0;
int eyeTimeout = 20000; //20 Sek //1200000 = 20 Min
int eyeBreak = 5000; //5 Sek
//Andere Globale Werte
#define Warte 400
/**************************************
//SETUP
**************************************/
void setup() {
Serial.begin(9600);
// Definieren der Eingabe-Pins
pinMode(echoPin, INPUT);
pinMode(buttonPin, INPUT_PULLUP);
// Definieren der Ausgabe-Pins
pinMode(trigPin, OUTPUT);
pinMode(buzzPin, OUTPUT);
// Initialisieren des Neo-Pixel Strips
strip.begin();
strip.show(); // Initialisiert alle Pixels auf "Off"
switchVar = 0;
}
/**************************************
//Loop
**************************************/
void loop() {
switch(switchVar){
case 0:
Serial.println("Button wird gelesen");
newState = digitalRead(buttonPin);
if ((newState == LOW) && (oldState == HIGH)) {
// Short delay to debounce button.
delay(20);
buttonPressed = true;
} else {
buttonPressed = false;
}
if(buttonPressed == true){
switchVar = 1;
}
break;
case 1:
bool raus = false;
int timer;
Serial.println("Case 1 entered");
colorWipe(strip.Color( 255, 0, 0), 50); // Grün leuchtet kurz auf
eyeTimer = millis(); //Timer wird gestartet
eyeBreak = eyeTimer + eyeTimeout;
while(!raus){
timer = millis();
if(timer >= eyeBreak){
raus = true;
Serial.println("eyeBreak entered");
}
Serial.println("Zielzeit:");
Serial.println(eyeBreak);
Serial.println("Millisekunden");
Serial.println(timer);
Serial.println("In While-Loop");
abstandMessen();
}
tone(buzzPin, G5);
delay(Warte);
noTone(buzzPin);
rainbow(10);
switchVar = 0;
break;
}
Serial.println("Button:");
Serial.println(buttonState);
}
.
.
.
Danke und viele Grüße,
Sandra