Go Down

Topic: Sensorwerte zu unterschiedlichen Zeiten erheben (Read 345 times) previous topic - next topic

leinaD

Hallo zusammen!

Ich möchte verschiedene Sensoren (Temperatur, Feuchte, Hall) zu verschiedenen Zeiten / in verschiedenen Intervallen abfragen. Hintergrund: die aktuelle Windgeschwindigkeit, die mit einem Hall-Sensor ermittelt wird, muss kontinuierlich "überwacht" werden, die Temperatur muss jedoch nur alle 10 - 15 Minuten abgefragt werden.

Die zusammengestellten Daten werden dann alle 15 Minuten an einen entfernten Server geschickt; bei der Windgeschwindigkeit soll dabei ein Durchschnittswert über den letzten Zeitraum und der Spitzenwert (Böen) mitgeschickt werden.

Bekomme ich das mit einem Arduino hin (das ist ja quasi Multitasking), oder brauche ich zwei Arduinos?

Danke & LG,
leinaD

maverick1509

Das ist kein Multitasking. Klar kannst du die Temperatur nur alle 10 oder 15 min abfragen und die
die Windgeschwindigkeit im Sekundentakt oder noch schneller.
Das kriegt der Arduino problemlos hin.
Gruß


jurs

#2
Jul 14, 2013, 04:01 pm Last Edit: Jul 14, 2013, 04:07 pm by jurs Reason: 1

Ich möchte verschiedene Sensoren (Temperatur, Feuchte, Hall) zu verschiedenen Zeiten / in verschiedenen Intervallen abfragen. Hintergrund: die aktuelle Windgeschwindigkeit, die mit einem Hall-Sensor ermittelt wird, muss kontinuierlich "überwacht" werden, die Temperatur muss jedoch nur alle 10 - 15 Minuten abgefragt werden.

Die zusammengestellten Daten werden dann alle 15 Minuten an einen entfernten Server geschickt; bei der Windgeschwindigkeit soll dabei ein Durchschnittswert über den letzten Zeitraum und der Spitzenwert (Böen) mitgeschickt werden.

Bekomme ich das mit einem Arduino hin (das ist ja quasi Multitasking), oder brauche ich zwei Arduinos?


Ein Arduino taktet mit 16 MHz, hat entprechend eine Rechenleistung von 16 MIPS, das sind 16 "Millionen Instruktionen pro Sekunde", und solange Du nicht mehr als diese 16 Millionen Instruktionen ("Maschinenbefehle") in einer einzigen Sekunde ausführen möchtest, kann ein einziger Arduino das erledigen.

Alles nur eine Frage der Programmlogik.

Anbei mal ein Programmvorschlag für einen Code, der im Halbsekundentakt, Dreisekundentakt und im Viertelstundentakt irgendwas erledigt, in dem Fall Ausgaben über den seriellen Monitor ausgibt.

Code: [Select]


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

boolean halbSekundenTakt()
// liefert true falls seit dem letzten Aufruf die Halbsekunde gewechselt hat
{
 static unsigned long alterWert;
 long halbeSekunden=millis()/500;
 if (halbeSekunden!=alterWert)
 {
   alterWert=halbeSekunden;
   return(true);  
 }
 else return(false);
}

boolean dreiSekundenTakt()
// liefert true falls seit dem letzten Aufruf ein neues 3-sec-Intervall begonnen hat
{
 static unsigned long alterWert;
 long dreiSekunden=millis()/3000;
 if (dreiSekunden!=alterWert)
 {
   alterWert=dreiSekunden;
   return(true);  
 }
 else return(false);
}


boolean viertelStundenTakt()
// liefert true falls seit dem letzten Aufruf ein neues Viertelstunden-Intervall begonnen hat
{
 static unsigned long alterWert;
 long viertelStunden=millis()/(15*60000L);
 if (viertelStunden!=alterWert)
 {
   alterWert=viertelStunden;
   return(true);  
 }
 else return(false);
}



void loop()
{
 if (halbSekundenTakt())
 {
   Serial.print("1/2 sec Tick ");
   Serial.println(millis());
 }  
 if (dreiSekundenTakt())
 {
   Serial.print("Jetzt sind 3 Sekunden um! ");
   Serial.println(millis());
 }  
 if (viertelStundenTakt())
 {
   Serial.print("Jetzt ist schon wieder eine Viertel Stunde um! ");
   Serial.println(millis());
 }  
 // Rest des loop-Codes hier
}


Da der Millis-Timer nach ca. 50 Tagen überläuft, würde diese Programmlogik dazu führen, dass immer jeweils nach 50 Tagen einmal der Takt unregelmäßig erfolgt und nicht eingehalten wird. Wenn man das nicht möchte und der Takt soll immer gleichmäßig kommen, also auch beim Überlauf alle 50 Tage, braucht man ein paar mehr Zeilen Code.

leinaD

Vielen Dank euch beiden!

maverick1509, ich hatte irgendwie vor Augen, dass die Windgeschwindigkeit dann 1x pro Sekunde erhoben wird, und dieser Prozess die selteneren "überlagert", also mehr als einer gleichzeitig ausgeführt wird - daher der Multitasking-Gedanke)

jurs, mit Deinem Beispiel kann ich schon mal sehr viel anfangen, danke!

Zu den Ausführungszeiten schwebt mir vor, noch eine Uhr (DCF 77) an den Arduino zu hängen, um wirklich zu den gewollten Uhrzeiten auszuführen, auch wenn der Strom mal weg war (:00, :15, :30, :45).

Wenn meine Sensoren da sind (leider zum teil aus China, das könnte ein bisschen dauern) und ich Teile des Scripts stehen habe, melde ich mich noch mal!

Go Up