Zeitgesteuerte Messung

Hallo Arduino Freunde,

ich brauche eure Hilfe :)

Ich will meinen Arduino UNO entlasten in dem ich meine "Messung oder Rechnung" nicht jedes Mal ausführe, sondern zB. nur alle 60 Sekunden.

Ich habe schon etliche Schleifen mit der millis() Funktion (den delay(); Befehl würde ich gerne vermeiden) gebastelt und ausprobiert, hatte aber keinen Erfolg.

Hätte jemand eine Idee??

Vielen Dank schon mal für eure Hilfe.

Grüße

Hallo,

ich machs mal ganz kurz :) a) Standard Bsp. "blinking without delay". b) oder hier reinschauen http://forum.arduino.cc/index.php?topic=391611 c) googeln nach Arduino millis timer oder ähnlichen

Mofritz: Ich habe schon etliche Schleifen mit der millis() Funktion (den delay(); Befehl würde ich gerne vermeiden) gebastelt und ausprobiert, hatte aber keinen Erfolg.

Hätte jemand eine Idee??

Meine Idee: Hilfe zur Selbsthilfe- Du zeigst uns deinen Sketch und wir analysieren mit dir, weshalb es nicht funktioniert und was verändert werden muss.

... wobei dann auch noch die Frage zu klären wäre, ob es sich um das Sparen von Energie dreht oder etwas anderes. Denn ob der µC nur in einer Schleife wie delay(x) hängt oder irgendwas sinnvolles macht ist ihm eigentlich Schnuppe. Er dreht unermüdlich seine Runden bis der Saft abgedreht wird oder man ihn bewußt zum Schlafen legt ...

Hallo,

glaube es wäre doch besser er zeigt [u]seinen[/u] Sketch, zur Fehleranalyse. War wohl zu kurz angebunden.

... in der Kürze liegt doch bekanntlich die Würze ... ;) Aber du hast eindeutig Recht - es wäre sinnvoll, mal einen Sketch zu zeigen oder das Problem näher zu schildern.

Hallo,

vielen Dank für eure Antworten.

Ich war gerade noch auf Fehlersuche mit dem EEPORM-speichern, die ganze Zeit funktionierts und auf einmal nicht mehr, zum verrückt werden.

Ich Versuchs mal mit dem Standard Bsp. "blinking without delay" vllt. bekomm ich da etwas zusammen, melde mich dann wieder mit dem sketch!

@Rudi die Messung will ich nicht ständig ausführen, da es nicht notwendig ist, es reicht locker alle zB. 60 Sekunden. Den delay(); Befehl will ich vermeiden, da noch weiter Prog. dazu kommen weden.

Ich baue für mein Moped eine Tankanzeige, die ich mit Durchlaufsensor und Display realisieren möchte :).

Vielen vielen Dank

Grüße

Moritz

Mofritz: ....die Messung will ich nicht ständig ausführen, da es nicht notwendig ist, es reicht locker alle zB. 60 Sekunden. Den delay(); Befehl will ich vermeiden, da noch weiter Prog. dazu kommen weden.

Ich baue für mein Moped eine Tankanzeige, die ich mit Durchlaufsensor und Display realisieren möchte :).

Das ist aus meiner Sicht eine sehr ungenaue Art der Messung.

Wenn du nur alle 60 sek. den Durchfluss misst, wirst du nie eine genaue Tankanzeige erhalten.

Eben hast du noch Vollgas gegeben und der Arduino macht Pause, jetzt stehst du an der Ampel und die Messung erfolgt. Das kann doch nicht funktionieren. ;)

Den delay(); Befehl will ich vermeiden

Sehr gut, großes Lob Daumenhoch

Aber ob Delay oder Millis - sofern du den µC nicht wirklich schlafenlegst, wird er durch nichts "entlastet". Gehe den von dir angedeuteten Weg mit "Blink without Delay", das ist ein guter Ansatz. Und der µC wird dir auch sicherlich nicht auf die Füße treten, wenn er ansonsten nix zum Werkeln bekommt... ;)

Viel Erfolg mit deinem Vorhaben Rudi

@HotSystems klar das wäre nichts!

Die Impulse die der Sensor liefert erfasse ich mit einem externen Interrupt und zähle sie mit.

Die Messung wo ich nur alle 60Sekunden wiederholen will, ist für die bessere Darstellung auf dem Display.

Mofritz: Ich will meinen Arduino UNO entlasten in dem ich meine "Messung oder Rechnung" nicht jedes Mal ausführe, sondern zB. nur alle 60 Sekunden.

Mofritz: Ich baue für mein Moped eine Tankanzeige, die ich mit Durchlaufsensor und Display realisieren möchte :).

Eine mir sinnvoller erscheinende Aufgabenstellung: Mit Hilfe des Durchlaufsensors wird ständig das verbrauchte Benzin gemessen und dann alle 60 Sekunden der Durchfluß berechnet und auf dem Display angezeigt.

Die Impulse des Durchlaufsensors (nicht Durchflußsensors?) zählst Du mittels Interrupt und zeigst die frisch berechneten Werte (minimaler und maximaler Durchfluß, aktueller und gesamter Verbrauch oder was Dich interessiert) alle 60 Sekunden an. Impulse zählen mittels Interrupt und die Verwendung von millis() sind Deine Themen.

Als Anregung für die Verwendung von Interrupts, delay() ersetzt Du bitte durch millis():

