hi
folgender Code:
#include <LiquidCrystal.h>
#define dimmtime 1 //Zeit in Millisekunden die gewartet wird bis zur nächsten Stufe (1/255) gedimmt wird
LiquidCrystal lcd(8, 7, 14, 15, 16, 17);
int pwm1 = 0;
int pwm2 = 0;
int start1 = 0;
int start2 = 0;
unsigned long timestartup;
unsigned long timestartup2;
unsigned long timestartdown;
unsigned long timestartdown2;
void setup()
{
lcd.begin(16, 2);
pinMode(3, OUTPUT);
pinMode(4, INPUT);
pinMode(5, OUTPUT);
}
void loop()
{
if(digitalRead(4)) //wenn Eingang Zeitschaltuhr HIGH
{
if(start1 == 0)
{
timestartup = millis(); //kopiere startzeit in timestartup
pwm1 = pwm1+1; //dimme um 1 hoch
analogWrite(3, pwm1); //schreibe wert in Ausgang
start1 = 1;
}
if (timestartup+dimmtime <= millis()) //nach + anzahl der Millisekunden nach der um 1 hochgedimmt werden soll
{
if (pwm1 < 255) //nur hochdimmen solang pwm unter 255
{
pwm1 = pwm1+1; //dimme um 1 hoch
analogWrite(3, pwm1); //schreibe wert in Ausgang
timestartup = timestartup + 1;
}
if (pwm1 > 127) //wenn erste LEDs 50% starte 2. PWM
{
if (pwm2 < 255) //nur hochdimmen solang pwm unter 255
{
pwm2 = pwm2+1; //dimme um 1 hoch
analogWrite(5, pwm2); //schreibe wert in Ausgang
timestartup2 = timestartup2 + 1;
}
}
}
}
lcd.setCursor(0, 0);
lcd.print("blau ");
lcd.print(pwm1);
lcd.setCursor(0, 1);
lcd.print("weiss ");
lcd.print(pwm2);
lcd.print(" ");
lcd.print(millis());
}
(sind noch ein paar Beispielvariablen angelegt die ich aktuell nicht brauche bitte nicht beachten auch ist der Code noch nicht fertig ich weiss das nach dem hochdimmen eigentlich nix mehr geht :D)
Ich nutze den Simulator:
http://www.arduino.com.au/Arduino%20Shields%20products.html
Anfangs klappt der Code auch wunderbar er fängt an jede Millisekunde pwm1 um 1 hochzudimmen. Irgendwann (manchmal bei pwm1 = 20 manchmal erst bei 100) hört er einfach auf weiter zu dimmen ohne erkennbaren Grund. Genaues steppen hat ergeben das er in folgende IF Anweisung nicht hineinspringt:
http://www.chrisi01.de/di-YHCP.jpg
Wenn ich bei dem Bild jetzt F7 drück im genau diesem Zustand lande ich in der Zeile:
//.....
timestartup2 = timestartup2 + 1;
}
}
}
} // <-----hier lande ich dann
lcd.setCursor(0, 0);
//.....
obwohl eigentlich alles gegeben ist damit
if (timestartup+dimmtime <= millis())
true wäre. timestartup ist 99 dimmtime 1 und millis beträgt wie im Bild zu sehen 104 d.h. 99+1<=104 sollte eigentlich true ergeben und er sollte in die IF Anweisung springen. Macht er aber aus irgendeinen Grund nicht.
weiss jemand wo mein Fehler liegt? Sieht mir irgendwie nach einen Überlauf oder so aus. Wobei millis() auf dem Display ausgegeben auf jeden Fall 104 beträgt.
mfg
Chris