Как построить схему управления на arduino и esp8266 с настраиваемыми таймерами, контролируемую через wi-fi

Содержание

Введение

Модифицировав код из раздела «Быстрый старт», мы пойдем на шаг дальше и сделаем так, чтобы ESP8266, отключившись от точки доступа, подключался к следующей доступной точке доступа. Этот функционал обеспечивается классом ESP8266WiFiMulti и демонстрируется в скетче ниже:

 1 #include <ESP8266WiFi.h>
 2 #include <ESP8266WiFiMulti.h>
 3 
 4 ESP8266WiFiMulti wifiMulti;
 5 boolean connectioWasAlive = true;
 6 
 7 void setup()
 8 {
 9   Serial.begin(115200);
10   Serial.println();
11 
12   wifiMulti.addAP("primary-network-name", "pass-to-primary-network");
13   wifiMulti.addAP("secondary-network-name", "pass-to-secondary-network");
14   wifiMulti.addAP("tertiary-network-name", "pass-to-tertiary-network");
15 }
16 
17 void monitorWiFi()
18 {
19   if (wifiMulti.run() != WL_CONNECTED)
20   {
21     if (connectioWasAlive == true)
22     {
23       connectioWasAlive = false;
24       Serial.print("Looking for WiFi ");
25                //  "Поиск WiFi-сети"
26     }
27     Serial.print(".");
28     delay(500);
29   }
30   else if (connectioWasAlive == false)
31   {
32     connectioWasAlive = true;
33     Serial.printf(" connected to %s\n", WiFi.SSID().c_str());
34               //  "Подключено к "
35   }
36 }
37 
38 void loop()
39 {
40   monitorWiFi();
41 }

Other libraries

  • ESP8266WebServer: fix URL parameter decoding in web server ()
  • ESP8266WebServer: allocate HTTPUpload struct on demand ()
  • ESP8266WebServer: send empty chunk when done sending chunked response
  • ESP8266WebServer: add CONTENT_LENGTH_UNKNOWN keyword
  • ESP8266HTTPClient: increase HTTP SEND/POST timeout to 5s ()
  • ESP8266HTTPClient: handle empty URI correctly
  • ESP8266HTTPClient: allow changing connection timeout using setTimeout ()
  • EEPROM: Added length and operator[] methods, added some constness, missed dirty clear ()
  • EEPROM: Clear dirty flag in begin and reallocate only if necessary, add getConstDataPtr method () ()
  • Set architecture=esp8266 for bundled SD and Ethernet libraries ()

Пробуем

Теперь загрузите скетч на ESP8266 и откройте монитор порта. Сначала модуль начнет сканировать доступные сети. Затем он выберет и подключится к сети с самым сильным сигналом. Если соединение будет утеряно, модуль подключится к следующей доступной сети.

В мониторе порта этот процесс будет выглядеть примерно так:

Looking for WiFi ..... connected to sensor-net-1
Looking for WiFi ....... connected to sensor-net-2
Looking for WiFi .... connected to sensor-net-1

В примере выше ESP8266 сначала подключается к сети sensor-net-1. Затем я выключаю sensor-net-1. ESP8266 понимает, что подключение разорвано и начинает искать другую доступную сеть. Она называется sensor-net-2, и ESP8266 решает подключиться к ней. Затем я включаю sensor-net-1 и выключаю sensor-net-2.

В конце скетча находится функция monitorWiFi() – она показывает, когда ESP8266 отключается от сети, печатая в мониторе порта сообщение Looking for WiFi. Во время поиска другой точки доступа в мониторе порта будут печататься точки. Когда ESP8266 настроит соединение с сетью, в мониторе порта появится сообщение вроде connected to sensor-net-2.

Websocket

Теперь сделаем сервер, который будет работать на указанном порту (пусть будет 333). Затем мы с помощью терминальной программы подключимся к нашему серверу, указав его IP и порт. И потом будем обмениваться данными.

Скрипт main.lua:

Теперь наш скрипт поднимает Wi-Fi точку, создает сервер, который на порту 333 ожидает подключения. В момент подключения сервер отправит клиенту строку «Hello!», а приняв от клиента данные, вернет ему строку «Recived: » и дальше все, что он принял.