// UNO mit Messung an Pin2

const byte messpin = 2;
volatile unsigned long zaehler;

void setup() {
  Serial.begin(9600);
  pinMode(messpin,INPUT_PULLUP);
  attachInterrupt(0, messung, CHANGE);
}

void loop()
{
  delay(1000); // every second
  Serial.print("Zaehler: "); Serial.println(zaehler); 
}

void messung() {
  if (digitalRead(messpin)) zaehler++;
}

Hat sich jetzt überkreuzt :)

Mofritz: @HotSystems klar das wäre nichts!

Die Impulse die der Sensor liefert erfasse ich mit einem externen Interrupt und zähle sie mit.

Die Messung wo ich nur alle 60Sekunden wiederholen will, ist für die bessere Darstellung auf dem Display.

Ja, ok.

Dann ist es ja nicht die Messung sondern nur die Anzeige im Display. Das hat ja agmue auch schon bestätigt.

Um die Anzeige alle 60 sek. zu aktualisieren, kannst du den "SimpleTimer" verwenden.

Den setze ich für eine ähnliche Anwendung ein, wo alle 10 sek. das Display aktualisiert wird.

Guten Abend ,

ich bedanke mich vielmals für eure Hilfe :slight_smile:

habe ein kleines “Test-Programm” getippt wo die LED über den Simple Timer gesteuert wird.

Damit sollte es auch bei meinem eigentlichen Programm laufen.

Danke nochmals und schönes Wochenende.

Gruß

Moritz

//=============================================

#include <SimpleTimer.h>

SimpleTimer timer;

// a function to be executed periodically
void repeatMe() {
timer.setInterval(1000, RepeatTask);
}

int ledPin = 13;

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

timer.setInterval(1000, repeatMe);

pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, LOW);
}

void loop() {
timer.run();
}

void RepeatTask() {

if (digitalRead(ledPin) == LOW)
digitalWrite(ledPin, HIGH);

else
digitalWrite(ledPin, LOW);

}

//=============================================

Prima, dass du das hinbekommst.

Allerdings setze den Sketch bitte in Code-Tags und verwende dazu die “Schaltfläche </>”

Nur so ganz komm ich nicht mit dem von dir erstellen Sketch klar, da du den Timer 2 mal startest.

So ist das ok und funktioniert.

#include <SimpleTimer.h>

SimpleTimer timer;
int ledPin =  13;


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

  timer.setInterval(1000, repeatMe);

  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, LOW);
}

void loop() {
  timer.run();
}

void repeatMe() {

  if (digitalRead(ledPin) == LOW)
    digitalWrite(ledPin, HIGH);
  else
    digitalWrite(ledPin, LOW);
}

Die schlichte Variante mit millis() finde ich auch schön:

unsigned long altMicros;

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

void loop() {
  if (millis() - altMicros >= 60000UL) {
    altMicros = millis();
    Serial.println("Berechnung und Anzeige");
  }
}

Viel mehr als die Variable unsigned long altMicros( unglücklicher Name, agmue :wink: )
mit einer Grenze und einer Funktion zu verpacken, wird sollte der SimpleTimer hoffentlich eigentlich nicht machen.

Unterstützt nur mein Mantra, dass wichtiger ist wie welche Variablen definiert sind, als was in loop() steht.

Den SimpleTimer aus dem Playground mit einem einzigen Objekt und Arrays für 10 Zeitzähler halte ich übrigens für eine Fehlkonstruktion mit falschem Namen.

Einfacher durchschaubar und damit sinnvoller für Anfänger ist jedenfalls die “schlichte Variante” von agmue.

void SingleTimer::run() {
 if (millis() - _altMillis > _intervall ) {
   (*_func) ();
   _altMillis += _intervall;
 }
}

ist eigentlich genauso schlicht

Verwendung:

SingleTimer mytimer(1000, blink);

void setup() {
  pinMode(13, OUTPUT);
}

void loop() {
  mytimer.run();
}

void blink() {
   digitalWrite(13, ! digitalRead(13)); 
}

Fehlt nur noch das wichtigste: SingleTimer.h :wink:

Guten Morgen,

vielen Dank für eure Hilfe!

Damit kann ich auf jeden Fall was mit anfangen :)

michael_x: ... altMicros (unglücklicher Name, agmue ;) )...

Als fauler Mensch habe ich C&P aus einem eigenen Sketch genutzt, da ging es um Micros :( Aber in Millis sind ja auch Micros enthalten, irgendwie ;D

Mir sind die Micros/Millis sympathischer als eine Bibliothek, doch das ist wie so häufig Geschmacksache.

Danke für die Korrektur!

agmue: Mir sind die Micros/Millis sympathischer als eine Bibliothek, doch das ist wie so häufig Geschmacksache.

Einfacher ist es mit Library, ohne ist der Lerneffekt größer. ;)

Um ein Programm schneller zum Laufen zu kriegen, setze ich schon häufiger Libraries ein. Um zu Lernen wie das alles geht, ist der Weg mit den "sympathischen Micros/Millis" besser.

HotSystems:
Einfacher ist es mit Library, ohne ist der Lerneffekt größer. :wink:

Das können wir an die Arduino-Wand der Weisheiten heften!

Ich stelle mich gerne auf die Schulter von Giganten, nur muß man halt aufpassen, damit einem nicht schwindelig wird.