ESP8266 с чего начать или первый опыт

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

Почему я это решил написать? Всё просто: я убил 3 недели времени на то, чтобы разобраться с чего начинать и как это работает. Кроме того, попробую собрать небольшой каталог ссылок по работе с ESP8266. Надеюсь, что эта информация поможет сэкономить вам хоть толику времени.

image

Итак, приступим!

Я заказал себе 3 варианта плат на известном китайском сайте:

  1. ESP8266 WIFI Serial Wireless Dev Test Board на основе ESP-12 (далее «Жёлтая плата») ($3.12)
  2. ESP8266 ESP-07 вместе с Adapter Plate For ESP8266 (далее ESP-07) ($2.30)
  3. LoLin V3 NodeMcu Lua на основе ESP-12 (далее «Лолин») ($3.12)

Причины, по которым я взял такой зоопарк:

  1. У Жёлтой платы уже встроены светодиодики, которыми можно сразу поморгать, для питания можно использовать не сказочные 3,3В, которые надо еще как-то добыть, а 3 батарейки типа АА или подключив 4,5В (что я и сделал).
  2. ЛоЛин меня подкупила тем, что подключается с помощью микро юсб кабеля и ей не нужны никакие UART конвертеры — в ней сразу он встроен на основе китайского чипа CH340, для которого можно легко найти драйвера как на win7x64 и на win10x64 (мои случаи), и, опять же питание от обычного адаптера с USB выходом, а не мудреные 3,3В.
  3. Конкретно эту ESP-07 я брал под метеостанцию. Ртутно-аналоговый градусник выцвел, прибивать новый лениво, да и врёт он нагреваясь от стены дома прилично. Для начинающих рекомендую брать сразу Adapter Plate — удорожание всего на 20 центов, а удобств намного больше.

Для начала — проверка модулей.

Во всех инструкциях по запуску пишут, что если Вы подключили питание и появилась WiFi сеть «AI-THINKER xxxxxxx», значит устройство работает. С моими устройствами так и вышло — они все создали WiFi сеть, к которой можно было подключиться. Ура! Заработало! Обрадовался я, но рано.

Для начала решил экспериментировать с Жёлтой платой. У продавца с лучшим показателем цена-рейтинг в описании товара были только картинки. И ни слова описания. На русскоязычных ресурсах были упоминания это платы, но конкретики именно про неё не нашёл. У некоторых продавцов я видел такую инструкцию:

Инструкция к Жёлтой плате
1. Android phone installation IOT.APK, IOS client be released later
2. shorting cap connected to the power to enter the programming mode, enter the normal operating state removed
3. Replace the battery, mobile search network «AI-THINKER» router
4. join the router (the router module form) password is: ai-thinker
5. after the success can be added directly to the control module of the mobile phone.
6. Enter the home router «SSID» and «Password» in the «Configure Device», then click on the icon at the top of the router, wait a few moments after the jump to join the router, connect the phone router WiFi, again «discovered device» to achieve control in the LAN.

Мой вольный перевод:

1. На устройство с Wi-Fi работающим на ОС Андроид (не работает на версии 5.0 и старше!) установите IOT.APK, Клиент для IOS будет выпущен позже
2. На плате необходимо снять пермычку, активирующую режим прошивки.
3. Перезагрузите модуль (отключить и подключить питание) и через минуту ищите на андроид устройстве Wi-Fi сеть «AI-THINKER»
4. Подключитесь к этой сети с паролем «ai-thinker»
5. После этого запустите установленной приложение IOT и нажмите на лупу. Плата должна автоматически определиться. После этого перемещайте ползунки, щелкайте выключателями и наблюдайте светодиоды на плате.

Нестыковка была в том, что моя сеть «AI-THINKER хххххххх» не спрашивала пароль, а сразу телефон к ней подключался. И приложение в упор не «видело» ESP после подключения. RGB светодиод горел синим с установленной перемычкой или зеленым без неё.

image

Я догадывался, что, возможно, китайцы спаять — спаяли, а прошить забыли (или криво прошили). Поэтому решил шить сам. Для прошивки я использовал ESP8266 Flasher. И тут вылез второй сюрприз: ни одна программа плату не распознавала, на команды не отвечала, прошивка не заливалась. Подключал через Ардуино и через UART-конвертер — ничего. Две другие платы уже успел перепрошить и помигать светодиодом, а тут глухо. Пока не догадался прозвонить контакты.

На этой плате отдельно выведены три контакты для прошивки: TX, RX, GND. Так вот оказалось, что TX разведен на RX самой ESP-12, соответственно RX — на TX. Т.е. просто надо было поменять местами два провода: к отдельно вынесенным трём контактам подключаем UART-конвертер по схеме:

TX-TX
RX-RX
GND-GND
Или Ардуино:
TX-RX
RX-TX
GND-GND

После такого открытия модуль ожил, была найдена оригинальная прошивка для мигания светодиодами (AI-THINKER-IOT-2014-10-17 165528.bin) и прошита все тем же ESP8266 Flasher. Появился пароль на точку доступа, и приложение сразу увидело Жёлтую плату. Единственный нюанс: для перепрошивки надо установить перемычку, для всех остальных случаев снять. И не забывать перезагружать устройство после перепрошивки.

ESP8266 ESP-07 вместе с Adapter Plate


Инструкция подключения ESP-07 (ESP-12) через UART-конвертер:

image

  • Красный — питание 3,3в;
  • Черный — GND;
  • Желтый — на стороне ESP8266 — RX, на стороне USB-TTL — TX;
  • Зеленый — на стороне ESP8266 — TX, на стороне USB-TTL — RX;
  • Оранжевый — CH_PD (CHIP ENABLE) — должен быть всегда подтянут к питанию;
  • Синий — GPIO0 — подключен через выключатель к земле для включения режима перепрошивки модуля. Для обычного старта модуля GPIO0 можно оставить никуда не подключенным;
  • Серый — GPIO15 (MTDO, HSPICS) этот пин необходимо притянуть к земле;
  • Если подключаете к Ардуино, то RX-RX, а TX-TX.

С помощью паяльника были объединены ESP-07 и адаптер. Адаптер рекомендую поскольку он в дальнейшем облегчает соединение беспаечным методом с помощью макетной платы и проводов. В данном случае для питания я использовал понижающий DC-DC преобразователь из Китая. В наличии были датчики DS18B20, их и было решено подключать.

HomesSmart сразу ставить не хотелось и выбор пал на такой вот пример. Не буду перепечатывать схему и код — они практически такие же. Заработало не сразу, но с гуглом и бубном завелось и полетели данные на Народный мониторинг.

Загружал скрипт через ESplorer.

Было на Ардуино
image

Стало на ESP8266
image

Жду компактный модуль питания 220AC — 3,3DC чтобы оптимизировать количество проводов.

LoLin V3 NodeMcu (Лолин)


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

Далее предполагалось подключение и управление 2-хканальным реле и управлять двумя бра в спальне. Тут хочу остановиться на одном ньансе. У китайского варианта такого реле есть перемычка JD-VCC — VCC — GND. По умолчанию она установлена на контакты JD-VCC — VCC.

image

Так вот, пермычку никогда нельзя устанавливать на VCC — GND — устроите КЗ! Эти три контакта используются для дополнительного питания реле, в случаях, когда управляющее может быть недостаточным для срабатывания реле. Присутсвие перемычки обозначает, что питание идет от «управляющих» контактов.

Скрипт был использован такой:

Текст скрипта
#================= init.lua =================
-- вводим имя сети и пароль сюда
ssid,pass = "SSID","PASSWORD";

if (file.open('wificonf') == true)then
   ssid = string.gsub(file.readline(), "\n", "");
   pass = string.gsub(file.readline(), "\n", "");
   file.close();
end

wifi.setmode(wifi.STATION)
wifi.sta.config(ssid,pass)
wifi.sta.autoconnect(1);
print('IP:',wifi.sta.getip());
--print('MAC:',wifi.sta.getmac());

led1 = 3
led2 = 4
gpio.mode(led1, gpio.OUTPUT)
gpio.mode(led2, gpio.OUTPUT)
restart=0;

gpio.write(led1, gpio.HIGH);
gpio.write(led2, gpio.HIGH);


t=0
tmr.alarm(0,1000, 1, function() t=t+1 if t>999 then t=0 end end)

srv=net.createServer(net.TCP, 1000)
srv:listen(80,function(conn)
    conn:on("receive",function(client,request)
    -- парсинг для отслеживания нажатий кнопок _GET
            local buf = "";
        local _, _, method, path, vars = string.find(request, "([A-Z]+) (.+)?(.+) HTTP");
        if(method == nil)then
            _, _, method, path = string.find(request, "([A-Z]+) (.+) HTTP");
        end
        local _GET = {}
        if (vars ~= nil)then
            for k, v in string.gmatch(vars, "(%w+)=(%w+)&*") do
                _GET[k] = v
            end
        end
    -- это начало веб сайта
       -- в начале ставим <html><body>, в конце каждой строки знак \
   -- в конце последней строки не ставим знак \, а </body></html>
    conn:send('HTTP/1.1 200 OK\r\nConnection: keep-alive\r\nCache-Control: private, no-store\r\n\r\n\
   <!DOCTYPE HTML>\
<html>\
 <head>\
        <meta charset="UTF-8" />\
        <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> \
        <meta name="viewport" content="width=device-width, initial-scale=1.0"> \
        <title>My control</title>\
   </head><body>\
        <div class="container">\
            <section class="color-1">\
                <p>\
                    <a href=\"?pin=ON1\"><button class="btn btn-4 btn-4a">Back ON</button></a>\
                    <a href=\"?pin=ON2\"><button class="btn btn-4 btn-4a">Bra ON</button></a>\
                </p>\
                <p>\
                    <a href=\"?pin=OFF1\"><button class="btn btn-5 btn-5a">Back OFF</button></a>\
                    <a href=\"?pin=OFF2\"><button class="btn btn-5 btn-5a">Bra OFF</button></a>\
                </p>\
            </section>\
        </div>\
</body></html>')
    -- это конец
    -- теперь опрос нажатых кнопок
        local _on,_off = "",""
        if(_GET.pin == "ON1")then
              gpio.write(led1, gpio.LOW);
        elseif(_GET.pin == "OFF1")then
              gpio.write(led1, gpio.HIGH);
        elseif(_GET.pin == "ON2")then
              gpio.write(led2, gpio.LOW);
        elseif(_GET.pin == "OFF2")then
              gpio.write(led2, gpio.HIGH);
        end
        
  
              
    conn:on("sent",function(conn) conn:close() end)
    collectgarbage();

    
    end)
    
end)

#========================================


Я не смог повторно найти ссылку на первоисточник. Но схема проста: К Лолин подключаем на выходы D3 и D4 реле 1 и реле 2 (led1 = 3 led2 = 4). Дальше заходим на выданный нашим роутером IP адресс и видим страничку:

image

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

Очень надеюсь что эта информация пригодиться хотябы одному человеку. И не судите строго за первую статью.

Ссылки


Поделиться публикацией
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама
Комментарии 51
  • 0
    По поводу отдельного файла CSS — вы можете его залить во внутреннюю память Esp-шки, а затем считывать стандартным API в ответ на запрос к серверу.
    Правда я столкнулся с тем, что при достижении некоторого размера страницы (примерно в 10кб) сервер уходит в даун, модуль — в ребут. Или же еще, как вариант, показывает только часть страницы. С чем связано — не знаю, может кто подскажет (прошивка — не NodeMCU, среда — Arduino IDE)?
    • 0
      очевидно не хватает рамы под буфер вывода
      • 0
        Как с этим бороться? Разбивать страницы на меньшие — или есть еще какой-то вариант?
        • 0
          но зачем пытаться сделать из довольно маломощной железочки веб сервер отдающий мегабайты контента?
          я бы на вашем месте вообще сделал бы просто сервисы, которые дёргать get\post запросами
          например из мобильного приложения
          • 0
            У меня веб сервер на esp отлично переваривает 50-90 кб файлы, правда не под NodeMCU, а через Arduino IDE писал код, используя веб сервер из стандартной библиотеки.
            • 0
              Прошивка NodeMCU хороша только для совсем поиграться. Очень долго мучался, пытаясь получить более-менее стабильно работающий web-сервер, отдающий странички размером больше 1400 байт. В итоге перешёл на esp8266/Arduino — файлы в 80Кб отдаются нормально.
              • 0
                положить css на cdn сервис гугла или амазона и давать на него ссылку. нет сети — нет css, зато быстро и можно пихать мегабайтные css и js
                • 0
                  Плохое решение. Предположим, вы на esp подняли вебморду управления чем-либо, и эта страничка тянет скрипты-стили откуда-то — и теперь представьте, что у вас мобильник, с которого вы пытаетесь что-то конфигурить, а сеть ловит плохо.
                  • +1
                    Ну будет без css. Не критично.
                • 0
                  Можно подключить локальные стили через плагин к browser-у типа Stylish.
                  https://addons.mozilla.org/en-US/android/addon/stylish/?src=hp-dl-featured
                  https://addons.mozilla.org/en-US/firefox/addon/stylish/
            • +4
              Bra ON — Bra OFF

              (оффтопик) bra по-английски означает не совсем то, что вы думаете. Это означает «бюстгалтер».

              • +2
                а мне нравится. лифчик ОН. лифчик ОФФ. хотя я бы оставил только лифчик ОФФ :))
                • +1
                  вот так и начиналось изобретение
                  пульта для женщины
                  image
              • 0
                Спасибо за статью. Мне подарили такую штуковину, я всё не знал как к ней подойти, теперь настало время встряхнуть с неё пыль)
                • +3
                  Не забудьте попробовать в связке с Блинком, возможности сильно расширяются.
                  • +1
                    Вы знаете, в случае с реле Блинк мне не нравится тем, что нет интернета — нет сервиса. Да, им очень легко пользоваться, его интерфейс приятен глазу и в интернете масса инструкций, но я стремлюсь чтобы мой умный дом не зависел от интернета. Сейчас разбираюсь с openwrt (lighttpd c sqlite3 уже запустились) чтобы временно (пока не дойдет до выделения отдельного железа под сервер) разместить там небольшую базу для ведения логов (температуры, влажности) и панель управления тем же «Bra». Кстати, если кто-то ткнет носом в аналогичный материал, буду признателен.
                    • 0
                      Возьмите малинку или ее аналог. Хватит за глаза.
                      • +1
                        Есть локальный сервер. Его мона даже на малине поднять.
                        • 0
                          Увы, малины нету и не уверен что будет. Чую, что всё равно приду к отдельному серверу, на который всё и повесится. Так что пока тренируюсь на том что есть. Тем более, не так давно перепал вот такой интересный роутер: http://www.gl-inet.com/gl-inet6416/ — на нём и тренируюсь.
                          • 0
                            Интересно, про роутер. Оформите впечатления и опыт в виде поста!
                            Я тоже заглядываюсь с некоторых пор на GL-MT300A
                            • 0
                              Если что-то более-менее определенное с ним получится — обязательно поделюсь. А роутер и правда интересен. Плюс этой мой первый опыт работы с OpenWRT. Ранее не попадался подходящий испытуемый. А у этого даже GPIO выходы есть, который можно задействовать и UART уже присутсвует. В общем подходящая штучка для экспериментов.
                              • 0
                                открою секрет, uart и gpio есть у всех роутеров ))
                                • 0
                                  Можете попробавать Orange Pi, правда там прошивку допиливать надо, но зато всего 14 USD. Она на Али производителем продается.
                                  • 0
                                    Как вариант можно в дальнейшем попробовать ещё и LinkIt Smart 7688. А по поводу Gl-Inet тоже хотел бы увидеть статью.
                                    • 0
                                      Всё, намек понял, статья «с чего начать с Gl-Inet» будет :). Реверс-инженеринга не ждите, но как его перепрошивать (после пятнадцати-то раз) точно расскажу.
                          • 0
                            Что делать с такой поделкой, если пропадет интернет? Облака это конечно хорошо, но показывать температуру дома, храня данные где-то у черта на рогах, а не том же на домашнем малиновом сервере, который будет работать всегда…
                            • 0
                              Есть локальный сервер. Его мона даже на малине поднять. 2 строки https://github.com/blynkkk/blynk-server#getting-started
                          • 0
                            На этой плате отдельно выведены три контакты для прошивки: TX, RX, GND. Так вот оказалось, что TX разведен на RX самой ESP-12, соответственно RX — на TX.

                            Просидел целый день с этой платой, прежде чем догадался прозвонить пины и выходы — грешил на софт. Самое обидное, что есть платы такого же вида, но с правильным обозначением выводов, поэтому проблема не гуглилась толком.
                            • 0
                              Кстати, у вас все цвета в RGB диоде работают? У меня почему-то красного нет.
                              • 0
                                При прозвоне тоже не было красного, но когда подключился китайским приложением — «полное RGB» было
                              • +2
                                А я взял Sonoff и перепрошил в Blynk.
                                Итого: клацаю релюхой, мигаю светодиодом, вижу температуру и давление:

                                • +1
                                  Упс, влажность конечно, а не давление. Подключил что было под рукой — датчик DHT11
                                  • 0
                                    А можно ваш исходный код посмотреть для такой штуки?
                                    • +1
                                      Это мои первые опыты с ESP8266 и Blynk поэтому может быть все не так правильно. Виртуальные пины нужны для программы на андроиде.
                                      Светодиод пришлось инвертировать, потому что включением кнопки он выключался и наоборот.

                                      прошивка
                                      #define BLYNK_PRINT Serial
                                      #include <ESP8266WiFi.h>
                                      #include <BlynkSimpleEsp8266.h>
                                      
                                      #include <DHT.h>
                                      #include <DHT_U.h>
                                      #include <Adafruit_Sensor.h>
                                      
                                      #define DHTPIN 14  // 14 пин датчика температуры
                                      #define DHTTYPE DHT11
                                      
                                      DHT_Unified dht(DHTPIN, DHTTYPE);
                                      
                                      #define VPIN_TEMP V1
                                      #define VPIN_HUMIDITY V2
                                      #define VPIN_INVERTLED V3
                                      #define VPIN_UPTIME V5
                                      
                                      // You should get Auth Token in the Blynk App.
                                      // Go to the Project Settings (nut icon).
                                      char auth[] = "93c17d62c32647c9a8a5cab5c3c98783";
                                      
                                      void setup()
                                      {
                                        Serial.begin(9600);
                                        Blynk.begin(auth, "SSID", "password");// wifi ssid and password
                                        pinMode(13, OUTPUT);  // 13 пин светодиода
                                        digitalWrite(13, HIGH);
                                        Blynk.virtualWrite(VPIN_INVERTLED, 1);
                                        dht.begin();
                                      }
                                      
                                      BLYNK_READ(VPIN_TEMP)
                                      {
                                        // This command writes DHT11 Temperature to Virtual Pin (1)
                                        sensors_event_t event;
                                        dht.temperature().getEvent(&event);
                                        if (!isnan(event.temperature)) {
                                          Blynk.virtualWrite(VPIN_TEMP, event.temperature-1);
                                        }
                                      }
                                      
                                      BLYNK_READ(VPIN_HUMIDITY)
                                      {
                                        // This command writes DHT11 Temperature to Virtual Pin (1)
                                        sensors_event_t event;
                                        dht.humidity().getEvent(&event);
                                        if (!isnan(event.relative_humidity)) {
                                          Blynk.virtualWrite(VPIN_HUMIDITY, event.relative_humidity);
                                        }
                                      }
                                      
                                      BLYNK_READ(VPIN_UPTIME)
                                      {
                                        // This command writes ESP8266's uptime in seconds to Virtual Pin (5)
                                        Blynk.virtualWrite(VPIN_UPTIME, millis() / 1000);
                                      }
                                      
                                      BLYNK_WRITE(VPIN_INVERTLED)
                                      {
                                        if (param.asInt() == 0) 
                                        {
                                          digitalWrite(13, HIGH);
                                        } 
                                      else
                                        {
                                          digitalWrite(13, LOW);
                                        }
                                      }
                                      
                                      void loop()
                                      {
                                        Blynk.run();
                                      }
                                      

                                      • +1
                                        Кстати, у меня с реле так же было: Чтобы выключить — нужно пин «выставить» в HIGH

                                        if(_GET.pin == "ON1")then
                                                      gpio.write(led1, gpio.LOW);
                                                elseif(_GET.pin == "OFF1")then
                                                      gpio.write(led1, gpio.HIGH);
                                        
                                    • 0
                                      Звучит здорово! А перепрошивка осуществляется без больших плясок с бубном?
                                      • +1
                                        Вот статья как подпаять гребенку, подключить датчик, как шить.
                                        Blynk я прошиваю из arduino-среды по инструкции с офф.сайта.
                                        Я без проблем прошиваюсь через arduino uno, так как переходник USB to TTL никак не куплю.
                                    • 0
                                      Брал себе чуть более дорогую (US $4.00) платку
                                      Плюс в том, что можно добирать комплекующие и выстраивать «бутерброд». Вот магазинчик
                                      • 0
                                        Есть еще и такой вариант исполнения. В общем тут есть где разгуляться
                                        • +1
                                          У меня такой на руках. С ним неудобство в том, что при подключении к компьютеру гребёнка оказывается закрыта. Т.е. или датчики паять, или гребёнку заменить на нижней плате чтоб сквозная была. А так отличны модуль для помигать rgb-диодом, понажимать кнопочку и посветить фонариком из коробки.
                                      • 0
                                        Вопрос автору: Вы пробовали сделать сбор данных с датчиков на ESP8622 и последующе отправкой на собственный сайт (Joomla!) на стороннем хостинге(зная все айпи и имея средства отображения на самом сайте)?
                                        • 0
                                          Я только изучаю эту тему. Для начала хочется отправки на локальный сервер, то что на openwrt. Уверен, что если заработает локально, то и удаленно проблем не должно быть.
                                          • 0
                                            я делал отправку состояния на сервер
                                            • 0
                                              Я не автор но у меня ESP-12 показывает графики на олед экране, управляет вентилятором на 220 и отсылает данные на thingspeak.com
                                              А вот оттуда можно данные на сайт вставлять с помощю ифрейма.
                                              • 0
                                                опять же: нет интернета — нет контроля
                                              • +1
                                                У меня сейчас тестируется ESP8266 c BME280 (температура, влажность, давление) + BH1750 (освещённость) + ADS1115 (напряжение на аккумуляторах). Всё это питается от двух аккумуляторов типа АА, которые заряжаются с помощью солнечной панели на 3,5В, через повышающий DC-DC на MT3608. Данные отправляются на ThingSpeak, которые можно посмотреть по этой ссылке.
                                                • 0
                                                  ссылка что-то стёрлась: https://thingspeak.com/channels/53771#publicview
                                                  • 0
                                                    Солнечной панели хватает для зарядки акков на темное время суток? Устройство дружит с отрицательными температурами?
                                                    • 0
                                                      Хватает не только на тёмное время суток. Пробовал без солнечной панели — хватило почти на месяц работы (показания отправлялись каждые пять минут, два аккумулятора ENELOOP 1900 мА*ч включенных последовательно), т.е. запас получается очень хороший.
                                                      В солнечный день аккмуляторы очень хорошо заряжаются. Ещё уточню один момент — коробка сейчас стоит на окне и направлена на запад, т.е. солнце начинает засвечивать панель во второй половине дня.
                                                      С отрицательными температурами должно дружить, т.к. NiMH аккумуляторы нормально работают при отрицательной температуре.
                                                  • 0
                                                    Я делал, прекрасно работает. А в чем там может быть проблема?
                                                  • 0
                                                    С broadlink такую штуку можно подружить? Я имею ввиду их приложение.
                                                    Поскольку делать самому и окружение и hard-часть — слишком затратно по времени.

                                                    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.