Теперь мы можем подключиться мобильным телефоном к Wi-Fi точке ESP8266. В принципе, создавать точку не обязательно. Вы можете переписать скрипт и сделать так, чтобы ESP8266 подключался к Вашей WiFi сети. Тогда Вам нужно узнать его IP и далее использовать его вместо 192.168.4.1, который далее используется в примерах.

Но нам еще нужна терминальная программа для подключения на IP адрес ESP8266 (192.168.4.1) и указанный порт (333). На обычном компьютере можно установить PuTTY. Для мобильных телефонов под Android я использую JuiceSSH.

Core

  • Const-correctness for MD5Builder ()
  • detect division by zero in map() to prevent exceptions ()
  • digitalWrite and digitalRead cancel analogWrite enabled on a pin ()
  • Fix incorrect usage of memset() in PWM code which leads to incomplete initialization of struct
  • Fix libb64 decoder ()
  • Force core_version to be added to compiled binary
  • Prevent divide by zero error causing tone() to crash ()
  • progmem: replace C version of pgm_read_{word,byte} with assembly
  • SPIFFS: fix unaligned read in HAL ()
  • Add Arduino File standard seek call
  • Add support to Print::printf for printing from flash ()
  • Allow global object instances be switched off with defines ()
  • Base64: add option to disable any newlines in output ()
  • Enable floating point formatting in sprintf/sscanf ()
  • Updated String library to use C++11 iterators. ()
  • Use libc from newlib ()
  • move libstdc++ to flash ()
  • Link ESP-NOW library

Подключаемся к Wifi или создаем свою Wifi точку

Для подключения к WiFi создаем main.lua и пишем:

После успешного подключения модуль получить IP адрес. Узнать его можно с помощью команды:

Если мы хотим, чтобы ESP8266 создал свою собственную WiFi точку:

Примечание: WiFi точка не поднимется, если пароль короче 8 символов. По умолчанию IP адрес точки всегда 192.168.4.1

Его можно узнать командой:

Что такое collectgarbage()? Функция collectgarbage — это сборщик мусора. Ее следует вызывать в конце каждого скрипта

Обратите внимание, переменная cfg объявлена как local. Она будет доступна только в текущем скрипте

Если local убрать, то переменная cfg была бы глобальной и доступной в других скриптах.

Шаг 6. Загрузите скетч в Arduino.

Скетч загружается в Arduino обычным способом. Однако из за того что модуль ESP8266 подключен к контактам 0 и 1, программирование становится невозможным. Компилятор будет показывать ошибку.

Перед программированием отсоедините провода идущие к ESP8266 от контактов 0 и 1. Произведите программирование. Затем верните контакты на место. Нажмите кнопку сброса Arduino.

Примечание: Первый признак того, что программирование прошло успешно, это мерцание синего светодиода на модуле ESP8266 в течении полсекунды сразу после сброса. Мерцание синего светодиода означает обмен данными между Arduino и ESP8266. В эти полсекунды Arduino производит настройку ESP8266 для работы в качестве точки доступа.

Код прошивки

Для прошивки всех используемых ниже модулей используем один и тот же код.

Основные функции:

  1. Установка Wi-Fi соединения

  2. Подключение к объекту на платформе Rightech IoT Cloud по протоколу MQTT

  3. Отправка рандомных значений по температуре («base/state/temperature») и влажности («base/state/humidity») каждые 5 секунд (PUB_DELAY)

  4. Получение сообщений о переключении света («base/relay/led1»)

Работоспособность кода будем проверять на платформе Rightech IoT Cloud, именно поэтому в качестве адреса MQTT-брокера указан dev.rightech.io. Идентификаторами клиентов служат идентификаторы объектов, созданных на платформе. Под каждую проверку я завела на платформе отдельный объект, именно поэтому во всех скринах кодов, которые будут далее представлены, отличается только строка <ric-mqtt-client-id>. 

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

Android приложение

Чтобы управлять всеми выше перечисленными аппаратными компонентами, мы будем использовать простое приложение для Android. Это приложение позволит нам включать или выключать выход напрямую или через определенный период времени.

Примечание: Приложение требует Android 4.0 (IceCreamSandwich) или выше.

  • Прежде всего, вы должны знать IP адрес своего модуля. Если вы использовали программный последовательный порт, IP адрес будет напечатан в консоли. Если вы использовали аппаратный последовательный порт, то вы должны использовать кабель для отслеживания данных на линиях RX и TX, чтобы увидеть IP адрес. Вам также нужно знать номер порта, который был указан в скетче для Arduino. После этого нажмите «connect», чтобы получить состояние всех трех выходов. Вам нужно убедиться, что ваш Wi-Fi роутер включен, и вы подключены к локальной сети.
  • Теперь нажмите на любой переключатель, который вы хотите включить/выключить. Всякий раз, когда захотите, вы можете нажать «refresh», чтобы обновить состояние всех выходов.
  • На вкладке «Timers» вы можете установить любой из этих трех выходов для включения/выключения через определенный промежуток времени (от 0 до 24 часов).
  • После любого действия вы получите сообщение с подтверждением о том, выполнилась ли команда успешно, или возникла какая-то ошибка.

Скриншоты Android приложения для управления контроллером на Arduino и ESP8266

Подключение

Переключение ESP8266 в режим станции выполняется при помощи функции begin(). Параметрами для этой функции служат SSID и пароль к ней, чтобы чип можно было подключить к определенной точке доступа.

WiFi.begin(ssid, password)

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

begin()

В библиотеке ESP8266WiFi представлено несколько вариантов функции begin(). Процесс совмещения нескольких функций в одной называют «перегрузкой функции». Один вариант был показан выше – это WiFi.begin(ssid, password). Перегрузка дает гибкость в количестве и типе параметров, задаваемых в функции.

Самый простой вариант функции begin() – это…

WiFi.begin()

Вызов этой функции скомандует ESP8266 переключиться в режим станции и подключиться к последней использованной точке доступа на основе данных, сохраненных во flash-памяти.

Ниже – синтаксис еще одного варианта функции begin() со всеми возможными параметрами:

WiFi.begin(ssid, password, channel, bssid, connect)

Параметр ssid – символьная строка, содержащая SSID точки доступа, к которой мы хотим подключиться (может содержать не более 32 символов). Параметр password – это пароль к точке доступа в виде символьной строки, которая может содержать от 8 до 64 символов. Параметр channel – канал точки доступа; на тот случай, если вы хотите работать через специальный канал (в противном случае этот параметр нужно проигнорировать). Параметр bssid – MAC-адрес точки доступа (тоже опционально). Параметр connect – это параметр с булевым значением; если задать в нем false, это скомандует модулю сохранить другие параметры, не подключаясь к точке доступа.

config()

Отключает DHCP-клиент (от «dynamic host configuration protocol», что значит «протокол динамической настройки узла») и выставляет IP-настройки станции на пользовательские значения. Эти IP-настройки, в отличие от настроек DHCP, будут статическими.

WiFi.config(local_ip, gateway, subnet, dns1, dns2)

При успешном изменении настроек функция вернет true. Если настройки задать нельзя (например, если чип не переключен в режим станции или станции + точки доступа), функция вернет false.

В функции можно указать следующую информацию:

  • local_ip – IP-адрес для стационарного интерфейса ESP8266
  • gateway – IP-адрес шлюза (роутера) для доступа к внешним сетям
  • subnet – маска подсети, диапазон IP-адресов в локальной сети
  • dns1, dns2 – опциональные параметры для IP-адресов DNS-серверов, которые хранят директории доменных имен (вроде www.google.co.uk) и преобразовывают их в IP-адреса

Пример:

 1 #include <ESP8266WiFi.h>
 2 
 3 const char* ssid = "********";
 4 const char* password = "********";
 5 
 6 IPAddress staticIP(192,168,1,22);
 7 IPAddress gateway(192,168,1,9);
 8 IPAddress subnet(255,255,255,);
 9 
10 void setup(void)
11 {
12   Serial.begin(115200);
13   Serial.println();
14 
15   Serial.printf("Connecting to %s\n", ssid);     //  "Подключение к "
16   WiFi.begin(ssid, password);
17   WiFi.config(staticIP, gateway, subnet);
18   while (WiFi.status() != WL_CONNECTED)
19   {
20     delay(500);
21     Serial.print(".");
22   }
23   Serial.println();
24   Serial.print("Connected, IP address: ");       //  "Подключено, IP-адрес: "
25   Serial.println(WiFi.localIP());
26 }
27 
28 void loop() {}

Пример данных, которые могут быть показаны в мониторе порта:

Connecting to sensor-net
.
Connected, IP address: 192.168.1.22

Станции с статическими IP-адресами, как правило, быстрее подключаются к сети. У кода выше подключение занимает примерно 500 мс (в мониторе порта показана только одна точка). Дело в том, что получение IP-настроек при помощи DHCP-клиента отнимает время, а в нашем случае этот шаг попросту пропущен. Если во всех трех параметрах (local_ip, gateway и subnet) указать «0.0.0.0», это снова активирует DHCP. Снова подключитесь к устройству, чтобы получить новые IP-адреса.

Установка Arduino IDE через Boards Manager

  1. Запустить Arduino IDE, далее Файл — Настройки — в поле Additional Boards Manager URLs вставить ссылку на стабильную версию
    http//arduino.esp8266.com/package_esp8266com_index.jsonили для nightly build
    http//arduino.esp8266.com/staging/package_esp8266com_index.json, нажать OK (В это поле вы можете вводить несколько ссылок, разделенных запятой)
  2. Инструменты — Плата — Boards Manager
  3. В Boards Manager в поле фильтра введите esp8266 или вручную пролистайте список и кликните на ESP8266 by ESP8266 Community Forum
  4. Кликните Install и дождитесь окончания загрузки (около 130 Мегабайт). Если загрузка произошла слишком быстро, возможно, что вы уже устанавливали Arduino IDE для ESP8266 и потребуется почистить кэш Boards Manager, иначе у вас останется установленной старая версия. Нужно сначала деинсталлировать старую версию, а потом необходимо удалить файлы кэша. Для Win7 x64 удалите файлы из папки C:\Users\Пользователь\AppData\Roaming\Arduino15 и повторите все, начиная с п.2
  5. Закройте Boards Manager и в меню Инструменты выберите Плата — Generic ESP8266
  6. Установите частоту вашего модуля 80 или 160Mhz, размер флеш памяти и выберите последовательный порт, к которому подключен ваш USB-TTL адаптер

Step 9: Loop

In the loop, we will read the button pin to see if it has been pressed, and then we will call the method to re-enable the AP mode.

void loop() {

  WiFiManager wifiManager;
  //se o botão foi pressionado
   if ( digitalRead(PIN_AP) == HIGH ) {
      Serial.println("resetar"); //tenta abrir o portal
      if(!wifiManager.startConfigPortal("ESP_AP", "12345678") ){
        Serial.println("Falha ao conectar");
        delay(2000);
        ESP.restart();
        delay(1000);
      }
      Serial.println("Conectou ESP_AP!!!");
   }

When you press the button, ESP will exit Station mode and open your Access Point and portal.

Remember that we do not use the resetSettings () command. The settings are still saved for the next time the ESP boots.

Проверка в действии

Загружаем скетч на модуль и открываем монитор порта. В нем должна появиться примерно такая запись:

Connecting to sensor-net ........ connected

Connecting to www.example.com ... connected
Sending a request

Сначала, когда установится WiFi-соединение, вы должны увидеть подтверждение, что клиент подключился к серверу и отправил ему запрос:
Получив запрос, сервер сначала ответит заголовком, в котором будет информация о типе отправляемых данных (например, Content-Type: text/html), их размере (вроде Content-Length: 1270) и т.д.

 1 Response:]
 2 HTTP1.1 200 OK
 3 
 4 Cache-Control max-age=604800
 5 Content-Type texthtml
 6 Date Sat, 30 Jul 2016 123045 GMT
 7 Etag "359670651+ident"
 8 Expires Sat, 06 Aug 2016 123045 GMT
 9 Last-Modified Fri, 09 Aug 2013 235435 GMT
