ожидание без остановки тела

shamsing
Offline
Зарегистрирован: 17.06.2014

Здравствуйте, делаю что то примитивное для ТТ котла собираю разные коды в кучу, т.к. не живу в доме который отапливаю подключил sim800l смс получаю отправляю в целом работает, но есть проблема! Проверяю температуру, включаю эл.котел и отправляю смс если она упала, но после того как она упала смс летят пока температура не поднимется, а сделав delay для отправки смс остановил всю программу,а кроме этого чюдо оператора не чего не нашёл, собственно как и достойного и продуманного на модуле сим тоже,в основном простая задача которая естественно выполняется, буду рад если подскажитевариант решения, а то за пока температура поднимется пакет смс 10 раз закончится (

#include <unistd.h>
#include "max6675.h"
#include <DHT.h>
#define DHTTYPE DHT22
#define DHTPIN  13
//#include "SIM900.h"
#include <SoftwareSerial.h>
#include "sms.h"
SMSGSM sms;

int Rel1 = 5; // для реле 1
int Rel2 = 6; // для реле 2
int thermoDO = 11;  //он же SO
int thermoCS = 12;
int thermoCLK = 10;  //он же SCK
MAX6675 thermocouple(thermoCLK, thermoCS, thermoDO);
float tkot;
int numdata;
boolean started=false;
char smsbuffer[159];
char n[20];
String input_string = "";
String smsContent = "";
char pos;
int flag=0;

char n1[] = "+79*********";
//char n1[] = "+79*********";
char sendsms[159];

float hdom, tdom;
DHT dht(DHTPIN, DHTTYPE);

void setup() {

 dht.begin();
 pinMode(Rel1, OUTPUT);
 pinMode(Rel2, OUTPUT);
 digitalWrite(Rel1, HIGH);
 digitalWrite(Rel2, HIGH);

Serial.begin(9600);

       if (gsm.begin(9600)) {
          Serial.println("\nstatus=READY");
          started=true;
     } else Serial.println("\nstatus=IDLE");

}
void loop() { 
delay(2000);
hdom = dht.readHumidity();
tdom = dht.readTemperature();
tkot = thermocouple.readCelsius();
Serial.println("T dom = "+String(tdom,1)+" C \r\nH dom = "+String(hdom,1)+" % \r\nT kotla = "+String(tkot,1)+" C");

smsContent=("T dom = "+String(tdom,1)+" C \r\nH dom = "+String(hdom,1)+" % \r\nT kotla = "+String(tkot,1)+" C");
smsContent.toCharArray(sendsms,159);

if (tdom<=5 || tkot<=2) {
  digitalWrite(Rel1, LOW);
  getfail();
  //sms.SendSMS(n1, "Tdom < 5C \r\nVkl Eletto kot 2 kVt, Krit min temperatura");
  //flag=1;
  }
if (tdom<=2) {
  digitalWrite(Rel2, LOW);
  sms.SendSMS(n1, "Tdom < 2C \r\nVkl Eletto kot 4 kVt, Krit temperatura");
  flag=1;}
if (tdom>=17&&flag==1) {
  digitalWrite(Rel1, HIGH);
  digitalWrite(Rel2, HIGH);
  flag=0;}

pos = sms.IsSMSPresent(SMS_UNREAD); // смотрим непрочитанные СМС
      if (pos) {                    // Если непрочитанные СМС есть, то...
        
getsms(); // получаем непрочитанную СМС                    // Если непрочитанные СМС есть, то...

if (input_string=="11"){digitalWrite(Rel1, LOW);sms.SendSMS(n1, " Vkl Eletto kot 2 kVt");memset(n,0,20);}
else if (input_string=="21"){digitalWrite(Rel2, LOW);sms.SendSMS(n1, " Vkl Eletto kot 4 kVt");memset(n,0,20);flag=1;}
else if (input_string=="10"){digitalWrite(Rel1, HIGH);sms.SendSMS(n1, "Otkl Eletto kot 2 kVt");memset(n,0,20);}
else if (input_string=="20"){digitalWrite(Rel2, HIGH);sms.SendSMS(n1, "Otkl Eletto kot 4 kVt");memset(n,0,20);flag=0;}
else if (input_string=="T"){sms.SendSMS(n1, sendsms);memset(n,0,20);}
sms.DeleteSMS(pos);
delay(1000);
}
}

void getsms()
{
          sms.GetSMS(pos,n,20,smsbuffer,159);
          input_string =String(smsbuffer);
          Serial.println("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!:--------- " + input_string + "\n");
}

void getfail()
{
          sms.SendSMS(n1, "Tdom < 5C \r\nVkl Eletto kot 2 kVt, Krit min temperatura");
          delay(120000);
          flag=1;
}

 

nik182
Онлайн
Зарегистрирован: 04.05.2015

У Вас есть замечательная переменная flag. Если её добавить в условия срабатывания в сроке 66 то sms будет отправляться только 1 раз, конечно если обнулять её когда температура превысит 2 градуса.

shamsing
Offline
Зарегистрирован: 17.06.2014

Я вчера с 18:00 до 6:00 сегодня пытался работать с этой переменной но так не чего и не добился, либо она прибавляет один раз и шлёт смс нон-стоп , либо прибавляете , но без следующего условия 

b707
Онлайн
Зарегистрирован: 26.05.2017

shamsing пишет:

Я вчера с 18:00 до 6:00 сегодня пытался работать с этой переменной но так не чего и не добился, либо она прибавляет один раз и шлёт смс нон-стоп , либо прибавляете , но без следующего условия 

хм, казалось бы, все просто - отправили первую СМС, поставили флаг =1. Если флаг ==1 - новых СМС не отправялем. Когда температура поднялась выше критической. ставим флаг =0

И это ВСЕ

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

shamsing пишет:

Я вчера с 18:00 до 6:00 сегодня пытался работать с этой переменной 

Так у неё это время - неприёмные часы, вот и не получалось :) Надо строго с 9:00 до 17:00, пн-пт, перерыв на обед: 13:00-14:00, пятница - сокращённый день.

