Hallo, bin der Jens und neu hier,
ich quäle mich seit drei Tagen mit meinem Sketch rum.
Ich starte mit einem Empfangshandy meine Standheizung am Auto.
Funktioniert bis jetzt super.
Grober Ablauf:
Rufe Handy an
Arduino startet Standheizung
nach 10 min.
Arduino schaltet Standheizung wieder aus.
Ich möchte gerne den Sketch ändern um in den 10 min, in der die Standheizung läuft durch einen zweiten Anruf (lange anklingeln) die Standheizung ausschalten können.
Ich sage nur delay :o
Ich weiß nicht wo der Sketch hin muss, füge den einfach mal mit hier ein...
Bitte nicht hauen
int eingang= A0;
int Handy = 0;
long startTime;
long Dauer;
void setup()
{
Serial.begin(9600);
pinMode (11,OUTPUT); //Standheizung
}
void loop()
{
digitalWrite(11,HIGH);
Handy =analogRead(eingang);
Serial.print("Handy = ");
Serial.println(Handy);
if (Handy <500)
startTime = millis();
long Dauer = millis() - startTime;
Serial.print("Dauer = ");
Serial.println(Dauer);
if (Dauer >1000) //Unterdrückung beim Handy einschalten
{
digitalWrite(11, LOW); //ansteuerung Standheizung start
Serial.println("Standheizung start");
delay(2000); //drücken
digitalWrite(11,HIGH);
Serial.println("Standheizung läuft...");
delay (600000); //Laufzeit bis...
digitalWrite(11, LOW); //ansteuerung Standheizung aus
Serial.println("Standheizung aus");
delay(2000); //drücken
digitalWrite(11,HIGH);
}
delay(1000);
}
Was muss ich ändern um in der Laufzeit einen Anruf registrieren zu können?
Damit das mit dem abschalten funktioniert, dürfen keine Delays eingesetzt werden.
Du musst millis() verwenden, nach dem Beispiel BlinkWithoutDelay.
Sieh dir das in den Beispielen der IDE an.
Ja, das auch. Aber hauptsächlich muss loop komplett anders funktionieren: Statt 600 Sekunden sollte ein Durchlauf 0 Millisekunden dauern. In 0 Millisekunden kann man locker prüfen, wieviel Zeit seit dem Start der 600 Sekunden vergangen ist, und ob sonst noch was anderes zu prüfen ist.
Zum Anfangen vieleicht etwa so, habs aber nicht prüfen können weil nur im Notepad geschrieben:
const int eingang = A0;
const int standheizung = 11;
uint16_t handy = 0; // wird nie negativ
uint32_t previousMillis;
const uint32_t einschaltzeit = 600000UL;
enum modis {bereitschaft, aktiv}; // mögliche Modi der Statemaschine
modis aktuell; // eine Variable zum merken des globalen Modus
void setup()
{
Serial.begin(115200); // BITTE, wir haben 2018 da warte ich doch nicht auf 9600 Baud
pinMode (standheizung, OUTPUT);
}
void triggerStandheizung()
{
digitalWrite(standheizung, LOW); //ansteuerung Standheizung
Serial.println(F("Standheizung getriggert"));
delay(2000); // taster loslassen
digitalWrite(standheizung, HIGH);
}
void loop()
{
switch (aktuell)
{
case bereitschaft :
handy = analogRead(eingang);
if (handy < 500)
{
Serial.println(F("Standheizung start"));
triggerStandheizung();
Serial.println(F("Standheizung soll wohl laufen..."));
previousMillis = millis();
aktuell = aktiv; // Zum anderen Modus der Statemaschine übergehen
}
break;
case aktiv :
if (millis() - previousMillis >= einschaltzeit) // da vieleicht noch was dazu für dein Handy-Startup, das hast aber nicht beschrieben und somit bekommst du das auch nicht gratis ;-P
{
Serial.println(F("Standheizung aus"));
triggerStandheizung();
aktuell = bereitschaft; // Zum anderen Modus der Statemaschine übergehen
}
}
}
der lange "Tastendruck" ist immer noch hässlich, aber hatte keine Lust mehr.
BITTE, wir haben 2018 da warte ich doch nicht auf 9600 Baud
Das ist nun wirklich völlig egal.
9600 ist schneller als ich lesen kann. Wenn es darum geht, große Datenmengen schnell zu übertragen, ist heutzutage Serial vielleicht nicht die optimale Lösung. Aber darum geht es hier nicht.