Pull to refresh

Уличное освещение на основе ESP8266

Reading time 16 min
Views 16K

Привет, Хабр! В этой статье я расскажу о своем опыте разработки системы уличного освещения, построенной на микроконтроллере 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.

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

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

Tags:
Hubs:
+12
Comments 35
Comments Comments 35

Articles