Hi zusammen, ich bin, was die Programmiersprache des Arduinos angeht, ein absoluter Anfänger. Im Moment versuche ich eine kleine Uhr zusammenzuschustern (Ja, nicht unbedingt ein Anfängerprojekt, aber die Leber wächst mit ihren Aufgaben.). Dabei bin ich auf ein kleines (für mich unverständliches) Problem gestoßen. Der Plan ist es, hier, so lange ich die Taste drücke einen zähler(zaehler) hochzählen zu lassen. Bei überschreiten der 400 soll uhrflag getoggelt werden, also immer zwischen 0 und 1 schalten und der zähler zurück auf 0 gesetzt werden.
Soweit, so gut.
set_btn und uhrflag sind als bool definiert, zaehler als int
der Eingangspin ist auf INPUT_PULLUP
void loop() {
set_btn=!digitalRead(2);
if(set_btn){
zaehler++;
}else{
zaehler=0;
}
if(zaehler > 400){
zaehler=0;
uhrflag = !uhrflag;
Serial.println(uhrflag);
}
}
Wenn ich diesen Code benutze, sollte ich jedes mal wenn die 400 erreicht werden, sehen dass uhrflag schaltet. Komischerweise schaltet der aber jedes mal 2x. Laut Zeitstempel im Serialmonitor auch gleichzeitig. Der zaehler geht aber ganz regulär auf 0 und zählt dann wieder hoch bis auf 400.
Setze ich nun die Serial.print-Befehle hinter die If-abfrage funktioniert alles so wie es soll. Wo habe ich den Verständnisfehler? Werden Variablen beim senden an die Serielle Schnittstelle verändert?
Danke schon mal für eure Infos
-Matthias
edit: Anscheinend liegt der Fehler im weiteren Programm. wenn ich tatsächlich nur das oben gezeigte lade gehts komischerweise (musste allerdings einen delay einbauen). Daher hier einmal der komplette Quelltext (Bitte nicht lachen)
#include "DS1307RTC.h"
#include "LedControl.h"
#include "Wire.h"
LedControl lc=LedControl(12,11,10,1); //Max7213 Data-12; Clock-11; Load-10; Anzahl-1
byte zsec=0; //Zehner Sekunden
byte esec=0; //Einer Sekunden
byte zmin=0;
byte emin=0;
byte ehour=0;
byte zhour=0;
byte sectic=0;
int sensor=0;
bool alarm_btn;
bool alarm_btn_flag=0;
bool alarm_on=0;
bool uhrflag=0;
bool set_btn=0;
int set_btn_count=0;
int zaehler;
void setup() {
pinMode(6,INPUT_PULLUP); //Alarm an Pin 6
pinMode(2,INPUT_PULLUP); //SET an Pin 2
lc.shutdown(0,false);// turn off power saving, enables display
lc.setIntensity(0,15);// sets brightness (0~15 possible values)
lc.clearDisplay(0);// clear screen
setSyncProvider(RTC.get);
Serial.begin(9600);
}
void loop() {
// alarm_btn=digitalRead(6);
set_btn=!digitalRead(2);
/* if (alarm_btn && !alarm_btn_flag)
{
alarm_btn_flag=1;
}
if(!alarm_btn && alarm_btn_flag)
{
alarm_on=!alarm_on;
alarm_btn_flag=false;
}
*/
if(set_btn){
zaehler++;
}else{
zaehler=0;
}
if(zaehler > 400){
zaehler=0;
uhrflag = !uhrflag;
Serial.println(uhrflag);
}
// Serial.print(zaehler);
// Serial.print("_");
// Serial.println(uhrflag);
if (!uhrflag){
Helligkeit();
AnzeigeUhr();
}
}
//******************************************
//Ende der Hauptroutine, ab hier Subroutinen
void AnzeigeUhr(){ //Routine zur Anzeige im Uhrenmodus
esec=second();
zsec=esec/10;
esec=esec-(10*zsec);
emin=minute();
zmin=emin/10;
emin=emin-(10*zmin);
ehour=hour();
zhour=ehour/10;
ehour=ehour-(10*zhour);
sectic=(esec%2*7)+1;
lc.setDigit(0,4,sectic,alarm_on);
lc.setDigit(0,3,emin,set_btn);
lc.setDigit(0,2,zmin,0);
lc.setDigit(0,1,ehour,0);
lc.setDigit(0,0,zhour,0);
//Serial.print(uhrflag);
//Serial.print("-");
//Serial.println(zaehler);
}
void Helligkeit(){ //Routine zum Auslesen des Helligkeitssensor und anpassen der Anzeigenintensität
sensor=analogRead(A3);
switch(sensor){
case 0 ... 200:
lc.setIntensity(0,0);
break;
case 201 ... 300:
lc.setIntensity(0,2);
break;
case 301 ... 400:
lc.setIntensity(0,4);
break;
case 401 ... 500:
lc.setIntensity(0,6);
break;
case 501 ... 600:
lc.setIntensity(0,8);
break;
case 601 ... 700:
lc.setIntensity(0,10);
break;
case 701 ... 800:
lc.setIntensity(0,12);
break;
case 801 ... 1024:
lc.setIntensity(0,15);
break;
}
}