Показ дописів із міткою IoT. Показати всі дописи
Показ дописів із міткою IoT. Показати всі дописи

четвер, 19 вересня 2019 р.

Blynk: шаблон-конструктор для створення прошивок з WiFi Manager, WebOTA та автоматичним перепідключенням до вашого WiFi і серверу Blynk

Передмова

Для зручності створив початковий шаблон-конструктор прошивки для системи Blynk з початковими налаштуваннями по WiFi зі смартфону (SSID, PASS, TOKEN, Name Device). З можливістю оновлювати прошивку по повітрю WebOTA, та перепідключенням до мережі WiFi і серверу Blynk у разі пропадання зв'язку. Плюс, якщо зв'язок буде втрачено, функціонал самого пристрою не буде "гальмувати", а буде працювати в режимі OFFLINE як слід, до наступного підключення до серверу. Є обробка натискання системної кнопки "FLASH" яка під'єднана до GPIO_0 і зазвичай присутня на всіх платах на базі "ESP8266" і пристроїв "IoT", наприклад, дуже популярних "Sonoff". Кнопка розпізнає довжину натискання. Коротке натискання - для свого коду, який буде щось вмикати/вимикати. Довге натискання від 5 до 10 секунд - перезавантаження пристрою. Довге натискання понад 10 секунд - скидання всіх налаштувань.

Код шаблону

Код шаблону можна завантажити на GitHub, Dropbox,  або скопіювати прямо звідси:

/*
 Name:  Blynk_Table_Menu.ino
 Created: 9/19/2019 9:04:46 AM
 Author: Andriy Honcharenko
*/

/* CODE BEGIN Includes */
#include <BlynkSimpleEsp8266.h>
#include <Ticker.h>
#include <EEPROM.h>
#include <ESP8266mDNS.h>
#include <ESP8266WebServer.h>
#include <ESP8266HTTPUpdateServer.h>
#include <WiFiManager.h>
/* CODE END Includes */

/* CODE BEGIN UD */
/* User defines ---------------------------------------------------------*/
#define BLYNK_PRINT Serial

#define NAME_DEVICE      "MyHomeIoT-ESP8266"

#define BUTTON_SYS0_PIN     0
#define LED_SYS_PIN      13

#define BUTTON_SYS_B0_VPIN    V20
#define WIFI_SIGNAL_VPIN    V80

#define INTERVAL_PRESSED_RESET_ESP  3000L
#define INTERVAL_PRESSED_RESET_SETTINGS 5000L
#define INTERVAL_PRESSED_SHORT   50
#define INTERVAL_SEND_DATA    30033L
#define INTERVAL_RECONNECT    60407L
#define INTERVAL_REFRESH_DATA   4065L
#define WIFI_MANAGER_TIMEOUT   180

#define EEPROM_SETTINGS_SIZE   512
#define EEPROM_START_SETTING_WM   0
#define EEPROM_SALT_WM     12661

#define LED_SYS_TOGGLE()    digitalWrite(LED_SYS_PIN, !digitalRead(LED_SYS_PIN))
#define LED_SYS_ON()     digitalWrite(LED_SYS_PIN, LOW)
#define LED_SYS_OFF()     digitalWrite(LED_SYS_PIN, HIGH)
/* CODE END UD */

/* CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/
bool shouldSaveConfigWM  = false; //flag for saving data
bool btnSystemState0  = false;
bool triggerBlynkConnect = false;
bool isFirstConnect   = true; // Keep this flag not to re-sync on every reconnection

int startPressBtn = 0;

//structure for initial settings. It now takes 116 bytes
typedef struct {
 char  host[33] = NAME_DEVICE;    // 33 + '\0' = 34 bytes
 char  blynkToken[33] = "";     // 33 + '\0' = 34 bytes
 char  blynkServer[33] = "blynk-cloud.com"; // 33 + '\0' = 34 bytes
 char  blynkPort[6] = "8442";    // 04 + '\0' = 05 bytes
 int   salt = EEPROM_SALT_WM;    // 04   = 04 bytes
} WMSettings;         // 111 + 1  = 112 bytes (112 this is a score of 0)
//-----------------------------------------------------------------------------------------

WMSettings wmSettings;

BlynkTimer timer;

Ticker tickerESP8266;

//Declaration OTA WebUpdater
ESP8266WebServer httpServer(80);
ESP8266HTTPUpdateServer httpUpdater;
/* CODE END PV */

/* CODE BEGIN PFP */
/* Private function prototypes -----------------------------------------------*/
static void configModeCallback(WiFiManager* myWiFiManager);
static void saveConfigCallback(void);
static void tick(void);
static void untick(void);
static void readSystemKey(void);
static void timerRefreshData(void);
static void timerSendServer(void);
static void timerReconnect(void);
/* CODE END PFP */

// the setup function runs once when you press reset or power the board

void setup() 
{
 Serial.begin(115200);

 pinMode(BUTTON_SYS0_PIN, INPUT_PULLUP);
 pinMode(LED_SYS_PIN, OUTPUT);

 // Read the WM settings data from EEPROM to RAM
 EEPROM.begin(EEPROM_SETTINGS_SIZE);
 EEPROM.get(EEPROM_START_SETTING_WM, wmSettings);
 EEPROM.end();

 if (wmSettings.salt != EEPROM_SALT_WM) 
 {
  Serial.println(F("Invalid wmSettings in EEPROM, trying with defaults"));
  WMSettings defaults;
  wmSettings = defaults;
 }

 // Print old values to the terminal
 Serial.println(wmSettings.host);
 Serial.println(wmSettings.blynkToken);
 Serial.println(wmSettings.blynkServer);
 Serial.println(wmSettings.blynkPort);

 tickerESP8266.attach(0.5, tick);   // start ticker with 0.5 because we start in AP mode and try to connect

 //Local intialization. Once its business is done, there is no need to keep it around
 WiFiManager wifiManager;

 //reset saved wmSettings
 //wifiManager.resetSettings();

 //set minimu quality of signal so it ignores AP's under that quality
 //defaults to 8%
 //wifiManager.setMinimumSignalQuality();

 //sets timeout before webserver loop ends and exits even if there has been no setup.
 //useful for devices that failed to connect at some point and got stuck in a webserver loop
 //in seconds setConfigPortalTimeout is a new name for setTimeout
 wifiManager.setConfigPortalTimeout(WIFI_MANAGER_TIMEOUT);

 // The extra parameters to be configured (can be either global or just in the setup)
 // After connecting, parameter.getValue() will get you the configured value
 // id/name placeholder/prompt default length
 WiFiManagerParameter custom_device_name_text("<br/>Enter name of the device<br/>or leave it as it is<br/>");
 wifiManager.addParameter(&custom_device_name_text);

 WiFiManagerParameter custom_device_name("device-name", "device name", wmSettings.host, 33);
 wifiManager.addParameter(&custom_device_name);

 WiFiManagerParameter custom_blynk_text("<br/>Blynk config.<br/>");
 wifiManager.addParameter(&custom_blynk_text);

 WiFiManagerParameter custom_blynk_token("blynk-token", "blynk token", wmSettings.blynkToken, 33);
 wifiManager.addParameter(&custom_blynk_token);

 WiFiManagerParameter custom_blynk_server("blynk-server", "blynk server", wmSettings.blynkServer, 33);
 wifiManager.addParameter(&custom_blynk_server);

 WiFiManagerParameter custom_blynk_port("blynk-port", "port", wmSettings.blynkPort, 6);
 wifiManager.addParameter(&custom_blynk_port);

 //set config save notify callback
 wifiManager.setSaveConfigCallback(saveConfigCallback);

 //set callback that gets called when connecting to previous WiFi fails, and enters Access Point mode
 wifiManager.setAPCallback(configModeCallback);

 //set custom ip for portal
 //wifiManager.setAPStaticIPConfig(IPAddress(10,0,1,1), IPAddress(10,0,1,1), IPAddress(255,255,255,0));

 //fetches ssid and pass from eeprom and tries to connect
 //if it does not connect it starts an access point with the specified name
 //here  "AutoConnectAP"
 //and goes into a blocking loop awaiting configuration
 //wifiManager.autoConnect();
 //or use this for auto generated name ESP + ChipID

 if (wifiManager.autoConnect(wmSettings.host))
 {
  //if you get here you have connected to the WiFi
  Serial.println(F("Connected WiFi!"));
 }
 else
 {
  Serial.println(F("failed to connect and hit timeout"));
 }

 untick(); // cancel the flashing LED

 // Copy the entered values to the structure
 strcpy(wmSettings.host, custom_device_name.getValue());
 strcpy(wmSettings.blynkToken, custom_blynk_token.getValue());
 strcpy(wmSettings.blynkServer, custom_blynk_server.getValue());
 strcpy(wmSettings.blynkPort, custom_blynk_port.getValue());

 // Print new values to the terminal
 Serial.println(wmSettings.host);
 Serial.println(wmSettings.blynkToken);
 Serial.println(wmSettings.blynkServer);
 Serial.println(wmSettings.blynkPort);

 if (shouldSaveConfigWM)
 {
  LED_SYS_ON();
  // Write the input to the EEPROM
  EEPROM.begin(EEPROM_SETTINGS_SIZE);
  EEPROM.put(EEPROM_START_SETTING_WM, wmSettings);
  EEPROM.end();
  //---------------------------------
  LED_SYS_OFF();
 }

 // Run OTA WebUpdater
 MDNS.begin(wmSettings.host);
 httpUpdater.setup(&httpServer);
 httpServer.begin();
 MDNS.addService("http", "tcp", 80);
 Serial.printf("HTTPUpdateServer ready! Open http://%s.local/update in your browser\n", wmSettings.host);

 // Configure connection to blynk server
 Blynk.config(wmSettings.blynkToken, wmSettings.blynkServer, atoi(wmSettings.blynkPort));

 if (Blynk.connect())
 {
  //TODO: something to do if connected
 }
 else
 {
  //TODO: something to do if you failed to connect
 }

 timer.setInterval(INTERVAL_REFRESH_DATA, timerRefreshData);
 timer.setInterval(INTERVAL_SEND_DATA, timerSendServer);
 timer.setInterval(INTERVAL_RECONNECT, timerReconnect); 
}

// the loop function runs over and over again until power down or reset
void loop() 
{
 if (Blynk.connected())
 {
  Blynk.run(); // Initiates Blynk Server  
 }
 else
 {
  if (!tickerESP8266.active())
  {
   tickerESP8266.attach(2, tick);
  }
 }

 timer.run(); // Initiates BlynkTimer
 
 httpServer.handleClient(); // Initiates OTA WebUpdater  

 readSystemKey();
}

