Пользователь
1,2
рейтинг
17 июня 2015 в 02:14

Arduino + ESP8266 с нуля на примере Wi-Fi термометра, часть первая

Часть 1. Подготовка ESP8266

Зачем эта статья? На хабре уже есть ряд статей про использование ESP в разных конфигурациях, но почему-то без подробностей о том, как именно все подключается, прошивается и программируется. Типа «я взял ESP, две пальчиковые батарейки, DHT22, закинул в коробку, потряс часик и термометр готов!». В итоге, получается странно: те, кто уже работают с ESP не видят в сделанном ничего необычного, а те, кто хочет научиться — не понимают с чего начать. Поэтому, я решил написать подробную статью о том, как подключается и прошивается ESP, как его связать с Arduino и внешним миром и какие проблемы мне попадались на этом пути. Ссылки на Aliexpress привожу лишь для представления порядка цен и внешнего вида компонентов.

Итак, у меня было два микроконтроллера, семь разных сенсоров, пять источников питания, температурный датчик DHT22 и целое множество проводков всех сортов и расцветок, а так же бессчетное количество сопротивлений, конденсаторов и диодов. Не то, чтобы все это было необходимо для термометра, но если уж начал заниматься микроэлектроникой, то становится трудно остановиться.



Питание

Для работы ESP8266 нужно напряжение 3.3В и ток не ниже 300мА. К сожалению, Arduino Uno не в состоянии обеспечить такой ток, как не в состоянии обеспечить его и переходники USB-UART (программаторы) типа FT232RL — их предел около 50мА. А значит придется организовать отдельное питание. И лучше бы, чтобы Arduino тоже работал от 3.3В, чтобы избежать проблем типа «я подал пятивольтовый сигнал на вывод RX модуля ESP, почему пахнет паленой пластмассой?».

Есть три решения.

1. Купить готовый блок питания на 3.3В.

2. Купить готовый модуль с регулятором напряжения, понижающий 5В до 3.3В. Пожалуй, это самый удобный вариант.

3. Собрать модуль самому из регулятора AMS1117 и одного танталового конденсатора на 22мкФ.

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

С AMS1117 все просто: если положить его текстом вверх, то напряжение на ногах растет слева направо: 0(Gnd), 3.3В (Vout), 5В (Vin).
Между нулем и выходом нужен танталовый конденсатор на 22мкФ (так по инструкции, что будет если поставить электролитический — я не проверял). У танталового SMD-конденсатора плюс там, где полоска. Немного чудовищной пайки совершенно не предназначенных для такого варварства SMD-компонентов и:

image



Обязательно проверяйте выходное напряжение. Если оно значительно меньше 3.3В (например, 1.17В) — дайте регулятору остыть после пайки и проверьте контакты. Если поставите конденсатор больше, чем на 22мкФ, то мультиметр может показать более высокое напряжение.

Почему именно AMS1117? Он широко используется. Его вы можете найти почти везде, даже в Arduino Uno, как правило, стоит AMS1117-5.0.
Если вы знаете что-то схожих габаритов и цены, еще более простое в использовании — напишите, пожалуйста.

Важный момент. Не знаю уж почему, но AMS1117 крайне капризно относится к качеству соединений. Контакты должны быть надежны. Лучше — пропаяны. Иначе он на тестах выдает 3.3В, но под нагрузкой не выдает ничего.

Подключение ESP8266

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

Чтобы чип запустился нужно соединить VCC и CH_P через резистор 10кОм. Если такого нет, то сгодится любой из диапазона 1-20кОм. Кроме того, конкретно модель 07 еще требует, чтобы GPIO15 (самый ближний к GND) был «на земле» (этого на картинке не видно, потому что соединение с другой стороны).



Теперь берем переходник USB-UART, переключаем его на 3.3В и подключаем RX к TX, TX к RX и GND к «земле» (у меня без этого передача нестабильна). Если вы не можете переключить на 3.3В, то можно использовать простейший резисторный делитель напряжения: соедините ESP RX с TX переходника через сопротивление в 1кОм, а ESP RX с «землей» через 2кОм. Существует масса более сложных и более надежных способов связать 3.3В и 5В, но в данном случае и так сойдет.



И соединяемся на скорости 9600 по нужному COM-порту (можно посмотреть в диспетчере устройств).


Я использую SecureCRT, Putty тоже подойдет, а ценители Линукса и так знают, что делать и где смотреть.


(AT+RST перезагружает чип)

Если ничего не происходит — выключите — включите питание, если все равно ничего не происходит — проверьте соответствие TX/RX, попробуйте переставить их местами или припаять к чипу.

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

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

Иногда при этом меняется номер COM-порта. Под Linux это можно решить с помощью udev.

Если вместо текста приходит мусор, то проверьте настройки скорости. Некоторые старые чипы работают на 115200.

На старте чип нагревается, но если он реально горячий и продолжает греться — отключайте и проверяйте все соединения. Чтобы на корпус не попадало +3.3В, чтобы 5В к нему вообще никуда не приходили, чтобы «земля» переходника была соединена с «землей» чипа. Модели с металлическим экраном очень трудно сжечь (но нет ничего невозможного), а на модели без экранов жалуются, мол даже небольшая ошибка может стать последней в жизни чипа. Но это я не проверял.

Прошивка

Мой выбор — NodeMCU. У нее проблемы с памятью и поддержкой железа, но это многократно окупается простотой кода и легкостью отладки.

Так же потребуются NodeMCU flasher и LuaLoader (последнее — опционально, есть и другие клиенты для работы с этой прошивкой).


Выключаем чип. Подсоединяем GPIO0 к земле и включаем чип:



Если ничего не происходит и поля AP MAC/STA MAC пустые — проверьте еще раз, чтобы GPIO0 был на «земле».
Если прошивка началась, но зависла — посмотрите в закладке Log, у меня почему-то конкретно этот чип отказался прошиваться на FT232RL, но зато без проблем прошился на PL2303HX на скорости 576000. PL2303HX в указанном варианте не имеет переключения на 3.3В, чтобы им воспользоваться нужно открыть пластиковый корпус и перепаять провод с 5V на 3.3V, есть варианты с пятью выходами: 3.3, 5, TX, RX, Gnd.


Обратите внимание: STA MAC поменялся. Подозреваю, что flasher его неправильно показывал, но требуется проверка.

Для экономии сил и нервов можно взять готовый или полуготовый вариант.

Есть одноразовые адаптеры с удобной разводкой.
Есть готовые к прошивке.
Есть варианты с простенькие кит-комплекты и посложнее — ESP8266-EVB
Есть с готовым USB-адаптером — NodeMCU Development Board. Под нее даже какие-то шилды делают.

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

Ценные ссылки из комментариев:
NodeMCU custom builds
Programming ESP8266-EVB with Arduino IDE
Объяснение про танталовый конденсатор.

Update: заменил в тексте «программатор» на «переходник USB-UART» или просто «переходник». По моему опыту термин «программатор» используется чаще, но, пожалуй, «переходник USB-UART» будет точнее.
Стоит ли что-то изменить?
81%
(124)
Больше текста и картинок
27%
(41)
Видео процесса
23%
(35)
Больше ссылок
13%
(20)
Лаконичнее бы

Проголосовало 154 человека. Воздержалось 79 человек.

Нужны ли ссылки на компоненты в магазинах?
67%
(145)
Да, это наглядно
4%
(9)
Стоит заменить их ссылками на скриншоты
22%
(49)
Не нужны, но не мешают
7%
(15)
Не нужны

Проголосовало 218 человек. Воздержалось 49 человек.

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