10 Server ECS (ewr15BD)
11 Vary Accept-Encoding
12 X-Cache HIT
13 x-ec-custom-error 1
14 Content-Length 1270
15 Connection close

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

 1 <!doctype html>
 2 <html>
 3 <head>
 4     <title>Example Domain</title>
 5 
 6     <meta charset="utf-8" />
 7     <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
 8     <meta name="viewport" content="width=device-width, initial-scale=1" />
 9     <style type="text/css">
10 
11 (...)
12 
13 </head>
14 
15 <body>
16 <div>
17     <h1>Example Domain</h1>
18     <p>This domain is established to be used for illustrative examples in documents. You may use this
19     domain in examples without prior coordination or asking for permission.</p>
20     <p><a href="http://www.iana.org/domains/example">More information...</a></p>
21 </div>
22 </body>
23 </html>
24 
25 

Можно ли его упростить?

Мы можем упростить этот скетч, удалив функцию и поместив в блок loop() только функцию wifiMulti.run(). ESP8266 по-прежнему будет переключаться между точками доступа, но теперь в мониторе порта будет молчание, разве что вы не добавите в скетч функцию Serial.setDebugOutput(true), о которой рассказывалось в статье о библиотеке ESP8266WiFi в разделе «Включение WiFi-диагностики».

Упрощенный скетч будет выглядеть следующим образом:

 1 #include <ESP8266WiFi.h>
 2 #include <ESP8266WiFiMulti.h>
 3 
 4 ESP8266WiFiMulti wifiMulti;
 5 
 6 void setup()
 7 {
 8   Serial.begin(115200);
 9   Serial.setDebugOutput(true);
10   Serial.println();
11 
12   wifiMulti.addAP("primary-network-name", "pass-to-primary-network");
13   wifiMulti.addAP("secondary-network-name", "pass-to-secondary-network");
14   wifiMulti.addAP("tertiary-network-name", "pass-to-tertiary-network");
15 }
16 
17 void loop()
18 {
19   wifiMulti.run();
20 }

Вот и все! Это весь код, нужный для того, чтобы ESP8266 автоматически переключался между доступными точками доступа.

Загрузив скетч и открыв монитор порта, вы увидите в нем примерно следующее.

При подключении к sensor-net-1 после включения питания:

 1 f r0, scandone
 2 f r0, scandone
 3 state:  -> 2 (b0)
 4 state: 2 -> 3 ()
 5 state: 3 -> 5 (10)
 6 
 7 add 
 8 aid 1
 9 cnt
10 chg_B1:-40
11 
12 connected with sensor-net-1, channel 1
13 dhcp client start...
14 ip:192.168.1.10,mask:255.255.255.0,gw:192.168.1.9

При потере соединения с sensor-net-1 и подключения к sensor-net-2:

 1 bcn_timout,ap_probe_send_start
 2 ap_probe_send over, rest wifi status to disassoc
 3 state 5 ->  (1)
 4 rm 
 5 f r-40, scandone
 6 f r-40, scandone
 7 f r-40, scandone
 8 state  -> 2 (b0)
 9 state 2 -> 3 ()
10 state 3 -> 5 (10)
11 add 
12 
13 aid 1
14 cnt
15 
16 connected with sensor-net-2, channel 11
17 dhcp client start...
18 ip192.168.1.102,mask255.255.255.0,gw192.168.1.234

При потере соединения с sensor-net-2 и подключения к sensor-net-1:

 1 bcn_timout,ap_probe_send_start
 2 ap_probe_send over, rest wifi status to disassoc
 3 state 5 ->  (1)
 4 rm 
 5 f r-40, scandone
 6 f r-40, scandone
 7 f r-40, scandone
 8 state  -> 2 (b0)
 9 state 2 -> 3 ()
10 state 3 -> 5 (10)
11 add 
12 aid 1
13 cnt
14 
15 connected with sensor-net-1, channel 6
16 dhcp client start...
17 ip192.168.1.10,mask255.255.255.0,gw192.168.1.9

Constructor

