Timer aktivieren

Hallo liebe Community,
ich benötige Hilfe bei meinem Projekt. Soweit steht alles und funktioniert auch alles, nun will ich einen timer einbinden, den ich per BlynkApp starte bzw. aktiviere. Wenn die Zeit ,,x" abgelaufen ist, soll PIN13(LED) an dem ein SSR angeschlossen ist, ausgeschaltet werden (LOW).
Funktion: Der Temperatursensor MAX6675 misst die Temperatur und hält diese mit Hilfe des Relais. Wenn die Solltemperatur erreicht wurde, soll für eine Zeit ,,x" die Temperatur gehalten werden und dann automatisch abschalten. Weiß jemand weiter? Hänge da gerade.
Danke :slight_smile:

#define BLYNK_TEMPLATE_ID "TMPLyYek5f7e"
#define BLYNK_DEVICE_NAME "Autoklav1"
#define BLYNK_FIRMWARE_VERSION        "0.1.0"
#define BLYNK_PRINT Serial

#include <max6675.h>
#include <Wire.h>
#include <U8x8lib.h>
#include <U8g2lib.h>
#include "BlynkEdgent.h"                                            //Bibliothek für die Verbindung mit der Blynk App über WLAN

U8X8_SH1106_128X64_NONAME_HW_I2C u8x8(/* reset=*/ U8X8_PIN_NONE);   // Display 128x64 ausgewählt in Bibliothek

int ktcSO = 19;                                                     // ktcSO deklariert und auf PIN 19 initialisiert
int ktcCS = 5;
int ktcCLK = 18;

int LED = 13;                                                       // LED deklariert und PIN 13 initialisiert
double solltemp = 121;                                              // solltemp deklariert und mit 26 initialisiert
double hyst = 2;                                                    // Hystherese deklariert
int temp = 0;


BlynkTimer timer;
//WidgetLED led1(V3);



MAX6675 ktc(ktcCLK, ktcCS, ktcSO);                                  // Sensor MAX6675 für Temperatur Sensor Typ K


BLYNK_WRITE(V1)                                                     // Schreibt virtuellen PIN 3 in Blynk
{
  solltemp = param.asDouble();                                      // Sollwert = Parameter als Double (für Slider)
}

BLYNK_WRITE(V2)
{
  hyst = param.asDouble();                                          // Hystherese = Parameter als Double (für Slider)
}

BLYNK_WRITE(V3) {                                                   // Switch Widget for Timer
  int pinValue = param.asInt();
}

void setup()
{
  Serial.begin(9600);                                               // Serielle Schnittstelle, serieller Monitor, Baudrate 9600
  Serial.println("Max6675 test");
  pinMode(LED, OUTPUT);                                             // deklariert LED als Output
  timer.setInterval(1000L, sensorDataSend);                         

  
  u8x8.begin();
  //Der Bildschirm hat ein Raster aus Bildpunkten
  //Pixel oder Bildpunkt: Ein Kästchen des Rasters

  u8x8.setFont(u8x8_font_7x14_1x2_f);
  // u8x8 Library mit der man sehr einfach Texte darstellen kann, Schriftgröße nur 8x8 Pixel, kaum Schriftarten
  // => wenig Ressourcen
  // bei u8x8 arbeitet man mit Zeilen und Spalten
  // bei u8g2 arbeitet man mit Pixeln

  u8x8.drawString(0, 1, "   Autoklav 1  ");                          // 0. Zeichen von links in der 1. Spalte von oben wird geschrieben
  u8x8.drawString(0, 3, "Temp:");
  u8x8.drawString(0, 5, "Soll:");
  u8x8.drawString(11, 3, " °C");                                     // 11. Zeichen von links in der 3. Spalte von oben wird geschrieben
  u8x8.drawString(12, 5, "°C");
  u8x8.drawString(12, 5, " ");
  u8x8.setCursor(7, 1);

  BlynkEdgent.begin();                                               // Kommunikation mit der Blynk 2.0 App
}



void sensorDataSend() {
  temp = ktc.readCelsius();
  Blynk.virtualWrite(V0, temp);                                      //Schreibt die gemessene Werte auf die virtuellen PINs in der Blynk APP
  Blynk.virtualWrite(V1, solltemp);
  Blynk.virtualWrite(V2, hyst);

  if (ktc.readCelsius() > solltemp) {                                // wenn die gemessene Temperatur < der angegebene Sollwert
    digitalWrite(LED, LOW);                                          // dann LED an bzw. PIN an
  }
  else if (ktc.readCelsius() <= solltemp - hyst) {                   // Hystherese, damit das Relais nicht ununterbrochen schaltet
    digitalWrite(LED, HIGH);                                         // sonst LED aus bzw. Pin aus
  }

  Serial.print("Temperatur = ");                                   // Ausgabe im seriellen Monitor
  Serial.print(ktc.readCelsius());
  Serial.println(" °C");

  u8x8.setCursor(8, 3);                                            // Stellt den Cursor zum schreiben an das 9. Zeichen von links und die 3. Spalte von oben
  // schreibt eine Leerzeile an angegebene Stelle, wenn der Wert unter 100 ist umd die erste Ziffer zu löschen
  if (ktc.readCelsius() < 100) u8x8.drawString(12, 3, " ");
  u8x8.print(ktc.readCelsius(), 1);                                // schreibt an der oben genannten Stelle den Messwert (eine Nachkommastelle: ,1)
  u8x8.setCursor(8, 5);
  if (solltemp < 100) u8x8.drawString(12, 5, " ");
  u8x8.print(solltemp, 1);


}

void loop() {

  BlynkEdgent.run();
  timer.run();

}

Hallo
Was für eine Last hast du am SSR angeschlossen?

