ARDUINO Сигнализация на ардуино и SIM800l

mr.Leks

✩✩✩✩✩✩✩
31 Май 2022
3
0
Добрый вечер. Как то собирал сигнализацию на дачу по данной схеме
Новый точечный рисунок (4).jpg
Отработала пару лет нормально, появилось желание добавить управление по смс.
Попалась статья про управление нагрузкой по смс

Попробовал их объединить что бы при получении смс сигнализация отключалась и включалась но без реле, а назначенные пины меняли свои параметры....или значения
получилось так:
C++:
String numberCall_1 = "7951*******";                                 // Номер абонента №1 для звонка
String numberSMS_1 = "+7951*******";                                 // Номер абонента №1 для СМС (отличается только знаком +)
//
String numberCall_2 = "7951*******";                                 // Номер абонента №2 для звонка
String numberSMS_2 = "+7951*******";                                 // Номер абонента №2 для СМС (отличается только знаком +)
//
String textZone_1 = "OPEN! 1-Front door";                            // Свое название зоны ,  на латинице.
String textZone_2 = "OPEN! 2-Home door";                             // Свое название зоны ,  на латинице.
String textZone_3 = "OPEN! 3-Back door";                             // Свое название зоны ,  на латинице.
String textZone_4 = "220V OFF";                                      // Свое название зоны ,  на латинице.
//
#include <SoftwareSerial.h>                                          // Подключение библиотеки
SoftwareSerial mySerial(11, 12);                                     // 11 - RX Arduino к (TX mySerialL), 12 - TX Arduino к (RX mySerialL)
//Далее создаем переменную «incomingByte» для хранения SMS сообщения и указываем к каким выводам подключено реле.
 char incomingByte;
 String inputString;
 int sens_1 = A0;                                                    // Вывод управления светодиода красного
 int sens_2 = A1;                                                    // Вывод управления светодиода зеленого
 int sens_3 = A2;
const int pinSensor_0 = 4;       // контакты Arduino D4
const int pinSensor_1 = 5;       // контакты Arduino D5
const int pinSensor_2 = 6;       // контакты Arduino D6
const int pinSensor_3 = 7;       // контакты Arduino D7
const int pinSensor_4 = 8;       // контакты Arduino D8

void initGSM(void) {
                                        
          pinMode(sens_1, OUTPUT);                                  // Установим вывод как выход
          digitalWrite(sens_1, HIGH);                               // Устанавливаем высокий уровень
          pinMode(sens_2, OUTPUT);                                  // Установим вывод как выход
          digitalWrite(sens_2, LOW);                               // Устанавливаем высокий уровень
                                    
 
          delay(2000);                           
          mySerial.begin(9600);                                      // Выставляем скорость общения с GSM-модулем 9600 Бод/сек. 
          Serial.begin(9600);                                        // подключаем монитор порта
                                        
          while(!mySerial.available()){                              // Зацикливаем и ждем инициализацию mySerialL
          mySerial.println("AT");                                    // Отправка команды AT
          delay(1000);                                               // Пауза
          Serial.println("Подключение к SIM800L");                  // Печатаем текст
   }
          Serial.println("Подключено!");                             // Печатаем текст

    

    
    
    


          mySerial.println("AT+CMGF=1");                             // Включаем текстовый режим
          delay(1000);                                               // Задержка времени
          mySerial.println("AT+CNMI=1,2,0,0,0");                     // Отправка команды AT+CNMI=1,2,0,0,0
          delay(1000);                                               // Пауза
          mySerial.println("AT+CMGL=\"REC UNREAD\"");
          mySerial.println("AT+CLIP=1");                             // Включение АОН
          Serial.print(" Настройки установлены ");                  // выводим текст на монитор

          delay(300);                                                // Задержка времени
                                      
                    


                    
                    
}

void sendSMS(String text, String phone)  // Процедура Отправка SMS
{
  Serial.println("SMS send started");
  mySerial.println("AT+CMGS=\"" + phone + "\"");
  delay(500);
  mySerial.print(text);                         
  delay(500);
  mySerial.print((char)26);
  delay(500);
  Serial.println("SMS send complete");
  delay(2500); 
}


unsigned long timerTemp = 0; 
uint8_t hours = 0;           

uint8_t flagSensor_0 = 0;
uint8_t flagSensor_1 = 0;
uint8_t flagSensor_2 = 0;
uint8_t flagSensor_3 = 0;
uint8_t flagSensor_4 = 0;

void setup() {
  mySerial.begin(9600);
  initGSM();
 
  pinMode(pinSensor_0, INPUT);
  pinMode(pinSensor_1, INPUT);
  pinMode(pinSensor_2, INPUT);
  pinMode(pinSensor_3, INPUT);
  pinMode(pinSensor_4, INPUT);

  timerTemp = millis();
}