:)))

shamsing
Offline
Зарегистрирован: 17.06.2014

Во первых спасибо, я идиот просидевший 12 часов над оператором сравнения, просто привык что "=" это равно, а в С++: "=" это присвоение, а равно это "==", смс я остановил благодаря вам, но дальше всё равно не прибавляет, не смог час отправить коментарий и вот смог добиться что то на подобие счетчика, приблизительно через час и 10 минут смс повторится естественно если температура не выростет 

if ((tdom<=5 || tkot<=2)&&flag==0) {
  digitalWrite(Rel1, LOW);
  flag = 1;
  if (flag == 1) {
    Serial.println("SMS:"+String(tkot,1)+"Vkl Eletto kot 2 kVt, Krit min temperatura\r\n Flag= "+String(flag));
    //sms.SendSMS(n1, "Tdom < 5C \r\nVkl Eletto kot 2 kVt, Krit min temperatura");
    flag = flag + 1;
  }  
  else{
    flag = flag + 2; 
  }
}
else{
  flag = flag + 2;
  if (flag == 3600) {
    flag = 0;
  }
}

 

shamsing
Offline
Зарегистрирован: 17.06.2014

другого времени к сожалению нет, кроме как после работы и ночью заниматься этим (

shamsing
Offline
Зарегистрирован: 17.06.2014

а нет было помутнение, всё равно не работает

shamsing
Offline
Зарегистрирован: 17.06.2014

пришлось сделать так

if ((tdom<=5 || tkot<=10)&&flag==0) {
  digitalWrite(Rel1, LOW);
  flag = 1;
  if (flag == 1) {
    Serial.println("SMS:"+String(tkot,1)+"Vkl Eletto kot 2 kVt, Krit min temperatura\r\n Flag= "+String(flag));
    //sms.SendSMS(n1, "Tdom < 5C \r\nVkl Eletto kot 2 kVt, Krit min temperatura");
    flag = flag + 1;
  }  
  else{
    flag = flag + 2; 
  }
}
/*else{
  flag = flag + 2;
  if (flag == 3600) {
    flag = 0;
  }
}*/

смс отправляется один раз,но  к сожалению через час не повторяется, может пойму что я изменил , до этого работало както (

shamsing
Offline
Зарегистрирован: 17.06.2014

всё таки победил, и я сразу был прав что delay так себе помошник,хотя совсем не понимал суть своей проблемы 

  if ((tdom <= 4 || tkot <= 4) && flag == 0) {
    digitalWrite(Rel1, LOW);
    flag = 1;
    Serial.println("T dom = " + String(tdom, 1) + "\r\nT kotla = " + String(tkot, 1) + "\r\nVkl Eletto kot, 2 kVt, Krit min temperatura");
    smsContent1 = ("T dom = " + String(tdom, 1) + " C \r\nH dom = " + String(hdom, 1) + " % \r\nT kotla = " + String(tkot, 1) + " C\r\nVkl Eletto kot, 2 kVt, Krit min temperatura");
    smsContent1.toCharArray(simbol, 159);
    sms.SendSMS(n1,simbol);
  }
  else {
    if (millis() - last_time_sms > (unsigned long)60 * 60 * 1000) {
      last_time_sms = millis();
      flag = 0;
    }
  }

вот так работает и не вешает весь код