ожидание без остановки тела
- Войдите на сайт для отправки комментариев
Пнд, 17/02/2020 - 01:53
Здравствуйте, делаю что то примитивное для ТТ котла собираю разные коды в кучу, т.к. не живу в доме который отапливаю подключил 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; }
У Вас есть замечательная переменная flag. Если её добавить в условия срабатывания в сроке 66 то sms будет отправляться только 1 раз, конечно если обнулять её когда температура превысит 2 градуса.
Я вчера с 18:00 до 6:00 сегодня пытался работать с этой переменной но так не чего и не добился, либо она прибавляет один раз и шлёт смс нон-стоп , либо прибавляете , но без следующего условия
Я вчера с 18:00 до 6:00 сегодня пытался работать с этой переменной но так не чего и не добился, либо она прибавляет один раз и шлёт смс нон-стоп , либо прибавляете , но без следующего условия
хм, казалось бы, все просто - отправили первую СМС, поставили флаг =1. Если флаг ==1 - новых СМС не отправялем. Когда температура поднялась выше критической. ставим флаг =0
И это ВСЕ
Я вчера с 18:00 до 6:00 сегодня пытался работать с этой переменной
Так у неё это время - неприёмные часы, вот и не получалось :) Надо строго с 9:00 до 17:00, пн-пт, перерыв на обед: 13:00-14:00, пятница - сокращённый день.
:)))
Во первых спасибо, я идиот просидевший 12 часов над оператором сравнения, просто привык что "=" это равно, а в С++: "=" это присвоение, а равно это "==", смс я остановил благодаря вам, но дальше всё равно не прибавляет, не смог час отправить коментарий и вот смог добиться что то на подобие счетчика, приблизительно через час и 10 минут смс повторится естественно если температура не выростет
другого времени к сожалению нет, кроме как после работы и ночью заниматься этим (
а нет было помутнение, всё равно не работает
пришлось сделать так
смс отправляется один раз,но к сожалению через час не повторяется, может пойму что я изменил , до этого работало както (
всё таки победил, и я сразу был прав что delay так себе помошник,хотя совсем не понимал суть своей проблемы
вот так работает и не вешает весь код