ESP8266:Примеры/Температурный датчик DS18B20, передающий данные на EasyIoT Cloud

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


Температурный датчик DS18B20, передающий данные на EasyIoT Cloud[1]

Эта статья рассказывает, как собрать систему, оснащенную температурным датчиком DS18B20, через WiFi подключенным к облачному сервису EasyIoT Cloud. Датчик подключается к системе автоматически – по методу «plug and play» (т.е. «подключай и работай»). Кроме того, у проекта будет функция оповещения по электронной почте – на тот случай, если температура достигнет порогового значения. Для этого проекта понадобятся модуль с чипом ESP8266, температурный датчик DS18B20 и среда разработки IDE Arduino.

Введение

[Видео – https://www.youtube.com/watch?v=KPvCs2ZeR10]

Датчик, показывающий изменения температуры:

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

  • Один модуль с чипом ESP8266 (например, ESP-01, ESP-07, плата NodeMCU или др.)
  • Один температурный датчик DS18B20
  • Один резистор на 4,7 кОм
  • Один источник 3,3-вольтового питания (батарея или регулятор напряжения)

Подключение компонентов

Схему подключения компонентов смотрите на схеме ниже. Вместо ESP-01 можно воспользоваться любым другим модулем ESP8266. Кроме того, вместо двух AA-батареек можно воспользоваться, к примеру, регулятором напряжения AMS1117-3.3.

Программа

Программа написана в среде разработки IDE Arduino. О том, как подключить ESP8266 к компьютеру, читайте в этой статье в разделе «Программа» от слов «Дальнейшие действия зависят от...» до слов «...отключить от адаптера линию Vcc)». Если у вас мало опыта, лучше воспользуйтесь платой NodeMCU, т.к. для ее подключения к компьютеру не нужно никаких настроек – просто подсоедините ее к USB-порту и все.

Саму программу можно загрузить с нашего GitHub-репозитория. Кроме того, вам нужно будет загрузить и установить в IDE Arduino библиотеки «EIoTCloudRestApiV1.0» (читайте об этом тут) и «DallasTemperature» (скачать ее можно тут).

Вам также нужно будет поменять три строчки в самой программе – для SSID, пароля к SSID и настройки «Instance ID». Чтобы узнать «Instance ID», нужно зарегистрироваться в сервисе EasyIoT Cloud, а затем кликнуть по Configure > User Info. Нужное значение будет в поле «Instance ID».

Вот так эти строчки выглядят в коде:

#define AP_USERNAME "xxxx"
#define AP_PASSWORD "xxxx" 
#define INSTANCE_ID "xxxx"

Программа считывает настройки из EEPROM. Если ID модуля равен «0», это значит, что настроек для него в EasyIoT Cloud нет. В таком случае программа автоматически добавит в настройки новый модуль, даст ему название, а затем добавит параметры и настройки для этих параметров (более подробно смотрите в комментариях к коду). В результате новый модуль будет виден и в веб-интерфейсе EasyIoT Cloud, и в интерфейсе мобильного приложения.

Кроме того, ID добавленного модуля будет сохранено в EEPROM-памяти ESP8266. Таким образом, когда мы в следующий раз включим датчик, программа прочтет ID модуля из EEPROM (т.е. ей не понадобятся настройки из EasyIoT Cloud).

#include <ESP8266WiFi.h>
#include "EIoTCloudRestApiV1.0.h"
#include <EEPROM.h>
#include <OneWire.h>
#include <DallasTemperature.h>

#define DEBUG_PROG 

#ifdef DEBUG_PROG
  #define DEBUG_PRINTLN(x)  Serial.println(x)
  #define DEBUG_PRINT(x)    Serial.print(x)
#else
  #define DEBUG_PRINTLN(x) 
  #define DEBUG_PRINT(x)
#endif


EIoTCloudRestApi eiotcloud;

// это строчки для SSID, пароля к SSID и «Instance ID»; поменяйте их:
#define AP_USERNAME "xxxx"
#define AP_PASSWORD "xxxx"
#define INSTANCE_ID "xxxx"



