Отправка сообщения о состоянии с геркона

Nailoren
Offline
Зарегистрирован: 30.10.2018

Всех приветствую, возник вопрос, в общем, написал скетч на ардуино - "управление реле по смс с ответным сообщением", нужно сделать так, чтобы при проверке замкнутого или разомкнутого состоянии геркона приходило ОДНО ответное сообщение, а не бесконечное кол-во, скетч прилагаю

#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");
}    

 

MaksVV
Offline
Зарегистрирован: 06.08.2015

как тут говорят, принято к сведению. 

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

Nailoren - принцип простой: запоминайте состояние геркона при посылке сообщения

И пока состояние геркона не изменится - новых сообщений не отсылайте.

Nailoren
Offline
Зарегистрирован: 30.10.2018

b707, спасибо. А не подскажите как это реализовать?

sadman41
Offline
Зарегистрирован: 19.10.2016

Nailoren пишет:
b707, спасибо. А не подскажите как это реализовать?

Какого ответа кроме "руками" Вы ждёте?

Logik
Offline
Зарегистрирован: 05.08.2014

Nailoren пишет:
b707, спасибо. А не подскажите как это реализовать?

Кончайте хитрить, Вы хотите чтоб это сделали за Вас. 

Nailoren
Offline
Зарегистрирован: 30.10.2018

Ничего подобного, просто подскажите, это булеаном реализуется?

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

Nailoren пишет:
Ничего подобного, просто подскажите, это булеаном реализуется?

У вас сейчас состояние геркона читается в переменную State. Заведите еще одну переменную, назовите, например, prev_State - "прежнее состояние". Каждый раз, когда вы считываете состояние геркона - сравнивайте текущее состояние State с предыдущим. Если они разные - значит геркон переключился. Вот только тогда и нужно отсылать СМС.

Не забывайте при отсылке СМС запоминать новое состояние геркона в переменной prev_State. И позаботьтесь. чтобы эта переменная не сбрасывалась в цикле loop()

 

Вот, описал максимально подробно, просто-таки разжевал. Пока не выполните эти рекомендации - больше вопросов не задавайте. Если и теперь не понятно - это просто означает. что вы в программировании НИЧЕГО НЕ ПОНИМАЕТЕ и вам для начала надо учиться, прочитать какой-нить учебник для чайников.

Nailoren
Offline
Зарегистрирован: 30.10.2018

Спасибо b707, вот такой ответ мне и нужен был!

Nailoren
Offline
Зарегистрирован: 30.10.2018

Проект работает, на поставленный мною вопрос решение найдено! Адекватным - спасибо!

MaksVV
Offline
Зарегистрирован: 06.08.2015

а где скетч? нужно чтобы вы выложили скетч.