Запрос показаний датчика по SMS с использованием Arduino и SIM800L
В этом проекте рассмотрим как запрашивать данные датчика через SMS с использованием Arduino. В качестве примера запросим температуру, влажность и атмосферное давление с датчика BME280. Для отправки и получения SMS будем использовать модуль SIM800L и плату Arduino.
Запрос показаний датчика по SMS с использованием Arduino и SIM800L
Необходимые детали:
► Arduino UNO R3 x 1 шт.
► Модуль GSM, GPRS на чипе SIM800L x 1 шт.
► Датчик атмосферного давления, влажности и температуры BME280 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 шт.
Алгоритм программы прост, при отправки SMS-сообщение «DATA» плата Arduino отвечает последними показаниями температуры, влажности и атмосферного давления, при необходимости код можно изменить, для отправки показаний в заданном интервале.
Подключение:
Для стабильно работы модуля 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.
Осталось подключить датчик BME280, SCL и SDA подключаем к выводам A5 и A4, затем необходимо подключить питание VCC и GND к плате ARDUINO.
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 72 73 74 75 76 77 78 79 80 81 82 83 |
/* Тестировалось на Arduino IDE 1.8.5 Дата тестирования 21.06.2019г. */ #include <SoftwareSerial.h> #include <Wire.h> // Подключаем библиотеку Wire #include <Adafruit_Sensor.h> // Подключаем библиотеку Adafruit_Sensor #include <Adafruit_BME280.h> // Подключаем библиотеку Adafruit_BME280 SoftwareSerial mySerial(3, 2); // Выводы SIM800L Tx & Rx подключены к выводам Arduino 3 и 2 #define SEALEVELPRESSURE_HPA (1013.25) // Задаем высоту Adafruit_BME280 bme; char incomingByte; String inputString; float t; float p; float h; void setup() { Serial.begin(9600); mySerial.begin(9600); bme.begin(0x76); 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("DATA") > -1){ // Проверяем полученные данные t = bme.readTemperature(); h = bme.readHumidity(); p = (bme.readPressure() / 100.0F); sms(String("Temperature: " + String(t) + " *C " + " Humidity: " + String(h) + " % " + " Pressure: " + String(p) + " hPa"), 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 с любого телефона DATA в ответ приходит SMS с температурой, влажностью и атмосферном давлением. состоянии.
Описание скетча:
Скетч начинается с включения библиотеки «SoftwareSerial.h», «Wire.h», «Adafruit_Sensor.h», «Adafruit_BME280.h» последние две библиотеки не входят в среду разработки Arduino IDE, необходимо скачать их и установить.
1 2 3 4 |
#include <SoftwareSerial.h> #include <Wire.h> #include <Adafruit_Sensor.h> #include <Adafruit_BME280.h> |
Далее, указываем вывода к которым подключены Tx и Rx модуля SIM800L, указываем что BME280 работает по шине I2C и создаем переменные для хранения данных incomingByte, inputString, t, p, h
1 2 3 4 5 6 7 8 9 10 |
oftwareSerial mySerial(3, 2); #define SEALEVELPRESSURE_HPA (1013.25) Adafruit_BME280 bme; char incomingByte; String inputString; float t; float p; float h; |
В функции void setup(), инициализируем последовательный связь между Arduino и модулем SIM800L на скорости 9600 бод и указываем адрес модуля BME280
1 2 3 |
Serial.begin(9600); mySerial.begin(9600); bme.begin(0x76); |
Командой 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 |
if (inputString.indexOf("DATA") > -1){ t = bme.readTemperature(); h = bme.readHumidity(); p = (bme.readPressure() / 100.0F); sms(String("Temperature: " + String(t) + " *C " + " Humidity: " + String(h) + " % " + " Pressure: " + String(p) + " hPa"), String("+7xxxxxxxxxx")); } |
Последняя функция просто отправляем сообщение об состоянии.
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); } |
Ссылки
Библиотека Adafruit BME280 Library
Библиотека Adafruit Unified Sensor
Купить на 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
BME280 — датчик атмосферного давления, влажности и температуры
Купить в Самаре и области
Контроллер 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А
BME280 — датчик атмосферного давления, влажности и температуры
Ошибка на 62 строке: call of overloaded ‘String(float&)’ is ambiguous
Можно ли в этой схеме использовать датчик AHT10 вместо BME280?
Здравствуйте, можно, но надо менять скетч.
После перезагрузки питания не отправляет смс с температурой, как только подключишь в компу откроешь монитор порта, все начинает работать, что может быть?
mySerial.println(«AT+CNMI=1,2,0,0,0»); // Отправка команды AT+CNMI=1,2,0,0,0
Пожалуйста напишите более информативные комментарии к коду
После включения метеостанции (arduino nano+sim800l+bme280+oled0.96+lm2596) дисплей на ней работает нормально, но сама на смс-запрос не отвечает. Начинает отвечать только после перезагрузки ардуино без отключения питания. В чем может быть проблема? Ардуино и lm2596 питаются от блока питания 9В, 1А, на sim800l подается 4В.
Решил эту проблему. Оказалось, что при подаче питания на метеостанцию, модуль sim800l начинает работать с некоторой задержкой. Поэтому после инициализации дисплея и датчика нужна пауза. Перед отправкой команды АТ (перед строкой 30) на sim800l добавил команду delay(5000); и метеостанция заработала как нужно.
Большое спасибо, помогло)
Как можно усовершенствовать программу так, чтобы модуль sim800l отправляла смс-ку не только на указанный в программе телефонный номер, но и на любой номер, с которого получил запрос?
Я не понял какой номер нужно указать в скетче?