WIFI Модуль ESP8266 за 3,5 $ первые впечатления. + мост UDP<-->UART на LUA

На прошлой неделе получил из КИТАЯ 2 WIFI модуляESP8266 по «преступно» низкой цене 3,5$ за штуку.(думаю наши продавцы и курс вскоре исправят этот досадный недостаток :)
Как говорится ESP8266: Революция в мире интернета вещей
Если кто еще не читал про ESP8266, то тут достаточно хорошо все описано.

Так как для одного моего устройства модуль как нельзя хорошо вписывался, то он немедля был заказан и под него была сделана тестовая плата. Модуль шел из Китая в Москву примерно две с половиной недели.
Под модуль существуют прошивка с управлением AT командами и со встроенным языком LUA. Так как под AT команды требуется внешний процессор, то этот вариант был отброшен так как во первых лень, во вторых конечная цена устройств должна быть минимальной.(делай как можно дещевле, дороже получится само собой(с))
Устройство должно иметь следующие функции:
— Если нет внешней WIFI точки доступа, то поднимать свою
— Если есть внешняя точка то «соединяться» с ней бриджем (вариант домашняя сеть)
— Принимать команды от внешнего устройства (комп или смартфон)
— Измерять температуру DS18B20 и выдавать ее по запросу
— Включать выключать нагрузку (реле 220V 5A)
— Запоминать во Flash памяти модуля время работы реле

Итак я выбрал вариант с написанием скрипта на LUA и использование GPIO модуля.
Под Андроид написал простого UDP клиента для получения и отображения данных с модуля.
Вот что примерно получилось:
Внешний вид:


настройки:


Плата:


Далее под модуль был написан скрипт на LUA
по сути это UDP сервер который принимает команды от Андроид устройство и отдает данные.
Вот его код:

----------------MAIN-----------------------
Init()
srv=net.createServer(net.UDP)
   srv:on("receive", function(srv, pl)
    print(pl)
    if pl=="!SetR1_1\r" then
       gpio.write(pinled, gpio.HIGH)
       stled=1
       counter=0
       srv:send("!LEDON\r")
    end
   if pl=="!SetR0_1\r" then
      gpio.write(pinled, gpio.LOW)
      stled=0
       srv:send("!LEDOFF\r")
        file.open("ltimer.log", "w")
        file.write(GCOUNTER)
    file.close()

   end
  
  if pl=="!GetR_1\r" then 
    if stled ==1 then 
      srv:send("!LEDON\r")
      else
    srv:send("!LEDOFF\r")
   end
  end
  if pl=="!GetCount\r" then
       srv:send("!COUNT "..counter.."\r")
  end
  if pl=="!GetGcount\r" then
      srv:send("!GCOUNT "..GCOUNTER.."\r")
  end
  if pl=="!GetC_1\r" then
     print(ShowTemp())
     srv:send("!TEMP"..TEMP.."\r")     
  end
 if pl=="!ClrCount\r" then
    GCOUNTER=0 
     srv:send("!GCOUNT=0\r")     
  end
if pl=="!GetIp\r" then
     srv:send("!IP "..wifi.sta.getip().."\r")     
  end

   end)
srv:listen(port)
uart.on("data",function(data)srv:send(data)end, 1)
--timer 1
tmr.alarm(2,60000,1, function() 
 if  stled==1 then
   counter=counter+1
   GCOUNTER=GCOUNTER+1
   --print(counter)
 end
 end )

Далее код по UART код был залит в модуль и потестирован в «хвост и в гриву» в моей домашней WIFI сети.
Вообщем все работает.Все настройки касаемые WIFI сети энергонезависимы, тоесть настроили пароль и ssid и далее по включению модуль автоматически цепляется к сети.
Конечно, не обошлось без «глюков» иногда модуль по непонятной причине перезагружался.Под память программ на LUA во FLASH модуле примерно 120кБ и примерно 25кб RAM. Не густо, но жить можно.Так как прошивка постоянно обновляется, то хочется надеяться что глюки со временем подчистят (или добавят как обычно новые :)
Ну как то так. Под какие то устройства вполне пойдет.

Так как были вопросы на email по реализации моста UDP<-->UART для модуля привожу пример моей реализации на Lua:

--!!!!nodemcu_512k_20150106
PORT=7777 pin=3
gpio.mode(pin, gpio.INPUT)
tmr.alarm(1,5000, 1, function()
if wifi.ap.getip()~=nil  then
if gpio.read(pin)==1 then
tmr.stop(1) print("WIFI_UDP_RS232 V1.1 06.01.2015")
else
tmr.stop(1) print("Telnet V1.1") dofile("telnet.lua")
end end end)
uart.setup( 0,9600, 8, 0, 1, 0 )
srv=net.createServer(net.UDP)
srv:eek:n("receive", function(srv, pl) tmr.wdclr() uart.write(0,pl) end)
srv:listen(PORT) uart.on("data",0,function(data)srv:send(data)end, 0)


По старту проверяю GPIO0, и если в течении 5 сек ее закоротить, то выходим в telnet.(до подачи питания коротить ее нельзя!!!) Лучше использовать Putty, а не виндовый телнет клиент.Тут можно сделать настройки, удалить прогу и т.д В качестве UDP клиента пользую бесплатную Hercules SETUP. Под Андроид свои проги(давал в разделе Умный дом)
Внимание! При запуске программы она переходит в режим моста и не отвечает на Lua команды, не пугайтесь так должно быть. Если надо ее удалить, то либо при старте file.remove(«init.lua») или из телнет.

Вот код телнет сервера он стандартный из примеров:

s=net.createServer(net.TCP,1000)
s:listen(23,function(C)
function s_output(str)
if(c~=nil)
then c:send(str)
end
end
node.output(s_output, 0)
c:eek:n("receive",function(c,l)
node.input(l)
end)
c:eek:n("disconnection",function(C)
node.output(nil)
end)
print("Telnet V1.1")
end)


Кому интересно пробуйте.
PS. Еще похоже при записи файлов во Flash, не убираются лидирующие пробелы и размер файла становится больше.(может показалось) Поэтому для экономии места :) во Flash лучше писать без отступов.Проверьте кому не лень плиз. И быстрее запись будет и место во Flash сохраним. Все равно исходники скрипта с форматированием остаются, а вычитывание файла из флеш довольно редкая операция (зачем?)
  • +5
  • 17 декабря 2014, 21:32
  • alexhi
  • 3
Файлы в топике: andrele.zip, LuaDownloader.zip, esp8266_flasher.zip

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

RSS свернуть / развернуть
Неплохая микра, но пока не доведена до ума. В частности есть замечания по SDK подробнее тута
Так что для домашнего рукоблудия пойдет, а вот в серию пока рановато пускать.
0
Да, я вообщем то и брал чтобы порукоблудничать :) Пока кризис, надо учиться.Но думаю до приемлемого уровня «доточат» достаточно быстро.Интерес к подобным штукам есть.
0
На той неделе при тестировании вылезла еще одна бага — при каких-то условиях модули кладут сеть WiFi. Т.е. все устройства WiFi вокруг модуля теряют сеть и не могут подключится пока модуль не будет выключен. При этом esp8266 сильно греется. Вроде бы так происходит при неудачном обновлении некоторых прошивок, пока не могу сказать точно потому что такая фигня внезапно началась и внезапно кончилась.
0
Интересно, у меня такого не было.Может брак какой?(или фича) А так зачетная глушилка WIFI получилась бы :)
0
Данный глюк наблюдается если сеть работает в n стандарте. Тогда на время передачи данных она переводится в g(что прекрасно видно по пингам, но учитывая поддержку чипом n стандарта непонятно почему), а после 5-20 пакетов с esp'шки(и чем чаще они отправляются тем меньше их надо) она почему-то виснет оставаясь в режиме передачи(глюк TCP?).
При предварительном переведении сети в 802.11g всё работает как часы.
0
Цимес- в цене. Сейчас полноценный wi-fi стоит дешевле, чем 2 года назад «народные» nRF24L01. Это заодно огроменный камень в огород ZigBee — технология такая же, но благодаря лицензионным отчислениям, зигби втрое дороже. Я уже заказал Деду Морозу пачку таких. Второе желание — чтобы SDK открыли полностью и написали хорошую документацию.
0
Хм-с… Это где такие цены?

