Отправка сообщения о состоянии с геркона
- Войдите на сайт для отправки комментариев
Вс, 01/09/2019 - 21:26
Всех приветствую, возник вопрос, в общем, написал скетч на ардуино - "управление реле по смс с ответным сообщением", нужно сделать так, чтобы при проверке замкнутого или разомкнутого состоянии геркона приходило ОДНО ответное сообщение, а не бесконечное кол-во, скетч прилагаю
#include <DallasTemperature.h>
#define DS18B20 4
#include "SIM900.h"
#include <SoftwareSerial.h>
#include "sms.h"
SMSGSM sms;
OneWire oneWire(DS18B20);
DallasTemperature sensors(&oneWire);
int Rel1 = 11; // для реле 1
int Rel2 = 12; // для реле 2
int numdata;
boolean started=false;
char smsbuffer[160];
char n[20];
String input_string = "";
String smsContent = "";
char pos;
int flag=0;
char n1[] = "xxxxxxxxxxx"; // номер скрыл специально
char sendsms[160];
void setup() {
sensors.begin();
// gprsSerial.begin(4800);
pinMode(7, INPUT_PULLUP);
pinMode(Rel1, OUTPUT);
pinMode(Rel2, OUTPUT);
digitalWrite(Rel1, 0);
digitalWrite(Rel2, 0);
pinMode(13, OUTPUT);
Serial.begin(9600);
if (gsm.begin(9600)) {
Serial.println("\nstatus=READY");
started=true;
} else Serial.println("\nstatus=IDLE");
for(pos=1;pos<=21;pos++) {
sms.DeleteSMS(pos);
}
input_string = "";
}
void loop() {
int State = !digitalRead(7);
delay(2000);
sensors.requestTemperatures();
Serial.println(sensors.getTempCByIndex(0));
smsContent=("T = "+String(sensors.getTempCByIndex(0)));
smsContent.toCharArray(sendsms,160);
if(State == 1){ // проверка состояния геркона
flag1 = 1;
if(flag1 == 1){
sms.SendSMS(n1, "dver zakryta");memset(n,0,20);
}
delay(3000);
digitalWrite(13, 1);
flag1 = 0;
}
if(State == 0){
flag2 = 1;
if(flag2 == 1){
sms.SendSMS(n1, "dver otkryta");memset(n,0,20);
}
delay(3000);
digitalWrite(13, 0);
flag2 = 0;
}
pos = sms.IsSMSPresent(SMS_UNREAD);
if (pos) {
getsms(); // получаем непрочитанную СМС
if (input_string=="Off1"){digitalWrite(Rel1, LOW);sms.SendSMS(n1, "Otkluchen svet");memset(n,0,20);}
else if (input_string=="Off2"){digitalWrite(Rel2, LOW);sms.SendSMS(n1, "Otkluchena ventilyaciya");memset(n,0,20);flag=1;}
else if (input_string=="On1"){digitalWrite(Rel1, HIGH);sms.SendSMS(n1, "Vkluchen svet");memset(n,0,20);}
else if (input_string=="On2"){digitalWrite(Rel2, HIGH);sms.SendSMS(n1, "Vkluchena ventilyaciya");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,160);
// Serial.println(n);
// Serial.println(smsbuffer);
input_string = String(smsbuffer);
Serial.println("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!:--------- " + input_string + "\n");
}
как тут говорят, принято к сведению.
Nailoren - принцип простой: запоминайте состояние геркона при посылке сообщения
И пока состояние геркона не изменится - новых сообщений не отсылайте.
b707, спасибо. А не подскажите как это реализовать?
Какого ответа кроме "руками" Вы ждёте?
Кончайте хитрить, Вы хотите чтоб это сделали за Вас.
Ничего подобного, просто подскажите, это булеаном реализуется?
У вас сейчас состояние геркона читается в переменную State. Заведите еще одну переменную, назовите, например, prev_State - "прежнее состояние". Каждый раз, когда вы считываете состояние геркона - сравнивайте текущее состояние State с предыдущим. Если они разные - значит геркон переключился. Вот только тогда и нужно отсылать СМС.
Не забывайте при отсылке СМС запоминать новое состояние геркона в переменной prev_State. И позаботьтесь. чтобы эта переменная не сбрасывалась в цикле loop()
Вот, описал максимально подробно, просто-таки разжевал. Пока не выполните эти рекомендации - больше вопросов не задавайте. Если и теперь не понятно - это просто означает. что вы в программировании НИЧЕГО НЕ ПОНИМАЕТЕ и вам для начала надо учиться, прочитать какой-нить учебник для чайников.
Спасибо b707, вот такой ответ мне и нужен был!
Проект работает, на поставленный мною вопрос решение найдено! Адекватным - спасибо!
а где скетч? нужно чтобы вы выложили скетч.