ESP8266:Примеры/Датчик света, передающий данные на EasyIoT Cloud

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

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


Черновик


Датчик света, передающий данные на EasyIoT Cloud [1]

В этой статье я расскажу, как собрать датчик света, передающий данные в браузерный интерфейс EasyIoT Cloud. Этот проект рассчитан, скорее, на новичков, т.к. использует всего три компонента.

Нам понадобятся модуль ESP8266, фоторезистор и подключение к EasyIoT Cloud. Фоторезистор используется по принципу «подключи и работай» (он автоматически регистрируется в EasyIoT Cloud). Для программирования ESP8266 используется IDE Arduino.

Введение

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

В качестве датчика света будет использоваться фоторезистор, т.е. светочувствительный резистор переменного сопротивления. Работает он по принципу фотопроводимости: чем выше интенсивность освещения, тем ниже его сопротивление. Одна сторона фоторезистора должна быть подключена к GND, а другая – к (последовательно) резистору и контакту с 3,3 вольтами.

Напряжение, идущее от фоторезистора, зависит от интенсивности освещения вокруг него. Затем это напряжение измеряется модулем ESP8266 и передается в EasyIoT Cloud.

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

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

  • Один модуль с чипом ESP8266 (ESP-07, ESP-12, адаптерная плата NodeMCU или др.)
  • Один резистор на 10 кОм
  • Один фоторезистор
  • Один 5-вольтовый источник питания

Настройка EasyIoT Cloud

Никакой настройки EasyIoT Cloud для этого проекта не требуется. Просто зарегистрируйтесь в сервисе EasyIoT Cloud. Зарегистрировавшись, кликните по Configuration > Tokens и нажмите на кнопку «Add Token». Запомните токен – его нужно будет добавить в код программы.

Программа

Программа написана в IDE Arduino. О том, как установить в IDE Arduino аддон для ESP8266, читайте тут.

Дальнейшие действия зависят от того, какой модуль ESP8266 вы используете. Если ваш модуль не оснащен адаптером USB-Serial, то его нужно будет подключить. Схему подключения к адаптеру смотрите на картинке ниже. Не забудьте настроить его на 3,3 вольта. Иногда адаптеры не обеспечивают ESP8266 достаточным напряжением. В этом случае ESP8266 нужно питать только от внешнего источника питания (т.е. нужно отключить от адаптера линию Vcc). Если вы используете адаптерную плату вроде той, что выпускает команда NodeMCU, просто подключите ее к компьютеру через USB-кабель. Этот способ рекомендуется для новичков.

Кроме того, вам понадобится библиотека EIoTCloudRestApiV1.0. О том, как установить ее в IDE Arduino, читайте тут. Саму программу можно скачать с GitHub.

В программе нужно будет поменять строчки c SSID, паролем к SSID и токеном:

#define AP_USERNAME "xxx"
#define AP_PASSWORD "xxx"
#define TOKEN "xxx"

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

/*
 Программа разработана Игорем Ярком (Igor Jarc)
 Подробнее смотрите по ссылке http://iot-playground.com
 Пожалуйста, не нужно связываться с автором напрямую,
 делайте это через форум на вебсайте.

 Программа бесплатна. Ее можно повторно распространять 
 и/или модифицировать согласно правилам лицензии
 GNU General Public License, опубликованной Фондом свободного ПО.
*/

#include <ESP8266WiFi.h>
#include "EIoTCloudRestApiV1.0.h"
#include <EEPROM.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;

// поменяйте три следующих строчки:
#define AP_USERNAME "xxx"
#define AP_PASSWORD "xxx"

#define TOKEN "xxx"

#define REPORT_INTERVAL 1

#define CONFIG_START 0
#define CONFIG_VERSION "v01"


#define MIN_VALUE 25
#define MAX_VALUE 800

#define SENSOR_PIN A0    // выберите входной контакт,
                         // к которому подключен потенциометр

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

String moduleId = "";
String parameterId = "";

int sensorValue = 0; 


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

    EEPROM.begin(512);
    loadConfig();

    eiotcloud.begin(AP_USERNAME, AP_PASSWORD);
    eiotcloud.SetToken(TOKEN);

    // если вы в первый раз получаете новый токен 
    // и регистрируете новый модуль, код ниже автоматически
    // добавляет модуль в EasyIoT Cloud:
    if (storage.moduleId == 0)
    {      
      // добавляем новый модуль и настраиваем его:
      moduleId = eiotcloud.ModuleNew();
      DEBUG_PRINT("ModuleId: ");
      DEBUG_PRINTLN(moduleId);
      storage.moduleId = moduleId.toInt();
      
      // если ID модуля – неправильный, останавливаемся:
      if (storage.moduleId == 0)
      {
        DEBUG_PRINTLN("Check Account limits -> module limit.");
                  //  "Проверьте в Account limits -> module limit."
        while(true) delay(1);
      }
      // задаем тип модуля:
      bool modtyperet = eiotcloud.SetModulType(moduleId, "MT_GENERIC");
      DEBUG_PRINT("SetModulType: ");
      DEBUG_PRINTLN(modtyperet);
      
      // задаем название модуля:
      bool modname = eiotcloud.SetModulName(moduleId, "LUX meter");
      DEBUG_PRINT("SetModulName: ");
      DEBUG_PRINTLN(modname);

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

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

      // вносим описание параметра:
      bool valueRet2 = eiotcloud.SetParameterDescription(parameterId, "LUX");
      DEBUG_PRINT("SetParameterDescription: ");
      DEBUG_PRINTLN(valueRet2);
      
      // задаем единицу измерения:
      bool valueRet3 = eiotcloud.SetParameterUnit(parameterId, "%");
      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)
      while(true) delay(1);

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

void loop() {
  sensorValue = analogRead(SENSOR_PIN);
  float level = 100 - ((sensorValue - MIN_VALUE) * 100 / (MAX_VALUE - MIN_VALUE));
  
  sensorValue = level;
  DEBUG_PRINT("LUX = ");
  DEBUG_PRINTLN(sensorValue);

  bool valueRet = eiotcloud.SetParameterValue(parameterId, String(sensorValue));
  DEBUG_PRINT("SetParameterValue: ");
  DEBUG_PRINTLN(valueRet);

  delay(1000 * 10 * 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();
}

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

В этом проекте используется плата NodeMCU, но вы можете воспользоваться любым другим модулем, оснащенным чипом ESP8266. Затем добавьте в цепь фоторезистор, один конец которого подключите к GND, а другой – к резистору. Кроме того, резистор и фоторезистор нужно подключить к входному аналоговому контакту ESP8266.

См.также

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