void loop() {
 
 
        
 

   if(mySerial.available()){                                          // Проверяем, если есть доступные данные
       delay(100);                                                    // Пауза
      while(mySerial.available()){                                    // Проверяем, есть ли еще данные.   
      incomingByte = mySerial.read();                                 // Считываем байт и записываем в переменную incomingByte   
      inputString += incomingByte;                                    // Записываем считанный байт в массив inputString   
    }   
       delay(1000);                                                   // Пауза       
       Serial.println(inputString);                                   // Отправка в "Мониторинг порта" считанные данные
       inputString.toUpperCase();                                     // Меняем все буквы на заглавные   
       if (inputString.indexOf("OFF") > -1){                          // Проверяем полученные данные, если OFF выключаем все каналы
        digitalWrite(sens_1, LOW); digitalWrite(sens_2, HIGH);
          if(flagSensor_0 <= 3 ) flagSensor_0 = 3;
//          if(flagSensor_0 <= 3 ) flagSensor_0 = 3; Serial.println(flagSensor_0);         
          if(flagSensor_1 <= 3 ) flagSensor_1 = 3;       
          if(flagSensor_2 <= 3 ) flagSensor_2 = 3;       
          if(flagSensor_3 <= 3 ) flagSensor_3 = 3;
          if(flagSensor_4 <= 3 ) flagSensor_4 = 3;     
        //flagSensor_0 = 3;  flagSensor_1 = 3;  flagSensor_2 = 3;  flagSensor_3 = 3;  flagSensor_4 = 3;   
        sendSMS(String("Power OFF"), numberSMS_1);}        // Отправка SMS     
       if (inputString.indexOf("ON") > -1){                           // Проверяем полученные данные, если ON включаем все каналы
        digitalWrite(sens_1, HIGH);  digitalWrite(sens_2, LOW);
          if(flagSensor_0 <= 3 ) flagSensor_0 = 0;
//          if(flagSensor_0 <= 3 ) flagSensor_0 = 0; Serial.println(flagSensor_0);         
          if(flagSensor_1 <= 3 ) flagSensor_1 = 0;       
          if(flagSensor_2 <= 3 ) flagSensor_2 = 0;       
          if(flagSensor_3 <= 3 ) flagSensor_3 = 0;
          if(flagSensor_4 <= 3 ) flagSensor_4 = 0;               
    //    flagSensor_0 = 0;  flagSensor_1 = 0;  flagSensor_2 = 0;  flagSensor_3 = 0;  flagSensor_4 = 0; 
        sendSMS(String("Power ON"), numberSMS_1);}         // Отправка SMS     


 //      if (inputString.indexOf("ON_2") > -1){                         // Проверяем полученные данные, если ON_2 включаем реле 2
  //      digitalWrite(sens_3, HIGH);       
  //      sendSMS(String("Relay 2 - ON"), numberSMS_1);}     // Отправка SMS   
  //     if (inputString.indexOf("OFF_2") > -1){                        // Проверяем  полученные  данные, если OFF_2 выключаем реле 2
  //      digitalWrite(sens_3, LOW);       
  //      sendSMS(String("Relay 2 - OFF"), numberSMS_1);}    // Отправка SMS   
        delay(2000);
       if (inputString.indexOf("OK") == -1){   
        mySerial.println("AT+CMGDA=\"DEL ALL\"");     
        delay(1000);}     
        inputString = "";}
 

 
    if(millis() - timerTemp >= 3600000) {timerTemp = millis(); hours++;}

  if(hours >= 144) {// Меняем время контроля системы на свое,144 часа.кол-во часов .
    sendSMS(String("The system works normally.OK"), numberSMS_1);
    delay(10000);                                 
                                  
    hours = 0;                                     
    timerTemp = millis();                         
  }
 
  if(flagSensor_0 == 0 && digitalRead(pinSensor_0) == 0) flagSensor_0 = 1;
  if(flagSensor_1 == 0 && digitalRead(pinSensor_1) == 0) flagSensor_1 = 1;
  if(flagSensor_2 == 0 && digitalRead(pinSensor_2) == 0) flagSensor_2 = 1;
  if(flagSensor_3 == 0 && digitalRead(pinSensor_3) == 0) flagSensor_3 = 1;
  if(flagSensor_4 == 0 && digitalRead(pinSensor_4) == 0) flagSensor_4 = 1;
// Зона 0 вывод D4
  if(flagSensor_0 == 1) {
    String command;

    command = "ATD+" + numberCall_1 + ";";  // Звонок на номер 1
    mySerial.println(command);

  Serial.println(" Вызов абонента  "); // выводим текст на монитор
  Serial.println( numberCall_1); // выводим текст на монитор 1 раз

 
 
 //   delay(20000);                           
 //   mySerial.println("ATH");   
 //   command = "ATD+" + numberCall_2 + ";";  // Звонок на номер 2
 //   mySerial.println(command); 

 // Serial.println(" Вызов абонента  "); // выводим текст на монитор
 // Serial.println( numberCall_2); // выводим текст на монитор 1 раз
 
    delay(20000);                           
    mySerial.println("ATH");               
    delay(10000);                           

    flagSensor_0 = 2;                       
  }

// Зона 1
  if(flagSensor_1 == 1) {
    sendSMS(textZone_1, numberSMS_1);
 
  Serial.println( textZone_1);//
 
    delay(10000);                     
                    
    flagSensor_1 = 2;                 
  }

// Зона 2
  if(flagSensor_2 == 1) {
    sendSMS(textZone_2, numberSMS_1);
 
  Serial.println( textZone_2);//
 
    delay(10000);                     
                    
    flagSensor_2 = 2;                 
  }

// Зона 3
  if(flagSensor_3 == 1) {
    sendSMS(textZone_3, numberSMS_1);
 
  Serial.println( textZone_3);//
 
    delay(10000);                     
                    
    flagSensor_3 = 2;                 
  }

// Зона 4
  if(flagSensor_4 == 1) {
    sendSMS(textZone_4, numberSMS_1);
 
  Serial.println( textZone_4);//
 
    delay(10000);                   
                    
    flagSensor_4 = 2;               
  }

  if(flagSensor_0 == 2 && digitalRead(pinSensor_0) != 0) flagSensor_0 = 0;
  if(flagSensor_1 == 2 && digitalRead(pinSensor_1) != 0) flagSensor_1 = 0;
  if(flagSensor_2 == 2 && digitalRead(pinSensor_2) != 0) flagSensor_2 = 0;
  if(flagSensor_3 == 2 && digitalRead(pinSensor_3) != 0) flagSensor_3 = 0;
  if(flagSensor_4 == 2 && digitalRead(pinSensor_4) != 0) flagSensor_4 = 0;
}
код не дописан до конца так как возникла проблема, с смс.
после отправки смс к примеру об отключении, все срабатывает светодиоды один тухнет другой загорается датчики отключаются...приходит смс о том что все отключено и вот тут начинается....
Эта смс просто повторяется и повторяется... бесконечно...
кто может подсказать с чем это связанно...??
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,263
1,301
Москва
Не вдаваясь в подробности скажу, что подобного рода проблемы связаны с тем, что надо делать действие по изменению состояния , а не по состоянию. Для примера разберем включение и выключение светодиода в зависимости от состояния пина. Если написать так:
Код:
если состояние пина 1, то включить светодиод, иначе выключить.
Это будет работать, НО действие по включению или выключению светодиода будет повторяться в каждом цикле. Правильнее было бы написать так:
Код:
если состояние пина 1 и светодиод выключен, то включить светодиод
если состояние пина 0 и светодиод включен, то выключить светодиод
 
  • Лойс +1