Пара nRF24L01 легко купилась за $3.99, когда ESP8266 чудом выигралась за $2.54, а обычно они уходят от $3. (ebay, free shipping все)
0
Я покупал на Ali, вот тут модули за 3.25$ c внешней антенной. Надо кстати попробывать на дальность.С PCB антенной у меня дальность примерно как у роутера TP Link MR3220 (проверял на даче)
0
Это тот же порядок цены, что я говорю.

Но это я протупил что сравнивается цена на WiFi сейчас с ценой на RF-ки два года назад.
0
Вот ещё есть интересный вариант, с внешней и внутренней антенной и в экране.
0
А что значит «со встроенным языком LUA»?
0
  • avatar
  • Den1s
  • 18 декабря 2014, 01:15
в одной из прошивок есть интерпретатор lua с привязкой к функциям из библиотек SDK, соответственно можно написать код на lua, как в статье, зашить в модуль и обойтись без внешнего МК, встроенный достаточно могуч.
0
Немного добавлю.Актуальная прошивка для модуля с LUA и описание находится тут После прошивки можете писать на LUA и загружать файл в модуль по UART. После включения питания прошивка запускает файл init.lua в котором можно прописать условия запуска и ваш файл.Если на LUA не писали, то удобно поставить LUA под Windows (потренироваться :) можно скачать тут Я для загрузки скриптов в модуль под себя написал загрузчик. Скрипт для модуля пишу в Notepad, а загружаю и делаю отладку через нее.
Вид:

Программа в аттаче.
0
А, вон оно как. Я писал немного на ЛУА, но я не знал что он работает через интерпритатор (думал что исходники компилируются как в Си, например). Тогда более менее ясно. Спасибо.

А шить эти прошивки чем? Я про заводские. Там бутлоадер есть?
0
Да, в модуле есть бутлодер.
Прошивка делается так:
1.Берем модуль и подключаем ногу GPIO0 на землю
2.Подаем питание на модуль
3.Далее запускаем утилиту esp8266_flasher.exe (прикрепил в аттач)
4.Выставляем адрес 0x00000, выбираем COM порт и файл
5.Жмем download
6.После прошивки снимаем перемычку с GPIO0
После этого можно грузить LUA скрипты через мою прогу или другую (GPIO0 на землю сажать уже не надо)
+1
Ясно. Спасибо за ответы.
0
ну вот, я думал я буду первый, кто напишет про них
хотел сделать инторнет весы, чтобы взвешиваться
я ведь со следущего года на фитнесс пойду качаться
0
По идее есть вариант писать прошивку свою в него как я понимаю. Только там ядро какое-то малоизвестное и под него свои IDE и компилятор нужны. А интернет расходится в показаниях на счет его (IDE) бесплатности.
Погружался кто-нить в этот вопрос?
0
  • avatar
  • Den1s
  • 19 декабря 2014, 01:42
компилятор GCC.
0
Есть подробная статья для начинающих Работа с ESP8266: Собираем компилятор и пишем первую прошивку
0
Тоже ковыряю такой модуль. Вариант с LUA — очень интересный, тем более что есть встроенная поддержка файловых операций, таймера, PWM, I2C, GPIO, ADC
Заказал на днях модули ESP-12 с таким-же чипом — там выведено кроме UART не 2 GPIO, а 9 GPIO + 1 ADC
0
  • avatar
  • xxc
  • 19 декабря 2014, 11:36
Интересно, если не сложно как получите модули отпишитесь.Да на 01 модуле с ногами в обрез :) Я пока вывел на эту плату консоль и сделал прозрачный мост UDP<-->UART. Можно на них подключить платку с дешовым процом типа STM32F0 (~0,5$)и сделать расширение возможностей типа шилда.
0
Обязательно отпишусь.
Кстати, насколько я понял — можно вместо UART ноги использовать как полноценные GPIO
И да — тоже была мысль сделать «ардуино-наоборот», т.е. прицепить дешевенький стм или авр как шиелд к нему и общаться с ним по UART или I2C
0
Зачем к модулю что-то цеплять? Он сам по себе очень даже ничего. Правда много gpio на режим загрузки уходит 0,2 и 15
0
  • avatar
  • mcsa
  • 20 декабря 2014, 00:20
В коде для udp-uart и для telnet встречаются какие-то eek`и. Что это? У меня жаловалось на это, пришлось поменять
srv:eek:n("receive", ...
на
srv:on("receive", ...
не только в этих местах, а вообще все ики. Возможно, дело в обновлении интерпритатора.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.