Управление нагрузкой через 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.
Программа:
Для работы скетча необходима библиотека «SoftwareSerial» которая входит с среду разработки IDE.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
/* Тестировалось на Arduino IDE 1.8.5 Дата тестирования 14.06.2019г. */ #include <SoftwareSerial.h> SoftwareSerial mySerial(3, 2); // Выводы SIM800L Tx & 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) отключиться, в ответ приходит сообщение о состоянии.
Описание скетча:
Скетч начинается с включения библиотеки «SoftwareSerial.h» и указании выводов к которым подключены Tx и Rx модуля SIM800L.
1 2 |
#include <SoftwareSerial.h> SoftwareSerial mySerial(3, 2); |
Далее создаем переменную «incomingByte» для хранения SMS сообщения и указываем к каким выводам подключено реле.
1 2 3 4 |
char incomingByte; String inputString; int relay_1 = A0; int relay_2 = A1; |
В функции void setup(), первым делом настраиваем реле, устанавливаем вывода как выход и устанавливаем лог «1», чтобы реле было по умолчанию выключено.
1 2 3 4 |
pinMode(relay_1, OUTPUT); pinMode(relay_2, OUTPUT); digitalWrite(relay_1, HIGH); digitalWrite(relay_2, HIGH); |
Далее, инициализируем последовательный связь между Arduino и модулем SIM800L на скорости 9600 бод.
1 2 |
Serial.begin(9600); mySerial.begin(9600); |
Командой while зацикливаем программу до связи с SIM800L. Если модуль обнаружен, отправляем команду «AT+CMGF=1» для установки текстового режим и отправляем команду «AT+CMGL=\»REC UNREAD\».
1 2 3 4 5 6 7 8 9 10 11 |
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())», если сообщение есть, считываем данные пока полностью не закончиться сообщение.
1 2 3 4 5 6 7 |
if(mySerial.available()){ delay(100); while(mySerial.available()){ incomingByte = mySerial.read(); inputString += incomingByte; } delay(10); |
Меняем все буквы на заглавные
1 |
inputString.toUpperCase(); |
Сравниваем получено сообщение и если оно совпадает включаем или отключаем реле.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
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);} } |
Последняя функция просто отправляем сообщение об состоянии.
1 2 3 4 5 6 7 8 9 10 11 12 |
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 на CH340G
Контроллер Arduino UNO R3 на Atmega16U2
Провода DuPont, 2,54 мм, 20 см
Модуль GSM, GPRS на чипе SIM800L
Преобразователь напряжения LM2596, DC 3.2-40B на DC 1.38-35B, 3А, Step-Down
Преобразователь напряжения LM2596 с вольтметром, DC 4-40B на DC 1.38-35B, 3А, Step-Down
Модуль реле 2-х канальный — 5V, 10A, 250V — lOW, OPTO
Купить в Самаре и области
Контроллер Arduino UNO R3 на CH340G
Контроллер Arduino UNO R3 на Atmega16U2
Провода DuPont, 2,54 мм, 20 см
Модуль GSM, GPRS на чипе SIM800L
Понижающий преобразователь напряжения LM2596, DC 3.2-40B на DC 1.38-35B, 3А
Понижающий преобразователь напряжения LM2596 с вольтметром, DC 4-40B на DC 1.25-37B, 3А
Модуль реле 2-х канальный — 5V, 10A, 250V — lOW, OPTO
«В функции void setup(), первым делом настраиваем реле, устанавливаем вывода как выход и устанавливаем лог «1», чтобы реле» — что бы реле было по умолчанию включено ?
Добрый день, нет, по умолчанию выключено.
добрый день, у меня в наличии есть ардуино нано, могу ли я использовать этот скейтч, заранее спасибо за ответ
Добрый день, да можете, скетч так же будет работать.
спасибо большое, я не спец в этом деле, но очень хочется…
А еще я правильно понимаю, что в этом скейтче нет номера телефона админа, смс можно слать с любого?
Да, верно. Белый список не реализован. Но его можно легко добавить.
А не подскажите как добавить белый список…
Не получается…
Функцию стирание СМС можно сделать?
Добрый день! Не удается повторить, не срабатывают команды. В чем может быть дело?
Полезная статья, все просто и понятно, я добавил еще проверку номера телефона и сделал себе сигнализацию. Спасибо .
Вот где найти пример, что бы номер на который будет отвечать ардуина был не жестко задан, а определялся. С этим кодом можно отправить сообщение с любого номера, но ответ прийдет именно на тот который прописан.
Здравствуйте, Павел.
Можно подкорректировать код, на днях сделаю.
Сергей, присоединяюсь к вопросу об автоматическом определении номера , на который будет отвечать Ардуино. Не подкорретировали еще код?
Здравствуйте, пока нет. На следующей недели подредактирую статью.
Здравствуйте. А можно сделать кратковременные замыкание реле? Просто нужно сделать включение подогревателя в автомобиле. А там просто подключиться к кнопке включения. Т. е. сделать симуляцию нажатия кнопки. И возможен ли еще вариант включения реле по звонку вместо Смс?
Здравствуйте, да можно сделать кратковременное включение, по смс
if (inputString.indexOf(«ON») > -1)
{
digitalWrite(relay_1, LOW);
delay(10);
digitalWrite(relay_1, HIGH);
sms(String(«Relay 1 — OFF»), String(«+xxxxxxxxxx»));
}
Спасибо большое!
У меня почему то по данному коду после отправки СМС, в ответ начинает валится СМС (ОК) без остановки, что не так?
Здравствуйте . Можно ли прикрепить тачик температуры к ардуино и его отслеживать запрсом например Temp
не реагирует на принятые смски
Здравствуйте, Сергей! Спасибо за материал. Опыта мало, но все получилось! У меня просьба — подскажите как организовать контроль напряжения аккумулятора тоже по смс ? Сенсор добавить удалось, а вот с напряжением — никак.
Здравствуйте Сергей, у меня всё работает, но только после включения»Монитор порта» и ещё хотелось бы на 4-е релюшки.
Помогите пожалуйсто.
Спасибо.
Разобрался сам.
Как решили проблему с монитором порта?
Вернулся в исходник.
Работает как хочет. То реле не включает, то ответа нет, а всë сработало.
Здравствуйте, скажите почему для выводов 3 и 2 нельзя задать значение pinMode() что-бы на них сразу было 3.3В без делителей?
У меня тоже смсками заваливает по данному коду.. где ошибку искать?
Здравствуйте! Использовал ваш код, и после включения у меня начинает присылать множество cmc(зацикливается), хотя нужна только одна? Подскажите что нужно сделать?
Всем привет, спасибо автору за простой и работоспособный код для смс розетки!
теперь поделюсь одной проблемой и ее решением…
как вижу в комментариях не у одного меня не стартует ардуинка если не открыт монитор порта.
так вот я все отладил с открытым монитором порта, внес изменения какие нужны были в коде и под конец закоментировал все обращения через Serial….
все работает отлично, ничего не глючит и все стартует без монитора порта и без шнурка .
надеюсь помог…
А можно поподробней, как закоментировал все обращения через Serial….
Денис, а на какой плате вы собирали? Не приходится ли нажимать Reset после пропадания питания?
Добрый день, аналогичная проблема «не стартует ардуинка если не открыт монитор порта», не могли бы выложить актуальный скетч с исправлениями, или написать здесь что нужно исправить. Спасибо большое.
Надо скорость 115200 в SoftSerial
где конкретно в скетче нужно изменить настройку?
Добрый день!
Хотел сделать устройство управления многоканальной загрузкой с дополнительными параметрами работы, задающимися в SMS в качестве ключей. Но столкнулся со следующей проблемой: при отправке SMS, полезная длина сообщения ограничена 13 символами (общая длина inputString включая служебный заголовок SMS и тело SMS получились то-ли 62, то-ли 64 байта). Всё что было за ними либо не пришло совсем, либо не поступает в переменную inputString. Можете подсказать, в чём может быть проблема?
При повторении данного устройства на ARDUINO Nano с этим скетчем все работает нормально, кроме одного момента. Когда устройство подключено автономно от внешнего БП (без подключения по USB) при пропадании питания не стартует скетч без нажатия Reset. Поэтому весь смысл проекта теряется. Может автор сталкивался с подобной проблемой или кто-нибудь еще?
Сталкивался. Нужно правильно подобрать питание. Используйте 2 понижайки и БП 12 вольт 2А (минимум), так как присутствует gsm-модуль.
Здравствуйте. Подскажите, с нескольких номеров можно отправлять сообщения? Как правильно их перечислить?
sms(String(«Relay 1 — OFF»), String(«+xxxxxxxxxx»));