Arduino + SIM800 HTTP -> GPRS термометр

Рассмотрим пример который отправляет температуру и влажность на складе раз в 5 минут.

Что нам потребуется:

Добавление и настройка устройства:

  1. Добавим новое устройство в VizIoT с именем «Тест GPRS термометр»
  2. Настроим параметры устройства. Добавьте три параметра:
    1. Ключ tem с типом «Температура, °C»
    2. Ключ hum с типом «Влажность, %»
  3. В «Основных настройках» устройства скопируем Ключ доступа и Пароль доступа.

Прошивка Arduino:

  1. Создайте новый проект в Arduino IDE.
  2. Скопируйте указанный ниже пример в созданный проект.
    #define TINY_GSM_MODEM_SIM800
    
    #include <TinyGsmClient.h>
    #include <ArduinoHttpClient.h>
    #include <Wire.h>
    #include "Adafruit_SHT31.h" //https://github.com/adafruit/Adafruit_SHT31
    #define SerialMon Serial
    
    // Использовать физический Serial порт для Mega, Leonardo, Micro
    #define SerialAT Serial1
    // или программный Serial для Uno, Nano
    //#include 
    //SoftwareSerial SerialAT(2, 3); // RX, TX
    
    Adafruit_SHT31 sht31 = Adafruit_SHT31();
    
    // Настройки точки доступа GPRS
    const char apn[]  = "YourAPN";
    const char user[] = "";
    const char pass[] = "";
    
    //Ключ и пароль доступа VizIoT Устройства (можно узнать в настройках устройства)
    String VizIoT_Device_key = "................";
    String VizIoT_Device_pass = "....................";
    
    //Адрес и Порт сервера
    const char server[] = "VizIoT.com";
    const int  port = 48656;
    
    TinyGsm modem(SerialAT);
    TinyGsmClient client(modem);
    HttpClient http(client, server, port);
    
    void setup() {
      // Установите скорость передачи для Serial Monitor
      SerialMon.begin(115200);
      delay(10);
    
      // Установите скорость передачи для GSM module
      SerialAT.begin(115200);
      delay(3000);
    
      SerialMon.println(F("Инициализация модема..."));
      modem.restart();
    
      String modemInfo = modem.getModemInfo();
      SerialMon.print(F("Модем: "));
      SerialMon.println(modemInfo);
    
      Serial.println("Поиск датчика SHT31-D");
      if (! sht31.begin(0x44)) {   // укажите 0x45 для альтернативного i2c адреса датчика
        Serial.println("Не могу найти SHT31-D");
      }
    }
    
    void loop() {
      SerialMon.print(F("Ожидание сети..."));
      if (!modem.waitForNetwork()) {
        SerialMon.println(" fail");
        delay(10000);
        return;
      }
      SerialMon.println(" OK");
    
      SerialMon.print(F("Подключение к точки доступа "));
      SerialMon.print(apn);
      if (!modem.gprsConnect(apn, user, pass)) {
        SerialMon.println(" неудачно");
        delay(10000);
        return;
      }
      SerialMon.println(" OK");
    
      SerialMon.print(F("отправка HTTP GET запроса... "));
    
      int err = http.get(getResource().c_str());
      if (err != 0) {
        SerialMon.println(F("ошибка соединения"));
        delay(10000);
        return;
      }
    
      http.stop();
      SerialMon.println(F("Отключились от сервера"));
    
      modem.gprsDisconnect();
      SerialMon.println(F("GPRS отключен"));
    
      //Спать 5 минут
      delay(5 * 60 * 1000);
    
    }
    
    String getResource() {
      String resource = String("/update?key=") + VizIoT_Device_key + "&" + "pass=" + VizIoT_Device_pass ;
    
      //считываем показания с датчиков
      float t = sht31.readTemperature();
      float h = sht31.readHumidity();
    
      //проверяем информацию о температуре
      if (! isnan(t)) {
        Serial.print("Температура *C = ");
        Serial.println(t);
        resource += String("&tem=") + t;
      } else {
        Serial.println("Ошибка при чтении температуры");
      }
    
      //проверяем информацию о влажности
      if (! isnan(h)) {
        Serial.print("Hum. % = ");
        Serial.println(h);
        resource += String("&hum=") + h;
      } else {
        Serial.println("Ошибка при чтении влажности");
      }
      return resource;
    }
    
  3. Установите библиотеку «Adafruit SHT31 Library» для работы c датчиком SHT31-D клиента.
  4. Установите библиотеку «TinyGSM» для работы c GSM модулем SIM800
  5. Установите библиотеку «ArduinoHttpClient» для работы c протоколом HTTP
  6. Укажите значения переменных:
    • apn – Имя точки доступа GSM
    • user – Пользователь точки доступа GSM
    • pass – Пароль точки доступа GSM
    • VizIoT_Device_key – скопированный Ключ доступа устройства
    • VizIoT_Device_pass – скопированный Пароль доступа устройства
  7. Подключите датчик SHT31-D к Arduino MEGA 2560 по схеме:
    • pin датчика VIN в pin arduino 3.3V
    • pin датчика GND в pin arduino GND
    • pin датчика SCL в pin arduino SCL
    • pin датчика SDA в pin arduino SDA
  8. Подключите GPRS модуля SIM800L к Arduino MEGA 2560 по схеме:
    • pin модуля VIN к плюсу внешнего источника питания 4 вольта
    • pin модуля GND к минусу внешнего источнику питания и в pin arduino GND
    • pin модуля TX в pin arduino RX1
    • pin модуля RX в pin arduino TX1 через резистивный делитель (резисторы одинакового номинала в диапазоне 1-10 КОм). Схема подключения:
      Arduino GND-----[10Ком]---+
                                +--------RX SIM800L
      Arduino TX------[10Ком]---+
      Подробнее можно прочитать здесь.
  9. Подключите Arduino к компьютеру и загрузите полученный скетч.

Добавления виджетов:

  1. Создадим новую панель с именем «Тест панель темп. влаж.»
  2. Добавим виджеты:
    1. Температура воздуха
      • тип: «График»;
      • устройство: «Тест температура и влажность воздуха»;
      • параметр: tem;
    2. Влажность воздуха
      • тип: «График»;
      • устройство: «Тест температура и влажность воздуха»;
      • параметр: hum;
    3. Изменения в Темп и Влаж
      • тип: «Гистограмма изменений в интервале»;
      • устройство: «Тест температура и влажность воздуха»;
      • параметр: tem и hum;

Теперь вы все настроили и осталось дождаться подключения вашего устройства на сервер.