/* BLYNK CODE BEGIN */
BLYNK_CONNECTED()
{
 untick(); 

 Serial.println(F("Blynk Connected!"));
 Serial.println(F("local ip"));
 Serial.println(WiFi.localIP());  

 char str[32];
 sprintf_P(str, PSTR("%s Online!"), wmSettings.host); 
 Blynk.notify(str);

 if (isFirstConnect)
 {
  Blynk.syncAll();
  isFirstConnect = false;
 }
}

BLYNK_WRITE(BUTTON_SYS_B0_VPIN) // Example
{ 
 //TODO: something to do when a button is clicked in the Blynk app
 
 Serial.println(F("System_0 button pressed is App!")); 
}
/* BLYNK CODE END */

/* CODE BEGIN USER FUNCTION */
static void timerRefreshData(void)
{
 //TODO: here are functions for updating data from sensors, ADC, etc ...
}

static void timerSendServer(void)
{
 if (Blynk.connected())
 {
  //TODO: here are the functions that send data to the Blynk server
  Blynk.virtualWrite(WIFI_SIGNAL_VPIN, map(WiFi.RSSI(), -105, -40, 0, 100)); //Example send level WiFi signal
 }
 else
 {
  //TODO:
 }
}

static void timerReconnect(void)
{
 if (WiFi.status() != WL_CONNECTED)
 {
  Serial.println(F("WiFi not connected"));

  if (WiFi.begin() == WL_CONNECTED)
  {
   Serial.println(F("WiFi reconnected"));
  }
  else
  {
   Serial.println(F("WiFi not reconnected"));
  }
 }
 else// if (WiFi.status() == WL_CONNECTED)
 {
  Serial.println(F("WiFi in connected"));

  if (!Blynk.connected())
  {
   if (Blynk.connect())
   {
    Serial.println(F("Blynk reconnected"));
   }
   else
   {
    Serial.println(F("Blynk not reconnected"));
   }
  }
  else
  {
   Serial.println(F("Blynk in connected"));
  }
 }
}

static void configModeCallback(WiFiManager* myWiFiManager)
{
 Serial.println(F("Entered config mode"));
 Serial.println(WiFi.softAPIP());
 //if you used auto generated SSID, print it
 Serial.println(myWiFiManager->getConfigPortalSSID());
 //entered config mode, make led toggle faster
 tickerESP8266.attach(0.2, tick);
}

//callback notifying us of the need to save config
static void saveConfigCallback()
{
 Serial.println(F("Should save config"));
 shouldSaveConfigWM = true;
}

static void tick(void)
{
 //toggle state  
 LED_SYS_TOGGLE();     // set pin to the opposite state
}

static void untick(void)
{
 tickerESP8266.detach();
 LED_SYS_OFF(); //keep LED off 
 
}

static void readSystemKey(void)
{
 if (!digitalRead(BUTTON_SYS0_PIN) && !btnSystemState0)
 {
  btnSystemState0 = true;
  startPressBtn = millis();
 }
 else if (digitalRead(BUTTON_SYS0_PIN) && btnSystemState0)
 {
  btnSystemState0 = false;
  int pressTime = millis() - startPressBtn;

  if (pressTime > INTERVAL_PRESSED_RESET_ESP && pressTime < INTERVAL_PRESSED_RESET_SETTINGS)
  {
   if (Blynk.connected())
   {    
    Blynk.notify(String(wmSettings.host) + F(" reboot!"));
   }
   
   Blynk.disconnect();  
   tickerESP8266.attach(0.1, tick);   
   delay(2000);
   ESP.restart();
  }
  else if (pressTime > INTERVAL_PRESSED_RESET_SETTINGS)
  {
   if (Blynk.connected())
   {        
    Blynk.notify(String(wmSettings.host) + F(" setting reset! Connected WiFi AP this device!"));
   }   

   WMSettings defaults;
   wmSettings = defaults;

   LED_SYS_ON();
   // We write the default data to EEPROM
   EEPROM.begin(EEPROM_SETTINGS_SIZE);
   EEPROM.put(EEPROM_START_SETTING_WM, wmSettings);
   EEPROM.end();
   //------------------------------------------
   LED_SYS_OFF();

   delay(1000);
   WiFi.disconnect();
   delay(1000);
   ESP.restart();
  }
  else if (pressTime < INTERVAL_PRESSED_RESET_ESP && pressTime > INTERVAL_PRESSED_SHORT)
  {   
   Serial.println(F("System button_0 pressed is Device!"));
   // TODO: insert here what will happen when you press the ON / OFF button   
  }
  else if (pressTime < INTERVAL_PRESSED_SHORT)
  {   
   Serial.printf("Fixed false triggering %ims", pressTime);
   Serial.println();
  }  
 }
}
/* CODE END USER FUNCTION */

Можливості

  • При першому, після прошивання, увімкнені пристроєм утворюється точка WiFi з ім'ям "MyHomeIoT-ESP8266". Підключиться до цієї точки своїм смартфоном і відкрийте браузер та перейдіть за адресою 192.168.4.1 до налаштувань;
  • Для прикладу і перевірки на віртуальну шпильку V80 відправляються дані рівня сигналу WiFi. Додайте якийсь віджет "value" і назначте йому віртуальну шпильку V80;
  • Кнопка, яка підключена до GPIO_0 обробляється шаблоном та може реагувати на коротке натискання - вставляєте свій код для увімкнення/вимкнення чогось, або інших дій. Довге натискання кнопки від 5 до 10 секунд - перезавантаження пристрою. Довге натискання понад 10 секунд - скидання всіх налаштувань;
  • Для прикладу є обробка віртуальної кнопки V20. Якщо в BlynkApp додати до проекту кнопку на віртуальну шпильку V20, то пристрій в термінал буде надсилати повідомлення про те що кнопку натиснули з додатку Blynk. Інший код-функціонал на ваш розсуд;
  • Є можливість оновити прошивку по повітрю - WebOTA. Для цього потрібно знати IP пристрою і з будь якого браузера який знаходиться в тій же ж самій мережі набрати "IP_Your_Drvice/update". Наприклад ваш пристрій має IP - 192.168.100.111, тоді в браузер вводимо "192.168.100.111/update", обираємо файл прошивки і тиснемо кнопку "update". 
  • При втраті WiFi мережі, або зв'язку з сервером Blynk, функціонал пристрою не буде "гальмувати" і зв'язок автоматично відновиться при першій можливості;
  • Присутні в шаблоні три таймери для збору даних з датчиків (вставляєте свій код), для надсилання даних на сервер (вставляєте свій код. Є приклад з рівнем сигналу WiFi), та таймер для перепідключення до WiFi і Blynk;
  • Якщо до пристрою GPIO_13 підключити світлодіод, це додасть інформативності. Часте блимання - створена точка WiFi, повільне блимання - йде підключення до Wi-Fi і серверу Blynk, блимання раз на 2 секунди - немає підключення до серверу, або мережі.

пʼятницю, 7 червня 2019 р.

Blynk: Авто-кватирка на ESP8266 та Stepper Motor

Передмова

Розробив на замовлення "Авто-кватирку", яка може міряти температуру і вологість в приміщення сенсором DHT, та відкривати чи закривати кватирку, або вікно за допомоги крокового двигуна (Stepper Motor 28BYJ-48 With Driver Module ULN2003). Схему і код публікую з дозволу замовника. 

Зачиняти і відчиняти вікно можна як з кнопки на пристрою, так і зі смартфону з додатку Blynk. А також задати залежності відкриття і закриття від температури і вологості в приміщенні. Плюс є два тижневих планувальника подій, яким можна задати час відкриття, та час закриття вікна. Чим повністю автоматизувати процес провітрювання приміщення.

Залізяччя

Схема

Схема авто-кватирка
Макет авто-кватирки

Скетч

Текст програми завеликий для публікації в статті. Завантажити скетч можна на GitHub.
На початку програми є деякі налаштування, за допомоги яких можна встановити інші піни для сенсора, мотора, кнопки, геркону, світлодіоду та номера віртуальних шпильок в Blynk:

#define BUTTON_SYSTEM   0
#define LED_BLUE    2
#define INITIAL_POSITION_SWITCH 16
#define ULN2003_IN1    5
#define ULN2003_IN2    4
#define ULN2003_IN3    14
#define ULN2003_IN4    12

#define DHTTYPE DHT11  // DHT11, DHT 22  (AM2302), AM2321
#define DHTPIN 13   // DHT PIN

// Сенсор DHT
#define TMP_DHT V5
#define HUM_DHT V6

#define MOTOR_MOVE_SLIDER   V20 // Віджет слайдера
#define MOTOR_SPEED_STEP_CONTROL V21 // Віджет STEP CONTROL
#define MOTOR_MAXIMUM_STEPS   V22 // Максимальна кількість кроків для слайдеру і кнопки
#define MOTOR_DIRECTION_MENU  V60 // Меню направлення руху мотору

#define TERMINAL   V41
#define TIME_INPUT_0  V50
#define TIME_INPUT_1  V51
#define WIFI_SIGNAL V80

