ESP8266. Привет мир

espressifПроба пера в работе с Wi-Fi модулем ESP8266 (ESP-07) от Espressif. Работать с этим модулем я уже пробовал в конце прошлого года, тогда эксперименты закончились окирпичиванием подопытного. В этот раз все более-менее удачно. Сразу же после покупки в модуль была залита прошивка NodeMCU, для дальнейшей работы с Lua-скриптами. В прошивки обнаружил много нового, как оказалось поддержка ряда датчиков уже заложена в прошивку и работу с ними можно вести просто через встроенные функции, в прошлом году такого еще не было.

esp07-dht22-bmp085

Прототип в сборе ESP-07, AM2301 и BMP085

Работа с AM2302 (он же DHT22) стала намного удобнее. Если раньше функции для работы с этим датчиком необходимо было прописывать отдельным модулем, то сейчас достаточно определить ножку ESP8266 к которому подсоединен выход датчика Dout и обратиться к нему через встроенную функцию dht.read(). Весь код выглядит следующим образом.

pin = 7

status, temp, humi, temp_dec, humi_dec = dht.read(pin)
if status == dht.OK then
    -- Integer firmware using this example
    print(string.format("%d.%d;%d.%d\r\n",
          math.floor(temp),
          temp_dec/100,
          math.floor(humi),
          humi_dec/100
    ))

elseif status == dht.ERROR_CHECKSUM then
    print( "DHT Checksum error." )
elseif status == dht.ERROR_TIMEOUT then
    print( "DHT timed out." )
end

Что замечательно, функция dht.read() не только читает значения температуры и влажности, но также может определять состояние обмена данными с датчиком, возвращая значения dht.OK — если все хорошо, dht.ERROR_CHECKSUM и dht.ERROR_TIMEOUT — если есть проблемы при обмене данными.

В readme на репозитории NodeMCU заявлено, что работа с датчиком BMP085 также встроена в прошивку. Однако при помощи функций bmp085.temperature() и bmp085.pressure() достучаться до датчика почему-то не получилось, вероятно не достаточно внимательно читал инструкции (или не включил поддержку датчика при сборке прошивки). Собственно поэтому для работы с датчиком BMP085 пришлось использовать дополнительный программный код, который общается с датчиком через использование встроенных функций i2c интерфейса. В результате опрос датчиков давления, температуры и влажности выглядит следующим образом (модуль bmp085-dht22.lua).

bmp085 = require("BMP")
sda_pin = 1
scl_pin = 2
pin = 7
-- инициализируем датчик BMP085 и читаем его измерения
bmp085.init(sda_pin, scl_pin)
p = bmp085.getUP(oss)
-- читаем измерения датчика DHT22
status, temp, humi, temp_dec, humi_dec = dht.read(pin)
if status == dht.OK then
    -- Integer firmware using this example
    print(string.format("%d.%d;%d.%d,%d",
          math.floor(temp),
          temp_dec/100,
          math.floor(humi),
          humi_dec/100, p
    ))

elseif status == dht.ERROR_CHECKSUM then
    print( "DHT Checksum error." )
elseif status == dht.ERROR_TIMEOUT then
    print( "DHT timed out." )
end
-- подготовка строчных переменных для модулей server и thingspeak
h = (math.floor(humi)).."."..(humi_dec/100)
t = (math.floor(temp)).."."..(temp_dec/100)
press = (math.floor((p*75)/10000)).."."..(((p*75)%10000)/1000)
print(string.format("%s;%s,%s\r\n",t,h,press))
-- Убираем мусор
bmp085 = nil
package.loaded["BMP"]=nil
collectgarbage()

Строка bmp085 = require(«BMP») как раз обращается к дополнительному файлу BMP.lua, который собственно и заведует общением с BMP085 через i2c интерфейс. Так как места у нас мало,  файлы BMP.lua и bmp085-dht22.lua желательно скомпилировать в *.lc после загрузки в ESP8266. Кроме того, стоит обратить внимание, что программный модуль приведенный выше чрезвычайно ресурсоемкий (в отношении памяти), потому может вылетать при его использовании вместе с какими-либо другими программными блоками.

Для подключения датчиков и последующей работы с ними будет полезна следующая таблица соотнесения программного индекса выхода ESP8266 и его номера GPIO

IO index ESP8266 pin IO index ESP8266 pin
0 [*] GPIO16 7 GPIO13
1 GPIO5 8 GPIO15
2 GPIO4 9 GPIO3
3 GPIO0 10 GPIO1
4 GPIO2 11 GPIO9
5 GPIO14 12 GPIO10
6 GPIO12