ESP8266:Примеры/Датчик открывания двери, передающий данные на EasyIoT Cloud
Датчик открывания двери, передающий данные на EasyIoT Cloud[1]
Эта статья рассказывает, как собрать систему с датчиком открывания/закрывания двери, через WiFi подключенным к облачному сервису EasyIoT Cloud. Для этого проекта понадобятся модуль с чипом ESP8266, электромагнитный переключатель и среда разработки IDE Arduino.
Введение
Видео, показывающее проект в действии:
[Видео – https://www.youtube.com/watch?v=5k5F5IpOKm4]
Браузерное меню с модулями EasyIoT Cloud:
График, показывающий, когда происходило открытие/закрытие двери:
Необходимые компоненты
- Один модуль с ESP8266 (например, плата NodeMCU, ESP-01, ESP-02 или пр.)
- Один электромагнитный переключатель
- Один 3,3-вольтовый источник питания (регулятор напряжения или батерея)
Настройка EasyIoT Cloud
Зарегистрируйтесь в EasyIoT Cloud. Если вам не пришло письмо с подтверждением регистрации, проверьте папку со спамом. Если письма нет и там, свяжитесь с нами, и мы активируем ваш аккаунт.
Никаких настроек в EasyIoT Cloud не требуется – модуль работает по принципу «plug and play» (т.е. «подключи и работай»). Вам нужно будет лишь запомнить токен безопасности для подключения к EasyIoT Cloud. Для этого пройдите в меню Configure > Tokens и нажмите на кнопку «Add Token». Запомните этот токен – он пригодится позже (его нужно будет вписать в программу). Если удалить токен из аккаунта, модуль перестанет отправлять данные на EasyIoT Cloud. Один токен можно использовать для нескольких устройств.
Программа
Программа написана в IDE Arduino. О том, как установить в IDE Arduino аддон для ESP8266, смотрите тут. Дальнейшие действия зависят от того, какой модуль ESP8266 вы используете. Если ваш модуль не оснащен адаптером USB-Serial, то его нужно будет подключить. Не забудьте настроить его на 3,3 вольта. Иногда адаптеры не обеспечивают ESP8266 достаточным напряжением. В этом случае ESP8266 нужно питать только от внешнего источника питания (т.е. нужно отключить от адаптера линию Vcc). Если вы используете адаптерную плату вроде той, что выпускает NodeMCU, просто подключите ее к компьютеру через USB-кабель. Этот способ рекомендуется для новичков.
Саму программу можно скачать с нашего GitHub-репозитория. Вам также понадобится библиотека «EIoTCloudRestApiV1.0». О том, как установить ее в IDE Arduino, читайте тут.
В самой программе нужно будет поменять строчки с SSID, паролем к SSID и токеном безопасности.
#define AP_USERNAME "xxx"
#define AP_PASSWORD "xxx"
#define TOKEN "xxx"
Если вы используете другой GPIO-контакт ESP8266, в программе также понадобится поменять строчку с используемым GPIO-контактом.
/*
Программа написана Игорем Ярком (Igor Jarc).
Более подробно смотрите по ссылке http://iot-playground.com.
Пожалуйста не пишите автору напрямую.
Используйте для этого форум сообщества на сайте.
Эта программа бесплатна. Вы можете повторно распространять
и/или модифицировать ее согласно правилам лицензии
GNU General Public License (2-ая версия),
опубликованной Фондом свободного ПО.
*/
#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;
// это строчки с SSID, паролем к SSID и токеном безопасности;
// поменяйте их:
#define AP_USERNAME "xxx"
#define AP_PASSWORD "xxx"
#define TOKEN "xxx"
#define CONFIG_START 0
#define CONFIG_VERSION "v01"
#define INPUT_PIN D5
struct StoreStruct {
// это лишь для того, чтобы определить, ваши ли это настройки:
char version[4];
// переменные для ваших настроек:
uint moduleId;
} storage = {
CONFIG_VERSION,
// модуль с ID «0» – неправильный модуль
0,
};
String moduleId = "";
String parameterId = "";
bool oldInputState;
void setup() {
Serial.begin(9600);
DEBUG_PRINTLN("Start..."); // "Запуск..."
EEPROM.begin(512);
loadConfig();
eiotcloud.begin(AP_USERNAME, AP_PASSWORD);
eiotcloud.SetToken(TOKEN);
// если это первый раз, когда вы получаете новый токен
// и регистрируете новый модуль, этот фрагмент кода
// автоматически добавит модуль в 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_DIGITAL_INPUT");
DEBUG_PRINT("SetModulType: ");
DEBUG_PRINTLN(modtyperet);
// задаем название модуля:
bool modname = eiotcloud.SetModulName(moduleId, "Door/window sensor");
DEBUG_PRINT("SetModulName: ");
DEBUG_PRINTLN(modname);
// добавляем картинку для параметра:
String parameterImgId = eiotcloud.NewModuleParameter(moduleId, "Settings.Icon1");
DEBUG_PRINT("parameterImgId: ");
DEBUG_PRINTLN(parameterImgId);
// добавляем картинку для модуля:
bool valueRet1 = eiotcloud.SetParameterValue(parameterImgId, "door_1.png");
DEBUG_PRINT("SetParameterValue: ");
DEBUG_PRINTLN(valueRet1);
// добавляем картинку для параметра:
String parameterImgId2 = eiotcloud.NewModuleParameter(moduleId, "Settings.Icon2");
DEBUG_PRINT("parameterImgId2: ");
DEBUG_PRINTLN(parameterImgId2);
// добавляем картинку для модуля:
bool valueRet3 = eiotcloud.SetParameterValue(parameterImgId2, "door_2.png");
DEBUG_PRINT("SetParameterValue: ");
DEBUG_PRINTLN(valueRet3);
// теперь добавляем значение параметру:
parameterId = eiotcloud.NewModuleParameter(moduleId, "Sensor.Parameter1");
DEBUG_PRINT("ParameterId: ");
DEBUG_PRINTLN(parameterId);
// задаем параметр LogToDatabase:
bool valueRet4 = eiotcloud.SetParameterLogToDatabase(parameterId, true);
DEBUG_PRINT("SetLogToDatabase: ");
DEBUG_PRINTLN(valueRet4);
// задаем параметр ChartSteps:
valueRet4 = eiotcloud.SetParameterChartSteps(parameterId, true);
DEBUG_PRINT("SetLogToDatabase: ");
DEBUG_PRINTLN(valueRet4);
// добавляем параметр StatusText1:
String parameterStatTxt1 = eiotcloud.NewModuleParameter(moduleId, "Settings.StatusText1");
DEBUG_PRINT("parameterStatTxt1: ");
DEBUG_PRINTLN(parameterStatTxt1);
// добавляем текст для параметра StatusText1:
bool valueRet5 = eiotcloud.SetParameterValue(parameterStatTxt1, "Open");
DEBUG_PRINT("SetParameterValue: ");
DEBUG_PRINTLN(valueRet5);
// добавляем параметр StatusText2:
String parameterStatTxt2 = eiotcloud.NewModuleParameter(moduleId, "Settings.StatusText2");
DEBUG_PRINT("parameterStatTxt2: ");
DEBUG_PRINTLN(parameterStatTxt2);
// добавляем текст для параметра StatusText2:
bool valueRet6 = eiotcloud.SetParameterValue(parameterStatTxt2, "Close");
DEBUG_PRINT("SetParameterValue: ");
DEBUG_PRINTLN(valueRet6);
// сохраняем настройки:
saveConfig();
}
// если что-то пошло не так, ждем:
if (storage.moduleId == 0)
while(true) delay(1);
// считываем из памяти ID модуля:
moduleId = String(storage.moduleId);
// считываем из облака ID параметра Sensor.Parameter1:
parameterId = eiotcloud.GetModuleParameterByName(moduleId, "Sensor.Parameter1");
DEBUG_PRINT("parameterId: ");
DEBUG_PRINTLN(parameterId);
pinMode(INPUT_PIN, INPUT_PULLUP);
oldInputState = !digitalRead(INPUT_PIN);
}
void loop() {
int inputState = digitalRead(INPUT_PIN);;
if (inputState != oldInputState)
{
bool valueRet = eiotcloud.SetParameterValue(parameterId, String(inputState));
DEBUG_PRINT("SetParameterValue: ");
DEBUG_PRINTLN(valueRet);
oldInputState = inputState;
}
}
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. Правда, в этом случае вам дополнительно понадобится программатор FTDI. Для питания можно воспользоваться двумя батарейками типа AA или 3,3-вольтовым регулятором.
Кроме того, один провод, идущий от электромагнитного переключателя, нужно подключить к 5-ому GPIO-контакту, а другой – к GND.
См.также
Внешние ссылки
ESP8266 AT-команды | |
---|---|
Список AT-команд | |
Базовые команды |
|
Команды для WiFi |
|
Команды для TCP/IP |
|