Hab mir Grade nochmal den blink without delay Sketch angeschaut aber meiner Meinung nach müsste doch irgendwann die unsigned long variable die die millis speichert wieder auf null überlaufen wenn sie voll ist aber das würde ja die ganze zeitsteuerung durcheinander bringen weil doch die variable die minus genommen wird immer noch sehr sehr groß ist.
Oder versteh ich da was falsch? wenn ja belehrt mich bitte .
Oder gibt es einen Tipp wie man den nulldurchlauf vermeiden kann?
Hier noch mal der Sketch :
const int ledPin = 13 ; // the number of the LED pin
// Variables will change :
int ledState = LOW ; // ledState used to set the LED
// Generally, you should use "unsigned long" for variables that hold time
// The value will quickly become too large for an int to store
unsigned long previousMillis = 0 ; // will store last time LED was updated
// constants won't change :
const long interval = 1000 ; // interval at which to blink (milliseconds)
void setup ( ) {
// set the digital pin as output:
pinMode ( ledPin , OUTPUT ) ;
}
void loop ( ) {
// here is where you'd put code that needs to be running all the time.
// check to see if it's time to blink the LED; that is, if the
// difference between the current time and last time you blinked
// the LED is bigger than the interval at which you want to
// blink the LED.
unsigned long currentMillis = millis ( ) ;
if ( currentMillis - previousMillis >= interval ){
// save the last time you blinked the LED
previousMillis = currentMillis ;
// if the LED is off turn it on and vice-versa:
if ( ledState == LOW ) {
ledState = HIGH ;
} else {
ledState = LOW ;
}
// set the LED with the ledState of the variable:
digitalWrite ( ledPin , ledState ) ;
}
}
Achso ja klar ok habe verstanden .
Dann habe ich also nur einmal zum nulldurchlauf hin eine verkehrte Zeitmessung weil das unsigned long ja keine geraden 1000er wert hat sondern am Ende 4.294.967.295 also hätte ich vor dem nulldurchlauf einmal nur eine Zeit von 296 Millisekunden anstatt 1000.
richtig ?
Weil unsigned long so elend groß sind, kann man sich das einfacher bei Überlauf eines einzelnen byte klar machen:
Ein byte hat den Wertebereich 0 .. 255 oder 0 .. 0xFF
byte zlr; // wird regelmässig um 1 erhöht, nach 255 kommt 0
byte alt; // merkt den Start des Intervalls
const byte DAUER= 100; // passendes Beispiel-Intervall, damit man es blinken sieht
bool ledstate;
void loop () {
zlr = millis() & 0xFF ; // langsamer gehts z.B. mit zlr = (millis() >> 4) & 0xFF; // alle 16 ms um 1 erhöhen
if (zlr - alt > DAUER) {
alt = zlr;
ledstate = ! ledstate;
digitalWrite(13, ledstate);
}
}
Schade, wäre schön, wenn es dir Freude machen würde, wo du dir doch schon die Mühe machst.
mein Arduino UNO rechnet anders, da wird ( zlr - alt ) negativ!
...
Mit if (byte(zlr - alt) > DAUER) funktioniert es. Liegt wohl daran, daß intern mit Integer gerechnet wird.
Danke!
Eine Alternative:
byte diff = zlr-alt;
if (diff > DAUER) { ... } // Blink without delay
Serial.println(diff, DEC);
michael_x:
Schade, wäre schön, wenn es dir Freude machen würde, wo du dir doch schon die Mühe machst.
Mit byte finde ich es auch anschaulicher, habe ich aber zunächst nicht hinbekommen. Mit unsigned long hat es dann funktioniert, habe ich eben das veröffentlicht. Dann kommst Du und hast scheinbar geschafft, was mir nicht gelungen war. An dieser Stelle startet mein Ergeiz, herauszufinden, warum ich es nicht geraffelt habe. Eigentlich sollte es also ein Lob für Dich werden, doch dann muß ich Dir leider ...
Daß ich dann gestärkt mit Frühstück und Espresso die Kurve gekriegt habe, macht mich dann natürlich doch noch froh