Управление нагрузкой через SMS (GSM) и Arduino.

Управление нагрузкой через SMS (GSM) и Arduino.

В данной статье расскажу как можно управлять нагрузкой удаленно по SMS сообщениям. В примере используем GSM модуля SIM800L, двух канальное реле и плат Arduino UNO.

Управление нагрузкой по SMS с использованием SIM800L и Arduino

Необходимые детали:
► Arduino UNO R3 x 1 шт.
► Модуль GSM, GPRS на чипе SIM800L x 1 шт.
► Модуль реле 2-о канальный — 5V, 10A, 250V — lOW x 1 шт.
► Преобразователь напряжения LM2596, DC 3.2-40B на DC 1.38-35B, 3А, Step-Down x 1 шт.
► Провод DuPont 10x, 2.54 мм, 20 см, F-M, Female — Male x 1 шт.

Подключение:
Для стабильно работы модуля SIM800L необходим источник питания с рабочим током 2А, подойдет преобразователь напряжения LM2596 с настроенным выходным напряжением 4.3 В (можно воспользоваться модулем MINI360).
Первым делом подготавливаем модуль SIM800L, припаиваем контакты и антенну, затем устанавливаем SIM карту любого оператора. Теперь подключаем вывод Tx на модуле к выводу 3 на Arduino. Вывод Rx нельзя подключать напрямую, так как цифровой вывод Arduino UNO использует 5В, а модуль SIM800L использует 3,3В. Необходимо сигнал Tx, поступающий от Arduino UNO, понизить до 3,3В, чтобы не спалить модуль SIM800L. Самый простой способ, это воспользоватся делителем напряжения на резисторах. Подключаем резистор на 10 кОм между выводом Rx (SIM800L) и выводом 2 (Arduino) и второй резистор на 10 кОм между выводом Rx (SIM800L) и GND. Теперь осталось подключить питание модуля, в примере используется стабилизатор напряжения на LM2596.
Осталось подключить двух канальное реле, подключаем IN1 и IN2 к выводам A0 и A1, затем необходимо подключить питание VCC и GND к плате ARDUINO.

Управление нагрузкой через SMS (GSM) и Arduino.

Программа:
Для работы скетча необходима библиотека «SoftwareSerial» которая входит с среду разработки IDE.

/* 
 Тестировалось на Arduino IDE 1.8.5
 Дата тестирования 14.06.2019г.
 */ 
 #include <SoftwareSerial.h> 
 SoftwareSerial mySerial(3, 2);              // Выводы SIM800L Tx &amp; Rx подключены к выводам Arduino 3 и 2
 char incomingByte; 
 String inputString;
 int relay_1 = A0;                           // Вывод управления реле 1
 int relay_2 = A1;                           // Вывод управления реле 2
 void setup() 
 {
   pinMode(relay_1, OUTPUT);                 // Установим вывод как выход
   digitalWrite(relay_1, HIGH);              // Устанавливаем высокий уровень
   pinMode(relay_2, OUTPUT);                 // Установим вывод как выход
   digitalWrite(relay_2, HIGH);              // Устанавливаем высокий уровень
   Serial.begin(9600);                   
   mySerial.begin(9600); 
 while(!mySerial.available()){             // Зацикливаем и ждем инициализацию SIM800L
    mySerial.println("AT");                  // Отправка команды AT
    delay(1000);                             // Пауза
    Serial.println("Connecting…");         // Печатаем текст
    }
    Serial.println("Connected!");            // Печатаем текст
    mySerial.println("AT+CMGF=1");           // Отправка команды 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\"");
 }
 void loop()
 {  
   if(mySerial.available()){                  // Проверяем, если есть доступные данные
       delay(100);                            // Пауза
      while(mySerial.available()){            // Проверяем, есть ли еще данные.   
      incomingByte = mySerial.read();         // Считываем байт и записываем в переменную incomingByte   
      inputString += incomingByte;            // Записываем считанный байт в массив inputString   
    }   
       delay(10);                             // Пауза        
       Serial.println(inputString);           // Отправка в "Мониторинг порта" считанные данные
       inputString.toUpperCase();             // Меняем все буквы на заглавные   
       if (inputString.indexOf("ON_1") > -1){ // Проверяем полученные данные, если ON_1 включаем реле 1 
        digitalWrite(relay_1, LOW);       
        sms(String("Relay 1 - ON"), String("+7xxxxxxxxxx"));} // Отправка SMS      
       if (inputString.indexOf("OFF_1") > -1){ // Проверяем полученные данные, если OFF_1 выклюем реле 1  
        digitalWrite(relay_1, HIGH);       
        sms(String("Relay 1 - OFF"), String("+7xxxxxxxxxx"));}// Отправка SMS      
       if (inputString.indexOf("ON_2") > -1){ // Проверяем полученные данные, если ON_2 включаем реле 2 
        digitalWrite(relay_2, LOW);       
        sms(String("Relay 2 - ON"), String("+7xxxxxxxxxx"));}  // Отправка SMS    
       if (inputString.indexOf("OFF_2") > -1){     // Проверяем  полученные  данные, если OFF_2 выключаем реле 2 
        digitalWrite(relay_2, HIGH);       
        sms(String("Relay 2 - OFF"), String("+7xxxxxxxxxx"));} // Отправка SMS    
        delay(50); 
       if (inputString.indexOf("OK") == -1){    
        mySerial.println("AT+CMGDA=\"DEL ALL\"");      
        delay(1000);}     
        inputString = "";}
 }
 void sms(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(2000);
 } 

