Запрос данных с датчика по SMS с помощью Arduino и GSM-модуля SIM900
В этом проекте мы покажем вам, как запрашивать данные с датчика по SMS с помощью Arduino. В качестве примера мы будем запрашивать температуру и влажность с датчика DHT11. Для отправки и получения SMS с помощью Arduino мы будем использовать GSM-модуль SIM900.
Когда вы отправляете SMS на Arduino с сообщением «STATE», он отвечает последними показаниями температуры и влажности.
Перед тем как приступить к этому руководству, мы рекомендуем ознакомиться со следующими ресурсами:
Руководство по датчику температуры и влажности DHT11/DHT22 с Arduino
Рекомендуемый курс: 25 пошаговых проектов на Arduino
Сначала посмотрите видео-демонстрацию
GSM-модуль SIM900
Существует несколько модулей, которые можно использовать для отправки и получения SMS с помощью Arduino. Мы выполнили этот проект с использованием GSM-модуля SIM900, и именно этот модуль мы рекомендуем вам приобрести.
GSM-модуль SIM900 показан на рисунке ниже:
Для ознакомления с GSM-модулем и его настройкой прочитайте Руководство по GSM GPRS модулю SIM900 с Arduino.
Необходимые компоненты
Вот список всех компонентов, необходимых для этого проекта:
Arduino UNO – читайте Лучшие стартовые наборы Arduino
FTDI программатор (опционально)
SIM-карта
Вы можете использовать ссылки выше или перейти напрямую на MakerAdvisor.com/tools, чтобы найти все компоненты для ваших проектов по лучшей цене!
Предварительные шаги
Прежде чем начать работу с GSM-модулем SIM900, необходимо учесть некоторые аспекты, касающиеся SIM-карты и питания модуля.
Предоплаченная SIM-карта
Мы рекомендуем использовать предоплаченный тарифный план или план с безлимитными SMS для тестирования. В противном случае, если что-то пойдёт не так, вам, возможно, придётся оплатить огромный счёт за сотни SMS-сообщений, отправленных по ошибке. В этом руководстве мы используем предоплаченный тарифный план с безлимитными SMS.
Модуль использует стандартный размер SIM-карты, а не micro или nano. Если у вас micro или nano, вы можете приобрести адаптер размера SIM-карты.
Отключение PIN-блокировки
Для использования SIM-карты с модулем необходимо отключить PIN-блокировку. Самый простой способ сделать это — вставить SIM-карту в смартфон и отключить PIN-блокировку в настройках безопасности телефона.
В моём случае необходимо перейти: Настройки > Расширенные настройки > Безопасность > Блокировка SIM и отключить блокировку SIM-карты с помощью PIN-кода.
Выбор правильного блока питания
На модуле имеется разъём DC для питания, как показано на рисунке ниже.
Рядом с разъёмом питания находится переключатель для выбора источника питания. Рядом с переключателем на плате есть стрелка, указывающая положение переключателя для использования внешнего источника питания — переведите переключатель в положение для использования внешнего питания, как показано выше.
Для питания модуля рекомендуется использовать блок питания 5В, способный обеспечить ток 2А, как показан ниже.
Подходящий блок питания для этого модуля можно найти здесь. Убедитесь, что вы выбрали модель с 5В и 2А.
Настройка GSM-модуля SIM900
Следующие шаги покажут вам, как настроить GSM-модуль SIM900.
1) Вставьте SIM-карту в держатель SIM-карты. Вам нужна SIM-карта стандартного размера. Модуль не совместим с micro или nano SIM-картами. При необходимости вы можете приобрести адаптер размера SIM-карты. Также рекомендуется использовать SIM-карту с предоплаченным тарифным планом или безлимитными SMS.
2) Убедитесь, что антенна хорошо подключена.
3) На переключателе выбора последовательного порта убедитесь, что перемычка установлена, как показано на рисунке ниже, для использования программного последовательного порта (Software Serial).
4) Подайте питание на модуль, используя внешний блок питания 5В. Убедитесь дважды, что вы выбрали внешний источник питания, как мы упоминали ранее.
5) Чтобы включить/выключить модуль, нажмите кнопку питания примерно на 2 секунды.
6) Затем загорится светодиод Status, а светодиод NetLight будет мигать каждые 800 мс, пока не найдёт сеть. Когда сеть будет найдена, светодиод NetLight начнёт мигать каждые три секунды.
7) Вы можете проверить, правильно ли работает модуль, отправив AT-команды из Arduino IDE с помощью FTDI-программатора — как мы покажем ниже.
Тестирование модуля с помощью FTDI-программатора
Вам не нужно выполнять этот шаг, чтобы модуль работал правильно. Это дополнительный шаг, чтобы убедиться, что вы можете общаться с GSM-модулем и отправлять AT-команды из монитора последовательного порта Arduino IDE. Для этого вам понадобится FTDI-программатор, как показан на рисунке ниже.
1) Подключите FTDI-программатор к GSM-модулю, как показано на рисунке ниже.
2) Откройте Arduino IDE и выберите правильный COM-порт.
3) Откройте монитор последовательного порта.
4) Выберите скорость 19200 бод — настройка модуля по умолчанию — 19200 — и Carriage return. Напишите AT в поле, выделенном красным, и нажмите Enter. Смотрите рисунок ниже.
5) Модуль ответит OK, если всё работает правильно.
Теперь, когда вы знаете, что модуль работает правильно, вы готовы приступить к сборке проекта.
Схема подключения
На рисунке ниже показана электрическая схема для этого проекта.
Вам необходимо подключить GSM-модуль SIM900 и датчик температуры и влажности DHT11 к Arduino, как показано на рисунке ниже.
Установка библиотеки DHT
Для чтения данных с датчика DHT у вас должна быть установлена библиотека DHT. Если у вас не установлена библиотека DHT, следуйте инструкциям ниже:
Нажмите здесь, чтобы скачать библиотеку DHT-sensor-library. У вас должен появиться .zip файл в папке «Загрузки»
Распакуйте .zip файл, и вы получите папку DHT-sensor-library-master
Переименуйте папку из DHT-sensor-library-master в DHT
Переместите папку DHT в папку библиотек вашей установки Arduino IDE
Наконец, перезапустите Arduino IDE
Установка библиотеки Adafruit_Sensor
Для использования датчика температуры и влажности DHT вам также необходимо установить библиотеку Adafruit_Sensor. Выполните следующие шаги для установки библиотеки в вашу Arduino IDE:
Нажмите здесь, чтобы скачать библиотеку Adafruit_Sensor. У вас должен появиться .zip файл в папке «Загрузки»
Распакуйте .zip файл, и вы получите папку Adafruit_Sensor-master
Переименуйте папку из Adafruit_Sensor-master в Adafruit_Sensor
Переместите папку Adafruit_Sensor в папку библиотек вашей установки Arduino IDE
Наконец, перезапустите Arduino IDE
Код
Следующий код считывает температуру и влажность с датчика DHT и отправляет их по SMS, когда вы отправляете SMS на Arduino с сообщением «STATE».
Вам необходимо изменить предоставленный код, указав номер телефона, на который Arduino должен отправить показания. Код хорошо прокомментирован, чтобы вы понимали назначение каждой строки кода. Не загружайте код сейчас. Прокрутите вниз и прочитайте объяснение под кодом.
/*
* Rui Santos
* Complete Project Details https://randomnerdtutorials.com
*/
// Include DHT library and Adafruit Sensor Library
#include "DHT.h"
#include <Adafruit_Sensor.h>
//Include Software Serial library to communicate with GSM
#include <SoftwareSerial.h>
// Pin DHT is connected to
#define DHTPIN 2
// Uncomment whatever type of sensor you're using
#define DHTTYPE DHT11 // DHT 11
//#define DHTTYPE DHT22 // DHT 22 (AM2302)
//#define DHTTYPE DHT21 // DHT 21 (AM2301)
// Initialize DHT sensor for normal 16mhz Arduino
DHT dht(DHTPIN, DHTTYPE);
// Create global varibales to store temperature and humidity
float t; // temperature in celcius
float f; // temperature in fahrenheit
float h; // humidity
// Configure software serial port
SoftwareSerial SIM900(7, 8);
// Create variable to store incoming SMS characters
char incomingChar;
void setup() {
dht.begin();
Serial.begin(19200);
SIM900.begin(19200);
// Give time to your GSM shield log on to network
delay(20000);
Serial.print("SIM900 ready...");
// AT command to set SIM900 to SMS mode
SIM900.print("AT+CMGF=1\r");
delay(100);
// Set module to send SMS data to serial out upon receipt
SIM900.print("AT+CNMI=2,2,0,0,0\r");
delay(100);
}
void loop(){
if (SMSRequest()){
if(readData()){
delay(10);
// REPLACE THE X's WITH THE RECIPIENT'S MOBILE NUMBER
// USE INTERNATIONAL FORMAT CODE FOR MOBILE NUMBERS
SIM900.println("AT + CMGS = \"+XXXXXXXXXX\"");
delay(100);
// REPLACE WITH YOUR OWN SMS MESSAGE CONTENT
String dataMessage = ("Temperature: " + String(t) + "*C " + " Humidity: " + String(h) + "%");
// Uncomment to change message with farenheit temperature
// String dataMessage = ("Temperature: " + String(f) + "*F " + " Humidity: " + String(h) + "%");
// Send the SMS text message
SIM900.print(dataMessage);
delay(100);
// End AT command with a ^Z, ASCII code 26
SIM900.println((char)26);
delay(100);
SIM900.println();
// Give module time to send SMS
delay(5000);
}
}
delay(10);
}
boolean readData() {
//Read humidity
h = dht.readHumidity();
// Read temperature as Celsius
t = dht.readTemperature();
// Read temperature as Fahrenheit
f = dht.readTemperature(true);
// Compute temperature values in Celcius
t = dht.computeHeatIndex(t,h,false);
// Uncomment to compute temperature values in Fahrenheit
//f = dht.computeHeatIndex(f,h,false);
// Check if any reads failed and exit early (to try again).
if (isnan(h) || isnan(t) || isnan(f)) {
Serial.println("Failed to read from DHT sensor!");
return false;
}
Serial.print("Humidity: ");
Serial.print(h);
Serial.print(" %\t");
Serial.print("Temperature: ");
Serial.print(t);
Serial.print(" *C ");
//Uncomment to print temperature in Farenheit
//Serial.print(f);
//Serial.print(" *F\t");
return true;
}
boolean SMSRequest() {
if(SIM900.available() >0) {
incomingChar=SIM900.read();
if(incomingChar=='S') {
delay(10);
Serial.print(incomingChar);
incomingChar=SIM900.read();
if(incomingChar =='T') {
delay(10);
Serial.print(incomingChar);
incomingChar=SIM900.read();
if(incomingChar=='A') {
delay(10);
Serial.print(incomingChar);
incomingChar=SIM900.read();
if(incomingChar=='T') {
delay(10);
Serial.print(incomingChar);
incomingChar=SIM900.read();
if(incomingChar=='E') {
delay(10);
Serial.print(incomingChar);
Serial.print("...Request Received \n");
return true;
}
}
}
}
}
}
return false;
}
Импорт библиотек
Сначала вы подключаете библиотеки, необходимые для этого проекта: библиотеку DHT для чтения данных с датчика DHT и библиотеку SoftwareSerial для связи с GSM-модулем SIM900.
#include "DHT.h"
#include <Adafruit_Sensor.h>
#include <SoftwareSerial.h>
Датчик DHT
Затем вы сообщаете Arduino, что вывод данных DHT подключён к пину 2, выбираете тип датчика DHT и создаёте экземпляр dht. Код совместим с другими датчиками DHT, при условии, что вы укажете используемый датчик в коде.
#define DHTPIN 2
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
Вы также создаёте переменные типа float для хранения значений температуры и влажности.
float t; // temperature in celcius
float f; // temperature in fahrenheit
float h; // humidity
GSM-модуль
Следующая строка настраивает программный последовательный порт на пинах 7 и 8. Пин 7 настроен как RX, а пин 8 как TX.
SoftwareSerial SIM900(7, 8);
Вы также создаёте переменную типа char для хранения входящих символов SMS.
char incomingChar;
setup()
В setup() вы инициализируете DHT и модуль SIM900. Модуль SIM900 устанавливается в текстовый режим, и вы также настраиваете модуль для отправки данных SMS на монитор последовательного порта при их получении. Это делается следующими двумя строками соответственно:
SIM900.print("AT+CMGF=1\r");
SIM900.print("AT+CNMI=2,2,0,0,0\r");
Функции
Мы создаём функцию для чтения температуры и влажности под названием readData(). Эта функция сохраняет значения в переменных t и h. Код использует температуру в градусах Цельсия, но подготовлен для использования по Фаренгейту — в коде отмечены комментариями места, где нужно внести изменения.
Мы также создаём функцию, которая проверяет, равно ли входящее сообщение STATE — функцию SMSRequest(). Эта функция возвращает true, если Arduino получает сообщение с текстом STATE, и false в противном случае. Вы считываете входящие символы SMS с помощью:
incomingChar = SIM900.read();
loop()
В loop() вы проверяете, был ли запрос по SMS с помощью функции SMSRequest() — проверяете, получил ли Arduino сообщение STATE. Если true, он считает температуру и влажность и отправит их вам по SMS.
Номер, на который Arduino отвечает, задаётся в следующей строке:
SIM900.println("AT + CMGS = \"XXXXXXXXXXXX\"");
Замените XXXXXXXXXXXX на номер телефона получателя.
Примечание: вы должны добавить номер в соответствии с международным форматом телефонных номеров. Например, в Португалии номер предваряется кодом +351 XXXXXXXXX.
Затем вы сохраняете сообщение, которое хотите отправить, в переменной dataMessage. Наконец, вы отправляете SMS-сообщение с помощью:
SIM900.print(dataMessage);
Демонстрация
Когда вы отправляете сообщение STATE на Arduino, он отвечает данными с датчика.
Посмотрите видео в начале публикации для более подробной демонстрации проекта.
Заключение
Это отличный проект, чтобы начать работу с GSM-модулем SIM900. Вы научились читать и отправлять SMS-сообщения с помощью Arduino.
Вы можете применить изученные концепции практически в любом проекте. Вот несколько идей проектов:
Система наблюдения, которая отправляет SMS при обнаружении движения
Запрос конкретных данных с датчиков из набора датчиков путём добавления дополнительных условий в код
Если вам нравится Arduino, вам определённо понравятся эти 25 пошаговых проектов на Arduino.