Wenn ich das richtig verstehe, dann heizt Du doch, bis an der Stelle die Solltemp erreicht ist.

Was suchst Du jetzt?
Willst Du den Teil des Codes eine bestimmte Zeit ausführen und dann (in was für einen Zustand) zurückkehren?

Ich würde das als Schrittkette bauen.
warte auf Start - heize auf - halte Temperatur xx Zeit - kühle aus - gehe zu warte auf Start.
Die Zeit kannst Du dann variabel bestimmen.

Hallo,
du könntest mit millis() einen "delayof" function bauen und die verwenden.
Heinz

Genau, jetzt wird geheizt bis eine bestimmte Temperatur erreicht wurde ( welche über die BlynkApp frei auszuwählen ist). Nun möchte ich, dass wenn die Temperatur erreicht wurde, nach z.B. 60min abgeschaltet wird.

Wenn der Code unsauber ist oder man etwas besser machen könnte, bin ich für jeden Ratschlag dankbar. :slight_smile:

Hi,
2000 Watt, 230V

Hallo,
ich hab von Blynk keine Ahnung. Du könntest eine Schrittkette verwenden.(aus, aufheizen, regeln)

Ich hab da mal was aus meiner Bastelkiste rausgesucht um Dir zu zeigen wie man das machen kann. Allerdings wird das Ganze mit einem Taster an Pin3 gestartet. Das musst Du für die App anpassen. In der App musst du ja eh einen Startbutton haben. Der Istwert wird über einen Analogeingang eingelesen und auf 0-100 gemappt, das muss auch angepasst werden.
Heinz


byte const startpin = 3; // button gehen GND
byte const outpin = 13;   // interne LED beim UNO Ausgang zum Heizen
byte const messpin = A1;  // Istwert
int sollwert = 25; // fest zum testen
int istwert;
int hyst = 1;
bool start;
uint32_t startzeit;
uint32_t laufzeit = 30000;

enum Ablauf { aus , aufheizen, regeln};
Ablauf zustand = aus;

void setup() {
  Serial.begin(115200);
  pinMode(startpin, INPUT_PULLUP);
  pinMode (outpin, OUTPUT);
}

void loop() {
  istwert = map(analogRead(messpin), 0, 1023, 0, 100); // z.B 0-100 Grad
  switch (zustand) {
    case aus:
      digitalWrite(outpin, LOW);
      start = !digitalRead(startpin);
      if (start)zustand = aufheizen;
      break;
    case aufheizen:
      digitalWrite(outpin, HIGH);
      if (istwert >= sollwert) {
        startzeit = millis();
        zustand = regeln;
      }
      break;
    case regeln:
      if (istwert <= sollwert - hyst) digitalWrite(outpin, HIGH);
      if (istwert >= sollwert) digitalWrite(outpin, LOW);
      if (millis() - startzeit >= laufzeit) {
        zustand = aus;
      }
      break;
  }
  anzeige();
}

void anzeige() {
  static uint32_t altzeit;
  if ( millis() - altzeit >= 1000) {
    altzeit = millis();
    Serial.print(sollwert); Serial.print("\t");
    Serial.print(istwert); Serial.print("\t");
    Serial.println(zustand);
  }
}

Vielen Dank für deinen Tipp Heinz. Ich habe das Ganze jetzt so gelöst:

bool timer_flag;

BLYNK_WRITE(V4)
{
  int pinValue = param.asInt();
  if (pinValue == 1)
    Serial.print("\nTaste in Blynk wurde gedrückt");
  {
    timer_flag = true;
    timer.setTimeout(timerZeit, []()
    {
      Serial.print("\nTimer läuft");
      digitalWrite(LED, LOW), led1.off();
      Serial.print("\nTimer ist abgelaufen - ausschalten");
      timer_flag = true;
    });
  }
}

//loop:

void sensorDataSend() {                                              // Timer: jede Sekunde wird der Sensor ausglesen und ausgegeben
  // hält den void-loop sauber damit die Blynk Cloud nicht mit Daten überlastet wird

  temp = ktc.readCelsius();
  Blynk.virtualWrite(V0, temp);                                      //Schreibt die gemessene Werte auf die virtuellen PINs in der Blynk APP
  Blynk.virtualWrite(V1, solltemp);
  Blynk.virtualWrite(V2, hyst);
  Blynk.virtualWrite(V5, timerZeit);


  if (timer_flag == false) {
    Serial.print("\nflag ist aus");
    if (ktc.readCelsius() > solltemp)
    {
      digitalWrite(LED, LOW), led1.off();
      Serial.print("\nTemperatur ist höher als Soll - ausschalten");
    }
    else if (ktc.readCelsius() <= solltemp - hyst)
    {
      digitalWrite(LED, HIGH), led1.on();
      Serial.print("\nTemperatur ist niedriger als Soll - anschalten");
    }
  }

  Serial.print("\nTemperatur = ");                                  // Ausgabe im seriellen Monitor
  Serial.print(ktc.readCelsius());
  Serial.println(" °C");

  u8x8.setCursor(8, 3);                                             // Stellt den Cursor zum schreiben an das 9. Zeichen von links und die 3. Spalte von oben
                                                                    // schreibt eine Leerzeile an angegebene Stelle, wenn der Wert unter 100 ist und die erste Ziffer zu löschen
  if (ktc.readCelsius() < 100) u8x8.drawString(12, 3, " ");
  u8x8.print(ktc.readCelsius(), 1);                                 // schreibt an der oben genannten Stelle den Messwert (eine Nachkommastelle: ,1)
  u8x8.setCursor(8, 5);
  if (solltemp < 100) u8x8.drawString(12, 5, " ");
  u8x8.print(solltemp, 1);


}

Gruß ericsson