Скачать скетч

Открываем окно «Мониторинг порта» , устанавливаем скорость «9600 и «NL» (Новая строка)». При отправки SMS с любого телефона ON_1 (ON_2) первое или второе реле включиться или OFF_1 (OFF_2) отключиться, в ответ приходит сообщение о состоянии.

Управление нагрузкой через SMS (GSM) и Arduino.

Описание скетча:
Скетч начинается с включения библиотеки «SoftwareSerial.h» и указании выводов к которым подключены Tx и Rx модуля SIM800L.

#include <SoftwareSerial.h>
SoftwareSerial mySerial(3, 2); 

Далее создаем переменную «incomingByte» для хранения SMS сообщения и указываем к каким выводам подключено реле.

char incomingByte; 
String inputString;
int relay_1 = A0;                          
int relay_2 = A1; 

В функции void setup(), первым делом настраиваем реле, устанавливаем вывода как выход и устанавливаем лог «1», чтобы реле

pinMode(relay_1, OUTPUT);                 
pinMode(relay_2, OUTPUT);                
digitalWrite(relay_1, HIGH);              
digitalWrite(relay_2, HIGH);   

Далее, инициализируем последовательный связь между Arduino и модулем SIM800L на скорости 9600 бод.

Serial.begin(9600);                   
mySerial.begin(9600);

Командой while зацикливаем программу до связи с SIM800L. Если модуль обнаружен, отправляем команду «AT+CMGF=1» для установки текстового режим и отправляем команду «AT+CMGL=\»REC UNREAD\».

while(!mySerial.available()){             
    mySerial.println("AT");                  
    delay(1000);                            
    Serial.println("Connecting…");         
    }
    Serial.println("Connected!");            
    mySerial.println("AT+CMGF=1");           
    delay(1000);                             
    mySerial.println("AT+CNMI=1,2,0,0,0");   
    delay(1000);                             
    mySerial.println("AT+CMGL=\"REC UNREAD\"");

В основной части программы, проверяем нет ли сообщений « if(mySerial.available())», если сообщение есть, считываем данные пока полностью не закончиться сообщение.

if(mySerial.available()){                       
   delay(100);     
    while(mySerial.available()){         
    incomingByte = mySerial.read();            
    inputString += incomingByte;                
    }   
    delay(10); 

Меняем все буквы на заглавные

inputString.toUpperCase();

Сравниваем получено сообщение и если оно совпадает включаем или отключаем реле.

if (inputString.indexOf("ON_1") > -1){      
           digitalWrite(relay_1, LOW);
           sms(String("Relay 1 - ON"), String("+xxxxxxxxxx")); 
           }
       if (inputString.indexOf("OFF_1") > -1){     
           digitalWrite(relay_1, HIGH);
           sms(String("Relay 1 - OFF"), String("+xxxxxxxxxx"));
           }   
       if (inputString.indexOf("ON_2") > -1){      
           digitalWrite(relay_2, LOW);
           sms(String("Relay 2 - ON"), String("+xxxxxxxxxx"));  
           }
       if (inputString.indexOf("OFF_2") > -1){    2
           digitalWrite(relay_2, HIGH);
           sms(String("Relay 2 - OFF"), String("+xxxxxxxxxx")); 
         delay(1000);}
           }

Последняя функция просто отправляем сообщение об состоянии.

void sms(String text, String phone) 
 {
   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(2000);
 }

Купить на Aliexpress
  Контроллер Arduino UNO R3
  Модуль GSM, GPRS на чипе SIM800L
  Комплект проводов DuPont, 2,54 мм, 20 см
  Преобразователь напряжения LM2596, DC 3.2-40B на DC 1.38-35B, 3А, Step-Down
  Преобразователь напряжения LM2596 с вольтметром, DC 4-40B на DC 1.38-35B, 3А, Step-Down

Купить в Самаре и области
  Купить контроллер Arduino UNO R3
  Модуль GSM, GPRS на чипе SIM800L
  Купить комплект проводов DuPont, 2,54 мм, 20 см
  Преобразователь напряжения LM2596, DC 3.2-40B на DC 1.38-35B, 3А, Step-Down
  Преобразователь напряжения LM2596 с вольтметром, DC 4-40B на DC 1.38-35B, 3А, Step-Down

Читайте также:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *