Привет, Хабр! В этой статье я расскажу о своем опыте разработки системы уличного освещения, построенной на микроконтроллере ESP8266. Хоть данная идея и не нова и в интернете огромное количество готовых проектов на базе данного микроконтроллера, я хотел бы поделиться тем, что у меня получилось в надежде, что для кого-нибудь это окажется полезным.

Прежде чем начать, позвольте добавить немного предыстории. Я живу в частном доме и улица, на которой расположен мой дом, не имеет хорошего освещения. Особенно данная проблема остро ощущается зимой, когда темнеет очень рано. Именно в один из таких дней, припарковав автомобиль и закрывая за ним ворота в полной темноте я решил, что пора заняться внешним освещением. Первая мысль была - повесить светодиодный прожектор с датчиком движения и освещенности. Вариант отличный, но мне хотелось все сделать самому, к тому же предыдущий Pet-project был закончен и время позволяло заняться чем-то другим. Обдумав различные варианты реализации, включая как с датчиками так и без, а также учитывая, что на тот момент у меня в наличии уже было несколько модулей реле с ESP-01S, купленных ранее для ознакомления, я остановился на следующем - реализовать систему уличного освещения на базе ESP8266 с управлением через web-интерфейс. В качестве экспериментальной площадки было выбрано место парковки автомобиля.

Микроконтроллер ESP8266

История ESP8266 началась в 2014 году. За это время он оброс серьезным комьюнити и получил широкую популярность благодаря наличию Wi-Fi, а также ввиду его относительно низкой стоимости. На базе ESP8266 построено большое количество различных модулей, более подробно о которых можно почитать на Хабре здесь и здесь. В данной статье речь будет идти о модуле ESP-01S, который я приобрел в паре с модулем реле для него.

Небольшая справка - модуль реле для ESP-01S уже содержит стабилизатор напряжения AMS1117, обеспечивающий питание микроконтроллера равное 3.3V. При этом собственное напряжение питание модуля реле составляет 5V, что существенно упрощает его использование. Управление реле осуществляется посредствам GPIO0.

Однако, для большей наглядности, во всех последующих схемах совместно с ESP-01S будет использоваться обычное реле, которое при желании всегда может быть заменено на модуль реле для ESP-01S.

Подготовка к программированию

Процесс программирования ESP-01S в подробностях описан на Хабре здесь и здесь, поэтому я решил не повторяться, а ограничиться лишь схемой подключения, которую я использовал во время разработки.

Для подключения к компьютеру я использовал кабель USB <–> UART TTL.

Программирование. Написание прошивки

В качестве среды разработки я выбрал Arduino IDE, процесс настройки которой, для работы с ESP8266, в деталях описан на Хабре здесь и здесь. Поэтому опять же не станем останавливаться на нем подробно.

Прежде чем продолжить, я хотел бы отметить, что одним из неоспоримых преимуществ Arduino IDE является то, что она содержит огромное количество готовых примеров, которые могут быть использованы для ознакомления или просто взяты в качестве основы, что значительно упрощает разработку.

Поскольку управление освещением планировалось осуществлять через web-интерфейс, то первым делом я подготовил следующую html страницу.

Исходный код html страницы
<!doctype html>

<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">

  <title>Remlight</title>
  <meta name="description" content="Remote lighting control">

  <style>
    body 
    {
      margin:30px auto;
      text-align: center;
      font-family: 'Arial';
    }

    #title
    {
      color: #444444;
      font-weight: bold;
      font-size: 13pt;
      outline: none;
    }

    #button-container 
    {
      display: inline-block;
    }

    #button-container > div 
    {
      padding: 10px;
      width: 100%;
    }

    button 
    {
      color: #444444;
      background: #F3F3F3;
      border: 1px #DADADA solid;
      padding: 10px 40px;
      border-radius: 2px;
      font-weight: bold;
      font-size: 9pt;
      outline: none;
      width: 100%;
    }

    button:hover 
    {
      color: #333333;
      background: #F7F7F7;
      border: 1px #C6C6C6 solid;
      box-shadow: 1px 1px 1px #EAEAEA;
    }

    button:active 
    {
      box-shadow: inset 1px 1px 1px #DFDFDF;
    }

    button.red 
    {
      color: white;
      background: -webkit-linear-gradient(top, #DD4B39, #D14836); 
      background: -moz-linear-gradient(top, #DD4B39, #D14836); 
      background: -ms-linear-gradient(top, #DD4B39, #D14836); 
      border: 1px solid #DD4B39;
      text-shadow: 0 1px 0 #C04131;
    }

    button.red:hover 
    {
      background: -webkit-linear-gradient(top, #DD4B39, #C53727);
      background: -moz-linear-gradient(top, #DD4B39, #C53727);
      background: -ms-linear-gradient(top, #DD4B39, #C53727);
      border: 1px solid #AF301F;
    }

    button.red:active 
    {
      background: -webkit-linear-gradient(top, #D74736, #AD2719);
      background: -moz-linear-gradient(top, #D74736, #AD2719);
      background: -ms-linear-gradient(top, #D74736, #AD2719);
      box-shadow: inset 0 1px 1px rgba(0,0,0,0.2);
    }
  </style>
</head>

<body>
  <p id="title">Управление освещением (гараж)</p>
  <div id="button-container">
    <div><a href="/light?action=on&time=5">
      <button>Включить свет на 5 минут</button>
    </a></div>
    <div><a href="/light?action=on&time=10">
      <button>Включить свет на 10 минут</button>
    </a></div>
    <div><a href="/light?action=on&time=15">
      <button>Включить свет на 15 минут</button>
    </a></div>
    <div><a href="/light?action=on">
      <button>Включить свет (постоянно)</button>
    </a></div>
    <div><a href="/light?action=off">
      <button class="red">Выключить свет</button>
    </a></div>
  </div>
</body>
</html>

Для обеспечения работы ESP-01S в качестве web-сервера, а также для поддержки базовой аутентификации был выбран класс ESP8266WebServer. При этом исходный код html-страницы был преобразован в шестнадцатеричный вид и записан в качестве содержимого массива `data_light_html`.

Исходный код прошивки
#include <ESP8266WiFi.h>
#include <ESP8266mDNS.h>
#include <ArduinoOTA.h>
#include <ESP8266WebServer.h>
//-----------------------------------------------------------------------------

#define WIFI_SSID "ssid"
#define WIFI_PASSWORD "password"

#define WWW_USER "user"
#define WWW_PASSWORD "password"
//-----------------------------------------------------------------------------

#define AUTHENTICATE_OR_RETURN()                                              \
if (!g_Server.authenticate(WWW_USER, WWW_PASSWORD)) {                         \
  return g_Server.requestAuthentication();                                    \
}
//-----------------------------------------------------------------------------

static const char data_light_html[] = {
  0x3c, 0x21, 0x64, 0x6f, 0x63, 0x74, 0x79, 0x70, 0x65, 0x20, 
  0x68, 0x74, 0x6d, 0x6c, 0x3e, 0xd, 0xa, 0xd, 0xa, 0x3c, 
  0x68, 0x74, 0x6d, 0x6c, 0x3e, 0xd, 0xa, 0x3c, 0x68, 0x65, 
  0x61, 0x64, 0x3e, 0xd, 0xa, 0x20, 0x20, 0x3c, 0x6d, 0x65, 
  0x74, 0x61, 0x20, 0x63, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 
  0x3d, 0x22, 0x75, 0x74, 0x66, 0x2d, 0x38, 0x22, 0x3e, 0xd, 
  0xa, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x6e, 
  0x61, 0x6d, 0x65, 0x3d, 0x22, 0x76, 0x69, 0x65, 0x77, 0x70, 
  0x6f, 0x72, 0x74, 0x22, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 
  0x6e, 0x74, 0x3d, 0x22, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 
  0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2d, 0x77, 0x69, 0x64, 
  0x74, 0x68, 0x2c, 0x20, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 
  0x6c, 0x2d, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x3d, 0x31, 0x22, 
  0x3e, 0xd, 0xa, 0xd, 0xa, 0x20, 0x20, 0x3c, 0x74, 0x69, 
  0x74, 0x6c, 0x65, 0x3e, 0x52, 0x65, 0x6d, 0x6c, 0x69, 0x67, 
  0x68, 0x74, 0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, 
  0xd, 0xa, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x74, 0x61, 0x20, 
  0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x64, 0x65, 0x73, 0x63, 
  0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x63, 
  0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x52, 0x65, 
  0x6d, 0x6f, 0x74, 0x65, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 
  0x69, 0x6e, 0x67, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 
  0x6c, 0x22, 0x3e, 0xd, 0xa, 0xd, 0xa, 0x20, 0x20, 0x3c, 
  0x73, 0x74, 0x79, 0x6c, 0x65, 0x3e, 0xd, 0xa, 0x20, 0x20, 
  0x20, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0xd, 0xa, 0x20, 
  0x20, 0x20, 0x20, 0x7b, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 
  0x20, 0x20, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x3a, 0x33, 
  0x30, 0x70, 0x78, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x3b, 0xd, 
  0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x65, 0x78, 
  0x74, 0x2d, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3a, 0x20, 0x63, 
  0x65, 0x6e, 0x74, 0x65, 0x72, 0x3b, 0xd, 0xa, 0x20, 0x20, 
  0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x66, 
  0x61, 0x6d, 0x69, 0x6c, 0x79, 0x3a, 0x20, 0x27, 0x41, 0x72, 
  0x69, 0x61, 0x6c, 0x27, 0x3b, 0xd, 0xa, 0x20, 0x20, 0x20, 
  0x20, 0x7d, 0xd, 0xa, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 
  0x23, 0x74, 0x69, 0x74, 0x6c, 0x65, 0xd, 0xa, 0x20, 0x20, 
  0x20, 0x20, 0x7b, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 
  0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x23, 0x34, 
  0x34, 0x34, 0x34, 0x34, 0x34, 0x3b, 0xd, 0xa, 0x20, 0x20, 
  0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x77, 
  0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x20, 0x62, 0x6f, 0x6c, 
  0x64, 0x3b, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 
  0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x3a, 
  0x20, 0x31, 0x33, 0x70, 0x74, 0x3b, 0xd, 0xa, 0x20, 0x20, 
  0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x6c, 0x69, 0x6e, 
  0x65, 0x3a, 0x20, 0x6e, 0x6f, 0x6e, 0x65, 0x3b, 0xd, 0xa, 
  0x20, 0x20, 0x20, 0x20, 0x7d, 0xd, 0xa, 0xd, 0xa, 0x20, 
  0x20, 0x20, 0x20, 0x23, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 
  0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 
  0x20, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xd, 0xa, 
  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x69, 0x73, 0x70, 
  0x6c, 0x61, 0x79, 0x3a, 0x20, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 
  0x65, 0x2d, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x3b, 0xd, 0xa, 
  0x20, 0x20, 0x20, 0x20, 0x7d, 0xd, 0xa, 0xd, 0xa, 0x20, 
  0x20, 0x20, 0x20, 0x23, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 
  0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 
  0x20, 0x3e, 0x20, 0x64, 0x69, 0x76, 0x20, 0xd, 0xa, 0x20, 
  0x20, 0x20, 0x20, 0x7b, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 
  0x20, 0x20, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x3a, 
  0x20, 0x31, 0x30, 0x70, 0x78, 0x3b, 0xd, 0xa, 0x20, 0x20, 
  0x20, 0x20, 0x20, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 
  0x20, 0x31, 0x30, 0x30, 0x25, 0x3b, 0xd, 0xa, 0x20, 0x20, 
  0x20, 0x20, 0x7d, 0xd, 0xa, 0xd, 0xa, 0x20, 0x20, 0x20, 
  0x20, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x20, 0xd, 0xa, 
  0x20, 0x20, 0x20, 0x20, 0x7b, 0xd, 0xa, 0x20, 0x20, 0x20, 
  0x20, 0x20, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20, 
  0x23, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x3b, 0xd, 0xa, 
  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x61, 0x63, 0x6b, 
  0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x3a, 0x20, 0x23, 0x46, 
  0x33, 0x46, 0x33, 0x46, 0x33, 0x3b, 0xd, 0xa, 0x20, 0x20, 
  0x20, 0x20, 0x20, 0x20, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 
  0x3a, 0x20, 0x31, 0x70, 0x78, 0x20, 0x23, 0x44, 0x41, 0x44, 
  0x41, 0x44, 0x41, 0x20, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x3b, 
  0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 
  0x64, 0x64, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x31, 0x30, 0x70, 
  0x78, 0x20, 0x34, 0x30, 0x70, 0x78, 0x3b, 0xd, 0xa, 0x20, 
  0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x6f, 0x72, 0x64, 0x65, 
  0x72, 0x2d, 0x72, 0x61, 0x64, 0x69, 0x75, 0x73, 0x3a, 0x20, 
  0x32, 0x70, 0x78, 0x3b, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 
  0x20, 0x20, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x77, 0x65, 0x69, 
  0x67, 0x68, 0x74, 0x3a, 0x20, 0x62, 0x6f, 0x6c, 0x64, 0x3b, 
  0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 
  0x6e, 0x74, 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x3a, 0x20, 0x39, 
  0x70, 0x74, 0x3b, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 
  0x20, 0x6f, 0x75, 0x74, 0x6c, 0x69, 0x6e, 0x65, 0x3a, 0x20, 
  0x6e, 0x6f, 0x6e, 0x65, 0x3b, 0xd, 0xa, 0x20, 0x20, 0x20, 
  0x20, 0x20, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x20, 
  0x31, 0x30, 0x30, 0x25, 0x3b, 0xd, 0xa, 0x20, 0x20, 0x20, 
  0x20, 0x7d, 0xd, 0xa, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 
  0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x3a, 0x68, 0x6f, 0x76, 
  0x65, 0x72, 0x20, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7b, 
  0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 
  0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x23, 0x33, 0x33, 0x33, 0x33, 
  0x33, 0x33, 0x3b, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 
  0x20, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 
  0x64, 0x3a, 0x20, 0x23, 0x46, 0x37, 0x46, 0x37, 0x46, 0x37, 
  0x3b, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 
  0x6f, 0x72, 0x64, 0x65, 0x72, 0x3a, 0x20, 0x31, 0x70, 0x78, 
  0x20, 0x23, 0x43, 0x36, 0x43, 0x36, 0x43, 0x36, 0x20, 0x73, 
  0x6f, 0x6c, 0x69, 0x64, 0x3b, 0xd, 0xa, 0x20, 0x20, 0x20, 
  0x20, 0x20, 0x20, 0x62, 0x6f, 0x78, 0x2d, 0x73, 0x68, 0x61, 
  0x64, 0x6f, 0x77, 0x3a, 0x20, 0x31, 0x70, 0x78, 0x20, 0x31, 
  0x70, 0x78, 0x20, 0x31, 0x70, 0x78, 0x20, 0x23, 0x45, 0x41, 
  0x45, 0x41, 0x45, 0x41, 0x3b, 0xd, 0xa, 0x20, 0x20, 0x20, 
  0x20, 0x7d, 0xd, 0xa, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 
  0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x3a, 0x61, 0x63, 0x74, 
  0x69, 0x76, 0x65, 0x20, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 
  0x7b, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 
  0x6f, 0x78, 0x2d, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x3a, 
  0x20, 0x69, 0x6e, 0x73, 0x65, 0x74, 0x20, 0x31, 0x70, 0x78, 
  0x20, 0x31, 0x70, 0x78, 0x20, 0x31, 0x70, 0x78, 0x20, 0x23, 
  0x44, 0x46, 0x44, 0x46, 0x44, 0x46, 0x3b, 0xd, 0xa, 0x20, 
  0x20, 0x20, 0x20, 0x7d, 0xd, 0xa, 0xd, 0xa, 0x20, 0x20, 
  0x20, 0x20, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x2e, 0x72, 
  0x65, 0x64, 0x20, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7b, 
  0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 
  0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x77, 0x68, 0x69, 0x74, 0x65, 
  0x3b, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 
  0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x3a, 
  0x20, 0x2d, 0x77, 0x65, 0x62, 0x6b, 0x69, 0x74, 0x2d, 0x6c, 
  0x69, 0x6e, 0x65, 0x61, 0x72, 0x2d, 0x67, 0x72, 0x61, 0x64, 
  0x69, 0x65, 0x6e, 0x74, 0x28, 0x74, 0x6f, 0x70, 0x2c, 0x20, 
  0x23, 0x44, 0x44, 0x34, 0x42, 0x33, 0x39, 0x2c, 0x20, 0x23, 
  0x44, 0x31, 0x34, 0x38, 0x33, 0x36, 0x29, 0x3b, 0x20, 0xd, 
  0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x61, 0x63, 
  0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x3a, 0x20, 0x2d, 
  0x6d, 0x6f, 0x7a, 0x2d, 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 
  0x2d, 0x67, 0x72, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x74, 0x28, 
  0x74, 0x6f, 0x70, 0x2c, 0x20, 0x23, 0x44, 0x44, 0x34, 0x42, 
  0x33, 0x39, 0x2c, 0x20, 0x23, 0x44, 0x31, 0x34, 0x38, 0x33, 
  0x36, 0x29, 0x3b, 0x20, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 
  0x20, 0x20, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 
  0x6e, 0x64, 0x3a, 0x20, 0x2d, 0x6d, 0x73, 0x2d, 0x6c, 0x69, 
  0x6e, 0x65, 0x61, 0x72, 0x2d, 0x67, 0x72, 0x61, 0x64, 0x69, 
  0x65, 0x6e, 0x74, 0x28, 0x74, 0x6f, 0x70, 0x2c, 0x20, 0x23, 
  0x44, 0x44, 0x34, 0x42, 0x33, 0x39, 0x2c, 0x20, 0x23, 0x44, 
  0x31, 0x34, 0x38, 0x33, 0x36, 0x29, 0x3b, 0x20, 0xd, 0xa, 
  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x6f, 0x72, 0x64, 
  0x65, 0x72, 0x3a, 0x20, 0x31, 0x70, 0x78, 0x20, 0x73, 0x6f, 
  0x6c, 0x69, 0x64, 0x20, 0x23, 0x44, 0x44, 0x34, 0x42, 0x33, 
  0x39, 0x3b, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 
  0x74, 0x65, 0x78, 0x74, 0x2d, 0x73, 0x68, 0x61, 0x64, 0x6f, 
  0x77, 0x3a, 0x20, 0x30, 0x20, 0x31, 0x70, 0x78, 0x20, 0x30, 
  0x20, 0x23, 0x43, 0x30, 0x34, 0x31, 0x33, 0x31, 0x3b, 0xd, 
  0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xd, 0xa, 0xd, 0xa, 
  0x20, 0x20, 0x20, 0x20, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 
  0x2e, 0x72, 0x65, 0x64, 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72, 
  0x20, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xd, 0xa, 
  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x61, 0x63, 0x6b, 
  0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x3a, 0x20, 0x2d, 0x77, 
  0x65, 0x62, 0x6b, 0x69, 0x74, 0x2d, 0x6c, 0x69, 0x6e, 0x65, 
  0x61, 0x72, 0x2d, 0x67, 0x72, 0x61, 0x64, 0x69, 0x65, 0x6e, 
  0x74, 0x28, 0x74, 0x6f, 0x70, 0x2c, 0x20, 0x23, 0x44, 0x44, 
  0x34, 0x42, 0x33, 0x39, 0x2c, 0x20, 0x23, 0x43, 0x35, 0x33, 
  0x37, 0x32, 0x37, 0x29, 0x3b, 0xd, 0xa, 0x20, 0x20, 0x20, 
  0x20, 0x20, 0x20, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 
  0x75, 0x6e, 0x64, 0x3a, 0x20, 0x2d, 0x6d, 0x6f, 0x7a, 0x2d, 
  0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x2d, 0x67, 0x72, 0x61, 
  0x64, 0x69, 0x65, 0x6e, 0x74, 0x28, 0x74, 0x6f, 0x70, 0x2c, 
  0x20, 0x23, 0x44, 0x44, 0x34, 0x42, 0x33, 0x39, 0x2c, 0x20, 
  0x23, 0x43, 0x35, 0x33, 0x37, 0x32, 0x37, 0x29, 0x3b, 0xd, 
  0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x61, 0x63, 
  0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x3a, 0x20, 0x2d, 
  0x6d, 0x73, 0x2d, 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x2d, 
  0x67, 0x72, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x74, 0x28, 0x74, 
  0x6f, 0x70, 0x2c, 0x20, 0x23, 0x44, 0x44, 0x34, 0x42, 0x33, 
  0x39, 0x2c, 0x20, 0x23, 0x43, 0x35, 0x33, 0x37, 0x32, 0x37, 
  0x29, 0x3b, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 
  0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x3a, 0x20, 0x31, 0x70, 
  0x78, 0x20, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x20, 0x23, 0x41, 
  0x46, 0x33, 0x30, 0x31, 0x46, 0x3b, 0xd, 0xa, 0x20, 0x20, 
  0x20, 0x20, 0x7d, 0xd, 0xa, 0xd, 0xa, 0x20, 0x20, 0x20, 
  0x20, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x2e, 0x72, 0x65, 
  0x64, 0x3a, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x20, 0xd, 
  0xa, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xd, 0xa, 0x20, 0x20, 
  0x20, 0x20, 0x20, 0x20, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 
  0x6f, 0x75, 0x6e, 0x64, 0x3a, 0x20, 0x2d, 0x77, 0x65, 0x62, 
  0x6b, 0x69, 0x74, 0x2d, 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 
  0x2d, 0x67, 0x72, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x74, 0x28, 
  0x74, 0x6f, 0x70, 0x2c, 0x20, 0x23, 0x44, 0x37, 0x34, 0x37, 
  0x33, 0x36, 0x2c, 0x20, 0x23, 0x41, 0x44, 0x32, 0x37, 0x31, 
  0x39, 0x29, 0x3b, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 
  0x20, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 
  0x64, 0x3a, 0x20, 0x2d, 0x6d, 0x6f, 0x7a, 0x2d, 0x6c, 0x69, 
  0x6e, 0x65, 0x61, 0x72, 0x2d, 0x67, 0x72, 0x61, 0x64, 0x69, 
  0x65, 0x6e, 0x74, 0x28, 0x74, 0x6f, 0x70, 0x2c, 0x20, 0x23, 
  0x44, 0x37, 0x34, 0x37, 0x33, 0x36, 0x2c, 0x20, 0x23, 0x41, 
  0x44, 0x32, 0x37, 0x31, 0x39, 0x29, 0x3b, 0xd, 0xa, 0x20, 
  0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x61, 0x63, 0x6b, 0x67, 
  0x72, 0x6f, 0x75, 0x6e, 0x64, 0x3a, 0x20, 0x2d, 0x6d, 0x73, 
  0x2d, 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x2d, 0x67, 0x72, 
  0x61, 0x64, 0x69, 0x65, 0x6e, 0x74, 0x28, 0x74, 0x6f, 0x70, 
  0x2c, 0x20, 0x23, 0x44, 0x37, 0x34, 0x37, 0x33, 0x36, 0x2c, 
  0x20, 0x23, 0x41, 0x44, 0x32, 0x37, 0x31, 0x39, 0x29, 0x3b, 
  0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x6f, 
  0x78, 0x2d, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x3a, 0x20, 
  0x69, 0x6e, 0x73, 0x65, 0x74, 0x20, 0x30, 0x20, 0x31, 0x70, 
  0x78, 0x20, 0x31, 0x70, 0x78, 0x20, 0x72, 0x67, 0x62, 0x61, 
  0x28, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2e, 0x32, 
  0x29, 0x3b, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xd, 
  0xa, 0x20, 0x20, 0x3c, 0x2f, 0x73, 0x74, 0x79, 0x6c, 0x65, 
  0x3e, 0xd, 0xa, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 
  0xd, 0xa, 0xd, 0xa, 0x3c, 0x62, 0x6f, 0x64, 0x79, 0x3e, 
  0xd, 0xa, 0x20, 0x20, 0x3c, 0x70, 0x20, 0x69, 0x64, 0x3d, 
  0x22, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x22, 0x3e, 0xd0, 0xa3, 
  0xd0, 0xbf, 0xd1, 0x80, 0xd0, 0xb0, 0xd0, 0xb2, 0xd0, 0xbb, 
  0xd0, 0xb5, 0xd0, 0xbd, 0xd0, 0xb8, 0xd0, 0xb5, 0x20, 0xd0, 
  0xbe, 0xd1, 0x81, 0xd0, 0xb2, 0xd0, 0xb5, 0xd1, 0x89, 0xd0, 
  0xb5, 0xd0, 0xbd, 0xd0, 0xb8, 0xd0, 0xb5, 0xd0, 0xbc, 0x20, 
  0x28, 0xd0, 0xb3, 0xd0, 0xb0, 0xd1, 0x80, 0xd0, 0xb0, 0xd0, 
  0xb6, 0x29, 0x3c, 0x2f, 0x70, 0x3e, 0xd, 0xa, 0x20, 0x20, 
  0x3c, 0x64, 0x69, 0x76, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x62, 
  0x75, 0x74, 0x74, 0x6f, 0x6e, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 
  0x61, 0x69, 0x6e, 0x65, 0x72, 0x22, 0x3e, 0xd, 0xa, 0x20, 
  0x20, 0x20, 0x20, 0x3c, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x61, 
  0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x2f, 0x6c, 0x69, 
  0x67, 0x68, 0x74, 0x3f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 
  0x3d, 0x6f, 0x6e, 0x26, 0x74, 0x69, 0x6d, 0x65, 0x3d, 0x35, 
  0x22, 0x3e, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 
  0x3c, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x3e, 0xd0, 0x92, 
  0xd0, 0xba, 0xd0, 0xbb, 0xd1, 0x8e, 0xd1, 0x87, 0xd0, 0xb8, 
  0xd1, 0x82, 0xd1, 0x8c, 0x20, 0xd1, 0x81, 0xd0, 0xb2, 0xd0, 
  0xb5, 0xd1, 0x82, 0x20, 0xd0, 0xbd, 0xd0, 0xb0, 0x20, 0x35, 
  0x20, 0xd0, 0xbc, 0xd0, 0xb8, 0xd0, 0xbd, 0xd1, 0x83, 0xd1, 
  0x82, 0x3c, 0x2f, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x3e, 
  0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x61, 0x3e, 
  0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0xd, 0xa, 0x20, 0x20, 
  0x20, 0x20, 0x3c, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x61, 0x20, 
  0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x2f, 0x6c, 0x69, 0x67, 
  0x68, 0x74, 0x3f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 
  0x6f, 0x6e, 0x26, 0x74, 0x69, 0x6d, 0x65, 0x3d, 0x31, 0x30, 
  0x22, 0x3e, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 
  0x3c, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x3e, 0xd0, 0x92, 
  0xd0, 0xba, 0xd0, 0xbb, 0xd1, 0x8e, 0xd1, 0x87, 0xd0, 0xb8, 
  0xd1, 0x82, 0xd1, 0x8c, 0x20, 0xd1, 0x81, 0xd0, 0xb2, 0xd0, 
  0xb5, 0xd1, 0x82, 0x20, 0xd0, 0xbd, 0xd0, 0xb0, 0x20, 0x31, 
  0x30, 0x20, 0xd0, 0xbc, 0xd0, 0xb8, 0xd0, 0xbd, 0xd1, 0x83, 
  0xd1, 0x82, 0x3c, 0x2f, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 
  0x3e, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x61, 
  0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0xd, 0xa, 0x20, 
  0x20, 0x20, 0x20, 0x3c, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x61, 
  0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x2f, 0x6c, 0x69, 
  0x67, 0x68, 0x74, 0x3f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 
  0x3d, 0x6f, 0x6e, 0x26, 0x74, 0x69, 0x6d, 0x65, 0x3d, 0x31, 
  0x35, 0x22, 0x3e, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 
  0x20, 0x3c, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x3e, 0xd0, 
  0x92, 0xd0, 0xba, 0xd0, 0xbb, 0xd1, 0x8e, 0xd1, 0x87, 0xd0, 
  0xb8, 0xd1, 0x82, 0xd1, 0x8c, 0x20, 0xd1, 0x81, 0xd0, 0xb2, 
  0xd0, 0xb5, 0xd1, 0x82, 0x20, 0xd0, 0xbd, 0xd0, 0xb0, 0x20, 
  0x31, 0x35, 0x20, 0xd0, 0xbc, 0xd0, 0xb8, 0xd0, 0xbd, 0xd1, 
  0x83, 0xd1, 0x82, 0x3c, 0x2f, 0x62, 0x75, 0x74, 0x74, 0x6f, 
  0x6e, 0x3e, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 
  0x61, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0xd, 0xa, 
  0x20, 0x20, 0x20, 0x20, 0x3c, 0x64, 0x69, 0x76, 0x3e, 0x3c, 
  0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x2f, 0x6c, 
  0x69, 0x67, 0x68, 0x74, 0x3f, 0x61, 0x63, 0x74, 0x69, 0x6f, 
  0x6e, 0x3d, 0x6f, 0x6e, 0x22, 0x3e, 0xd, 0xa, 0x20, 0x20, 
  0x20, 0x20, 0x20, 0x20, 0x3c, 0x62, 0x75, 0x74, 0x74, 0x6f, 
  0x6e, 0x3e, 0xd0, 0x92, 0xd0, 0xba, 0xd0, 0xbb, 0xd1, 0x8e, 
  0xd1, 0x87, 0xd0, 0xb8, 0xd1, 0x82, 0xd1, 0x8c, 0x20, 0xd1, 
  0x81, 0xd0, 0xb2, 0xd0, 0xb5, 0xd1, 0x82, 0x20, 0x28, 0xd0, 
  0xbf, 0xd0, 0xbe, 0xd1, 0x81, 0xd1, 0x82, 0xd0, 0xbe, 0xd1, 
  0x8f, 0xd0, 0xbd, 0xd0, 0xbd, 0xd0, 0xbe, 0x29, 0x3c, 0x2f, 
  0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x3e, 0xd, 0xa, 0x20, 
  0x20, 0x20, 0x20, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x64, 
  0x69, 0x76, 0x3e, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x3c, 
  0x64, 0x69, 0x76, 0x3e, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 
  0x66, 0x3d, 0x22, 0x2f, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x3f, 
  0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x6f, 0x66, 0x66, 
  0x22, 0x3e, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 
  0x3c, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x20, 0x63, 0x6c, 
  0x61, 0x73, 0x73, 0x3d, 0x22, 0x72, 0x65, 0x64, 0x22, 0x3e, 
  0xd0, 0x92, 0xd1, 0x8b, 0xd0, 0xba, 0xd0, 0xbb, 0xd1, 0x8e, 
  0xd1, 0x87, 0xd0, 0xb8, 0xd1, 0x82, 0xd1, 0x8c, 0x20, 0xd1, 
  0x81, 0xd0, 0xb2, 0xd0, 0xb5, 0xd1, 0x82, 0x3c, 0x2f, 0x62, 
  0x75, 0x74, 0x74, 0x6f, 0x6e, 0x3e, 0xd, 0xa, 0x20, 0x20, 
  0x20, 0x20, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 
  0x76, 0x3e, 0xd, 0xa, 0x20, 0x20, 0x3c, 0x2f, 0x64, 0x69, 
  0x76, 0x3e, 0xd, 0xa, 0x3c, 0x2f, 0x62, 0x6f, 0x64, 0x79, 
  0x3e, 0xd, 0xa, 0x3c, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 
  0xd, 0xa, 0
};
//-----------------------------------------------------------------------------

ESP8266WebServer g_Server(80);
//-----------------------------------------------------------------------------

bool g_fLightOn = false;
int g_LightOnMillis = 0;
int g_LightOnTimeInMs = 0;
//-----------------------------------------------------------------------------

void handlerLight();
void lightOn(int aTime);
void lightOff();
//-----------------------------------------------------------------------------

void setup() 
{
  pinMode(0, OUTPUT);
  digitalWrite(0, 1);
  
  Serial.begin(115200);
  WiFi.mode(WIFI_STA);
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  if (WiFi.waitForConnectResult() != WL_CONNECTED) 
  {
    Serial.println("WiFi Connect Failed! Rebooting...");
    delay(1000);
    ESP.restart();
  }
  ArduinoOTA.begin();

  g_Server.on("/light", handlerLight);
  g_Server.begin();

  Serial.print("Open http://");
  Serial.print(WiFi.localIP());
  Serial.println("/light in your browser to see it working");

  WiFi.setAutoReconnect(true);
}
//-----------------------------------------------------------------------------

void loop() 
{
  ArduinoOTA.handle();
  g_Server.handleClient();

  if(g_fLightOn && g_LightOnTimeInMs &&
    (millis() - g_LightOnMillis) > g_LightOnTimeInMs) { lightOff(); }
}
//-----------------------------------------------------------------------------

void handlerLight()
{
  AUTHENTICATE_OR_RETURN();

  auto action = g_Server.arg("action");
  if(action == "on")
  {
    lightOn(g_Server.arg("time").toInt());
  }
  else if(action == "off")
  {
    lightOff();
  }
  else
  {
    // unknown action
  }
  
  g_Server.send(200, "text/html", data_light_html);
}
//-----------------------------------------------------------------------------

void lightOn(int aTime)
{
  Serial.println("Turn light on " + (aTime ? ("for " + String(aTime) + " minutes") : "permanently"));
  
  g_fLightOn = true;
  g_LightOnMillis = millis();
  g_LightOnTimeInMs = aTime * 60 * 1000;

  digitalWrite(0, 0);
}
//-----------------------------------------------------------------------------

void lightOff()
{
  Serial.println("Turn light off");
  
  g_fLightOn = false;

  digitalWrite(0, 1);
}
//-----------------------------------------------------------------------------

Логика работы следующая. После старта выполняется попытка подключения к точке доступа Wi-Fi, используя в качестве SSID и пароля значения WIFI_SSID и WIFI_PASSWORD. В случае успешного выполнения соединения запускается веб-сервер на 80 порту и html-страницой, доступной по адресу `http://<ip адрес>/light`. Логин и пароль, используемые при аутентификации, указаны в WWW_USER и WWW_PASSWORD.

Для удобства отладки, а также для вывода дополнительной информации присутствуют вызовы `Serial.println`, результат работы которых можно увидеть в `Serial Monitor`. Так, например, среди выводимой информации можно увидеть ip адрес, который был присвоен при подключении к точке доступа Wi-Fi.

Создание тестового образца

Прежде чем приступить к сборке рабочего варианта, который будет управлять уличным освещением, я собрал простую схему на макетной плате с использованием светодиода вместо прожектора.

В моем случае, используя модуль реле для ESP-01S, это выглядело следующим образом.

Сборка и монтаж рабочего образца

Для сборки рабочего образца я приобрел несколько светодиодных прожекторов и распаячную коробку, куда поместил модуль реле. В качестве источника питания для модуля реле я решил использовать сетевое зарядное устройство, а точнее его содержимое, мощностью 5 Вт.

Для того чтобы веб-страница была также доступна за пределами домашней сети на роутере было добавлено правило, выполняющее проброс порта на ESP-01S.

Разрешите продемонстрировать, что получилось в итоге.

Спасибо за внимание!

Комментарии (27)


  1. mkvmaks
    11.05.2022 18:18

    Мне понравилось. Спасибо


  1. sborisov
    11.05.2022 18:51
    -3

    Спасибо, было интересно почитать!

    Кстати на YouTube есть канал (англ), там парень очень круто показывает как работать с прошивками и самому собирать контроллеры и другие компоненты компьютера

    https://youtube.com/c/BenEater


  1. praeivis
    11.05.2022 20:54
    +4

    Sonoff + Tasmota.


    1. Barnaby
      11.05.2022 22:43

      У tasmota не сделать свои кнопки, нужно будет ходить в консоль и скрипты включать.

      Можно сделать на ESPHome и еще в ХА интегрировать :)


      1. DaemonGloom
        12.05.2022 08:29

        А что не так с кнопками tasmota? Да и в HA оно нормально интегрируется.


      1. serafims
        12.05.2022 17:57

        Кнопки на заданное время можно сделать в тасмоте.


    1. IvanBormotov
      12.05.2022 10:15

      Sonoff + Tasmota есть подробности реализации?


      1. DaemonGloom
        12.05.2022 10:57

        1) Берём https://sonoff.tech/product/diy-smart-switch/dualr3/ (или любой другой по вкусу — отличаются возможностью подключения проводных или беспроводных кнопок и количеством выходов)
        2) Прошиваем tasmota.
        3) Радуемся жизни.


        Альтернативно останавливаемся на пункте 1, поскольку родной софт у них вполне нормальный.


        1. IvanBormotov
          12.05.2022 11:27

          Спасибо, попробую домашнее освещение участка сделать.


  1. xiliu
    11.05.2022 21:38

    Просто в 2х словах опишу, как у меня получилось сделать то же самое, но лично мне удобнее.

    Sonoff (по акции стоит как esp8266+бп+корпус) подцеплен к аккаунту яндекса. Подъезжая к воротам я просто говорю Навигатору (который и так запущен и меня слушает) "Алиса включи свет над въездом".


  1. randomsimplenumber
    11.05.2022 21:49
    +1

    Непонятно, зачем преобразовывать html в hex.


    1. Chupaka
      12.05.2022 10:16

      Чтобы больше места в исходниках занимал :)

      Но, к слову, не так давно в ESPHome его после такого ещё и сжали чем-то, сэкономив немного пространства — может, отсюда ноги растут?


    1. p0r0sen0k Автор
      12.05.2022 11:07

      Да, согласен - можно записать и в более привычном виде, но нужно будет добавить экранирование отдельных символов.


      1. pOmelchenko
        12.05.2022 13:42

        По идее не нужно, можно через SPIFFS сразу html отдавать

        Там и css сразу отделить можно и js закинуть для добавления динамичности странички


        1. p0r0sen0k Автор
          12.05.2022 14:01

          Да, можно и так. Но поскольку проект крайне простой, то решил просто в hex. Спасибо!


  1. vindy123
    12.05.2022 07:30
    +5

    но ведь датчик реально удобнее.

    1. срабатывает автоматически без дополнительных телодвижений пользователя

    2. срабатывает для любой машины, а не только для того, у кого телефон с вебмордой

    3. не зависит от наличия интернета

      Извините за занудство)


    1. eurol
      12.05.2022 09:35

      Вроде бы да, но…
      1. Может сработать непонятно из-за чего. Мало радости от моргающего фонаря.
      2. Веб-морда вполне подойдет почти любому телефону.
      3. Вообще есп8266 может быть точкой доступа, и интернет тогда не нужен. Но нужен телефон с вайфай. Да, не очень удобно, что телефон надо подключать именно к этой точке доступа, согласен.


      1. p0r0sen0k Автор
        12.05.2022 11:19

        Спасибо за комментарий. Для меня определяющим фактором было то, что esp-01s уже были у меня в наличии. Решил, так сказать, сделать из того что есть :)


  1. AVX
    12.05.2022 07:34
    +2

    Сам процесс создания понятен с точки зрения "повозиться" :)

    Но вот именно такая задача как раз лучше бы если совсем автоматически - подъехал, свет включился и горит сколько там задано. Обычные датчики движения уже имеют регулируемую задержку. Тут же надо при подъезде достать телефон, открыть браузер, тыкнуть кнопку. Я бы предпочёл просто датчик движения, ну или обычный выключатель на радиоканале с одной кнопкой (бывают разные, можно с 2-3 кнопками).

    А если хочется чтобы свет не включался от каждого встречного, а только от нужной машины - можно было бы продумать вариант с RFID - тут и авторизация, и автоматика. А заодно можно и для других целей как-то использовать.

    А ещё можно с тем же модулем, но автоматически - на роутере сделать какой-нибудь скрипт, чтобы если определённый телефон зарегистрировался в сети, то посылал на ESP команду включения света (правда, лучше если бы на самом модуле был-таки датчик освещённости).

    А ещё... Можно повесить камеру, и если она распознала номера или лицо определённого человека, то при низкой освещённости посылала бы команду на включение. Но для этого скорее комп какой-нибудь надо, производительности ESP скорее всего не хватит. Приходишь к дому вечером, свет включается, и голос из динамика "Добро пожаловать, мой господин!", и дверь сама открывается :) (конечно, для подстраховки лучше ещё что-то придумать, на случай ложных срабатываний, например, собаку иметь во дворе).


    1. randomsimplenumber
      12.05.2022 08:05

      повозиться

      Помигать светодиодом же.


    1. p0r0sen0k Автор
      12.05.2022 11:23

      Да, соглашусь - есть еще над чем и куда работать :) Но на данный момент для моих нужд вполне хватает текущей функциональности. Спасибо за подробный комментарий!


  1. bellerofonte
    12.05.2022 10:52

    Плюсую. Я сам использовал такую же китайскую релюху для автоматики ворот и калитки в моем доме. И в итоге отказался от нее в пользу собственной разработки из-за одного критичного недостатка ESP-01: при подаче питания на GPIO пинах 0 и 2 (единственных доступных на этой плате) на несколько миллисекунд скачет напряжение. этого хватает для срабатывания реле. и если с освещением это не так критично - ну моргнула лампа, и ладно, то открывать калитку/ворота при включении питания - это уже прям уязвимость.


    1. AVX
      12.05.2022 11:30
      +1

      Можно же фильтр сделать. Резистор и конденсатор вполне сгладят эти всплески.

      Кстати, на контроллерах же настраиваться должно какой уровень при включении. Подтяжка вроде называется. Может просто при его программировании надо это учесть и всë норм будет? Если нет такого, то конечно сильный недостаток.


      1. bellerofonte
        12.05.2022 11:46

        изначально я так и сделал - навесом добавил в транзистор в разрыв между питанием и обмоткой реле, который отпирался напряжением питания с задержкой через RC-цепь. но потом все равно понял, что лучше свое. подтяжка на ESP8266 нужна, но на ESP-01 она уже распаяна на плате. я пробовал вешать еще сверху, но эффекта, как и ожидалось, 0.

        в итоге моя схема для меня все равно лучше, т.к.

        • можно на 1шт ESP-01 повесить 2шт реле

        • заменить напряжение питания с 5В на 12В (которыми все надо дергать соленоид в замке калитки),

        • поставить также 12В релюхи

        • лучше скомпоновать плату и сделать дырки под крепеж


  1. hooperer
    12.05.2022 10:53

    А бывают еще и готовые приборы на базе Есп-шки, от тех же китайских Sonoff,

    до наших, российских, с хорошим вебинтерфейсом, возможностью работать через телеграммбота и входами для контроля 220 вольт и перекидными контактами - для организации проходных выключателей.

    Мне в таких вещах весьма интересны алгоритмы применения. Их достаточно мало, но они весьма интересны


  1. bellerofonte
    12.05.2022 10:56
    +1

    И кстати, вместо вебморды я рекомендую настроить иконки на экране смартфона. iOS 13 уже из коробки умеет дергать HTTP, а на андройде есть отличное приложение.


  1. safari2012
    12.05.2022 11:38

    Эти синие релюшки долго не живут. Они умирают (залипают) достаточно быстро. У себя дома я использовал штук пять и, в итоге, все заменил на SSR.