millis() auslesen

Hallo,

ich bin sehr neu in der Arduino-Welt (habe bisher PICs in Assembler genutzt) und bin in der Probierphase der einfachen Dinge :slight_smile:
Ich wollte für eine spätere Anwendung mich mit millis() beschäftigen. Habe dazu einen einfachen Sketch (siehe unten), der mir auch korrekt aller 10 Sekunden die Ausgabe im Seriellen Monitor erzeugt. Der Arduino wird über "V in" mit einem Netzteil versorgt (9V) und ich hätte jetzt erwartet, dass er auch ohne Verbindung zum Rechner / Monitor intern ganz normal weiter hochzählt. Wenn ich nach einer gewissen Laufzeit ihn über USB wieder mit dem Rechner verbinde und den Seriellen Monitor aufrufe (ohne einen Sketch neu zu übertragen), fängt der Zähler aber jedesmal bei 0 an.

Wird der Nano jedesmal beim Anstecken vom USB-Kabel resettet oder habe ich einen Denkfehler?

Danke im Voraus für Antworten,

Tschööö Sven

unsigned long Zeit;

void setup()
{
Serial.begin(9600);
}

void loop()
{
Serial.print("Zeit: ");
Zeit = millis()/1000;
Serial.println(Zeit);
delay(10000);
}

Hallo Sven,

Wenn du den USB mit dem Arduino verbindest und den seriellen Monitor öffnest, dann wird automatisch ein Reset durchgeführt. Das ist der Grund für die "0" im Zähler.

Du darfst nicht gleichzeitig den Nano mit Spannung über Vin und USB betreiben.
Das kann den Nano grillen.

Und ja, der Nano wir beim Starten des seriellen Monitors (auch anstecken an USB) resettet.

Und zukünftig beachten:
Setze den bitte in Code-Tags.

Verwende dazu die Schaltfläche </> oben links im Editorfenster.
Das kannst du auch nachträglich machen.
Dazu den Sketch markieren und die Schaltfläche klicken.

Damit wird dieser für alle besser lesbar.

Hallo,

vielen Dank für die Infos, also kein Denkfehler bei mir sondern eine Eigenheit des Boards :slight_smile:

Und schon kommt die nächste Frage, sorry :slight_smile:

Ich wollte zum Test aller 30 Minuten einen Hupton ausgeben. Meiner Berechnung nach sollten das 30Minuten * 60Sekunden = 1800Sekunden sein. Dann noch *1000, um Millisekunden zu erhalten, also 1800000. Ich erhalte aber statt 30min aller 30 Sekunden einen Hupton. Nach mehrmaliger Kontrolle finde ich aber meinen Fehler nicht :slight_smile:

Danke im Voraus nochmal!!

// gibt nach einer Zeit Hupton aus

unsigned long Startzeit;
int Hupe = 12;
int Zeitraum=1800000;  //Test 30min  (30min * 60 Sek *1000 = msek)

void setup() 
{
  Startzeit = millis();
  digitalWrite(Hupe, HIGH);   //Einschaltkontrolle
  delay(500);
  digitalWrite(Hupe, LOW);
}

void loop() 
{
  if (millis() - Startzeit > Zeitraum)   //wenn gewünschte Zeit vergangen ist
    {
      Startzeit = millis();           //und Referenzzeit neu setzen
      digitalWrite(Hupe, HIGH);
      delay(1000);
      digitalWrite(Hupe, LOW);
    }
}

Der Wert ist für “Zeitraum” zu groß, passt nicht in int rein.

int Zeitraum=1800000;

Ähm, INT geht nur von -32768 ... +32767
Du musst "Zeitraum" ebenfalls als "long int" deklarieren

Oups, HotSystems war natürlich mal wieder schneller ... :wink:

"long int"
unsigned long

Ach Mensch, wenn ich das jetzt lese, ist es logisch.. aber ich war zu verbissen auf die Berechnung und habe den Rest nicht weiter beachtet,

vielen Dank :slight_smile:

Sven

DH0JSV:
Ach Mensch, wenn ich das jetzt lese, ist es logisch.. aber ich war zu verbissen auf die Berechnung und habe den Rest nicht weiter beachtet,

vielen Dank :slight_smile:

Sven

Manchmal sieht man den Wald vor lauter Bäumen nicht. :wink:

"long int"
unsigned long

Dat kimmt davon, wenn ich "mal eben schnell" was schreiben will...
Wobei "long int" für den Zahlenwert 1800000 dennoch funktioniert.
(gerade noch getestet)

[pingel an]
unsigned long Startzeit;
const byte Hupe = 12;
const unsigned long Zeitraum=1800000; //Test 30min (30min * 60 Sek *1000 = msek)
[pingel aus]

RudiDL5:
Dat kimmt davon, wenn ich "mal eben schnell" was schreiben will...
Wobei "long int" für den Zahlenwert 1800000 dennoch funktioniert.
(gerade noch getestet)

Das stimmt.

Dennoch muss ich sagen, dass die Variable zeitraum heißt.
Und ein zeitraum ist immer absolut.
Kann also nie negativ werden.

Es ist also eher ein semantisches Problem.

Um an @ agmue noch an zu schliessen, wieso machst dus dir nicht ein wenig einfacher ?

const int Minuten = 30;  //Hier kannst du deine Zeitspanne entsprechend ändern
unsigned long Startzeit;
const byte Hupe = 12;
const unsigned long Zeitraum = Minuten * 60 * 1000;  //Lass dir die mSek doch berechnen

So musst du deine mSek nicht jedes Mal neu berechnen :wink:

Das wird schief gehen, da standardmäßig der rechte Teil mit int gerechnet wird.

// falsch
const unsigned long Zeitraum = Minuten * 60 * 1000;
// richtig
const unsigned long Zeitraum = Minuten * 60 * 1000UL;

Gruß Tommy

Hast recht Tommy, mein Fehler

Danke fürs korrigieren :wink: