Nodemcu (esp8266) для начинающих: что такое, как подключить
Содержание:
Цели проекта
Как то так вышло, что я построил свой дом, каркасник. В моём лакшери ауле нет газа и не предвидится в ближайшее время, потому и выбрал каркасник — всё остальное, для меня, было бы очень дорого топить электричеством. Ну и ещё потому что это одна из самых дешевых технологий.
Ок, раскидал трубы по дому, повесил батареи, котёл, вроде тепло, но что то не то.
Прислушавшись к себе, я понял, что это жаба, которой не нравится, что пока меня нет дома (12-16 часов в сутки), отопление работает. А могло бы и не работатать, включаться только перед приходом, благо каркасник обладает небольшой инерционностью и позволяет быстро поднять температуру. Та же ситуация когда куда то надолго уехать из дома. Ну и вообще, бегать, крутить ручку котла при изменениях температуры на улице — как то не кошерно.
Стало понятно, что без автоматизации никуда, благо хоть котёл из самых простых, но имеет контакты для подключения реле внешнего управления. Конечно, можно было бы сразу купить котёл со всеми нужными функциями, но для меня такие котлы стоят как то негуманно. Плюс хотелось поприседать мозгами, пописать что то для души, изучить немного C, пусть и в ардуино варианте.
Собственно о требованиях:
- управление температурой в доме по уставке
- управление температурой теплоносителя в зависимости от температуры на улице или вручную
- временные зоны с разными уставками, днём холоднее, ночью горячее
- автоматический режим, с авто переходом день-ночь
- ручной режим, без автопереходов, для выходных
- режим без автоматики, где можно вручную задать любую температуру теплоносителя и включить/выключить котёл
- управление отоплением локально, с кнопок и экрана и через сайт/мобильное приложение
Это было в начале, а потом меня понесло и добавились:
- управление уличным фонарём (LED прожектором)
- сигнализация на основе датчика движения, сирены и уличного фонаря
- учёт энергии потреблённой котлом за день/месяц/год + за каждый месяц года
- режим сигнализация только медленным миганием фонаря
- режим сигнализации быстрым миганием фонаря и короткими гудками сирены
- режим сигнализации быстрым миганием фонаря и постоянным воем сирены
Цель написания статьи — поделиться опытом, описать что то на русском, что я не смог найти в интернете. Думаю, статья будет полезна начинающим Arduino самодельщикам, которые уже немного знакомы с программированием, т.к. совсем уж базовые вещи я не описывал. Я старался писать код как можно более понятным, надеюсь это у меня получилось.
Установка ядра ESP8266 на ОС Windows
Давайте приступим к установке ядра ESP8266 Arduino.
Во-первых, на вашем компьютере должна быть установлена последняя версия Arduino IDE (Arduino 1.6.4 или выше). Если у вас ее нет, рекомендуем сейчас обновиться.
Для начала нам нужно обновить менеджер плат с помощью пользовательского URL. Откройте Arduino IDE и выберите Файл → Настройки. Затем скопируйте приведенный ниже URL в текстовое поле Дополнительные ссылки для менеджера плат, расположенное в нижней части окна:
Рисунок 7 – Установка платы ESP8266 в Arduino IDE с помощью json URL
Отлично. Затем перейдите к Менеджеру плат, выбрав Инструменты → Платы → Менеджер плат. Там, в дополнение к стандартным платам Arduino, должна быть пара новых записей. Отфильтруйте результаты поиска, введя esp8266. Нажмите на эту запись и выберите Установить.
Рисунок 8 – Установка ядра ESP8266 в менеджере плат Arduino IDE
Определения и инструменты для платы ESP8266 включают в себя полностью новый набор gcc, g++ и других достаточно больших скомпилированных двоичных файлов, поэтому загрузка и установка могут занять несколько минут (заархивированный файл весит ~110 МБ). После завершения установки рядом с записью появится надпись INSTALLED. Теперь можно закрыть менеджер плат.
NodeMCU PyFlasher¶
Self-contained NodeMCU flasher with GUI based on Python, esptool.py (see below) and wxPython. A runnable .exe is available for Windows and a .dmg for macOS.
No installation required on Windows and macOS! Instructions how to run it on other platforms are available on the project site.
- Install drivers for USB-to-serial. Which driver you need depends on the ESP8266 module or USB-to-serial converter you use.
- Connect USB cable to device and computer.
- Download then start PyFlasher
- Select serial port, browse for firmware binary and set the flash options.
Note that this tool is not an official NodeMCU offering. It’s maintained by a NodeMCU team member as an individual, though.
net.ifinfo()¶
Return information about a network interface, specified by index.
Returns
if the given does not correspond to an interface. Otherwise,
a table containing …
-
, , and configured for this interface, as dotted quad strings
or if none is set. -
if DHCP was used to configure the interface, then will be a table containing…
-
— the DHCP server itself, as a dotted quad
-
— the IP address suggested for the client; likely, this equals
above, unless the configuration has been overridden. -
— the NTP server suggested by the DHCP server.
DNS servers are not tracked per-interface in LwIP and, as such, are not
reported here; use .
Структура проекта
Файл | Назначение |
---|---|
WaterpoolManager.ino | Объявление основных переменных и констант. Инициализация. Главный цикл. |
HeaterMainLogic.ino | Основная логика управления реле котла (по температурам) и вспомогательными реле. |
Sensors.ino | Считывание данных сенсоров |
Settings.ino | Настройки устройства, сохранение их в флеш-памяти контроллера |
LCD.ino | Вывод информации на LCD |
ClockTimer.ino | Считывание показаний часов RTC, или симуляция часов |
Relays.ino | Управление включением/выключением реле |
ButtonLogic.ino | Логика реакции на состояния аппаратных кнопок |
ReadButtonStates.ino | Считывание состояний аппаратных кнопок |
EEPROM_Logging.ino | Логгирование данных датчиков в EEPROM |
WebServer.ino | Встроенный веб-сервер для управления устройством и отображением состояний |
WebPages | В этой папке хранятся страницы веб-сервера |
index.h | Основная страница отображения состояния устройства. Идет считывание текущего состояния с помощью вызова ajax. Refresh каждые 5 секунд. |
loggraph.h | Выводит лог данных датчиков и состояний реле в виде графика. Используется библиотека jqPlot – все построение происходит на стороне клиента. Запрос к контроллеру идет лишь на бинарный файл – копии данных из EEPROM. |
logtable.h | тоже, но в виде таблицы |
settings.h | Управление настройками устройства: установка пределов по температурам, потоку воды, периодичности логгирования данных |
time.h | Установка текущего времени |
Библиотеки | |
EepromLogger.cpp | Библиотека записи логов во флеш |
EepromLogger.h | |
crc8.cpp | Подсчет 8-битного CRC для библиотеки |
crc8.h | |
TimeSpan.cpp | Структура для управления отрезками времени |
TimeSpan.h |
node.bootreason()¶
Returns the boot reason and extended reset info.
The first value returned is the raw code, not the new «reset info» code which was introduced in recent SDKs. Values are:
- 1, power-on
- 2, reset (software?)
- 3, hardware reset via reset pin
- 4, WDT reset (watchdog timeout)
The second value returned is the extended reset cause. Values are:
- 0, power-on
- 1, hardware watchdog reset
- 2, exception reset
- 3, software watchdog reset
- 4, software restart
- 5, wake from deep sleep
- 6, external reset
In general, the extended reset cause supercedes the raw code. The raw code is kept for backwards compatibility only. For new applications it is highly recommended to use the extended reset cause instead.
In case of extended reset cause 3 (exception reset), additional values are returned containing the crash information. These are, in order, EXCCAUSE, EPC1, EPC2, EPC3, EXCVADDR, and DEPC.
node.egc.setmode()¶
Sets the Emergency Garbage Collector mode. The EGC whitepaper
provides more detailed information on the EGC.
Parameters
-
- EGC inactive, no collection cycle will be forced in low memory situations
- Try to allocate a new block of memory, and run the garbage collector if the allocation fails. If the allocation fails even after running the garbage collector, the allocator will return with error.
- Run the garbage collector when the memory used by the Lua script goes beyond an upper . If the upper limit can’t be satisfied even after running the garbage collector, the allocator will return with error. If the given limit is negative, it is interpreted as the desired amount of heap which should be left available. Whenever the free heap (as reported by falls below the requested limit, the garbage collector will be run.
- Run the garbage collector before each memory allocation. If the allocation fails even after running the garbage collector, the allocator will return with error. This mode is very efficient with regards to memory savings, but it’s also the slowest.
- in the case of , this specifies the memory limit.
Распределение памяти
Как уже говорилось — встроенной памяти чипсет не имеет, а поэтому используется внешняя — от 512 Кбайт до 4 Мбайт. Эта память распределена на следующие разделы:
- скетчи (память для прошивки);
- файловая система SPIFFS;
- OTA-Update (прошивка, переданная «по воздуху»);
- EEPROM (да-да, её у МК тоже нет, поэтому она имитируется на flash-памяти);
- конфигурация WiFi.
Файловая система SPIFFS
Во внешней flash-памяти явно есть свои «плюшки». Одна из них — файловая система. Как это ни странно, в неё можно с лёгкостью записать файлы (как на какой-нибудь накопитель). На аппаратном уровне это можно было бы реализовать подключив к МК модуль SD-карт. Однако это решение требует свободных портов (которых иногда может не быть). Поэтому SPIFFS является очень полезным в данном плане.
Для чего? На МК часто заливаются веб-странички, медиа-файлы и прочее. Если HTML-страницу в 20 строк ещё приемлемо хранить в коде, то что делать с большими сайтами? При каждом изменении менять в коде? А с изображениями как? Сериализовать (бывает и такое) и тоже вставлять в код? Вот в таких случаях и спасает файловая система.
Размер файловой системы (от 32 Кбайт до 15 Мбайт) зависит от самого объема flash-памяти и от конфигурации, выставленной в Инстурменты → Flash size. Например, конфигурация предназначена для МК с общим объёмом flash-памяти 4 Мбайт, 2 Мбайт из которых будут выделены под файловую систему.
SPIFFS не работает с папками — она содержит только список файлов. Соответственно, если загрузить в неё папку style, в которой будет файл header.css, то в файловую систему систему запишется файл с именем /style/header.css. Об этом стоит помнить, потому что длина файлового имени не должна превышать 31 символ (читается 32, но символ с кодом 0 отведён под завершение строки). В этот 31 символ, естественно, входят все слэши, точки перед расширением и само расширение. Поэтому придётся воздержаться от многоуровневых структур и длинных имён файлов/папок.
Для загрузки файлов в файловую систему МК потребуется инструмент ESP8266FS, который интегрируется в Arduino IDE. Инструкция по установке:
Энергонезависимая память EEPROM
Уже упоминалось, что сам чипсет не имеет энергонезависимой памяти, поэтому она имитируется через внешнюю flash-память. Из-за этого работа с ней немного отличается от стандартной. Перед считыванием или записью данных нужно инициализировать EEPROM, указав при этом выделяемую под неё память (от 4 до 4096 байт) функцией . Привычная функция записывает данные не на саму энергонезависимую память, а в оперативную. Чтобы внесённые данные записались в память, нужна функция (или же , чтобы заодно очистить данные из оперативной памяти). Метод возвращает байт из памяти по адресу.
Прошивка «по воздуху» OTA-Update
ESP8266 имеет возможность обновления прошивки по сети WiFi. Это удобно, если МК находится в труднодоступном месте. Кроме того, прошивки «по воздуху» чаще всего быстрее, чем по проводу.
Вам потребуется установленный Python.
Потом в скетч нужно добавить файл: . Инициализируем и настраиваем OTA следующими строками:
После этого достаточно в метод добавить строку: .
Прошиваем МК по проводу. В случае успешной загрузки в списке портов появится новый хост с именем «esp8266-xxxxxx», где esp8266 — указанное выше имя хоста, а xxxxxx — локальный IP-адрес МК. Выбираем его.
Теперь МК можно прошивать «по воздуху».
node.stripdebug()¶
Controls the amount of debug information kept during , and allows removal of debug information from already compiled Lua code.
Only recommended for advanced users, the NodeMCU defaults are fine for almost all use cases.
Parameters
-
- 1, don’t discard debug info
- 2, discard Local and Upvalue debug info
- 3, discard Local, Upvalue and line-number debug info
- a compiled function to be stripped per setfenv except 0 is not permitted.
If no arguments are given then the current default setting is returned. If function is omitted, this is the default setting for future compiles. The function argument uses the same rules as for .
Docker¶
The Docker NodeMCU build image is the easiest method to build NodeMCU related components locally on your preferred platform.
Offering:
- build NodeMCU firmware based on locally cloned sources and configuration
- cross-compile Lua files into LFS image locally
Detailed instructions available in the image’s README. As for available config options and study the comments in .
For LFS
- In edit the line and adjust the size to that needed. Note that this must be a multiple of 4Kb.
- Build as you would otherwise build with this image (i.e. see its README)
Note that this Docker image is not an official NodeMCU offering. It’s maintained by a NodeMCU team member as an individual, though.
Распиновка ESP8266 NodeMCU
С внешним миром ESP8266 NodeMCU соединяют всего 30 выводов. Ниже показана распиновка отладочной платы.
Рисунок 6 – Распиновка ESP8266 NodeMCU
Для простоты мы сгруппируем выводы с аналогичными функциями.
Выводы питания – на плате расположено четыре вывода питания, а именно: один вывод VIN и три вывода 3.3V. Если у вас есть стабилизированный источник напряжения 5 В, вывод VIN можно использовать для непосредственного питания ESP8266 и его периферии. Выводы 3.3V – это выходы встроенного стабилизатора напряжения. Эти выводы могут использоваться для подачи питания на внешние компоненты.
GND – это вывод земли отладочной платы ESP8266 NodeMCU.
Выводы I2C используются для подключения всех видов датчиков и периферийных устройств на шине I2C в вашем проекте. Поддерживаются и I2C Master, и I2C Slave. Работа интерфейса I2C может быть реализована программно, а тактовая частота составляет максимум 100 кГц. Следует отметить, что тактовая частота I2C должна быть выше самой низкой тактовой частоты из ведомых устройств.
Выводы GPIO На ESP8266 NodeMCU имеется 17 выводов GPIO, которые можно назначать программно на различные функции, такие как I2C, I2S, UART, PWM, дистанционное инфракрасное управление, светодиодный индикатор и кнопка. Каждый включенный вывод GPIO может быть настроен либо на внутреннюю подтяжку к земле или к шине питания, либо установлен на высокоимпедансное состояние. При конфигурировании на вход для генерирования прерываний процессора он может быть настроен на срабатывание либо по фронту, либо по спаду.
Вывод ADC подает сигнал на имеющийся в NodeMCU, встроенный 10-разрядный прецизионный аналого-цифровой преобразователь последовательного приближения (SAR ADC). С помощью этого АЦП могут быть реализованы две функции: проверка напряжения питания на выводе VDD3P3 и проверка входного напряжения на выводе TOUT (но не одновременно).
Выводы UART ESP8266 NodeMCU имеет 2 интерфейса UART, то есть UART0 и UART1, которые обеспечивают асинхронную связь (RS232 и RS485) и могут обмениваться данными со скоростью до 4,5 Мбит/с. Для связи можно использовать UART0 (выводы TXD0, RXD0, RST0 и CTS0), который поддерживает управление потоком. UART1 (вывод TXD1) поддерживает только сигнал передачи данных, поэтому он обычно используется для печати журнала событий.
Выводы SPI ESP8266 имеет два интерфейса SPI (SPI и HSPI), поддерживающих и ведомый (slave), и ведущий (master) режимы. Эти интерфейсы SPI также поддерживают следующие функции SPI:
- 4 режима синхронизации передачи SPI;
- до 80 МГц и тактовые частоты, полученные делением 80 МГц;
- до 64 байт FIFO.
Выводы SDIO ESP8266 имеет защищенный цифровой интерфейс ввода/вывода (SDIO, Secure Digital Input/Output Interface), который используется для прямого подключения карт SD. Поддерживаются 4-битный 25 МГц SDIO v1.1 и 4-битный 50 МГц SDIO v2.0.
Выводы PWM На плате имеется 4 канала широтно-импульсной модуляции (PWM). Выход ШИМ может быть реализован программно и использован для управления двигателями и светодиодами. Частотный диапазон ШИМ регулируется от 1000 мкс до 10000 мкс, то есть от 100 Гц до 1 кГц.
Выводы управления используются, как ни странно, для управления ESP8266. Эти выводы включают в себя вывод включения микросхемы EN, вывод сброса RST и вывод пробуждения WAKE.
- Вывод EN – микросхема ESP8266 включена, когда на вывод EN подается высокий логический уровень. При низком логическом уровне микросхема работает на минимальной мощности.
- Вывод RST используется для сброса микросхемы ESP8266.
- Вывод WAKE используется для вывода чипа из глубокого сна.
Постановка задачи
Я живу в частном доме под Минском, и собственный бассейн, пусть и простейший каркасный, является неотъемлемой частью того набора «бенефитов», который получают многие, живущие в загородном доме. В нашем нестабильном климате оказалось, что в бассейне купаться некомфортно, если он стоит на открытом воздухе: вода выхолаживается ночью, а ветренная погода днем не делает купание комфортным. В прошлом году я своими руками построил геодезический купол фуллера над бассейном, поставил горочку и повесил тарзанку – дети довольны.
В этом году я пошел еще дальше и решил организовать подогрев бассейна от газового котла,
который служит для отопления дома в зимний период и подогрева горячей воды в летний.
На лето «отопительный» контур котла с помощью вентилей переключается на подогрев
бассейна. Подогрев воды бассейна осуществляется с помощью титанового теплообменника, по первичному контуру которого проходит теплоноситель (горячая вода без примесей) из отопительного контура, а по вторичному – вода из бассейна, нагнетаемая насосом рециркуляции системы фильтрации. Поскольку бассейн я использую с хлоратором (много интересного по теме расписано на ForumHouse), в воде содержится немного соли и теплообменник нужен титановый. Нельзя просто так взять и пустить воду напрямую через котел – иначе все трубы разъест солью.
Проходя через теплообменник, теплоноситель, нагретый котлом, с температурой около 70-90 °C отдает тепло воде из бассейна, нагревая ее на пару градусов. Сам теплоноситель при этом остывает на пару десятков градусов, и возвращается в котел с тем, чтобы быть снова
подогретым. Соотношение остывания воды от котла с нагревом воды бассейна зависит от многих факторов: мощности теплообменника и скорости циркуляции воды в первичном и вторичных контурах.
Трубы, подведенные от бассейна к теплообменнику – обычные полиэтиленовые, те, которые
в настоящее время применяются для подвода холодной воды в частные дома. Дешевизна, способность выдержать приличное давление, отсутствие коррозии – вот основные достоинства таких труб. Для всех без исключения полиэтиленовых труб рабочая температура ограничена 40 градусами по шкале Цельсия. В принципе, для бассейна этого более чем достаточно.
Однако, существует высокая вероятность развития аварийной ситуации в случае, если насос
рециркуляции воды бассейна воды остановится по какой-либо причине, а котел будет продолжать греть теплообменник: в этом случае вода во вторичном контуре теплообменника достаточно быстро повысится до температуры первичного контура, а значит, примыкающие к теплообменнику участки полиэтиленовых труб расплавятся, а вода из бассейна затопит все пространство вокруг.
Необходимо предусмотреть возможность защиты перегрева теплообменника.
Arduino IDE
Для использования совместно с ESP8266 рекомендуется использовать Arduino IDE версии 1.6.5. Если у вас более ранняя версия, то можете попробовать и её или обновить IDE до версии 1.6.5.
- Как только у вас будет установлена подходящая версия Arduino IDE, запустите программу, перейдите в меню File (Файл) → Preferences (Настройки) и найдите в диалоговом окне поле ввода Additional Board Manager URLs (Дополнительные ссылки для Менеджера плат)
http://arduino.esp8266.com/stable/package_esp8266com_index.json
. Введите следующий URL точно, как он написан, и нажмите OK:
- Затем нажмите Tools (Инструменты) → Board Manager (Менеджер плат) и прокрутите список вниз, чтобы найти «esp8266 by ESP8266 Community«. Выберите эту запись и нажмите кнопку Install (Установка); загрузка и установка начнутся и будут продолжаться несколько минут. Пока дополнение устанавливается, взгляните на поддерживаемые платформы. В дополнение к базовому модулю ESP826 обеспечивается поддержка NodeMCU, Huzzah и SweetPea. К тому моменту, когда вы будете читать данную статью, этот список возможно расширится.
- Когда установка закончится, нажмите кнопку Close (Закрыть).
- Теперь нажмите Tools (Инструменты), перейдите в список плат и выберите «Generic ESP8266 Module«.
- Снова нажмите Tools (Инструменты) и убедитесь, что выбран Generic ESP8266 Module.
- Нажмите File (Файл), Examples (Примеры) и прокрутите список вниз, пока не дойдете до ESP8266WiFi, а затем выберите WiFiScan. После этого должно будет открыться новое окно IDE со кодом примера WiFiScan.
Снова подключите схему к компьютеру и убедитесь, что на ESP-01 горит красный светодиод. Нажмите Tools (Инструменты), Port (Порт) и выберите порт, к которому подключен ESP-01. Наконец, вы готовы запрограммировать ESP-01.
Нажмите и удерживайте кнопку Reset, а затем нажмите и удерживайте кнопку Flash. Отпустите кнопку Reset и, удерживая нажатой кнопку Flash, нажмите кнопку со стрелкой Загрузка в Arduino IDE. Скетч должен скомпилироваться и загрузиться примерно за минуту, и когда компилирование будет завершено, отпустите кнопку Flash. Скомпилированный код будет отправлен в ESP-01; когда отправка будет завершена, на ESP-01 замигает синий светодиод.
Чтобы посмотреть результаты всех этих нажатий и выбираний, нажмите Tools (Инструменты), Serial Monitor (Монитор порта) и установите скорость передачи в правом нижнем углу окна монитора порта на 115200. Если у вас более ранняя версия ESP-01 (возможно на синей печатной плате), скорость передачи данных, скорее всего, равна 9600.
ESP-01 должен сканировать Wi-Fi сети и сообщать о результатах в окне монитора порта, как показано на примере ниже.
Результаты сканирования Wi-Fi сетей модулем ESP-01
Среди сообщений вы должны увидеть свою собственную сеть и все остальные сети, которые сумел поймать ESP-01
Числа в скобках показывают уровень сигнала сети (обратите внимание, что эти числа отрицательные; следовательно, уровень сигнала -41 выше, чем -92)
node.dsleep()¶
Enters deep sleep mode, wakes up when timed out.
Theoretical maximum deep sleep duration can be found with . «Max deep sleep for ESP8266» claims the realistic maximum be around 3.5h.
Caution
This function can only be used in the condition that esp8266 PIN32(RST) and PIN8(XPD_DCDC aka GPIO16) are connected together. Using sleep(0) will set no wake up timer, connect a GPIO to pin RST, the chip will wake up by a falling-edge on pin RST.
Parameters
-
number (integer) or , sleep time in micro second. If , it will sleep forever. If , will not set sleep time.
-
number (integer) or . If , it will use last alive setting as default option.
- 0, init data byte 108 is valuable
- > 0, init data byte 108 is valueless
- 0, RF_CAL or not after deep-sleep wake up, depends on init data byte 108
- 1, RF_CAL after deep-sleep wake up, there will be large current
- 2, no RF_CAL after deep-sleep wake up, there will only be small current
- 4, disable RF after deep-sleep wake up, just like modem sleep, there will be the smallest current
- number (integer) or . If present and non-zero, the chip will enter Deep-sleep immediately and will not wait for the Wi-Fi core to be shutdown.