#define REPORT_INTERVAL 1

#define ONE_WIRE_BUS 2  // контакт для датчика DS18B20
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature DS18B20(&oneWire);

#define CONFIG_START 0
#define CONFIG_VERSION "v01"

struct StoreStruct {
  // это лишь для определения того, ваши ли это настройки:
  char version[4];
  // переменные для ваших настроек:
  char token[41];
  uint moduleId;
  //bool tokenOk; // правильный токен  
} storage = {
  CONFIG_VERSION,
  // токен:
  "1234567890123456789012345678901234567890",
  // если ID модуля будет «0», то это неправильный модуль
  0,
  //0 // неправильный ID
};

String moduleId = "";
String parameterId = "";
float tempOld = 0;

void setup() {
    Serial.begin(115200);
    DEBUG_PRINTLN("Start...");   //  "Запуск..."

    EEPROM.begin(512);
    loadConfig();

    eiotcloud.begin(AP_USERNAME, AP_PASSWORD);

    // если это первый раз, когда вы получаете новый токен
    // и регистрируете новый модуль, этот фрагмент кода 
    // автоматически добавляет новый модуль в EasyIoT Cloud:
    if (storage.moduleId == 0)
    {
      // получаем новый токен; альтернативный способ – 
      // создать токен вручную, а затем сохранить его в EEPROM:
      String token = eiotcloud.TokenNew(INSTANCE_ID);
      DEBUG_PRINT("Token: ");
      DEBUG_PRINTLN(token);
      eiotcloud.SetToken(token);

      // запоминаем токен:
      token.toCharArray(storage.token, 41);

      // добавляем новый модуль и настраиваем его:
      moduleId = eiotcloud.ModuleNew();
      DEBUG_PRINT("ModuleId: ");
      DEBUG_PRINTLN(moduleId);
      storage.moduleId = moduleId.toInt();

      // задаем тип модуля:
      bool modtyperet = eiotcloud.SetModulType(moduleId, "MT_GENERIC");
      DEBUG_PRINT("SetModulType: ");
      DEBUG_PRINTLN(modtyperet);
      
      // задаем название для модуля:
      bool modname = eiotcloud.SetModulName(moduleId, "Room temperature");
      DEBUG_PRINT("SetModulName: ");
      DEBUG_PRINTLN(modname);

      // задаем картинку для параметра: 
      String parameterImgId = eiotcloud.NewModuleParameter(moduleId, "Settings.Icon1");
      DEBUG_PRINT("parameterImgId: ");
      DEBUG_PRINTLN(parameterImgId);

      // задаем картинку для модуля:
      bool valueRet1 = eiotcloud.SetParameterValue(parameterImgId, "temperature.png");
      DEBUG_PRINT("SetParameterValue: ");
      DEBUG_PRINTLN(valueRet1);
      
      // добавляем параметр для отображения температуры:
      parameterId = eiotcloud.NewModuleParameter(moduleId, "Sensor.Parameter1");
      DEBUG_PRINT("ParameterId: ");
      DEBUG_PRINTLN(parameterId);

      // задаем описание параметра:
      bool valueRet2 = eiotcloud.SetParameterDescription(parameterId, "Temperature");
      DEBUG_PRINT("SetParameterDescription: ");
      DEBUG_PRINTLN(valueRet2);
      
      // задаем единицу измерения (как кодировать градусы Цельсия,
      // смотрите на http://meyerweb.com/eric/tools/dencoder/):
      bool valueRet3 = eiotcloud.SetParameterUnit(parameterId, "%C2%B0C");
      DEBUG_PRINT("SetParameterUnit: ");
      DEBUG_PRINTLN(valueRet3);

      // задаем параметр LogToDatabase:
      bool valueRet4 = eiotcloud.SetParameterLogToDatabase(parameterId, true);
      DEBUG_PRINT("SetLogToDatabase: ");
      DEBUG_PRINTLN(valueRet4);

      // задаем параметр SetAvreageInterval:
      bool valueRet5 = eiotcloud.SetParameterAverageInterval(parameterId, "10");
      DEBUG_PRINT("SetAvreageInterval: ");
      DEBUG_PRINTLN(valueRet5);

      // сохраняем настройки:
      saveConfig();
    }

    // если что-то пошло не так, ждем:
    if (storage.moduleId == 0)
      delay(1);

    // считываем из памяти ID модуля:
    moduleId = String(storage.moduleId);
    // считываем из памяти ID токена:
    eiotcloud.SetToken(storage.token);    
    // считываем из облака ID параметра Sensor.Parameter1:
    parameterId = eiotcloud.GetModuleParameterByName(moduleId, "Sensor.Parameter1");
    DEBUG_PRINT("parameterId: ");
    DEBUG_PRINTLN(parameterId);
}


