Запрос данных с датчика по SMS с помощью Arduino и GSM-модуля SIM900

В этом проекте мы покажем вам, как запрашивать данные с датчика по SMS с помощью Arduino. В качестве примера мы будем запрашивать температуру и влажность с датчика DHT11. Для отправки и получения SMS с помощью Arduino мы будем использовать GSM-модуль SIM900.

Запрос данных с датчика по SMS с помощью Arduino и GSM-модуля SIM900

Когда вы отправляете SMS на Arduino с сообщением «STATE», он отвечает последними показаниями температуры и влажности.

Перед тем как приступить к этому руководству, мы рекомендуем ознакомиться со следующими ресурсами:

Сначала посмотрите видео-демонстрацию

GSM-модуль SIM900

Существует несколько модулей, которые можно использовать для отправки и получения SMS с помощью Arduino. Мы выполнили этот проект с использованием GSM-модуля SIM900, и именно этот модуль мы рекомендуем вам приобрести.

GSM-модуль SIM900 показан на рисунке ниже:

GSM-модуль SIM900

Для ознакомления с GSM-модулем и его настройкой прочитайте Руководство по GSM GPRS модулю SIM900 с Arduino.

Необходимые компоненты

Вот список всех компонентов, необходимых для этого проекта:

Компоненты для проекта запроса данных по SMS

Вы можете использовать ссылки выше или перейти напрямую на MakerAdvisor.com/tools, чтобы найти все компоненты для ваших проектов по лучшей цене!

Предварительные шаги

Прежде чем начать работу с GSM-модулем SIM900, необходимо учесть некоторые аспекты, касающиеся SIM-карты и питания модуля.

Предоплаченная SIM-карта

Мы рекомендуем использовать предоплаченный тарифный план или план с безлимитными SMS для тестирования. В противном случае, если что-то пойдёт не так, вам, возможно, придётся оплатить огромный счёт за сотни SMS-сообщений, отправленных по ошибке. В этом руководстве мы используем предоплаченный тарифный план с безлимитными SMS.

SIM-карта для GSM-модуля

Модуль использует стандартный размер SIM-карты, а не micro или nano. Если у вас micro или nano, вы можете приобрести адаптер размера SIM-карты.

Отключение PIN-блокировки

Для использования SIM-карты с модулем необходимо отключить PIN-блокировку. Самый простой способ сделать это — вставить SIM-карту в смартфон и отключить PIN-блокировку в настройках безопасности телефона.

В моём случае необходимо перейти: Настройки > Расширенные настройки > Безопасность > Блокировка SIM и отключить блокировку SIM-карты с помощью PIN-кода.

Отключение PIN-блокировки SIM-карты

Выбор правильного блока питания

На модуле имеется разъём DC для питания, как показано на рисунке ниже.

DC-разъём питания GSM-модуля SIM900

Рядом с разъёмом питания находится переключатель для выбора источника питания. Рядом с переключателем на плате есть стрелка, указывающая положение переключателя для использования внешнего источника питания — переведите переключатель в положение для использования внешнего питания, как показано выше.

Для питания модуля рекомендуется использовать блок питания 5В, способный обеспечить ток 2А, как показан ниже.

Блок питания 5В 2А для GSM-модуля SIM900

Подходящий блок питания для этого модуля можно найти здесь. Убедитесь, что вы выбрали модель с 5В и 2А.

Настройка GSM-модуля SIM900

Следующие шаги покажут вам, как настроить GSM-модуль SIM900.

1) Вставьте SIM-карту в держатель SIM-карты. Вам нужна SIM-карта стандартного размера. Модуль не совместим с micro или nano SIM-картами. При необходимости вы можете приобрести адаптер размера SIM-карты. Также рекомендуется использовать SIM-карту с предоплаченным тарифным планом или безлимитными SMS.

Установка SIM-карты в GSM-модуль SIM900

2) Убедитесь, что антенна хорошо подключена.

3) На переключателе выбора последовательного порта убедитесь, что перемычка установлена, как показано на рисунке ниже, для использования программного последовательного порта (Software Serial).

Настройка перемычки Software Serial на GSM-модуле SIM900

4) Подайте питание на модуль, используя внешний блок питания 5В. Убедитесь дважды, что вы выбрали внешний источник питания, как мы упоминали ранее.

