Neuling benötigt Hilfe für Telestart

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?

Danke im voraus, Jens

Ich sage nur delay :o

Wenn du es schon weißt, dann ahnst du sicher auch die Antwort: Mach es ohne delay

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.

BlinkWithoutDelay habe ich mir schon angeguckt... ist mir sehr unverständlich.
Dann muss ich wohl noch weiter versuchen das zu verstehen.

Jenser:
BlinkWithoutDelay habe ich mir schon angeguckt... ist mir sehr unverständlich.
Dann muss ich wohl noch weiter versuchen das zu verstehen.

Ja, das solltest du unbedingt.
Nur wenn du es verstehst, kannst du es auch richtig umsetzen.

Du musst millis() verwenden

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 :smiley:
danke erstmal, ich versuch das in naher Zukunft zu kapieren

BITTE, wir haben 2018 da warte ich doch nicht auf 9600 Baud :smiley:

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.

... mein Code - meine Regeln ... :wink: