Guten Tag,
ich komme ja eher von Delphi, deshalb habe ich nicht so viel Erfahrung mit C.
Ich habe nun eine kleine Funktion geschrieben welche sich m. E. sehr merkwürdig verhält. Für mich ergibt das Verhalten überhaupt keinen Sinn. Was mache ich falsch?
Grüße
Matias
unsigned long delayStart_outPin0 = 0;
unsigned long delayStart_outPin1 = 0;
unsigned long delayStart_outPin01 = 0;
unsigned long delayStart_outPin11 = 0;
int inPin0 = 4;
int inPin1 = 5;
int outPin0 = 8;
int outPin1 = 9;
boolean checkDelay(unsigned long& adelayStart, unsigned long adelay);
void setup()
{
Serial.begin(9600);
pinMode(inPin0, INPUT);
pinMode(inPin1, INPUT);
pinMode(outPin0, OUTPUT);
pinMode(outPin1, OUTPUT);
digitalWrite(outPin0, true);
}
void loop()
{
if (digitalRead(inPin0) == true
&& digitalRead(outPin1) == true
&& delayStart_outPin1 == 0)
{ // Ausschalt-Verzögerung für outPin1 starten
delayStart_outPin1 = millis(); // start delay
}
// if (delayStart_outPin1 != 0 && millis() >= delayStart_outPin1 + 400) // <- das funktioniert
if (checkDelay(delayStart_outPin1, 400)) // <- das funktioniert nicht, sobald delayStart_outPin1 > 65535 wird (ist ja wohl die Grenze für Word)
{ // outPin1 ausschalten
delayStart_outPin1 = 0;
digitalWrite(outPin1, false);
}
if (digitalRead(outPin0) == false
&& digitalRead(inPin0) == true
&& digitalRead(outPin1) == false
&& delayStart_outPin01 == 0)
{ // Einschalt-Verzögerung für outPin0 starten
delayStart_outPin01 = millis(); // start delay
}
// if (delayStart_outPin01 != 0 && millis() >= delayStart_outPin01 + 800)
if (checkDelay(delayStart_outPin01, 800))
{ // outPin0 einschalten
Serial.println(delayStart_outPin01);
delayStart_outPin01 = 0;
Serial.println(delayStart_outPin01);
digitalWrite(outPin0, true);
}
// ---
if (digitalRead(inPin1) == true
&& digitalRead(outPin0) == true
&& delayStart_outPin0 == 0)
{ // Ausschalt-Verzögerung für outPin0 starten
delayStart_outPin0 = millis(); // start delay
}
// if (delayStart_outPin0 != 0 && millis() >= delayStart_outPin0 + 400)
if (checkDelay(delayStart_outPin0, 400))
{ // outPin0 ausschalten
delayStart_outPin0 = 0;
digitalWrite(outPin0, false);
}
if (digitalRead(outPin1) == false
&& digitalRead(inPin1) == true
&& digitalRead(outPin0) == false
&& delayStart_outPin11 == 0)
{ // Einschalt-Verzögerung für outPin1 starten
delayStart_outPin11 = millis(); // start delay
}
// if (delayStart_outPin11 != 0 && millis() >= delayStart_outPin11 + 800)
if (checkDelay(delayStart_outPin11, 800))
{ // outPin1 einschalten
delayStart_outPin11 = 0;
digitalWrite(outPin1, true);
}
}
// das funktioniert nicht:
// sobald adelayStart den Wert 65535 überschreitet liefert die Funktion
// immer sofort true?
// wenn man die Zeile Serial.println(adelay); aktiviert bekommt man immer true
// unter allen Umständen?
// adelayStart = 0; funktioniert dann ja auch nicht
boolean checkDelay(unsigned long& adelayStart, unsigned long adelay)
{
unsigned long MyMillis = millis();
if (adelayStart == 0)
{
return false;
}
if (adelayStart != 0 && MyMillis >= adelayStart + adelay)
{
// Serial.println(adelay);
adelayStart = 0;
return true;
}
}