leinaD:
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.
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.