SerialESP8266wifi(Stream serialIn, Stream serialOut, byte resetPin)

  • serialIn this object is used to read from the ESP8266, you can use either hardware or software serial
  • serialOut this object is used to write to the ESP8266, you can use either hardware or software serial
  • Example:

SerialESP8266wifi(Stream serialIn, Stream serialOut, byte resetPin, Stream debugSerial)

  • serialIn this object is used to read from the ESP8266, you can use either hardware or software serial
  • serialOut this object is used to write to the ESP8266, you can use either hardware or software serial
  • debugSerial enables wifi debug and local echo to Serial (could be hw or sw)
  • Example:

Breaking changes summary

  • BREAKING: WString: return bool instead of unsigned char ()
  • BREAKING: wifi: remove pseudo-modes for shutdown, expose ()
  • BREAKING: Disable WiFi at boot by default (, , )
  • BREAKING: base64::encode() compat with esp32: no newlines by default ()
  • BREAKING: Use IRAM_ATTR in place of ICACHE_RAM_ATTR ()
  • BREAKING: Upgrade to upstream newlib 4.0.0 release (64 bits time_t) ()
  • BREAKING: Change servo defaults to safer defaults ()
  • BREAKING: Add Print::availableForWrite method ()
  • BREAKING: Change return EEPROM.end() to bool ()
  • BREAKING: Change return type of channel() ()
  • BREAKING: Change return type of RSSI() ()
  • BREAKING: Add Wrong Password wifi status case ()
  • BREAKING: analogWriteRange 8-bit default ()
  • BREAKING: HTTPClient: RequestHandler: Pass String by const reference ()

Библиотека Servo

Библиотека позволяет управлять сервомоторами. Поддерживает до 24 сервоприводов на любых доступных GPIO. По умолчанию первые 12 сервоприводов будут использовать Timer0 и будут независимы от любых других процессов. Следующие 12 сервоприводов будут использовать Timer1 и будут разделять ресурсы с другими функциями, использующими Timer1. Большинство сервоприводов будут работать с управляющим сигналом ESP8266 3,3в, но не смогут работать на напряжении 3,3в и потребуют отдельный источник питания. Не забудьте соединить общий провод GND этого источника с GND ESP8266

Другие библиотеки, не включенные в поставку Arduino IDE

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

  • arduinoWebSockets — WebSocket сервер и клиент для esp8266 (RFC6455)
  • aREST REST API handler библиотека, позволяет управлять GPIO через http запросы вида http://192.168.1.101/digital/6/1
  • Blynk — легкий в освоении IoT фреймворк (страница на Kickstarter). Статья на нашем сайте об этой библиотеке и мобильном приложении ESP8266 – Управляем со смартфона через Blynk
  • RTC — библиотека for Ds1307 & Ds3231 для esp8266
  • Souliss, Smart Home — фреймворк для Умного Дома, построенный на Arduino, Android и OpenHAB

Подключаем реле с нагрузкой

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

А теперь вместо светодиода подключим модуль реле, а в качестве нагрузки — скажем лампу, обогреватель, компрессор для аквариума, вентилятор и т.п.

При подключении реле могут быть нюансы. Если блок реле с оптической развязкой (с оптопарой), то, скорее всего, Вам ничего переделывать не придется. Если блок реле без оптической развязки, как у меня, тогда придется переделать работу с GPIO, поскольку во первых реле включается низким уровнем, а не высоким, а во вторых высокий уровень ESP8266 – это 3.3В, для 5-ти вольтового блока реле этого не достаточно, поэтому мне пришлось настроить выход как OPENDRAIN, после чего все заработало как надо.

Финальная версия скрипта выглядит так:

Теперь мы можем включать и выключать “розетку” с мобильного телефона с помощью программы RoboRemoFree или с помощью браузера. Разумеется, с обычного компьютера через браузер тоже можно управлять.

Все это хорошо, но что дальше? Если у нас будет 5, 10, 20 подобных устройств? Как их объединить, чтобы не надо было подключаться к каждому устройству отдельно. Для этого существует протокол MQTT, но это будет отдельная тема. А пока мы изучим возможности ESP8266 и NodeMCU.

Esp-link goals

