Can anyone help me with this problem? Why are calls made one by one after the threshold is exceeded if one call was supposed to make and then another if the temperature (after 10 minutes) is not above the threshold? Any advice on what to change in the code so that it makes another call after 10 minutes if the temperature is below the set temperature?
#include <OneWire.h>
#include <DallasTemperature.h>
#define BLYNK_TEMPLATE_ID "TMPL44_6bflrE"
#define BLYNK_TEMPLATE_NAME "Pomiar temperatury"
#define BLYNK_AUTH_TOKEN "XXXX"
#define BLYNK_PRINT Serial
#define TINY_GSM_MODEM_SIM800
#include <TinyGsmClient.h>
#include <BlynkSimpleTinyGSM.h>
char apn[] = "internet";
char user[] = "internet";
char pass[] = "internet";
#include <SoftwareSerial.h>
SoftwareSerial SerialAT(3, 2); // RX, TX
TinyGsm modem(SerialAT);
#define ONE_WIRE_BUS_1 4
#define ONE_WIRE_BUS_2 5
OneWire oneWire1(ONE_WIRE_BUS_1);
OneWire oneWire2(ONE_WIRE_BUS_2);
DallasTemperature sensors1(&oneWire1);
DallasTemperature sensors2(&oneWire2);
float temperatureThreshold = 15.0;
bool callInitiated = false;
bool callInProgress = false;
int ledPin = 7;
bool ledState = LOW;
int virtualLedPin = V2;
unsigned long callCooldown = 600000; // Czas oczekiwania między kolejnymi połączeniami (10 minut w milisekundach)
unsigned long lastTempReadTime = 0;
const long tempReadInterval = 5000; // Odczyt temperatury co 5 sekund
unsigned long lastLedToggleTime = 0;
const long ledToggleInterval = 500; // Migotanie diody co 0.5 sekundy
unsigned long lastCallTime = 0;
void setup()
{
Serial.begin(9600);
delay(10);
SerialAT.begin(9600);
delay(3000);
Serial.println("Inicjalizacja modemu...");
modem.restart();
Blynk.begin(BLYNK_AUTH_TOKEN, modem, apn, user, pass);
sensors1.begin();
sensors2.begin();
pinMode(ledPin, OUTPUT);
Blynk.virtualWrite(virtualLedPin, LOW);
}
void initiateCall()
{
Serial.println("Inicjacja połączenia...");
SerialAT.println("ATDxxxxxxx;");
delay(10000);
SerialAT.println("ATH");
lastCallTime = millis();
}
void loop()
{
Blynk.run();
unsigned long currentMillis = millis();
sensors1.requestTemperatures();
float temperature1 = sensors1.getTempCByIndex(0);
sensors2.requestTemperatures();
float temperature2 = sensors2.getTempCByIndex(0);
Serial.print("Temperatura 1: ");
Serial.println(temperature1);
Serial.print("Temperatura 2: ");
Serial.println(temperature2);
bool temperatureBelowThreshold = (temperature1 < temperatureThreshold || temperature2 < temperatureThreshold);
if (temperatureBelowThreshold && !callInitiated && !callInProgress)
{
Serial.println("Temperatura poniżej progu! Wykonywanie akcji...");
callInitiated = true;
callInProgress = true;
initiateCall();
}
else if (callInProgress && (currentMillis - lastLedToggleTime >= ledToggleInterval))
{
Serial.println("Migotanie diody: warunek spełniony");
lastLedToggleTime = currentMillis;
ledState = !ledState;
digitalWrite(ledPin, ledState);
Blynk.virtualWrite(virtualLedPin, ledState);
Serial.println("Migotanie diody: wykonano");
}
if (currentMillis - lastTempReadTime >= tempReadInterval)
{
lastTempReadTime = currentMillis;
Blynk.virtualWrite(V0, temperature1);
Blynk.virtualWrite(V1, temperature2);
}
if (temperatureBelowThreshold && (currentMillis - lastCallTime >= callCooldown) && (currentMillis - lastLedToggleTime >= ledToggleInterval))
{
callInitiated = false;
callInProgress = false;
Serial.println("Resetowanie flagi połączenia...");
}
}