Рекомендації по збиранню

  1. Зібрати макет чи завершений пристрій відповідно до наведеної схеми. Обов'язково живіть окремими джерелами струму двигун і сам пристрій. Геркон розташуйте на рамі вікна, а магніт розташуйте на кватирці або фрамузі так, щоб геркон замикався при закритті кватирки чи фрамуги. Розташування крокового двигуна і яка саме буде конструкція відкриття/закриття залежить від вашої фантазії і можливостей і виходить за рамки цієї статті;
  2. Скомпілювати скетч та залити до ESP8266 за допомоги Arduino IDE, або MS Visual Studio з плагіном visualMicro. Обов'язково перед компіляцією зробіть зміни до коду в бібліотеку "stepper". Відкрийте файл "stepper.cpp" та додайте рядок "delay(0);" до коду в це місце:
    // decrement the number of steps, moving one step each time:
      while (steps_left > 0)
      {
        delay(0);
        unsigned long now = micros();
    
    Або взяти готовий бінарник, як вас влаштовує типова схема наведена вище, і прошити цей бінарник будь яким прошивачем, який може прошити ESP8266. Наприклад "flash download tools", "ESP8266Flasher", тощо. Після прошивання, обов'язково зняти живлення з ESP8266. Вимкнути взагалі весь пристрій що прошили.
  3. Завантажити на свій смартфон додаток Blynk для андроїд, або Blynk для iOS;
  4. Запустити додаток і зареєструватись в системі Blynk:
  5. Увімкнути сканування QRcode: 
  6. Сканувати цей QRcode:
  7. Після сканування у вас з'явиться готовий проект. Відкрийте налаштування проекту:
  8. Зайдіть у розділ "Device":
  9. Зайдіть у властивості "My Devices", як немає жодного пристрою, додайте "New Device":
  10. Отримайте "Auth Token" та натисніть де позначено червоним прямокутником - "AUTH TOKEN" скопіюється до буферу. За потреби натисніть на "Email" і отримаєте "AUTH TOKEN" на свою поштову скриньку:
  11. З головного екрану проекту запустіть свій проект:
  12. Подайте живлення на свій пристрій. Двигун почне обертання, поки не замкнеться "геркон" магнітом (калібрування положення "вікно закрите"), або не пройде 10 секунд (timeout). На стадії тестування і ознайомлення можна самому рукою піднести магніт до геркону, або якимсь іншим чином замкнути контакти геркону. Далі почне блимати синій світлодіод на платі ESP8266, який під'єднано до GPIO2. На своєму смартфоні скануємо мережі Wi-Fi і підключаємось до мережі з назвою "Stepper-Motor-Wemos". Після підключення вам запропонується увійти через браузер на сторінку налаштувань пристрою, або самі запустіть браузер і зайдіть на сторінку налаштувань пристрою за адресою 192.168.4.1;
  13.  Зайти в меню "Configure WiFi":
  14. Ввести "SSID", "password" вашої WiFi мережі де буде працювати пристрій, та вставити з буферу обміну "Auth Token". Зберегти налаштування кнопкою "Save":
  15. Пристрій перезавантажиться, підключиться до вашої WiFi мережі і під'єднається до серверу Blynk. Смартфон від'єднається від мережі пристрою і під'єднається до вашої WiFi мережі. Запускаємо додаток Blynk з цим проектом і спостерігаємо на екрані данні про температуру і вологість, а також можете спробувати керувати слайдером щоб порухати кватирку чи фрамугу вікна.

Опис можливостей

В проекті є налаштування максимальної кількості кроків двигуна "MAX STEPS" і швидкість руху двигуна "SPEED MOTOR". Направлення руху двигуна (revers/direction). Рівень сигналу WiFi. Та вікно терміналу де друкуються деякі події, що відбуваються. Два планувальника подій "TIME INPUT". Та датчики температури і вологості. 

Термінал приймає деякі команди:
  • version - друкує в термінал поточну версію прошивки;
  • name - друкує в термінал поточну назву пристрою;
  • ip - друкує в термінал IP пристрою в мережі;
  • mac - друкує в термінал MAC адресу пристрою;
  • reboot - перезавантажує пристрій;
  • reset - скидає налаштування до "заводських";
  • pins - пам'ятка на яких віртуальних шпилька що "сидить".
Також в проекті присутній віджет "Eventor" за допомоги якого можна встановити залежності від температури і вологості і назначити для цього дії. 

Пристрій підтримує оновлення прошивки по WEB OTA. Для цього потрібно в браузері ПК, який знаходиться в тій же ж мережі що і пристрій, набрати IP адресу пристрою і додати "/update", наприклад пристрій має IP адресу "192.168.0.102" тоді в браузері набрати таку адресу "192.168.0.102/update" і ви потрапите на сторінку оновлення прошивки. Обирайте файл прошивки і тисніть кнопку "UPDATE". Після оновлення пристрій перезавантажиться і почне працювати знову.

Приклад роботи


вівторок, 25 вересня 2018 р.

MyHomeIoT: Рівень води Water Level шина I2C

MyHomeIoT Water Level

Рівень води MyHomeIoT Water Level призначений для контролю рівня води, та керуванням впускним і випускним клапаном по шині I2C з мікроконтролера. Приєднавши цю плату до Sonoff Basic (TH), або до будь якого пристрою на ESP8266, схемно сумісного з Sonoff basic (TH) та прошитого прошивкою MyHomeIoT починаючи з версії 1.1.4 і вище, до шини I2C, отримуєте контроль рівня води (чотири рівня: пустий, 1/4, 1/2, 3/4 і повний) плюс керування впускним і випускним клапаном зі світлодіодною індикацією і зворотнім зв'язком, як з додатку blynk app, так і з кнопки на самій платі. В додачу два тижневих планувальника для встановлення потрібного рівня води.
Також цей Water Level можна використовувати з будь яким мікроконтролером для своїх поробок автоматики і систем розумного будинку написавши програмну підтримку до свого мікроконтролеру який будете використовувати.

Схема пристрою

Схема рівня води (тицяйте в зображення для збільшення)
Схема складається з мікросхеми PCF8574P, яка є двонаправленим розширювачем портів вводу/виводу з керуванням по I2C шині і має адресу 0x21. Та мікросхеми ULN2803A, яка є масивом транзисторів Дарлінгтона і має 8 транзисторів з загальним емітером та внутрішніми діодами для індуктивних навантажень (реле).
Перші чотири входи IN1 - IN4 мікросхеми ULN2803A використовуються для визначення рівня води. Виходи OUT5 і OUT6 мікросхеми ULN2803A керують впускним і випускним клапаном. А OUT7 керує світлодіодним індикатором режиму роботи. OUT8 не використовується (резерв), тому можна замість мікросхеми ULN2803A застосувати UNL2003.

Мікросхема PCF8574P - двонаправлений розширювач портів вводу/виводу з шиною I2C
Кнопка S1 - встановлення потрібного рівня води.
Світлодіод D2 - для індикації режимів роботи та помилок сенсору.
Реле К1, К2 - керування впускним і випускним клапаном
Транзистор Q1 - захист від переливу води у випадку, якщо мікроконтролер "завис" або не працює з якихось причин. Можна без транзистору, тоді OUT5 мікросхеми ULN2803A з'єднати на пряму з реле К1 (вивід 2 на схемі).

Демонстраційний код


/*
 Name:  pcf8574_water_level.ino
 Created: 7/16/2018 8:59:19 AM
 Author: Andriy
*/
#include <Ticker.h>
#include <Wire.h>
#include <pcf8574_esp.h>


#define ADDRESS_WATER_LEVEL  0x21 // Address PCF8574 on the I2C bus
#define SDA    4 // Pin SDA wire 
#define SCL    5 // Pin SCL wire

typedef enum {
 empty  = 0x00,
 quarter  = 0x40,
 half  = 0x80,
 threeQuarters = 0xC0,
 full  = 0xFE,
 errorSensor = 0xFF
}WaterLevelEnum;

typedef enum {
 sensor_0,
 sensor_1,
 sensor_2,
 sensor_3,
 intake_pump,
 outlet_pump,
 led_indicator,
 button
}WaterLevelPortEnum;

typedef struct
{
 bool triggerInit  = false;   // трігер чи є такий пристрій в системі
 bool triggerButton  = false;   // трігер натискання і відпускання кнопки
 bool triggerStart  = false;   // трігер старту встановлення рівня води 
 bool stateLed   = false;   // стан світлодіодного індікатора увімк/вимкн 
 bool stateRelay[2]  = { false, false }; // стан впускного і випускного реле 
 uint8_t requiredWaterLevel = full;
 uint8_t currentWaterLevel = empty;
}WaterLevelTypeDef;

WaterLevelTypeDef waterLevelStruct;

PCF857x waterLevelDevice(ADDRESS_WATER_LEVEL, &Wire, false);

Ticker tickerWaterLevel;

static void wl_Run(bool setOutletPump);
static uint8_t wl_GetWaterLevel(void);
static void wl_SetWaterLevel(uint8_t level);
static void wl_ReadKey(void);
static void wl_Control(bool setOutletPump);
static void wl_ErrorLedStatus(void);
static void wl_Action(bool state, bool stateIntakePump, bool stateOutletPump, String str);

// the setup function runs once when you press reset or power the board
void setup()
{
 Serial.begin(115200);

 Wire.begin(SDA, SCL);
 // ініціалізуємо рівень води
 waterLevelDevice.begin(0x8F);
 // встановлюємо потрібний рівень
 wl_SetWaterLevel(half);
 // взнаємо поточний рівень води і заносимо до структури
 waterLevelStruct.currentWaterLevel = wl_GetWaterLevel();

 if (waterLevelStruct.currentWaterLevel != errorSensor)
 {
  wl_Action(false, false, false, "Device water level is OK!");

  if (tickerWaterLevel.active())
  {
   tickerWaterLevel.detach();
   waterLevelDevice.write(led_indicator, LOW);
  }
 }
 else
 {
  wl_Action(false, false, false, "Device water level is sensor error!");
  
  if (!tickerWaterLevel.active())
  {
   tickerWaterLevel.attach(0.2, wl_ErrorLedStatus);
  }  
 }
}

// the loop function runs over and over again until power down or reset
void loop() 
{ 
 wl_Run(true);
}

static void wl_Run(bool setOutletPump)
{
 wl_ReadKey();
 wl_Control(setOutletPump);  
}

static void wl_ReadKey(void)
{
 if (!waterLevelDevice.read(button) && !waterLevelStruct.triggerButton)
 {
  waterLevelStruct.triggerButton = true;
  waterLevelStruct.triggerStart = !waterLevelStruct.triggerStart; 
 }
 else if (waterLevelDevice.read(button) && waterLevelStruct.triggerButton)
 {
  waterLevelStruct.triggerButton = false;  
 }
}

static void wl_Control(bool setOutletPump)
{
 if (waterLevelStruct.triggerStart) 
 {  
  waterLevelStruct.currentWaterLevel = wl_GetWaterLevel();

  if (waterLevelStruct.currentWaterLevel == errorSensor)
  {  
   wl_Action(false, false, false, "Error water sensor");
   
   if (!tickerWaterLevel.active())
   {
    tickerWaterLevel.attach(0.2, wl_ErrorLedStatus);
   }   
  }
  else
  {      
   if (tickerWaterLevel.active())
   {
    tickerWaterLevel.detach();
    waterLevelDevice.write(led_indicator, LOW);
   }
   
   if (waterLevelStruct.currentWaterLevel == waterLevelStruct.requiredWaterLevel)
   {    
    wl_Action(false, false, false, "The tank has already reached the required level");    
   }
   else if (waterLevelStruct.currentWaterLevel < waterLevelStruct.requiredWaterLevel)
   {
    if (!waterLevelStruct.stateRelay[0])
    {     
     wl_Action(true, true, false, "Intake Pump ON");
    }
   }
   else if (waterLevelStruct.currentWaterLevel > waterLevelStruct.requiredWaterLevel)
   {
    if (setOutletPump)
    {     
     if (!waterLevelStruct.stateRelay[1])
     {
      wl_Action(true, false, true, "Outlet Pump ON");
     }
    }
   }
  }  
 }
 else
 {
  if (waterLevelStruct.stateRelay[0])
  {   
   wl_Action(false, false, false, "Intake Pump OFF");
  }
  
  if (waterLevelStruct.stateRelay[1])
  {
   wl_Action(false, false, false, "Outlet Pump OFF");
  }
 } 
}

static void wl_Action(bool state, bool stateIntakePump, bool stateOutletPump, String str)
{ 
 waterLevelStruct.triggerStart = state;
 waterLevelStruct.stateLed = state;
 waterLevelStruct.stateRelay[0] = stateIntakePump;
 waterLevelStruct.stateRelay[1] = stateOutletPump; 
 Serial.println(str);
 Serial.print("Current water level is ");
 switch (waterLevelStruct.currentWaterLevel)
 {
 case empty:
  Serial.println("empty");
  break;
 case quarter:
  Serial.println("1/4");
  break;
 case half:
  Serial.println("1/2");
  break;
 case threeQuarters:
  Serial.println("3/4");
  break;
 case full:
  Serial.println("full");
  break;
 case errorSensor:
  Serial.println("error");
  break;
 default:
  break;
 } 

 waterLevelDevice.write(led_indicator, waterLevelStruct.stateLed);
 waterLevelDevice.write(intake_pump, waterLevelStruct.stateRelay[0]);
 waterLevelDevice.write(outlet_pump, waterLevelStruct.stateRelay[1]); 
}

static void wl_ErrorLedStatus(void)
{
 waterLevelDevice.toggle(led_indicator);
}

static uint8_t wl_GetWaterLevel(void)
{ 
 uint8_t level = (waterLevelDevice.read8() & 0xF) ^ 0x0F;
 
 if (level != 0b0000 && level != 0b0001 &&\
  level != 0b0011 && level != 0b0111 && level != 0b1111)
 {
  return errorSensor;
 }
 else
 {
  if (level == 0b0000)
   return empty;
  else if (level == 0b0001)
   return quarter;
  else if (level == 0b0011)
   return half;
  else if (level == 0b0111)
   return threeQuarters;
  else if (level == 0b1111)
   return full;  
 } 
}

static void wl_SetWaterLevel(uint8_t level)
{
 waterLevelStruct.requiredWaterLevel = level;
}

неділю, 8 липня 2018 р.

Blynk: контроль підключеннями до серверу Blynk та мережі WiFi

update 25.12.2020: написав нову статтю на цю тему плюс відео: "Blynk: підключення до точки WiFi та серверу Blynk, очікування WiFi точки, перепідключення до WiFi та серверу Blynk, робота основного коду без блокування при очікування з'єднання для ESP32/ESP8266"

Передмова

Надихнуло на написання цієї статті це відео з каналу "Інженерка" - рекомендую.

Коли справно працює ваша мережа WiFi, безперебійний доступ до інтернету, та доступ до серверу Blynk, то й немає ніяких проблем з пристроєм який виконує свій функціонал в парі з системою Blynk. Але коли нештатна ситуація з підключенням, при увімкнені пристрою, чи обірвався зв'язок з мережею, чи сервером Blynk, то треба програмно передбачити такі ситуації і передбачити повторне підключення до серверу у разі втрати зв'язку. А також, коли немає зв'язку з сервером з якихось причин, функція Blynk.run(); буде "гальмувати" ваш пристрій, при кожному виклику (за замовчуванням аж 30 секунд). А викликається ця функція в головному циклі як найчастіше. Тому, як не передбачити втрату зв'язку, ви навіть не в змозі будете щось увімкнути на своєму пристрої. Наприклад, це буде у вас WiFi реле. То увімкнути, чи вимкнути реле з кнопки, скоріше за все в вас не вийде, або вийде з величезною затримкою. У всякому разі таким пристроєм користуватись буде не зручно.

Основа

Беремо за основу "пустий" приклад скетчу для роботи з Blynk:
*************************************************************

  Youll need:
   - Blynk App (download from AppStore or Google Play)
   - ESP8266 board
   - Decide how to connect to Blynk
     (USB, Ethernet, Wi-Fi, Bluetooth, ...)

  There is a bunch of great example sketches included to show you how to get
  started. Think of them as LEGO bricks  and combine them as you wish.
  For example, take the Ethernet Shield sketch and combine it with the
  Servo example, or choose a USB sketch and add a code from SendData
  example.
 *************************************************************/

/* Comment this out to disable prints and save space */
#define BLYNK_PRINT Serial


#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>

// You should get Auth Token in the Blynk App.
// Go to the Project Settings (nut icon).
char auth[] = "YourAuthToken";

// Your WiFi credentials.
// Set password to "" for open networks.
char ssid[] = "YourNetworkName";
char pass[] = "YourPassword";

void setup()
{
  // Debug console
  Serial.begin(115200);

  Blynk.begin(auth, ssid, pass);
  // You can also specify server:
  //Blynk.begin(auth, ssid, pass, "blynk-cloud.com", 8442);
  //Blynk.begin(auth, ssid, pass, IPAddress(192,168,1,100), 8442);
}

void loop()
{
  Blynk.run();
  // You can inject your own code or combine it with other sketches.
  // Check other examples on how to communicate with Blynk. Remember
  // to avoid delay() function!
}
Тепер додамо до цієї основи програмний контроль підключення до WiFi і Blynk.

Доопрацьований базовий скетч з контролем підключення до Wi-Fi та Blynk

Код для скетчу можете копіювати звідси або завантажити файл:
/* Comment this out to disable prints and save space */
#define BLYNK_PRINT Serial


#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>

bool triggerBlynkConnect = false;
bool isFirstConnect = true; // Keep this flag not to re-sync on every reconnection

// You should get Auth Token in the Blynk App.
// Go to the Project Settings (nut icon).
char auth[] = "YourAuthToken";

// Your WiFi credentials.
// Set password to "" for open networks.
char ssid[] = "YourNetworkName";
char pass[] = "YourPassword";

// Оголошення таймеру
BlynkTimer timer;

static void timerReconnect(void);

void setup()
{
  // Debug console
  Serial.begin(115200);

  // Конфігуруємо підключення до blynk server
  Blynk.config(auth);
  
  //Під'єднуємось до WiFi мережі
  Blynk.connectWiFi(ssid, pass);

  if (WiFi.status() == WL_CONNECTED)
  {
    if (Blynk.connect())
    {
      triggerBlynkConnect = true;
    }
    else
    {
      triggerBlynkConnect = false;
    }
  }

  timer.setInterval(60000L, timerReconnect);
}

void loop()
{
  if (Blynk.connected())
  {
    Blynk.run(); // Initiates Blynk Server  
  }
  else
  {
    triggerBlynkConnect = false;
  }

  timer.run(); // Initiates BlynkTimer
}

BLYNK_CONNECTED()
{
  triggerBlynkConnect = true;

  Serial.println(F("Blynk Connected!"));
  Serial.println(F("local ip"));
  Serial.println(WiFi.localIP());

  if (isFirstConnect)
  {       
    Blynk.syncAll();    

    isFirstConnect = false;
  }
}

static void timerReconnect(void)
{
  if (WiFi.status() != WL_CONNECTED)
  {
    Serial.println(F("WiFi not connected"));
    
    Blynk.connectWiFi(ssid, pass);
  }
  else
  {
    Serial.println(F("WiFi in connected"));
  }

  if (!Blynk.connected() && WiFi.status() == WL_CONNECTED)
  {
    if (Blynk.connect())
    {
      Serial.println(F("Blynk reconnected"));
    }
    else
    {
      Serial.println(F("Blynk not reconnected"));
    }
  }
  else
  {
    Serial.println(F("Blynk in connected"));
  }
}
І трішки пояснень по порядку:

  • змінна triggerBlynkConnect саме в цьому скетчі не використовується. Їй назначається true або false, але ніде не аналізується цей стан. Але коли знадобиться такий аналіз, то змінна, значення якої залежить чи є з'єднання з сервером blynk, або немає такого з'єднання з сервером, у вас вже буде.
  • змінна isFirstConnect потрібна для того, щоб синхронізація шпильок відбувалась тільки раз при першому підключенні.
  • оголошуємо таймер BlynkTimer timer і оголошуємо прототип функції для реконекту static void timerReconnect(void)
  • конектимось до WiFi мережі і в разі успіху конектимось до серверу блінк, як ні, то до серверу блінк і не намагаємось пробитись.
  • запускаємо таймер реконекту timer.setInterval(60000L, timerReconnect) - кожну хвилину буде виконуватись функція static void timerReconnect(void), де буде здійснюватись підключення до WiFi і Blynk у разі потреби, а як з конектом буде все гаразд, то нічого не буде виконуватись в цій функції.
  • в безкінечному циклі loop буде виконуватись Blynk.run(); тільки в тому разі, коли є підключення до серверу Blynk, а у разі втрати з'єднання, ваш код не буде "гальмувати".
  • функція BLYNK_CONNECTED() викликається кожного разу при з'єднанні з сервером Blynk і щоб кожного разу, при реконекті не синхронізувались всі шпильки, аналізуємо стан змінної isFirstConnect
До цього базового, доопрацьованого скетчу можете додавати свій функціонал і не боятись втрати зв'язку. Коли зв'язок відновиться, ваш пристрій знову підключиться до мережі і серверу. А також не буде "гальмуватись" ваш код коли не буде зв'язку, бо функція Blynk.run(); буде викликатись тільки коли є зв'язок з сервером.

Післямова

Як вам сподобалась стаття і хочете підтримати проект і бачити нові статті про Blynk, то буду вдячний за будь-які "донати".

вівторок, 13 березня 2018 р.

MyHomeIoT: Прошивка для Sonoff та ESP8266 з підтримкою Blynk


Опис прошивки не повний, поступово буду додавати інформацію, вона дуже об'ємна. Прошивка повноцінна можна користуватись. Зворотній зв'язок вітається. 

update 30.12.2019 - додав прошивку 1.1.7.8
update 01.10.2019 - додав прошивку 1.1.7.3
update 07.11.2018 - додав прошивку 1.1.6 + оновив інформацію щодо оновлення.
update 09.10.2018 - додав прошивку 1.1.5
update 26.09.2018 - додав прошивку 1.1.4 + оновив інформацію щодо оновлення.
update 14.07.2018 - додав прошивку 1.1.3
update 02.06.2018 - додав прошивку 1.1.1
update 23.04.2018 - додав розділ "Як скинути налаштування" пристрою в початковий стан. Оновив інформацію в розділі "Як налаштувати" - для користувачів локальних blynk серверів тепер порт за замовчуванням: 8080.
update 13.04.2018 - додав прошивку 1.1.0 оновив схему датчиків які підключаються до GPIO14. Деякі правки в тексті щоб відповідало поточному стану.
update 05.04.2018 - додав прошивку 1.0.9 та схему підключення світлодіодної стрічки для саморобних пристроїв
update 30.03.2018 - додав прошивку 1.0.8
update 29.03.2018 - додав розділ "Меню налаштувань Widget TABLE", опис Widget TERMINAL
update 28.03.2018 - додав прошивку 1.0.7 і схеми підключення периферії до GPIO14
update 15.03.2018 - додав схему для саморобок.
update 14.03.2018 - додав розділи "Планувальник і годинник реального часу", "Оновлення по Web OTA", "Віртуальні шпильки".


Прошивка 1.1.7.8

  • Додав час і дату до повідомлень про reconnect в термінал blynk і в serial terminal;
  • Коли GPIO14 в режимі PIR або SECURITY, то при першому підключені до blynk, або при перепідключені до серверу blynk - відправляється на сервер стан піну GPIO14;
  • І найголовініше!!! Кардинально перероблено логіку конекту і реконекту до мережі WiFi та серверу Blynk. Тепер пристрій в будь якому разі відновить з'єднання при наявності WiFi і мережі інтернет. Пристрій на який перший раз встановили прошивку MyHomeIoT при першому ввімкненні живлення, автоматично входить в режим точки доступу з ім'ям мережі "MyHomeIoT-Sonoff" або "Sonoff Basic, TH, T1". Під'єднавшись до цієї мережі перейдіть з бравзера за  адресою 192.168.4.1 та потрапите на сторінку початкового налаштування (так було і раніше). Далі відмінності. Якщо після перебоїв з електрикою подали живлення на пристрій і на роутер WiFi одночасно, то пристрій протягом 1 хвилини намагається з'єднатись з роутером (як правило, за 1 хвилину будь який роутер "підіймає" WiFi мережу). У разі з'єднання пристрій працює в штатному режимі з мережею. У разі невдалого з'єднання, пристрій працює в штатному режимі без мережі. Кожні 2 хвилини намагається відновити з'єднання з WiFi та сервером Blynk. При відновлені мережі WiFi та доступу до серверу blynk з'єднання відновиться автоматично. Щоб скинути налаштування і увійти в режим початкових налаштувань можна, як і раніше, тримати натиснутою кнопку GPIO0 більш ніж 10 секунд. Або в терміналі blynk надіслати на пристрій команду "reset". Після цього пристрій "обнулиться", перезавантажиться, і створить власну мережу WiFi на 180 секунд, під'єднавшись до якої можна зайти з браузера за адресою 192.168.4.1 щоб потрапити на сторінку початкових налаштувань пристрою. 

Прошивка 1.1.7.3

  • Додав пітримку Sonoff T1 в прошивці тільки для Sonoff. Віртуальні шпильки для керування сенсорними кнопками  Sonoff T1 з додатку Blynk - V20, V34, V35;
  • Додав можливість при надсиланні даних через Webhook регулювати частоту надсилання. Зараз є: disable, 1 minute, 5 minute, 10 minute, 20 minute, 30 minute. Цей параметр можна налаштувати в таблиці налаштувань на V66.

Прошивка 1.1.6

  • Оновив інформацію щодо віртуальних шпильок по команді "pins" в терміналі на V41
  • Додав WebHook для сенсору HDC1080 на V74
  • Для керування RGB LED Strip, додав підтримку 16 канального 12 бітного розширювача широтно-імпульсної модуляції на PCA9685, керування каналами по I2C шині. Тепер у вас є можливість з ESP8266, WeMos, NodeMCU, а також пристроїв Sonoff Basic (TH), керувати 16-ма незалежними каналами, яким можна задавати значення від 0 до 4095, щоб задати як інтенсивність свічення, так і колір свічення RGB світлодіодної стрічки. Схема підключення PCA9685 типова. Адреса PCA9685 на шині I2C має бути 0x50. Можна використовувати готові модулі на PCA9685, які можна купити будь де, наприклад тут, або тут. Виходи каналів підключати до світлодіодних стрічок через MOSFET ключ. Встановлення рівня на каналах PWM 0-15 прив'язані до таких шпильок: V100 - V115. Увімкнути/вимкнути світлодіодні стрічки, кнопка на V33. Два планувальника для кнопки на V33 прив'язані до таких шпильок: V64, V65

Прошивка 1.1.5

Важливо!!! Після оновлення прошивки, налаштування в таблиці-меню, що на V66 скинуться на значення за замовчуванням. Перепрошую за незручності.
  • Виправив помилку при виборі типу сенсора DHT. Було: при обрані будь якого типу сенсору DHT - оброблявся сенсор DHT22. Зараз: перевірено на DHT22, DHT11 - показники коректні.
  • Додано обробку ADC на A0. За замовчуванням вимкнено. В таблиці-меню, що на V66, можна обрати: отримувати, або значення у вольтах, або значення ADC від 0 до 1024. За замовчуванням на A0 очікується максимальна напруга 3.3 вольта. Це значення можна змінити через команду в терміналі що на V41. Наприклад, максимальна напруга яку ви будете міряти становить 5.5 вольт. В терміналі вводити таку команду: "maxvoltage=5.5". Замість символу "=" можна вводити як "пробіл", так і "-". Це потрібно для коректного обрахунку виміряної напруги у вольтах. Данні з A0 очікуються на V81. Увага!!! Напряму на A0 чипу ESP8266 можна подавати максимальну напругу - 1 вольт!!! Щоб міряти більшу напругу потрібно вимірювану напругу подавати через резистивний дільник. Наприклад, такі плати, як NodeMCU чи Wemos mini вже мають такий дільник. І на A0 вже можна подавати максимальну напругу 3.3 вольта. Значення резисторів для дільника наруги можна вирахувати по формулі чи скористатись онлайн калькулятором (google.com у допомогу).
  • Додано підтримку високоточного (14 розрядного) сенсору температури і вологості HDC1080. Значення температури і вологості виводяться, як на дисплей SSD1306, при його наявності, так і на віртуальні шпильки Blynk - V16, V17.

Прошивка 1.1.4

  • Оновлено бібліотеку Blynk до 0.5.4
  • Додав команду до терміналу "name" - повертає ім'я пристрою, яке ви задали при початковому налаштуванні
  • Додано підтримку плати "Water Level". Чотири рівня води (пустий, 1/4, 1/2, 3/4, повний), впускний і випускний клапан, світлодіодна індикація режимів роботи і помилки сенсору. Захист від переливу води. Керування по шині I2C, адреса пристрою на шині 0x21. Кнопка встановлення, наперед заданого, рівня води - V31. Має два тижневих планувальника - V62, V63. Індикатор рівня води - V15. Сегментний перемикач встановлення потрібного рівня води  - V32
  • Виправив індикацію втрати зв'язку з сервером Blynk і трішки змінив функцію реконекту до мережі WiFi та серверу Blynk

Прошивка 1.1.3

  • Оновлено ядро для ESP8266 до версії 2.4.1
  • Оновлена бібліотека Blynk до версії 0.5.3
  • Виправлена та покращена робота з платою Expander 4x4
  • Зроблена деяка оптимізація RAM і ROM, та усунення незначних помилок
  • Тепер події в термінал і серіал порт пишуться з часом і датою

Прошивка 1.1.1

  • Змінено поведінку світлодіода, що на GPIO13 в режимі "Security". Тепер світлодіод світиться коли порушено охорону (контакт на GPIO14 розімкнуто) і світлодіод вимкнено коли об'єкт під охороною (контакт на GPIO14 замкнуто). Додано повідомлення про зміну стану охорони в віджет термінал V41 (дата, час, стан)
  • Тепер для всіх підтримуваних датчиків доступний WebHook. За замовчуванням WebHook вимкнено. Увімкнути можна в таблиці-меню, що на V66. Докладно дивись в розділі "WebHook"
  • В додачу до DHT22 (AM2302, AM2321) додано підтримку датчиків DHT11, DHT21 (АМ2301). За замовчуванням очікується DHT22, інші типи DHT можна обрати в таблиці-меню, що на V66.
  • І головне оновлення це підтримка плати розширення 4x4 - "Expander I/O 4x4" (чотири реле + чотири кнопки). Керування по шині I2C з адресою пристрою на шині 0x20. Реле "прив'язані" до таких віртуальних шпильок як: V21, V22, V23, V24. До кожного додаткового реле є один тижневий планувальник. Схеми, опис, за ланкою - "Expander I/O 4x4"
Важливо!!! Після оновлення налаштування, в таблиці-налаштувань, що на V66, скинуться на значення за замовчуванням. Потрібно знову налаштувати за вашими вподобаннями чи потребами. Вибачте за незручності, але структура даних для налаштувань змінилась потрібен перезапис даних налаштувань.

Прошивка 1.1.0

  • Додав режим PIR на GPIO14 (детально в "Меню налаштувань пристрою Widget TABLE")
  • Покращив роботу сенсору BME280, та BMP180
  • Додав нову команду до віджету терміналу "altitude". Актуально для пристроїв з сенсором BMP180 і BME280. В рядку для вводу набрати слово "altitude" (без лапок) потім пробіл,  або тире, або дорівнює, а вже потім висоту в метрах цілим числом над рівнем моря де встановлено пристрій. Нове значення висоти запам'ятається в EEPROM пристрою. За замовчуванням "altitude=0"
  • По дрібничкам. Щось оптимізував, щось виправив, щось додав, щось прибрав

Прошивка 1.0.9

  • Додав до меню режим роботи GPIO12, де знаходиться на Sonoff реле. Тепер на GPIO12 може бути як реле, так і світлодіодна стрічка під'єднана через MOSFET транзисторний ключ. Та керувати світлодіодною стрічкою не тільки увімкнути/вимкнути, а й регулювати яскравість стрічки за допомоги віджета SLIDER якому призначити віртуальну шпильку V20. Скоріше, це оновлення для саморобок, так як під'єднати до Sonoff світлодіодну стрічку, у цьому разі, вимагатиме значних переробок самого Sonoff, та необхідно забезпечити окреме живлення світлодіодної стрічки. Схема додається в розділі нижче.
  • Спростив режим "Security". Тепер, якщо обрано режим охорони і до GPIO14 під'єднано контакти охоронного сенсора, то працює це так: коли контакти замкнути - на сервер відсилається на віртуальну шпильку V19 значення 255, а коли розімкнути, на сервер на шпильку V19 відсилається значення 0. На V19 в додатку Blynk App можна навішати віджет LED. А необхідні події про надсилання повідомлень, електронних листів, спрацювань реле вже робите по бажанню, самі, через віджет EVENTOR в додатку Blynk App.
  • Важливо! Після оновлення обов'язково перевірте налаштування в меню, що в таблиці на шпильці V66. Скоріше за все деякі налаштування "злетять".

Прошивка 1.0.8

  • Додав підтримку до 5 сенсорів DS18B20 на GPIO14
  • Виправив помилку пов'язану віджетом TIME_INPUT. Було: як обрати тільки час для Start, а час для Stop не обирати, то подія Stop все одно опівночі відбудеться. Або навпаки коли обрати час для Stop, а час для Start не обирати, то подія Start все одно опівночі відбудеться. Виправлено!
  • Віджет MENU V60 - вже не обробляється
  • LCD  V40 - дані не надсилаються
  • Дрібні правки в коді

Прошивка 1.0.7

  • Додав меню налаштувань до віджету "Table". Подробиці в розділі "Меню налаштувань Widget TABLE".
  • Зміни в командах до віджету "Terminal". Тепер команда "reset" - скидання налаштувань в початковий стан (SSID, PASS і AUTH потрібно вводити заново). А команда "reboot" - це просто перезавантаження пристрою.
  • Тепер на "GPIO14" можна під'єднати не тільки сенсори DS18B20 або DHT22, а і додаткову кнопку, яка дублює увімкнути/вимкнути реле. В додачу, можна в налаштуваннях GPIO14 виставити режим "Security". Додавши віджет світлодіоду (Widget LED) на віртуальну шпильку V19 можна відстежування стану охоронного датчика, що на GPIO14. Віджет світлодіоду увімкнено, як об'єкт під охороною (замкнуті контакти), віджет світлодіоду вимкнено, як об'єкт знято з охорони (розімкнуті контакти).
  • Важливо!!! В наступних прошивках не буде підтримки MENU V60 - режим поведінки реле на GPIO12 при подачі живлення на пристрій. Зараз працює і на MENU V60 і на TABLE V66 (пріоритет MENU V60, якщо встановлено обоє віджети). Також не будуть надсилатися дані до віджету LCD V40. 

Опис функціоналу

Особливості

  • Автоматичнє визначення підтримуваної периферії при увімкнені пристрою
  • Підтримка WEB OTA (оновлень по повітрю)
  • Робота з Blynk сервером
  • Автоматичне перепідключення при втраті з'єднання
  • В разі відсутності WiFi - автономно на рівні пристрою функціонал зберігається
  • З версії 1.1.1 і вище підтримка розширювача портів 4x4 "Expander I/O 4x4" для керування додатковими чотирма реле, як з додатку Blynk App так і з кнопок на платі
  • З версії 1.1.4 і вище підтримує плату "Water Level" для контролю і встановлення рівня води в ємності, як з додатку Blynk App так і з кнопки на платі

Реле GPIO12

  • Увімкнути/вимкнути реле як з кнопки, так і з додатку на смартфоні Blynk App
  • Сім планувальників на тиждень увімкнути/вимкнути реле
  • Зворотній зв'язок. Якщо натиснути кнопку на пристрої, або спрацює планувальник, то стан реле коректно відобразиться в додатку на вашому смартфоні. Ви завжди будете знати увімкнене, чи вимкнене реле на цей час
  • Три режими реле при увімкнені пристрою On/Off/Keep (увімкнуте, вимкнуте, як було)

Світлодіод GPIO13

  • Блимання світлодіоду 5 разів на 1 секунду - пристрій в режимі налаштування
  • Блимання світлодіоду 2 рази на 1 секунду - триває під'єднання до точки WiFi
  • Блимання світлодіоду 1 раз на 2 секунди - втрачено зв'язок з сервером Blynk
  • Світлодіод не світиться - все в порядку

OLED дисплей I2C 0x3C

На дисплей виводиться, раз на 2 секунди по черзі, така інформація:
  • Поточний час (потрібно додати в проект віджет RTC)
  • Стан реле (On/Off)
  • Рівень сигналу WiFi у відсотках
  • Рівень освітленості (при наявності сенсору)
  • Температура (при наявності сенсору)
  • Вологість (при наявності сенсору)
  • Тиск (при наявності сенсору)
Дисплей можна вимикати і вмикати за розкладом, або кнопкою з додатку Blynk App.

Як прошити

Для заливки прошивки підійде будь який прошивач для ESP8266:
Скріншоти до програми nodeMCU:


Чи будь який інший, це не принципово. Головне щоб в налаштуваннях прошивача було вірно обрано номер порту куди під'єднано пристрій, швидкість порту 115200, вірно обраний розмір флеш-пам'яті, і початок прошивки має починатись з адреси 0x00000.
Для Sonoff та ESP8266 потрібен ще USB2UART конвертер, наприклад такий:
Для плат типу NodeMCU не потрібно. Зазвичай мають на платі такий конвертер і під'єднуються до ПК звичайним usb шнурком.
Після прошивання, як правило, потрібно пересмикнути живлення. Не кнопкою ресет, а повністю зняти живлення, та знову подати на пристрій.

Доопрацювання Sonoff

  • Пристрої Sonoff мають місце під гребінку для прошивання, як показано на світлині. Потрібно впаяти туди підходящу гребінку на 5 шпильок для під'єднання USB2UART конвертора (прошивача).
  • В стоковій комплектації Sonoff на борту має memory flash розміром 8Мбіт (1Мбайт). І поки цього достатньо навіть для оновлень по OTA. Але як маєте навички паяти, то краще перепаяти стокову флешку, на флешку більшого об'єму 32Мбіт (4Мбайт). Щоб при подальшому розвитку прошивки ви могли зберегти можливість оновлюватись за технологією OTA. Плюс цієї модифікації ще в тому, що ви зберігаєте стокову прошивку на випаяній мікросхемі, і в разі, як вам захочеться повернутись до eWelink, ви просто впаюєте мікросхему пам'яті назад і все. Так, як стокова прошивка має захист і підходить виключно під ваш конкретний пристрій, то спосіб з заливкою дампу прошивки від іншого пристрою, більш за все, не оживить ваш пристрій.
У всякому разі, впаювання 5-ти шпилькової гребінки для вдалого прошивання, достатньо.
Місце для впаювання гребінки і призначення виводів гребінки

SONOFF J1
WIRE
USB TO SERIAL
1 : VCC-3V3
Orange
3V3
2 : E-RX
Green
TXD
3 : E-TX
Yellow
RXD
4 : GND
Black
GND
5 : GPIO14
Not Connected
Not Connected

Підтримувана периферія на GPIO14

Сенсори DS18B20 і DHT22 на GPIO14

Наявність сенсорів DS18B20 та DHT22 визначається автоматично, коли обрано режим GPIO14 - sensors (за замовчуванням) в меню-таблиця на V66 . Необхідно обов'язково між GPIO14 та +3.3В впаяти резистор на 4.7КОм.

Резистор R1 на 4.7КОм можна впаяти на саму плату Sonoff (ESP8266, NodeMCU) між GPIO14 та живленням +3.3V. А сенсори вже під'єднувати до шпильок роз'єму. Або можна підпаювати резистор на сам сенсор. Та скоріше за все, сенсор DHT22, вже має цей резистор-підтяжку в своєму корпусі і має працювати і так, без додаткового резистора. Спробуйте спочатку без резистора, як не працює, додайте резистор як показоно в схемі.

Додаткова кнопка, сенсор руху і охоронний датчик

Схема підключення сенсорної кнопки, сенсора руху та охоронного датчика

Для додаткової кнопки і охоронного сенсору потрібно впаяти резистор між GPIO14 та GND будь якого номіналу між 3.3КОм та 10КОм.

Підтримувана периферія на шині I2C

Шина I2C для SONOFF - SDA -> GPIO1 (TX), SCL -> GPIO3 (RX)
Шина I2C для ESP8266 & NodeMCU - SDA -> GPIO4, SCL -> GPIO5
  • OLED дисплей SSD1306, адреса на шині 0x3C
  • сенсор рівня освітлення TSL2561, адреса на шині 0x39
  • сенсор температури і атмосферного тиску BMP180, адреса на шині 0x77
  • сенсор температури, вологості і атмосферного тиску BME280, адреса на шині 0x76
  • плата розширення портів 4x4 "Expander I/O 4x4", адреса на шині 0x20
  • плата контролю та встановлення рівня води в ємності "Water Level", адреса на шині 0x21
  • сенсор температури і вологості HDC1080, адреса на шині 0x40
  • плата розширення сигналів широтно-імпульсної модуляції PWM 16 каналів 12 біт на PCA9685, адреса на шині 0x50
Наявність периферії визначається автоматично. Необхідно обов'язково між SDA, SCL та +3.3В впаяти по резистору на 10КОм.

Як початково налаштувати

При першому увімкнені, або коли змінились налаштування WiFi роутера, пристрій входить в режим налаштувань і створює свою WiFi точку без паролю з ім'ям "MyHomeIoT-Sonoff", або "MyHomeIoT-ESP8266" в залежності від обраної прошивки. Під'єднайтесь до цієї точки і увійдіть через браузер за адресою "192.168.4.1". Відкриється меню налаштувань.
Початкова сторінка налаштувань

Обрати "Configure WiFi", ввести SSID, PASS вашої WiFi мережі. Назначити унікальне ім'я вашому пристрою. Наприклад: "lustre", "lamp-baby-room", "heater-bad-room", "socked-conditioner", тощо. Та ввести AUTH пристрою в системі Blynk (AUTH надається при додаванні пристрою в проект, дивись у розділі "Як користуватись"). Натиснути "зберегти". Пристрій запам'ятає налаштування до флеш-пам'яті, перезавантажиться, підключиться до вашої WiFi мережі і почне працювати.
До уваги користувачів локальних Blynk-server, в налаштуваннях пристрою зазначте порт 8080. Ось ланка на джерело.

Як скинути налаштування

Налаштування пристрою зберігаються окремо від самої прошивки, тому просте перепрошивання чи оновлення прошивки не зачепить самих налаштувань і вони збережуться. Тому, щоб скинути налаштування у початковий стан, є декілька способів:
  • Потримайте натиснутою кнопку на пристрої, що на GPIO0, 5-10 секунд і відпустіть її, це призведе до скидання налаштувань у початковий стан, перезавантаження пристрою, створення точки доступу і вхід пристрою в режим налаштувань. На Sonoff це єдина кнопка, а на NodeMCU і подібних пристроях вона теж на GPIO0 і називається "flash".
  • В віджеті терміналу на смартфоні (Blynk App) введіть команду "reset" - маленькими літерами без лапок. Пристрій так само скине налаштування в початковий стан, перезавантажиться і створить точку доступу. Можна підключитись до цієї ТД і знову ввести потрібні налаштування.

Як користуватись

Перш за все потрібно мати на смартфоні додаток Blynk. Є як для Android, так і для iOS. Встановіть його і запустіть на своєму смартфоні. Зареєструйтесь і створіть новий проект, дайте йому ім'я та оберіть пристрій:

Отримаєте на пошту повідомлення з AUTH для вашого пристрою.

Кнопка керування реле

Додайте в свій проект віджет кнопки, зайдіть в налаштування кнопки і дайте їй ім'я "Relay", оберіть колір на свій розсуд, оберіть віртуальну шпильку "V20", режим кнопки "SWITCH", як на малюнку:
Запустіть проект. Спробуйте понатискати кнопку на смартфоні - реле вмикається і вимикається. Понатискайте кнопкуGPIO0 на пристрої - реле вмикається і вимикається і стан реле видно у вашому смартфоні.

Планувальник і годинник реального часу

Увімкнення і вимкнення реле можна запланувати. Для цього є аж сім планувальників на тиждень. Це віджет "TIME INPUT". Для правильної роботи планувальника потрібен віджет "RTC".  Додайте його до свого проекту. Тепер можна додати до проекту віджет "TIME INPUT".
Планувальникам відповідають такі віртуальні шпильки:
  1. Time Input 0 - V50 - реле на GPIO12
  2. Time Input 1 - V51 - реле на GPIO12
  3. Time Input 2 - V52 - реле на GPIO12
  4. Time Input 3 - V53 - реле на GPIO12
  5. Time Input 4 - V54 - реле на GPIO12
  6. Time Input 5 - V55 - реле на GPIO12
  7. Time Input 6 - V56 - реле на GPIO12
  8. Time Input 7 - V57 - реле на GPIO12
  9. Time Input 8 - V58 - реле 1 розширювача 4х4
  10. Time Input 9 - V59 - реле 2 розширювача 4х4
  11. Time Input 10 - V60 - реле 3 розширювача 4х4
  12. Time Input 11 - V61 - реле 4 розширювача 4х4
  13. Time Input 12 - V62 - встановлення рівня води
  14. Time Input 13 - V63 - встановлення рівня води
  15. Time Input 14 - V64 - RGB Led стрічка
  16. Time Input 15 - V65 - RGB Led стрічка

Меню налаштувань пристрою Widget TABLE

Щоб отримати доступ до меню налаштувань свого пристрою. Зупиніть проект. Додайте в проект віджет "Table". В налаштуваннях віджету назначте віртуальну шпильку V66"ALLOW REORDERING - NO""CLICKABLE ROWS - YES". Запустіть проект та перезавантажте пристрій утриманням кнопки протягом 3 - 4 секунд, або в терміналі введіть команду "reboot". 

Після перезавантаження пристрою віджет таблиця заповниться пунктами меню.з початковими налаштуваннями:
  • Display flip (з'являється як під'єднано дисплей)
  1. Disabled - зображення за замовчуванням.
  2. Enabled - зображення перевертається по горизонталі. Потрібне перезавантаження пристрою.
  • Web OTA
  1. Enabled (за замовчуванням) - режим Web OTA увімкнено і за адресою http://ip_device/update доступна сторінка для оновлення прошивки. 
  2. Disabled - вимикає цю функцію. Корисно вимикати цю функцію, щоб розвантажити мікроконтролер, як немає потреби в оновленні прошивки. А вмикати вже перед оновленням прошивки. Потрібне перезавантаження пристрою.
  • Notifications - enable
  1. Enable (за замовчуванням) - на смартфон відправляються сповіщення з пристрою
  2. Disable - сповіщення вимкнуто
  • WebHook - disable
  1. disable (за замовчуванням) - дані до віджету WebHook не надсилаються
  2. 1 minutes - надсилаються дані з сенсорів до віджету WebHook з періодичністю в 1 хвилину
  3. 5 minutes - надсилаються дані з сенсорів до віджету WebHook з періодичністю в 5 хвилин
  4. 10 minutes - надсилаються дані з сенсорів до віджету WebHook з періодичністю в 10 хвилин
  5. 20 minutes - надсилаються дані з сенсорів до віджету WebHook з періодичністю в 20 хвилин
  6. 30 minutes - надсилаються дані з сенсорів до віджету WebHook з періодичністю в 30 хвилин
  • Power - OFF
  1. OFF (за замовчуванням) - коли на пристрій подати живлення, то реле буде вимкеним.
  2. ON - коли на пристрій подати живлення, то реле увімкнеться.
  3. KEEP - коли на пристрій подати живлення, то реле прийме стан, в якому знаходилось до відключення живлення (сінхронізується з додатком на смартфоні).
  • GPIO14 - Sensors (за замовчуванням). 
  1. Sensors - при подачі живлення пристрій шукає на GPIO14 цифрові сенсори DS18B20, DHT22 і при наявності сенсорів збирає дані з них і відправляє їх на сервер Blynk.
  2. Button - додаткова кнопка яка дублює системну кнопку що на GPIO0. Наприклад, підключити таку сенсорну кнопку і вивести її окремо від пристрою, або вмонтувати в середину корпусу і легким дотиком вмикати чи вимикати реле. Або ж підключити звичайну кнопку дзвінкового типу і вивести її в зручне місце. Ця кнопка тільки вмикає і вимикає реле. Щоб кнопкою перезавантажити пристрій чи скинути налаштування користуйтесь системною кнопкою що на GPIO0. 
  3. PIR - це режим сенсору руху. До GPIO14 можна під'єднати такий сенсор і на V19 "відловлювати" стан "0" або "1". А вже через віджет "Eventor" створити події які будуть відбуватись при зміні стану. Наприклад створити подію в "Eventor": якщо на V19 - "0", то шлемо до V20 - "0", якщо на V19 - "1", то шлемо до V20 - "1". То отримуємо таку логіку роботи. Коли повз датчику руху проходить людина, то датчик встановлює стійку логічну "1" на GPIO14, спрацьовує подія і  надсилається "1" до V20, де в нас "прикріплене" реле, а реле вмикає, наприклад, світло. Коли вийшов час, заданий в налаштуваннях PIR sensor, датчик руху встановлює стійкий "0" на GPIO14, а "eventor" надсилає до V20 - "0" і реле вимикається, контактами розриває ланцюг живлення світла. Світло вимкнулось. Або замість V20 в "подіях" встановити в V30 і тоді коли до пристрою підійде людина увімкнеться дисплей, а коли людина відійде, то через деякий час (задається налаштуваннями самого PIR sensor) дисплей вимкнеться. Цей режим аналогічний режиму Security, з різницею, що на V19 в режимі PIR надсилається 0 або 1 та не змінює свій стан світлодіод, який на пристрої, а в режимі Security надсилається 0 або 255, та змінюється стан світлодіода на пристрої (увімкнутий - коли під охороною, вимкнутий - коли охорону порушено) . 
  4. Security - це режим охоронної кнопки (геркон, кінцевик, контакти, тощо).  До GPIO14 під'єднати, наприклад, датчик типу геркон (що комутується магнітом) і на V19 "відловлювати" стан "0" або "255". Наприклад, на V19 в додатку Blynk App можна навішати віджет "LED". І наочно бачити стан охорони. Також за допомоги віджету "Eventor" створити події які будуть відбуватись при зміні стану охорони. Наприклад створити подію в "Eventor": якщо на V19 - "0", то шлемо сповіщення "Notification" з повідомленням "Security - OFF", якщо на V19 - "1", то шлемо сповіщення "Notification" з повідомленням "Security - ON". То отримуємо таку логіку роботи. Коли, наприклад, відкриваються двері і геркон розмикає контакти, то датчик встановлює стійкий логічний "0" на GPIO14, спрацьовує подія і  надсилається сповіщення "Security - OFF" на ваш смартфон. Коли закрити двері, в герконі замкнуться контакти і на GPIO14 отримуємо стійку "1", а "eventor" надсилає до сповіщення "Security - ON". Так ви зможете контролювати стан дверей, вікон, тощо. Цей режим аналогічний режиму PIR, з різницею, що на V19 в режимі PIR надсилається 0 або 1 та не змінює свій стан світлодіод, який на пристрої, а в режимі Security надсилається 0 або 255, та змінюється стан світлодіода на пристрої (увімкнутий - коли під охороною, вимкнутий - коли охорону порушено).
  5. Nothing - до шпильки GPIO14 нічого не під'єднано. Корисний режим для люстри чи іншого освітлювального пристрою. Швидке увімкнення світла при подачі живлення на пристрій (не скануються сенсори на GPIO14).
  • DHT Type - DHT22 (з'являється цей пункт при наявності датчику DHT на GPIO14)
  1. DHT22 (за замовчуванням) - тип датчику DHT 22, AM2302,  AM2321
  2. DHT11 - тип датчику DHT11
  3. DHT21 - тип датчику DHT 21, AM2301
  • Outlet pump (з'являється цей пункт коли під'єднано плату "Water Level" до шини I2C)
  1. Disable (за замовчуванням) - випускний клапан не встановлено
  2. Enable - випускний клапан встановлено
  • ADC (вимірювання напруги на A0)
  1. Off (за замовчуванням) - вимірювання не відбувається і на сервер нічого не надсилається
  2. Voltage - виміряні значення будуть надсилатись у вольтах
  3. Value - виміряні значення (0 - 1024) будуть надсилатись без перетворень
  • Setting - unchanged за замовчуванням unchanged і цей рядок не підсвічується.
  1. Settings save - Apply. Коли ви робите зміни в налаштуваннях з'явиться цей пункт меню. За допомоги цього пункту можна зберегти налаштування до EEPROM пристрою.  
  2. Device reboot - Apply. Якщо буде потрібне перезавантаження пристрою, то з'явиться цей пункт меню. Натиснувши ще раз, ваш пристрій перезавантажиться з новими налаштуваннями.

Віджет Terminal

Зупиніть проект. Додайте до проекту Widget TERMINAL, та встановіть такі налаштування:
  • INPUT - V41
  • INPUT LINE - ON
  • AUTOSCROLL - ON

Тепер в вікні терміналу ви зможете бачити інформацію, що надсилає ваш пристрій, для вас. А також вводити команди в термінал (команди вводяться маленькими літерами):
  • ip - повертає IP адресу вашого пристрою в мережі
  • mac - повертає mac адресу вашого пристрою
  • version - повертає версію прошивки
  • name - повертає ім'я пристрою
  • reset - скидає налаштування пристрою до початкового стану
  • reboot - перезавантажує пристрій
  • pins - пам'ятка по віртуальним шпилькам
  • altitude - (за замовчуванням 0 (нуль)) команда вводу висоти над рівнем моря, де буде встановлений пристрій, це актуально для датчиків BMP180 та BME280, для корекції показників тиску. Приклади вводу команди: "altitude 42", "altitude-56", "altitude=83". Де "altitude" команда, а числа роз'єднані символами пробіл, тире і дорівнює - висота в метрах над рівнем моря де встановлено пристрій. Цю висоту над рівнем моря можна взнати, наприклад по гугломапам.
  • maxvoltage - (за замовчуванням 3.3 вольта) команда вводу максимальної напруги яку вимірюємо на "дільнику напруги" A0.

Оновлення по WEB OTA

Оновлення прошивки зручно робити за технологією WEB OTA. Пристрій, який вже працює в електричній схемі, не потрібно демонтувати, розбирати і знову підключати до ПК, щоб залити нову прошивку. Достатньо зайти за адресою: http://host.local/update , де host це унікальне ім'я пристрою, яке ви надали пристрою в початкових налаштуваннях. Майте на увазі, що домен local підтримують не всі роутери, тому, скоріш за все потрібно набрати в браузері http://device_ip/update , де device_ip - це ip вашого пристрою в вашій локальній мережі. Взнати його можна, як засобами вашого роутера, так і засобами якогось програмного IP сканера, або ж додавши до свого проекту віджет terminal який має бути на віртуальній шпильці V41, та ввести команду "ip". В вікні терміналу надрукується поточний IP вашого пристрою.
Коли завантажиться сторінка оновлення прошивки, оберіть через файловий діалог файл прошивки, та натисніть кнопку "update". Через декілька секунд прошивка оновиться і пристрій перезавантажиться. Пристрій буде "пам'ятати" ваш SSID, PASS, AUTH, та ім'я пристрою і в повторному налаштуванні немає потреби. Пристрій після оновлення і перезавантаження під'єднається до мережі, з'єднається з Blynk сервером і почне працювати.

Віртуальні шпильки

Сенсор DS18B20

  • Температура DS18B20_0 V0 - працює
  • Температура DS18B20_1 V1 - працює
  • Температура DS18B20_2 V2 - працює
  • Температура DS18B20_3 V3 - працює
  • Температура DS18B20_4 V4 - працює

Сенсор DHT22

  • Температура DHT22 V5 - працює
  • Вологість DHT22 V6 - працює

Сенсор TSL2561

  • Люкси TSL2561 V7 - працює

Сенсор BMP180

  • Температура BMP180 V8 - працює
  • Тиск BMP180 V9 - працює
  • Висота над рівнем моря BMP180 V10 - працює

Сенсор BME280

  • Температура BME280 V11 - працює
  • Вологість BME280 V12 - працює
  • Тиск BME280 V13 - працює
  • Висота над рівнем моря BME280 V14 - працює 

Сенсор HDC1080

  • Температура HDC1080 V16 - працює
  • Вологість HDC1080 V17 - працює

Рівень WiFi сигналу у відсотках

  • Рівень WiFi сигналу у відсотках V80 - працює (при відсутності WiFi сигналу показує > 200%)

Рівень напруги на A0

  • Рівень напруги або значення ADC на A0 V81 - працює

Реле

  • Кнопка на V20 (керує основним реле, що на платі GPIO12) - працює
  • Кнопка на V21 (керує додатковим реле 1 що на платі Expander I/O 4x4) - працює
  • Кнопка на V22 (керує додатковим реле 2 що на платі Expander I/O 4x4) - працює
  • Кнопка на V23 (керує додатковим реле 3 що на платі Expander I/O 4x4) - працює
  • Кнопка на V24 (керує додатковим реле 4 що на платі Expander I/O 4x4) - працює
  • Кнопка на V25 - зарезервовано, в розробці
  • Кнопка на V26 - зарезервовано, в розробці
  • Кнопка на V27 - зарезервовано, в розробці
  • Кнопка на V28 - зарезервовано, в розробці
  • Кнопка на V29 - зарезервовано, в розробці

Дисплей

  • Кнопка на V30 - Вмикає і вимикає дисплей SSD1306

Рівень води

  • Кнопка на V31 (Widget Button) - Ініціює встановлення потрібного рівня води
  • Тижневі планувальники встановлення рівня води на V62, V63 (Widget Time Input) 
  • Сегментний перемикач встановлення потрібного рівня води наV32 (Widget Segmented Switch)
  • Індикатор рівня води на V15 (Widget Level H)

Плата розширювача на PCA9685

  • zeRGBa або Slider V100 - V115 - встановлення рівня на каналах PWM 0-15
  • Кнопка на V33 - вмикає або вимикає RGB стрічку
  • Два тижневі планувальники на V64 і V65

Віджети

  • LED V19 - стан охоронного сенсору. 0 - вимкнуте (в режимі охорони), 255 - увімкнуто (охорону порушено), стан PIR датчику. 0 - вимкнуте, 1 - увімкнуто (в режимі PIR)
  • TERMINAL V41 - різноманітна інформація та введення команд (корисна річ)
  • TIME_INPUT_0 V50 - планувальник реле на GPIO12
  • TIME_INPUT_1 V51 - планувальник реле на GPIO12
  • TIME_INPUT_2 V52 - планувальник реле на GPIO12
  • TIME_INPUT_3 V53 - планувальник реле на GPIO12
  • TIME_INPUT_4 V54 - планувальник реле на GPIO12
  • TIME_INPUT_5 V55 - планувальник реле на GPIO12
  • TIME_INPUT_6 V56 - планувальник реле на GPIO12
  • TIME_INPUT_7 V57 - планувальник увімкнення і вимкнення дисплею SSD1306
  • TIME_INPUT_8 V58 - планувальник для реле 1 що на платі Expander I/O 4x4
  • TIME_INPUT_9 V59 - планувальник для реле 2 що на платі Expander I/O 4x4
  • TIME_INPUT_10 V60 - планувальник для реле 3 що на платі Expander I/O 4x4
  • TIME_INPUT_11 V61 - планувальник для реле 4 що на платі Expander I/O 4x4
  • TIME_INPUT_12 V62 - планувальник для встановлення рівня води на платі "Water Level"
  • TIME_INPUT_13 V63 - планувальник для встановлення рівня води на платі "Water Level"
  • TIME_INPUT_14 V64 - планувальник для увімкнення/вимкнення LED стрічок
  • TIME_INPUT_15 V65 - планувальник для увімкнення/вимкнення LED стрічок
  • TABLE V66 - налаштування пристрою
  • GPS_TRIGGER_ENTER V70 - не працює. В розробці.
  • GPS_TRIGGER_EXIT V71 - не працює. В розробці.

WebHook

Дані з датчиків можна відправляти не тільки на сервер Blynk, а й на інші служби, наприклад, такі як: ThingSpeak, Народний Моніторинг, тощо.
  • WHOOK_HDC1080 V74 - дані з сенсору HDC1080: температура і вологість
  • WHOOK_DHT V75 - дані з сенсору DHT22: температура і вологість.
  • WHOOK_BMP180 V76 - дані з сенсору BMP180: температура і тиск.
  • WHOOK_BME280 V77 - дані з сенсору BME280: температура, вологість, тиск
  • WHOOK_TSL2561 V78 - дані з сенсору TSL2561: рівень освітлення
  • WHOOK_DS18B20 V79 - дані з сенсорів DS18B20: температура

Приклад WebHook

Налаштування віджету WebHook
  • Назва віджету ThingSpeak DHT22
  • Віртуальна шпилька V75
  • URL запит: "https://api.thingspeak.com/update?api_key=ТУТ_ВАШ_API&field1=/pin[0]/&field2=/pin[1]/
  • Метод GET

Плата Expander I/O 4x4 для Sonoff Basic (TH) та інших пристроїв на базі ESP8266 з прошивкою MyHomeIoT 1.1.1 і вище

Схема, малюнки плат, gerber файли, опис за ланкою: Expander I/O 4x4

Реле прив'язані до таких шпильок: V21, V22, V23, V24

Та кожне реле має по одному планувальнику на таких шпильках: V58, V59, V60, V61

Плата в зборі

    Приклад інтерфейсу для плати розширення

    Плата Water Level

    Схема пристрою "Рівень води" та демо-код за цією ланкою - Water Level
    Кнопка встановлення рівня води прив'язана до - V31 (Widget Button OFF - 0, ON - 1, SWITCH)
    Два планувальника встановлення рівня води на - V62, V63 (Widget Time Input: ALLOW START/STOP INPUT - NO)
    Індикатор рівня води - V15 (Widget Level H 0 - 255, READING RATE - 1-5sec)
    Сегментний перемикач встановлення потрібного рівня води  - V32 (Widget Segmented Switch - 5 sectors: Empty, 1/4, 1/2, 3/4, Full)
    Прототип плати "Рівень води"

    Приклад інтерфейсу для "Рівня води"

    Схема розширювача PWM PCA9685 (16ch 12bit)

    Типова схема підключення PCA9685
    • Встановлення рівня на каналах PWM 0-15 прив'язані до таких шпильок: V100 - V115
    • Увімкнути/вимкнути світлодіодні стрічки, кнопка на V33
    • Два планувальника для кнопки на V33 прив'язані до таких шпильок: V64, V65
    • Адреса на шині I2C: 0x50


    Схема для саморобок на ESP8266 сумісний з Sonoff Basic(TH)

    Схема для саморобок на ESP8266 та NodeMCU
    Клацайте на світлину щоб збільшити. Де HLK-PM1 це такий ізольований від мережі 220V малогабарітний, малопотужний блок живлення. Потрібен 220V to 5V. U1 - стабілізатор напруги на 3.3V AMS1117.

    Схема для саморобок на ESP8266 для підключення світлодіодної стрічки на 12В з регулюванням яскравості

    Схема для саморобок на ESP8266 для роботи з світлодіодною стрічкою
    Клацайте на світлину щоб збільшити. Де U1 - стабілізатор напруги на 3.3V AMS1117. Транзистор Q1 будь який MOSFET n-channel з напругою на повне відкриття VGS(th) не більше 3V.  Наприклад AO3400. Купити пачками можна тут.

    Приклади інтерфейсу


    Відеоприклад проекту "Літній душ"

    На базі Sonoff TH10, Expander 4x4, Water Level, прошивки MyHomeIoT, та Blynk можна створити доволі складну систему "Літній душ":

    Підтримка проекту

    Проект можна підтримати грошовою енергією. Ця енергія додає мені наснаги та сил для творення нових функцій і можливостей цієї прошивки. 

    Енергію надсилати сюди!