ожидание без остановки тела
- Войдите на сайт для отправки комментариев
Пнд, 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 минут смс повторится естественно если температура не выростет
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; } }другого времени к сожалению нет, кроме как после работы и ночью заниматься этим (
а нет было помутнение, всё равно не работает
пришлось сделать так
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; } }*/смс отправляется один раз,но к сожалению через час не повторяется, может пойму что я изменил , до этого работало както (
всё таки победил, и я сразу был прав что 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; } }вот так работает и не вешает весь код