void loop() {
  float temp;

  do {
    DS18B20.requestTemperatures(); 
    temp = DS18B20.getTempCByIndex(0);
    DEBUG_PRINT("Temperature: ");
    DEBUG_PRINTLN(temp);
  } while (temp == 85.0 || temp == (-127.0));



  if (tempOld != temp)
  {
    // отправляем данные о температуре:
    bool valueRet = eiotcloud.SetParameterValue(parameterId, String(temp));
    DEBUG_PRINT("SetParameterValue: ");
    DEBUG_PRINTLN(valueRet);
    tempOld = temp;
  }
  delay(1000 * 60 * REPORT_INTERVAL);
}

void loadConfig() {
  // это чтобы убедиться, что настройки есть, и это ваши настройки;
  // если программа не найдет настройки, то воспользуется 
  // настройками по умолчанию:
  if (EEPROM.read(CONFIG_START + 0) == CONFIG_VERSION[0] &&
      EEPROM.read(CONFIG_START + 1) == CONFIG_VERSION[1] &&
      EEPROM.read(CONFIG_START + 2) == CONFIG_VERSION[2])
    for (unsigned int t=0; t<sizeof(storage); t++)
      *((char*)&storage + t) = EEPROM.read(CONFIG_START + t);
}

void saveConfig() {
  for (unsigned int t=0; t<sizeof(storage); t++)
    EEPROM.write(CONFIG_START + t, *((char*)&storage + t));

  EEPROM.commit();
}

Вот так модуль выглядит в интерфейсе EasyIoT Cloud:

Настройка EasyIoT Cloud

Для использования температурного датчика не требуется никаких настроек, т.к. он подключается к системе по принципу «plug and play» (т.е. «подключай и работай»). Кроме того, интерфейс EasyIoT Cloud поддерживает автоматические оповещения, и в нашем случае эту функцию можно использовать, к примеру, для отправки оповещения по электронной почте, если температура достигнет заданного порогового значения.

Чтобы настроить это, кликните в интерфейсе EasyIoT Cloud по Configure > Automation, а затем нажмите на кнопку «Add automation program». В результате откроется новое меню.

Выставьте переключатель «Enabled» на «On», а пункт «Program type» – на «Condition». Далее в пункте «Module» выберите только что созданный модуль для температурного датчика DS18B20, в пункте «Parameter» – параметр «Sensor.Parameter1», а в пункте «Condition»«>= rising edge». Настройка «>= rising edge» значит, что уведомление будет отправлено только когда температура достигнет заданного значения. Далее в пункте «Condition value» выставьте «Fixed value», а в появившемся поле «Fixed value» – необходимое пороговое значение (в нашем случае это «27»). Затем в пункте «Action» выставьте значение «Send email», а в полях «Email address» и «Message» – электронный адрес и текст сообщения. Если вы хотите, чтобы в сообщении, помимо текста, было и температурное значение, воспользуйтесь конструкцией {value}. Теперь просто сохраните заданные настройки, нажав на кнопку «Save».

Итак, в нашем примере, если датчик, за который в интерфейсе отвечает модуль «9 - room temperature», отправит значение, равное «27» или выше, EasyIoT отправит на указанный электронный ящик примерно такое сообщение:

См.также

Внешние ссылки