Hi,
I have another question.
When I have pressed the button in blynk(V4) and the timer is running, the LED(pin13) no longer switches on even though the set temperature has not been reached. Where is the bug, do you have an idea?
Thanks in advance
#define BLYNK_TEMPLATE_ID "TMPLvmzlelxk"
#define BLYNK_DEVICE_NAME "Autoklav3"
#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; // ktcCS deklariert und auf PIN 5 initialisiert
int ktcCLK = 18; // ktcCLK deklariert und auf PIN 18 initialisiert
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; // mit 0 initialisiert, da kein expliziter Wert deklariert wurde.
int timerZeit = 0; // mit 0 initialisiert, da kein expliziter Wert deklariert wurde.
bool timer_flag; // Flag Variable als boolschen Wert um Schleife zu kontrollieren
BlynkTimer timer;
WidgetLED led1(V3);
WidgetLED ledTimer(V6);
MAX6675 ktc(ktcCLK, ktcCS, ktcSO); // Initialisierung 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(V5) {
timerZeit = param.asInt() * 60000; // Timer, einstellbar über Slider in Blynk 60.000 Millisekunden = 1 Minute
}
BLYNK_WRITE(V7) // Reset des Conrollers über Taster in Blynk APP
{
if (param.asInt()==1) {
delay(100);
ESP.restart();
}
}
BLYNK_CONNECTED() // fordert den Blynk-Server an, die neuesten Werte für jeden der aufgelisteten virtuellen Pins zu senden.
// Wenn diese Werte vom Server gesendet werden, werden die entsprechenden BLYNK_WRITE(vPin)-Funktionen ausgelöst
{
Blynk.syncVirtual(V1); // Solltemperatur, Slider in Blynk
Blynk.syncVirtual(V2); // Hystherese, Slider in Blynk
Blynk.syncVirtual(V5); // Timer Zeiteinstellung, Slider in Blynk
}
BLYNK_WRITE(V4)
{
int pinValue = param.asInt();
if (pinValue == 1) {
Serial.print("\nTaste in Blynk wurde gedrückt");
ledTimer.on();
timer_flag = true;
timer.setTimeout(timerZeit, []()
{
Serial.print("\nTimer läuft");
digitalWrite(LED, LOW);
led1.off();
ledTimer.off();
Serial.print("\nTimer ist abgelaufen - ausschalten");
timer_flag = true;
});
}
else{
digitalWrite(LED, HIGH);
led1.on();
ledTimer.off();
}
}
void setup()
{
Serial.begin(9600); // Serielle Schnittstelle, serieller Monitor, Baudrate 9600
Serial.println("\nMax6675 test");
pinMode(LED, OUTPUT); // deklariert LED als Output
timer.setInterval(1000L, sensorDataSend); // Timer jede Sekunde werden die Daten gelesen
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 3 "); // 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() { // 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);
if (timer_flag == false) { // flag als variable
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) // wenn gemessene Temperatur <= Solltemperatur - Hystherese über Slider in Blynk
{
digitalWrite(LED, HIGH); // dann LED bzw. Relais an
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
if (ktc.readCelsius() < 100) u8x8.drawString(12, 3, " "); // schreibt eine Leerzeile an angegebene Stelle, wenn der Wert unter 100 ist und die erste Ziffer zu löschen
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);
if (solltemp <= 0 || solltemp < 10) u8x8.drawString(11, 5, " ");
}
void loop() {
BlynkEdgent.run(); // Handshake mit dem Blynk Server
timer.run(); // startet den Timer (sensorDataSend)
}