Реакции: mr.Leks

bort707

★★★★★★✩
21 Сен 2020
3,062
912
подобного рода проблемы связаны с тем, что надо делать действие по изменению состояния , а не по состоянию.
согласен, только чуть уточню - надо выполнять действие "по изменению состояния" пина, а не светодиода.
Поэтому правильно писать код так
C++:
если сейчас состояние пина 1 а в прошлом цикле состояние пина было 0 - включить светодиод
если сейчас состояние пина 0 а в прошлом цикле состояние пина было 1 - выключить светодиод
 
  • Лойс +1
Реакции: mr.Leks

mr.Leks

✩✩✩✩✩✩✩
31 Май 2022
3
0
@bort707,
C++:
       if (inputString.indexOf("OFF") > -1){                          // Проверяем полученные данные, если OFF выключаем все каналы
        digitalWrite(sens_1, LOW); digitalWrite(sens_2, HIGH);
          if(flagSensor_0 <= 3 ) flagSensor_0 = 3;
как бы с пинами проблем нет, сама сигнализация работает меняет их по вашему примеру со светодиодом и посылает смс о срабатывании
именно зацикливает после токо как пытается ответить на входящее смс..
C++:
       if (inputString.indexOf("ON") > -1){                           // Проверяем полученные данные, если ON включаем все каналы
        digitalWrite(sens_1, HIGH);  digitalWrite(sens_2, LOW);
          if(flagSensor_0 <= 3 ) flagSensor_0 = 0;
//          if(flagSensor_0 <= 3 ) flagSensor_0 = 0; Serial.println(flagSensor_0);         
          if(flagSensor_1 <= 3 ) flagSensor_1 = 0;       
          if(flagSensor_2 <= 3 ) flagSensor_2 = 0;       
          if(flagSensor_3 <= 3 ) flagSensor_3 = 0;
          if(flagSensor_4 <= 3 ) flagSensor_4 = 0;               
    //    flagSensor_0 = 0;  flagSensor_1 = 0;  flagSensor_2 = 0;  flagSensor_3 = 0;  flagSensor_4 = 0;
        sendSMS(String("Power ON"), numberSMS_1);}         // Отправка SMS
вот отправил смс с текстом ON... все включилось к примеру
в ответ пришла смс Power ON что соответствует включению... и так эта происходит каждую пару секунд Power ON Power ON Power ON Power ON.....
 

bort707

★★★★★★✩
21 Сен 2020
3,062
912
ну тут Похабыч правильно подсказал - перед тем, как включить или выключить сигналку - проверяйте ее состояние. И если сигналихация УЖЕ включена - не включайте ее повторно.
 
  • Лойс +1
Реакции: mr.Leks

mr.Leks

✩✩✩✩✩✩✩
31 Май 2022
3
0
Всем спасибо, не сразу понял про что имели ввиду. Все заработало.