The goal of the esp-link project is to create an advanced Wifi co-processor. Esp-link assumes that
there is a «main processor» (also referred to as «attached uController») and that esp-link’s role
is to facilitate communication over Wifi. This means that esp-link does not just connect TCP/UDP
sockets through to the attached uC, rather it implements mostly higher-level functionality to
offload the attached uC, which often has much less flash and memory than esp-link.

Where esp-link is a bit unusual is that it’s not really
just a Wifi interface or a slave co-processor. In some sense it’s the master, because the main
processor can be reset, controlled and reprogrammed through esp-link. The three main areas of
functionality in esp-link are:

  • reprogramming and debugging the attached uC
  • letting the attached uC make outbound communication and offloading the protocol processing
  • forwarding inbound communication and offloading the protocol processing

The goal of the project is also to remain focused on the above mission. In particular, esp-link
is not a platform for stand-alone applications and it does not support connecting sensors or
actuators directly to it. A few users have taken esp-link as a starting point for doing these
things and that’s great, but there’s also value in keeping the mainline esp-link project
focused on a clear mission.

Последние штрихи

Итак, смотрим что получилось:

https://example.com/ — это ваш сайт заглушка, можно разместить что-то полезное, положив html файлы в conf/nginx/www

https://example.com/manager/rabbit/ — интерфейс управления RabbitMQ, доступ по умолчанию guest пароль guest — пароль нужно сразу же сменить — помните про китайцев! Создание новых пользователей MQTT на вкладке Admin. Если укажете TAG administrator, то этот пользователь сможет логиниться в WEB интерфейс RabbitMQ и управлять другими пользователями. Если нужно только подключение по MQTT то задавайте TAG None. Создайте нового пользователя, которого прописали в конфиге Telegraf, перезапустите Telegraf. Каждому пользователю после создания нужно дать права на доступ к Virtual host (это внутренний термин RabbitMQ, наш единственный Virtual host это «/»), жмите Set permission.

https://example.com/manager/grafana/ — самое интересное — Grafana. По умолчанию там только один источник данных — Prometheus. Из него берутся данные для мониторинга RabbitMQ и VPS. Нужно создать еще один источник данных InfluxDB — туда Telegraf будет складывать данные из всех топиков, полученные по MQTT. Вообще, в Grafana все интуитивно понятно да и в интернете множество инструкций. Смотрите готовые dashboards, импортируйте чужие и создавайте свои.

https://example.com/manager/portainer/ — WEB интерфейс для управления контейнерами. Тоже нужно задать нормальный пароль после первого входа (admin admin). Можно останавливать/перезапускать контейнеры, смотреть логи каждого контейнера и многое другое — смотрите, изучайте. Именно здесь найдете причину в логах, если что-то не работает.

Releases & Downloads

Esp-link uses semantic versioning. The main change between versions 1.x and 2.x was the
addition of MQTT and outbound REST requests from the attached uC. The main change between 2.x
and 3.x will be the addition of custom web pages (this is not ready yet).

  • The master branch is currently unstable as we integrate a number of new features to get
    to version 3.0. Please use v2.2.3 unless you want to hack up the latest code!
    This being said, the older functionality seems to work fine on master, YMMV…
  • V2.2.3 is the most recent release.
    It has a built-in stk500v1 programmer (for AVRs), work on all modules, and supports mDNS,
    sNTP, and syslog. It is built using the Espressif SDK 1.5.4.
  • V2.1.7 is the previous release.
  • See all releases.

EEPROM

Этот класс слегка отличается от стандартного класса EEPROM. Перед считыванием или записью данных нужно вызвать функцию EEPROM.begin(size), где аргумент size – это количество байт, которые вы хотите использовать. Этот размер может быть в диапазоне от 4 до 4096 байтов.

Если вы хотите выполнить немедленную запись данных на flash-память, то нужно вызывать не EEPROM.write(), а EEPROM.commit(). Функция EEPROM.end() делает то же самое, что и EEPROM.commit(), но также удаляет из оперативной памяти содержимое EEPROM.

Библиотека EEPROM использует один сектор flash-памяти, расположенный сразу после SPIFFS.