Выбор внешнего источника питания GSM-модуля SIM900

5) Чтобы включить/выключить модуль, нажмите кнопку питания примерно на 2 секунды.

Кнопка питания GSM-модуля SIM900

6) Затем загорится светодиод Status, а светодиод NetLight будет мигать каждые 800 мс, пока не найдёт сеть. Когда сеть будет найдена, светодиод NetLight начнёт мигать каждые три секунды.

Светодиоды Status и NetLight на GSM-модуле SIM900

7) Вы можете проверить, правильно ли работает модуль, отправив AT-команды из Arduino IDE с помощью FTDI-программатора — как мы покажем ниже.

Тестирование модуля с помощью FTDI-программатора

Вам не нужно выполнять этот шаг, чтобы модуль работал правильно. Это дополнительный шаг, чтобы убедиться, что вы можете общаться с GSM-модулем и отправлять AT-команды из монитора последовательного порта Arduino IDE. Для этого вам понадобится FTDI-программатор, как показан на рисунке ниже.

FTDI-программатор

1) Подключите FTDI-программатор к GSM-модулю, как показано на рисунке ниже.

Схема подключения FTDI-программатора к GSM-модулю SIM900

2) Откройте Arduino IDE и выберите правильный COM-порт.

3) Откройте монитор последовательного порта.

Открытие монитора последовательного порта в Arduino IDE

4) Выберите скорость 19200 бод — настройка модуля по умолчанию — 19200 — и Carriage return. Напишите AT в поле, выделенном красным, и нажмите Enter. Смотрите рисунок ниже.

Настройка скорости бод и отправка AT-команды в мониторе последовательного порта

5) Модуль ответит OK, если всё работает правильно.

Ответ OK от GSM-модуля SIM900 в мониторе последовательного порта

Теперь, когда вы знаете, что модуль работает правильно, вы готовы приступить к сборке проекта.

Схема подключения

На рисунке ниже показана электрическая схема для этого проекта.

Вам необходимо подключить GSM-модуль SIM900 и датчик температуры и влажности DHT11 к Arduino, как показано на рисунке ниже.

Схема подключения GSM-модуля SIM900 и датчика DHT11 к Arduino

Установка библиотеки DHT

Для чтения данных с датчика DHT у вас должна быть установлена библиотека DHT. Если у вас не установлена библиотека DHT, следуйте инструкциям ниже:

  1. Нажмите здесь, чтобы скачать библиотеку DHT-sensor-library. У вас должен появиться .zip файл в папке «Загрузки»

  2. Распакуйте .zip файл, и вы получите папку DHT-sensor-library-master

  3. Переименуйте папку из DHT-sensor-library-master в DHT

  4. Переместите папку DHT в папку библиотек вашей установки Arduino IDE

  5. Наконец, перезапустите Arduino IDE

Установка библиотеки Adafruit_Sensor

Для использования датчика температуры и влажности DHT вам также необходимо установить библиотеку Adafruit_Sensor. Выполните следующие шаги для установки библиотеки в вашу Arduino IDE:

  1. Нажмите здесь, чтобы скачать библиотеку Adafruit_Sensor. У вас должен появиться .zip файл в папке «Загрузки»

  2. Распакуйте .zip файл, и вы получите папку Adafruit_Sensor-master

  3. Переименуйте папку из Adafruit_Sensor-master в Adafruit_Sensor

  4. Переместите папку Adafruit_Sensor в папку библиотек вашей установки Arduino IDE

  5. Наконец, перезапустите 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, он отвечает данными с датчика.

Демонстрация запроса данных с датчика по SMS с Arduino

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

Заключение

Это отличный проект, чтобы начать работу с GSM-модулем SIM900. Вы научились читать и отправлять SMS-сообщения с помощью Arduino.

Вы можете применить изученные концепции практически в любом проекте. Вот несколько идей проектов:

  • Система наблюдения, которая отправляет SMS при обнаружении движения

  • Управление реле через SMS

  • Запрос конкретных данных с датчиков из набора датчиков путём добавления дополнительных условий в код

Если вам нравится Arduino, вам определённо понравятся эти 25 пошаговых проектов на Arduino.