@Hellsy22
карма
5,0
рейтинг 1,2
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое

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

  • +5
    1) Рекомендую самостоятельно компилировать nodemcu firmware. Плюшки: можно выбрать только те модули, которые нужны, сэкономив хоть и крохи, но нужной оперативки, и еще — в последней версии прошивки параметр LUAL_BUFFERSIZE завышен, что приводит к нехватке памяти при работе функций модуля string (я уменьшил его в 2 раза);
    2) Модули брать лучше в формфакторе ESP-12-E (наибольшее количество выводов и что-то там еще оптимизировано в радиотракте);
    3) Смысл связывать его с arduino только в одном — используя его в качестве watchdog, в общем и целом nano с 2КБ RAM и рядом не валялась. Я вообще использую ESP8266 как универсальный коммуникационный модуль, который через http работает с api сайта. Единственное, что мне не внушает доверия — модуль использует какие-то зашитые адреса dns -серверов, скорее всего, китайские, поэтому будьте осторожны.
    4) Для разработки рекомендую хотя бы один devkit приобрести — проще будет отладить устройство.
    • +2
      Для компиляции прошивки добрые люди запилили frightanic.com/nodemcu-custom-build.
    • +1
      Я присматривался к 12-E, насторожило, что у него PCB-антенна и нет гнезда под внешнюю антенну. Как у него вообще с качеством связи?

      Arduino выступает в роли исполнительного модуля. На него цепляется самое разное железо. Например, если нужно считать показания с трех датчиков (температура-влажность, давление, уровень CO2) и вывести результаты на двухстрочный LCD-экран, то как сделать это одним ESP?

      Насчет DNS.
      tcpdump ничего такого не показал
      18:36:55.097770 IP 192.168.10.36.4096 > 192.168.10.1.53: 0+ A? esp. (21)
      18:36:55.097770 IP 192.168.10.36.4096 > 192.168.10.1.53: 0+ A? esp. (21)
      18:36:55.097855 IP 192.168.10.1.53 > 192.168.10.36.4096: 0* 1/0/0 A 192.168.10.1 (37)
      18:36:55.097862 IP 192.168.10.1.53 > 192.168.10.36.4096: 0* 1/0/0 A 192.168.10.1 (37)

      18:41:56.111751 IP 192.168.10.36.4096 > 192.168.10.1.53: 1+ A? api.pushingbox.com. (36)
      18:41:56.111751 IP 192.168.10.36.4096 > 192.168.10.1.53: 1+ A? api.pushingbox.com. (36)
      18:41:56.111845 IP 192.168.10.1.53 > 192.168.10.36.4096: 1 1/0/0 A 213.186.33.19 (52)
      18:41:56.111853 IP 192.168.10.1.53 > 192.168.10.36.4096: 1 1/0/0 A 213.186.33.19 (52)

      Оба запроса пришли на мой DNS-сервер (192.168.10.1) и он же ответил на них.
      Интересно, почему отправляется сразу по два запроса?


      Единственный непонятный мне запрос, это вот этот:

      18:36:54.966762 IP 192.168.10.36 > 224.0.0.1: igmp v2 report 224.0.0.1
      • 0
        www.youtube.com/watch?v=JGb5xMTIoNc ESP-01, а если взять например 07, пинов хватит всем. :) Но в теме заявлен Wi-Fi термометр, мне например показалось, что будет измеряться только лишь температура, поэтому и недопонимание.
        Я тоже столкнулся с отсутствием аналогового входа, а датчик как раз таки аналоговый. Буду брать Arduino Pro Mini для этих целей.
      • 0
        Может эта про экран ссылка вам поможет и эта про датчик газа. ESP8266 под Arduino IDE очень хорошо и быстро с теми же самыми сектчами. Отличия только в номерах GPIO.
        • 0
          По отдельности их подключить можно, а как насчет всех вместе одновременно? Ну, знаете, такая вот погодная станция, с DHT22, датчиком давления, газовым датчиком MG811. Результаты — на дисплей и на сервер для хранения. И пара тройка кнопок на корпусе. А в перспективе желательно еще туда же поставить DS3231 на случай долгой работы без интернета и карту флеш-памяти, чтобы сохранять результаты. Arduino позволяет легко масштабировать проекты не упираясь в необходимость экономить каждый байт памяти и каждый пин. И меня удивляет, почему вы, как поборник дорогих и громоздких комплексных решений не видите очевидных плюсов такой интеграции.
          • 0
            Я всегда говорю используйте ESP8266 и Arduino IDE если нужно совсем за $5. Остальное вы заплатите вашим временем в данном случае. Если вы кому то продадите сделаете такую систему и без инсталятора то нужно ещё будет потратить время на установку и настройку. За гарантию качества, вы так же своим временем и бензином (для выезда на объект) будете должны.

            Вот поэтому лучше заплатить $35 за комплексное решение, чем $5 + $100 (бензин и 4 часа работы).
            • 0
              Так в том-то и вопрос — почему бы не заплатить $40 за комплексное решение со связкой ESP+Arduino, у которого возможностей на порядок больше, если вы уж все равно платите $35?
              • 0
                У Arduino есть АЦП приличный у ESP АЦП урезанный. ESP покупают только вместе с готовой прошивкой, а Arduino от Olimex я не продаю, этим занимаются другие магазины.

                Когда мне нужно на два порядка больше возможностей я плачу примерно столько же сколько вы за Arduino и использую A20-OLinuXino-LIME за 26.40 EUR (У меня скидки). И это лучше чем Arduino. Так же RT5350F-OLinuXino-EVB за 19.20 EUR. И скоро эта модель будет с корпусом на DIN рейку за 35 Евро, включая IO на 2 реле.
                • 0
                  Я использую китайские клоны Ардуино (Nano Pro Mini) — странно было бы не использовать их, если используется китайский же ESP, они стоят по 1.7$ за штуку (а 168 и вовсе по 1.4$). Я все равно вас решительно не понимаю. Есть возмоджность радикально увеличить возможности ESP, практически не увеличив цену платы и ее габариты. Так почему бы и нет? Это же удобное решение, да еще и с потенциальной масштабируемостью (можно добавить 2, 3, да хоть 5 Ардуино).
                  • 0
                    Ну не тянет меня на это и тем более это. PIC и AVR я начал использовать в 2003 году. Мне не интересны устаревшие, на мой взгляд, технологии. Моя специализация VLSI CAD. Поэтому могу и сам спроектировать и запустить нечто похожее :-)
                • 0
                  Это моя ошибка цена на OLinuXino-LIME сотавляет более 33 EURO. Не каких скидок не предусмотрено.
            • 0
              Актуальные цены на продукцию Olimex лучше смотреть на сайте:
              https://www.olimex.com/Products/OLinuXino/RT5350F/RT5350F-OLinuXino-EVB/open-source-hardware

              Для RT5350F-OLinuXino-EVB это 24.00 EUR, Если же покупаешь более 50 штук то цена 19.20 EUR.

              Аналогично для OLinuXino-LIME цену лучше смотреть на сайте:

              https://www.olimex.com/Products/OLinuXino/A20/A20-OLinuXino-LIME/open-source-hardware

              Сейчас она составляет 33.00 EUR

      • 0
        Варианты есть, пусть и не в Вашей конфигурации. Гляньте хотя бы это. Весьма впечатляет. Что касается DNS, каюсь, поленился проверить. Непонятный вам запрос имеет отношение к igmp протоколу и в данном контексте никакой смысловой нагрузки не несет.
  • +1
    Очень даже есть смысл связывать его с ардуиной, у меня esp8266 стоит на меге в качестве TCP<->UART гейта для удаленного управления мегой с телефона/компа. Тоже под nodemcu, кстати. А мега управляет уже значительно более сложным устройством.

    • 0
      Как вы связали Arduino+ESP? Как бегают данные.
      • 0
        Покажу скрипт на lua, простой и надежный:
        wifi.setmode(wifi.STATION)
        wifi.sta.config("ssid","key")
        wifi.sta.autoconnect(1)   -- восстанавливаем соединение со станцией при потере связи
        
        uart.setup(0,9600,8,0,1,0) -- коннектимся к ардуине
        sv=net.createServer(net.TCP, 60) -- создаем сервер
        global_c = nil
        sv:listen(8266, function(c)      -- и слушаем на порту 8266 :)
             if global_c~=nil then       -- много клиентов мне не надо - я управляю либо с телефона, либо с компа
                  global_c:close()
             end
             global_c=c
             c:on("receive",function(sck,pl)    uart.write(0,pl) end)     -- что пришло по TCP валим в UART
        end)
        
        uart.on("data",4, function(data)    -- Что ответила ардуина - шлем по TCP
             if global_c~=nil then
                  global_c:send(data)
             end
        end,0 )
        
        

        При этом прошивку для ардуины я отлаживал через обычный серийный порт, и только в релизе с 8266 на борту меняю Serial на HardwareSerial. Всё.
        • 0
          Отлично, спасибо! Я тоже подумываю связать ATiny85+ESP, думал о I2C, 1-Wire, и догадывался, что Serial как самое быстрое решение — однозначно хорошо.
      • 0
        Об этом подробно будет вторая часть статьи. Но если кратко, то можно как просто связать TX-RX и тогда все работает отлично даже на скорости в 115200, так и через SoftwareSerial, но тогда придется снизить скорость до 9600.

        Само общение идет как-то так:

        uart.write(0,"ARD:gettemp\n"); -- так отправляется запрос
        
        uart.on("data", "\n",
            function(data)
                -- тут разбираются ответы
                _,_,humidity,temp = data:find("OK: ([%d.]+),([%d.]+)");
            end, 0);
        


        "\n" означает, что функция будет вызвана как только встретится символ "\n", можно вместо этого указать, например, минимальное количество.
        • 0
          Я бы рекомендовал использовать для обмена данными json, поскольку функции разбора уже есть в модуле cjson nodemcu api.
          • 0
            А как у него с обработкой ошибок? Если придут некорректные данные — он вернет nil или отправит MCU в перезагрузку?
        • 0
          Как насчет подписи данных, например хеш, который генерируется у отправителя и пересчитывается у получателя? Есть что ни будь стандартное для проверки целостности данных?
          • 0
            Сам отвечу на свой вопрос: нашел пример и библиотеку для отправки-приема данных по Serial с проверкой целостности.
  • +5
    Статья полезная. Однако если она позиционируется для начинающих — то лучше не использовать жаргон или вообще малопонятные выражения. Не поймет Вас начинающий.

    например:

    выбрал модель 07, поскольку у нее отличный металлический щит

    Экран это, а не щит!

    Если ничего не происходит — мигните питанием

    выключите — включите питание.

    Иногда фокусы с программатором вешают USB-порт. Лекарство очевидно — вытащить и вставить в другой.

    Это перегрузка порта и отключение его по питанию. Разумно перезагрузить комп.

    подключаем RX к TX, TX к RX и GND к «земле» (у меня без этого передача нестабильна).

    Надежное соединение общих выводов — азы электроники!

    • 0
      Внес изменения. Насчет общих выводов — скажите, а +3.3В тоже стоит объединять?
      • 0
        если Вы спрашиваете «надо ли объединить выводы +3.3 двух источников» — то очевидно нет. Это будет коротким замыканием для источника с большим внутренним сопротивлением. Да и второму будет нехорошо.

        Если вопрос про общие выводы — то конечно да.
        • 0
          Да, в этом и был вопрос. Я примерно так и понял, но решил уточнить. Спасибо.
  • +5
    для начинающих можно было бы пояснять зачем вообще нужен ESP8266
  • НЛО прилетело и опубликовало эту надпись здесь
  • 0
    К сожалению, Arduino Uno не в состоянии обеспечить такой ток

    Я использую ESP-01, питание от Ардуины просто идеально вписывается, хватает. Если подключать через какой ни будь USB-TTL (UART), то вот там питания как раз не хватает.

    На форуме esp8266.ru советуют отказаться от использования NodeMCU в сторону github.com/esp8266/Arduino Arduino IDE (C++). Лично я, после того как перешел от NodeMCU к C++, заметил, что выросла стабильность работы и я перестал морочить голову с хипом.

    И мне не ясно использование Ардуино, потому что для отправки данных будет достаточно ESP+датчик.
  • 0
    Вот ещё несколько подробных инструкций по изготовлению прошивки ESP8266-EVB.
  • 0
    У меня ESP-01 работал от PL2303 и от FT232RL, но отказывался работать от Arduino Nano. Использование Arduino c ESP8266 на мой взгляд, тривиально — TX-RX Arduino цепляем к ESP и работаем через Serial, все равно с какой прошивкой, Nodemcu или AT. Бонусом получаем возможность закоротив RST Arduino на землю, получить USB-UART переходник прямо на ESP.
    • НЛО прилетело и опубликовало эту надпись здесь
      • 0
        TX-RX Ардуины вы сможете прицепить только в конечном варианте, а в варианте дебага, они будут подключены к компьютеру, с которого вы будете заливать прошивку и читать диагностические сообщения.

        Собственно говоря, не понял, в чем тут проблема. Именно такую схему и использовал. Ничего не мешает подцепить еще один UART адаптер параллельно и ловить обмен между ESP и Arduino. Там же и дебаг.
        А кроме всего прочего, придется отвечать на сообщения в последовательный порт. А этого вы сделать не сможете, пока порт прослушивается, иначе прослушивание прервется. Придется городить костыли.

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

        В моем варианте обмен инициируется Arduino и нет необходимости слушать порт постоянно. Я обмен гоняю банальным json -вот и старт со стопом, и данные. В AT-варианте вообще не использую.
        К Ардуине подключены датчик движения и серва. Ардуина передает данные с датчика движения на центральный сервер через ESP. Центральный сервер решает, двигать или нет, и передает через минутку ответ обратно Ардуине через ESP

        На мой взгляд, Вы все чересчур усложняете. У меня скрипт обмена данными с сервером, включая аутентификацию по токенам, занял 2 кб lua кода. Но ESP ничего не решает, просто передает данные и парсит ответ. arduino в этом варианте вообще не интересуется, кто данные отдает.
        • НЛО прилетело и опубликовало эту надпись здесь
      • 0
        ESP8266 в прошивке AT периодически теряет точку доступа. И не умеет к ней переподключаться, единственный способ это сделать — RESET. Поэтому варианта тут два — ставить NodeMCU или вводить доп.хардверный костыль на Ардуине.

        Можно поинтересоваться, у вас только 2 варианта — использовать NodeMCU или хардварный ресет на ардруине. Не пробывали использовать Arduino IDE и C++? (и проблемы с нехваткой хипа решает)

        void loop() {
          // при потере подключения - пытаемся переподключиться
          while (WiFi.status() != WL_CONNECTED) {
              connectWiFi();
          }
          if (WiFi.status() == WL_CONNECTED && ! mqttClient.connected()) {
            if (mqttClient.connect(mqttId)) {
              Serial.println("MQTT connected.");
            } else {
              Serial.println("MQTT connect fail.");
            }
            delay(500);
          }
          if (mqttClient.connected() && lastTime+10000 < millis()) {
            mqttClient.publish("chart/chart1", "rand1=" + String(random(200,300)) + "&rand2=" + String(random(100, 200)));
            Serial.println("MQTT published.");
            lastTime = millis();
          }
        }
        

        И если вы твердо уверены, что NodeMCU лучше, хотелось бы узнать почему?
        • 0
          ESP8266 в любом варианте достаточно кривой, а закрытое sdk со множеством проблем не делают его лучше. Вариант с lua позволяет быстрее написать и отладить устройство, плюс есть неплохая документация по api. В то же время я считаю, что наилучший вариант работы с esp разработка собственной узко заточенной под конкретную задачу прошивки на базе esp sdk. Для себя рассматриваю промежуточный вариант — выделение критических участков кода на lua и перенос их в прошивку.
          P.S. Не пишите, пожалуйста, «пробЫвали». Правильно — " пробовали".
        • НЛО прилетело и опубликовало эту надпись здесь
        • НЛО прилетело и опубликовало эту надпись здесь
          • 0
            Что ж, я сам за стабильность. Личный опыт с NodeMCU показал, что работает это все менее стабильно, чем на C++.

            На Lua весь функционал вписывается в 20 строк, и это весьма удобно.

            Это весьма удобно, но и сказывается на размере прошивки, а так же потребляемой памяти. Ведь это дополнительная абстракция над кодом на Си.

            Я не спорю, код на Lua писать удобно, но и течет такой код по памяти лучше.
            И между удобством и просто чтобы стабильней работало — я выбрал стабильную работу.

            Добавим к этому код «сетевой карты к Ардуине», ну чтобы Ардуина общалась с сервером — это сколько еще строк?


            Приведу полный скетч
            #include <ESP8266WiFi.h>
            #include <WiFiServer.h>
            #include <MQTT.h>
            #include <PubSubClient.h>
            
            #define WIFI_SSID "test_ap" 
            #define WIFI_PWD "12345678"
            
            IPAddress mqttIp(192, 168, 0, 220);
            PubSubClient mqttClient(mqttIp);
            String mqttId = "token";
            long int lastTime = 0;
            
            void setup() {
              Serial.begin(115200);
              Serial.println("Started.");
              
              WiFi.mode(WIFI_STA);
              WiFi.begin(WIFI_SSID, WIFI_PWD);
            }
            
            void loop() {
              while (WiFi.status() != WL_CONNECTED) {
                  connectWiFi();
              }
              if (WiFi.status() == WL_CONNECTED && ! mqttClient.connected()) {
                if (mqttClient.connect(mqttId)) {
                  Serial.println("MQTT connected.");
                } else {
                  Serial.println("MQTT connect fail.");
                }
                delay(500);
              }
              if (mqttClient.connected() && lastTime+10000 < millis()) {
                mqttClient.publish("chart/chart1", "rand1=" + String(random(200,300)) + "&rand2=" + String(random(100, 200)));
                Serial.println("MQTT published.");
                lastTime = millis();
              }
            }
            
            void connectWiFi(void) {
                Serial.print("Connect to Wi-Fi");
                int retries = 0;
                while (WiFi.status() != WL_CONNECTED) {
                    retries++;
                    Serial.print(".");
                    delay(500);
                }
                Serial.println("");
                Serial.println("Wi-Fi connected.");
                Serial.print("IP: ");
                Serial.println(WiFi.localIP());
            }
            



            Код библиотек, вроде MQTT, пока их не подключишь в МК присутствовать не будет.
            • НЛО прилетело и опубликовало эту надпись здесь
              • 0
                Пример простого вебсервера hello-world на С++ для Arduino IDE github.com/sandeepmistry/esp8266-Arduino/blob/master/esp8266com/esp8266/libraries/ESP8266WebServer/examples/HelloServer/HelloServer.ino

                Померяйте хип в loop ESP.getFreeHeap(). В handleNotFound() иллюстрируется работа с GET данными.
              • 0
                И еще есть такая штука, как github.com/marcoschwartz/aREST (возможно не слышали), работаем с пинами ESP по REST, может как то решает вашу задачу. Но если честно, не совсем понял ваш вопрос.
                Если вы дерните ESP за URL, то вам нужно сгенерировать какие то данные в Serial порт к которому подключена Ардуина. Если так, то это сделать не составит труда. И задача не сильно сложная, поэтому свободного хипа, я уверен, хватит. Здесь github.com/jmas/ESP8266Device/blob/master/ESP8266Device.h я делал библиотеку для начальной настройки ESP (установка названия AP и пароля через веб-интерфейс). И работает все весьма неплохо. Я думаю, ваша задача должно быть проще.
                • НЛО прилетело и опубликовало эту надпись здесь
                  • 0
                    Почему глюк? Вы же сами захватили коммуникацию по uart и не вернули ее на место.

                    Чтобы не доводить дело до перепрошивки, можно делать это не сразу, а по команде с сервера. Или через выполнение другого файла с задержкой в секунду (успеете стереть). В моем случае ESP при включении качает с сервера файл с lua и запускает его, что позволяет, к примеру, одним копированием перевести его в telnet-сервер, чтобы посмотреть что там и как.
                  • 0
                    Буду ковырять сегодня связь по Serial, может потом чем то полезным помогу в виде кода на C++, пока нем могу ничего конкретного сказать по поводу такого «глюка» в NodeMCU.
            • 0
              Собственно говоря, и прошивку nodemcu можно выборочно собрать. А сколько времени и кода у Вас займет обновление той же прошивки через WiFi? На Lua можно реализовать весьма быстро, подняв веб-сервер. lua нестабильно работает из-за нехватки памяти, но и с этим можно бороться.
              • 0
                Да, если ты берешь Arduino IDE и C++ ты делаешь «статическую» прошивку, «баги» которой в конечном устройстве править будет почти не возможно по Wi-Fi. NodeMCU в этом плане действительно «вещь»: возможность обновлять скрипты по сети это круто.
                Бороться с нехваткой памяти мне было сложно, возможность посмотреть общее число свободного места в хипе это хорошо, но если у меня будет «течь» переменная в определенном месте (принимая данные извне) это заставит устройство регулярно перегружаться. А отследить узкое место, в целом, сложновато. Не говорю, что это не реально, но таких «граблей» можно расставить очень много (благо lua нас в этом поощряет), а вменяемых средств дебага не нашел.
  • –1
    Я против ссылок на компоненты в магазинах. Это уже будет рекламой магазина. К тому же в статье (как это обычно почему-то и бывает) плату называют Arduino Uno R3, в то время как плата совсем другого производителя, подозреваю, что китай. Вот как выглядят оригинальные платы: www.arduino.cc/en/Main/ArduinoBoardUno. Т.е. мы получаем мало того, что рекламу, так ещё и предоставляющую недостоверную информацию (что, вообще говоря, карается). Учитывая, что в поисковике эти компоненты ищутся на раз (первые ссылки), опросник вообще выглядит подозрительно.

    В крайнем случае — давать ссылки на [b]несколько[/b] магазинов, и уж во всяком случае давать достоверную информацию.
    • НЛО прилетело и опубликовало эту надпись здесь
      • 0
        <ошибся веткой>
    • +3
      а как по мне так линки удобны — сразу ткнул, посмотрел описание. не устраивает цена или продавец — поискал еще.
      все лучше, чем ковыряться в гугле чтобы только взглянуть на внешний вид и описание.
      никто же не заставляет вас покупать именно у этого продавца, это просто как пример.
    • 0
      Все верно, это китайская UNO R3 MEGA328P, стоимостью около 3$. Насчет поиска — тут все не так просто. Например, по запросу «блок питания 3.3В» первой ссылкой идет Чип и Дип, с блоком питания за полторы тысячи рублей. А на Ali поиск затруднен тем, что релеватность невысока и по тому же запросу про «power supply 3.3» вылезает все подряд, включая источники тока с плавающим напряжением в 3-12В.
      • 0
        Ну так зато по запросу «AMS1117-3.3 купить» вылезает что надо. Это как с брендами в художественных фильмах: вроде бы случайно ноут оказался у съёмочной группы фирмы Гнусмас, но по факту получается рекламой. Поэтому пользуются всяческими ухищрениями. Если вы действительно преследуете исключительно образовательные цели, то можно хотя бы выбирать наименьшее из зол: например давать список магазинов, а не только один. Решайте сами, конечно, я исключительно свою субъективно-эгоистическую точку зрения высказал; не хочется мне видеть на Хабре неприкрытую рекламу.
        • +1
          Ссылки не содержат промо-кода, так что мне нет никакой прямой выгоды от их размещения. Закупаюсь я в основном, на Ali, поскольку в российских магазинах часто какая-то негуманная наценка, причем на тот же самый товар. В тексте есть по одной ссылке на Tindie, и Olimex.

          Если вы знаете какие-то хорошие магазины, которые можете порекомендовать — напишите, пожалуйста, список. Я посмотрю и добавлю апдейтом.

          • 0
            Наценка в наших магазинах как правило, ИМХО, нормальная. Я работал в одном из них раньше, знаю кухню из нутри. Оригинальный товар стоит изначально дорого + наценка 40%-70% в DIY электронике в России — нормальное дело, т.к. больших оборотов пока ни у кого нет (отрасль ещё не развита).

            Т.к. работал раньше в одном из магазинов, ссылки давать воздержусь :) Скажу только, что если надо дешёво, то действительно лучше в китае заказывать. Если надо с гарантией или быстро, или не хочется разбираться с заказом из-за бугра, то придётся мириться с «негуманными» российскими ценами. Работа — есть работа, даже если это работа ритейлера. По опыту большинство всё же выбирает второй вариант.
            • +1
              В силу необходимости пришлось немного заняться закупкой ардуино-железок. В «наших» магазинах цена НА ВСЁ получается раз в 2-5 больше, чем на аналогичное по смыслу на Али или Ебэй. И когда речь идёт о «купить набор за 15к у нас или такой же, но рассыпухой в Китае за 3-4к», угадайте, что выберет вменяемый человек, тратящий свои деньги? Да, есть некоторые проблемы с качеством и скоростью доставки, но разница в цене перекрывает это. Вот мне сейчас надо будет для досугового центра (который мы пытаемся организовать) закупить железок на 20 наборов (в каждом наборе 40+ наименований деталек). На Али мне это обойдётся примерно в 90-130к, у «наших» раз в 5 дороже.
              • 0
                Если не секрет, то что у вас вошло в набор?
                • 0
                  Да какой там секрет. Вот тут эксельный файлик со списком, ссылками и ценами. Буду рад, если предложите что-то добавить/заменить. Особенно интересует вариант камеры, которую можно в набор такой включить. Я как-то не совсем понимаю, какую можно взять.
                  • 0
                    С ультрасоником намучаетесь, особенно если их несколько в помещении — куча ложных срабатываний. По сравнению с ним Шарповский ИК-сенсор — чудо.

                    TFT-экран может стать реальной проблемой, мне удалось заставить работать свой только путем дописывания библиотеки. Замечу, что отображение медленное — перерисовка всего экрана занимает секунды.

                    Я бы предложил добавить еще простенькие радиомодули (не блютус), RFID/NFC и несколько мощных (1-3 ватта) RGB-светодиодов, чтобы роботы подавляли!

                    А по наводке ignat99 я еще заказал гироскопические сенсоры. Буду учить Ардуину отзываться на условный стук.
                    • 0
                      В наборе и ультрасоники, и ИК-сенсоры, вроде бы. Просто нам, для обучения, надо и то, и другое. Чтобы можно было смотреть, сравнивать, изучать.

                      С TFT-экраном ещё не работал, но хочется попробовать. Да и там не надо будет игру рисовать, во всяком случае, в ближайшее время.

                      Про RFID/NFC надо подумать (ещё бы ссылочки на подходящее, т.к. я ещё пока совсем новичок в этом). RGB-светодиоды есть в наборе, но не сильно мощные. Всё же это планируется питать от Ардуинки чаще всего.
                      • 0
                        Кстати, еще вспомнил. Забавны управляемые RGB-светодиодные пиксели, ленты и массивы. Например, на основе WS2811(12, 12B). Суть в том, что можно назначать им разные цвета. Я вот играюсь сейчас с FC-102. Отдельные пиксели стоят где-то по 6.5-7 рублей за штуку (при крупном заказе), готовые сборки дороже, вплоть до 10-12р за пиксель в зависимости от формы (массив, лента и т.д.)

                        Насчет радиомодулей RF, они тоже есть на Али, туториалов по ним много, но, в целом, они так же просты в использовании, как и ИК.
                        • 0
                          Спасибо большое! Буду думать, что из этого с ребятами можно сотворить.
                    • 0
                      мемс датчики сами умеют реагировать на условный стук и выставлять прерывания :)
              • 0
                Так ваши слова не противоречат моим. Какой смысл в России торговать запчастями с Али? Мало того, что наценка на каждом компоненте в абсолютном значении будет мизерной (а партии, как я уже говорил, в России пока невелики), так ещё и замучаешься с возвратами, мнение о магазине будет плохим («торгуют всяким барахлом»). Гораздо проще работать для другой категории людей. Возвратов минимум (т.к. качество более-менее стабильное), мнение о магазе можно держать хорошее, хороший суппорт организовал — люди вообще довольны как слоны по большей части. И всем хорошо.

                А кто хочет купить по цене как на Али (с вытекающими), тот может купить на Али. Кто запрещает? Я когда работал в этой области вообще честно так и говорил: «мы продаём не по минимальным ценам, у нас другие плюсы. Если вам нужно по минимальной цене, покупайте на Али.» И люди по большей части на это нормально реагировали. Если люди работают не на широкую публику, но честно, то я бы не стал их ругать.
                • 0
                  Я согласен переплатить за качество при покупке какого-нибудь сложного устройства вроде фотоаппарата, ноутбука и т.п… И, когда я закупал подобную технику для организации, в которой работал, именно так я и делал — переплачивал немного за гарантию и хороший сервис. Но переплачивать в 5 раз за какой-нибудь фоторезистор мне кажется странным. Тем более, что всё равно большинство этих фоторезисторов изначально будет привезено из Китая и у нас его только засунут в красивый корпус.
                  • 0
                    А получить инфракрасный сенсор не на 3-15 см, а на 50-80 вам понравится? А китайцы даже нам — постоянным корпоративным клиентам, вставляющим им периодически за их ошибки —, умудряли присылать не то, что мы им заказываем. Причем в одной партии могут быть и одни и другие и вообще непонятно что. С фоторезистором, конечно, труднее напутать, но ведь вы выбираете удобные вам примеры. А я про Arduino-совместимые платы вообще молчу, одних плясок с драйверами сколько было…
                    • 0
                      Я чуть выше давал ссылочку на планируемый набор для обучения детей работе с Ардуино. Если вы (или ещё кто знающий) сможете подсказать, где такое или подобное можно купить более качественно, но за разумные деньги, то я буду вам сильно признателен. Мне бы тоже было лучше работать не с Китаем, но и переплачивать слишком сильно возможности нет, т.к. у спонсоров сразу возникает вопрос: «Если набор Ардуино стоит почти как Лего, то нафига такой набор надо? Ведь с Лего народу больше хочет заниматься.» И, хотя есть понимание, что это всё же разные вещи и для разного уровня, но денежный вопрос тут вылезает во всю ширь.
                      • –1
                        Вы не частное лицо, как я понял? Вы занимаетесь коммерческой деятельностью? Если да, то заказыйте из Китая. Ищите надёжных поставщиков, занимайтесь их воспитанием, проверяйте за ними товар и делайте всю ту невидимую, но гадкую и муторную работу, которой занимаются все отечественные магазины. Или кооперируйтесь с этими магазинами. Иного выхода нет. Бесплатно никто не работает, не только вы. Кстати, большинство таких магазинов имеют партнёрские соглашения с кружками робототехники, т.е. занимаются тем, чем занимаетесь вы как я понял. Т.ч. они ещё и ваши конкуренты.
                        • 0
                          Я — учитель физики небольшой школы в областном центре. У меня нет возможности и необходимости воспитывать поставщиков. Мне надо, всего лишь, купить нормальное оборудование для центра, в котором мы будем детей учить работе с Лего, Ардуино и прочими 3D-принтерами. Нашёлся добрый человек, у которого есть некоторое количество денег на это всё и желание помочь в организации…

                          С магазинами я пока не очень скооперировался. Точнее, есть предложение от «Амперки» на хорошую скидку, но даже с этой скидкой цена набора получается в 3-4 раза больше, чем купить на Али.
                          • 0
                            Теперь понял вас.

                            С этим ничего не поделаешь. Амперка вообще ориентируется на качество в первую очередь (даже среди других магазинов). Например, у них вообще нет в ассортименте китайских Arduino-совместимых плат. В моей родной школе тоже плохо с финансированием и там несколько энтузиастов занимаются тем, чем они не должны по должности заниматься, лишь бы купить дешевле. При недостатке финансирования другого выхода нет.
                          • 0
                            Вот Arduino совместимая плата ~ 10 евро. А вот набор для подключения ~ каждый элемент с кабелем и драйвером ~ 3-10 евро. Думаю что для школы очень хорошо.
                            • 0
                              То ли я чего-то недопонял, то ли это не совсем то, что я ищу. Но в любом случае спасибо, поизучаю ссылки повнимательнее.
                            • 0
                              Почему бы не брать Arduino Pro Mini (оригинал) они у нас в магазине за углом по 3$. Идентична с Arduino Nano (Uno без гнезда для БП). Правда нехватка USB-TTL может иметь значение. USB-TTL можно докупить за 1.5$, но если не хочется морочить голову, можно брать Arduino Pro Micro в районе 7$ (опять таки локально). На алиэкспресс Arduino Pro Micro по 3$ (а Uno по 5.6$). Это я к тому, если есть желание сэкономить. Для обучения, я не думаю, что будут серьезные отличия от Uno, если вообще будут (разве что нет гнезда для БП) и как бонус — кабель miniUSB, который стоит копейки.
                              • 0
                                Кабель USB-TTL для прошивки, блок питания. На плате за 10 евро есть кнопка, реле, LED, разьём UEXT для сенсоров, разьём для ESP8266-DEV, 10 GPIO (все) от ESP и остальные пины для второго UEXT. Сжечь не чего не получиться. Если только очень постараться.
                    • +2
                      Гхм, я давно заказываю на Ebay, Ali и MiniInTheBox. Бывали и ошибки продавцов. Для этого существуют диспуты, позволяющие как серьезно срезать стоимость заказа, так и вовсе отказаться от оплаты (с возвратом товара). Есть и откровенное мошенничество, которое, впрочем, очевидно: когда продают power bank на 100,000м*Ач за 1000 рублей, флешку на 128 гигов за 300 рублей, стоваттный лазер, питающийся от пальчиковой батарейки или чудо-вебкамеру с невероятным разрешением. Как правило, таким страдают низкорейтинговые продавцы, впрочем их тоже можно потроллить с помощью диспутов.

                      Бывает, что продавцы наборов тормозят с отправкой (на самом деле они просто скупают набор, перепаковывают и отправляют). Бывает, что товар приходит в плохом состоянии — мне пришла плата с 8 реле с погнутыми пинами. Тем не менее, торгующие компонентами крупные продавцы редко когда косячат специально и, как правило, идут навстречу при решении проблем, не только не возражая против разумных рефандов, но еще и добавляя купоны.

                      Самый серьезный минус — время ожидания. Не очень-то радостно ждать полтора месяца какую-нибудь мелочь.

                      Ну и о печальном опыте покупки. Купил я в одном российском магазине келлеровский токопроводящий маркер с доставкой. Он месяц шел, а когда пришел, то оказалось, что пересохший. Я его и тряс, как положено по инструкции, и всячески крутил — увы, пользоваться им не получилось. Мои вопросы и претензии магазин просто проигнорировал. И вот это огорчило даже больше, чем негуманные наценки и затянутая доставка. Даже не столько жаль денег, сколь неприятно такое отношение и ощущение беззащитности перед косяками продавца. Все же, защита покупок — великая вещь.
  • +1
    Спасибо, делал похожее. Данные передавал по serial в форме псевдо-json. Работало достаточно стабильно.
    Далее решил попробовать запилить все на чистом lua, получилось вот что. Работало стабильно. Далее решил запилить конфигурацию «нового» устройства (финт со сменой режимов и загрузкой конфиг файла с ФС) — начались тупняки с памятью. Далее стал комплировать lua, все равно мало памяти.
    Расстроился, понял что система не стабильна. Количество багов растет. SDK до сих пор 0.9.5, последний релиз 2015-03-31 :(

    Не пробовали смотреть в сторону ESP8266-only решения, типа sming? Приходите, коммьюнити живое.
    • +1
      Весьма интересно, спасибо за наводку. Что касается Вашего кода на lua. Он хорош для десктопа, к сожалению, на esp8266 сборщику мусора надо помогать. Багов вагон и маленькая тележка, многое очевидное не работает, но есть варианты. Во-первых, имеет смысл обнулять не используемые переменные. Вот, напрмер, каким образом я компилирую lua при старте МК (честно подсмотрел в одном из репозиториев):
      local compile = function(f)
         if file.open(f) then
            file.close()
            if debug then print('compiling:', f) end
            node.compile(f)
            file.remove(f)
         end
      end
      
      local sources = {
      'server_exchange.lua',
      'http_urldecode.lua',
      'http_urlencode.lua',
      'http_page.lua',
      'http_page1.lua',
      'http_page2.lua',
      'http_setup.lua',
      'id.lua'
      }
      for i, f in ipairs(sources) do 
          i=nil
          compile(f) 
      end
      
      compile = nil
      sources = nil
      collectgarbage()
      

      Сборщик мусора вполне себе четко отрабатывает.
      Дальше, точно также вставал на грабли с конфигом. Однако esp конфиг wifi не нужен, он замечательно помнит свои наcтройки. Напротив, приходится выключать autoconnect, чтобы имитировать разрыв связи. И еще такой момент — код приходится писать узкозаточенный, поэтому чем меньше Вы используете фишек такого высокоуровневого языка как lua, тем лучше. Тут на модули разбивают код для экономии памяти, а не для удобства архитектуры. В целом у Nodemcu будущее есть, однако не на esp8266, а на чипе с памятью побольше. Слух о том, что подобный будет выпущен, уже давно муссируются в Интернете.
      • 0
        Спасибо, да, я до этого дошел уже потом, но оно стало выглядеть, мягко говоря «не очень».
        Я компилировал файлы во время загрузки. Загружаем lua файл, компилируем, удаляем lua файл.
        def file_compile(self, path):
                log.info('Compile '+path)
                cmd = 'node.compile("%s")' % path
                self._port.write(cmd + '\r\n')
                r = self.dump()
                log.info(r)
                return r
        


        Мне конечно, нравится идея запуска динамических скриптов на SoC, и lua-наилучший кандидат из-за его минимализма. Но вот что-то мне кажется nodemcu так и останется на esp8266 и устройствах от espressif.
  • 0
    Есть проект, где разрабатывается готовая прошивка с поддержкой кучей датчиков, дисплеев, счётчиков и прочего. Есть конструктор прошивки:

    homes-smart.ru/index.php/oborudovanie/bez-provodov-wi-fi/62-besprovodnoj-datchik-na-baze-esp8266-dlya-servisa-narodmon-ru

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

    Разработчик достаточно оперативно на хотелки отзывается.
  • 0
    Если кому-либо интересен выбор конденсатора — на SE подробно объяснили: electronics.stackexchange.com/questions/18384/why-does-the-lm1117-data-sheet-specifically-specify-tantalum-capacitors (tl;dr танталовый конденсатор — необязателен, есть варианты получше).

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