среда, 14 декабря 2016 г.

Вывод отладочной информации с ESP-12 на дисплей SSD1306 (128x64px)


Инициализация дисплея по I2C по адресу 0x3C, поиск точки доступа, поднятие своей SoftAP и вызов WEB-сервера в скрипте 'init.lua':
-- setup I2c and connect display
function init_i2c_display()
-- SDA and SCL can be assigned freely to available GPIOs
local sda = 5 -- GPIO14
local scl = 6 -- GPIO12
local sla = 0x3C
i2c.setup(0, sda, scl, i2c.SLOW)
disp = u8g.ssd1306_128x64_i2c(sla)
end

-- draw routine
local function draw()
disp:setFont(u8g.font_6x10)
disp:setFontPosTop()

disp:drawStr(0, 4, "Wi-Fi AP Search")
disp:drawStr(0, 16, "Wait...")
disp:drawStr(0, disp:getHeight()-10, "RAM: " .. node.heap())

--disp:drawBox(0, 0, 3, 3)
--disp:drawCircle(8, 0, 2)

disp:drawBox(disp:getWidth()-6, 0, 6, 6)
disp:drawBox(disp:getWidth()-9, disp:getHeight()-9, 9, 9)
--disp:drawBox(0, disp:getHeight()-12, 12, 12)
--disp:drawTriangle(disp:getWidth()-9,disp:getHeight()-10, 45,30, 10,40)

end

init_i2c_display()
disp:setRot180()
disp:firstPage()
repeat
draw(draw_state)
until disp:nextPage() == false

-- registr = 13, pin - GPIO13 na plus optron cherez 1 kOm
dpin=7
gpio.mode(dpin, gpio.OUTPUT);
gpio.write(dpin, gpio.HIGH);
-- GPIO2 (используем для настройки, подтянут к 1)
tpin=4
gpio.mode(tpin,gpio.INPUT,gpio.PULLUP)
print("Setting up Wi-Fi...")
wifi.setmode(wifi.STATION)
wifi.sta.config("SSIDMAIN","passwordmain")
wifi.sta.connect()
local cnt=0

tmr.alarm(1, 1000, 1, function()
if wifi.sta.getip()==nil then
print("First IP unavaiable, Waiting...")
cnt = cnt + 1
if (cnt > 2) then
tmr.stop(1)
cnt=0

print("Soft AP started")
wifi.setmode(wifi.SOFTAP)
wifi.ap.config({ssid="SSID",pwd="password"})
print('IP:',wifi.ap.getip())
print('MAC: ',wifi.ap.getmac())

disp:setRot180()
disp:firstPage()
repeat
disp:drawStr(0, 0, "Soft AP started")
disp:drawStr(0, 12, "Please connect SSID")
disp:drawStr(0, 24, "Password: password")
disp:drawStr(0, disp:getHeight()-10, "RAM: " .. node.heap())
until disp:nextPage() == false

dofile("dio.lua")
collectgarbage()
end
else
tmr.stop(1)
print("Config done, IP is "..wifi.sta.getip())

disp:setRot180()
disp:firstPage()
repeat
disp:drawStr(0, 0, "Connect LENOVOS")
disp:drawStr(0, disp:getHeight()-10, "RAM: " .. node.heap())
until disp:nextPage() == false

dofile("dio.lua")
collectgarbage()
end
end)
WEB-сервер с визуализацией контроля DIO на дисплее в скрипте 'dio.lua':
-- POWER DIO
local function powersat()
srv=net.createServer(net.TCP,5)
srv:listen(80,function(conn)
conn:on("receive", function(client,request)      
local buf = "";
local sel_msg= " selected=true";
local _on1,_off1,_on2,_off2="","","","";
local head = "HTTP/1.1 200 OK\n\n<!DOCTYPE HTML>\n<html>\n<head></head>\n<body>\n";
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+_*-*%w*)&*") do
_GET[k] = v
end
end
buf = head;
buf = buf.."<h1>DIO Control</h1>\n";
buf = buf.."<h3>RAM: "..node.heap().."b</h3>\n";
t=gpio.read(tpin)
r=gpio.read(dpin)
buf = buf.."<h3>GPIO2 ("..r..") / GPIO13 ("..t..")</h3>\n";

--POWER   
buf = buf.."<form src=\"/\">POWER <select name=\"pin1\" onchange=\"form.submit()\">";
if(_GET.pin1~=nil)then
flag=1
if(_GET.pin1 == "ON")then

disp:setRot180()
disp:firstPage()
repeat
disp:drawBox(disp:getWidth()/2-15, disp:getHeight()/2-15, 30, 30)
disp:drawStr(0, disp:getHeight()-10, "RAM: " .. node.heap())
disp:drawStr(0, 0, "raxp on ("..tim.." sec)")
until disp:nextPage() == false
gpio.write(dpin, gpio.LOW);
trig=0
tim=0

elseif(_GET.pin1 == "OFF")then

disp:setRot180()
disp:firstPage()
repeat
disp:drawBox(disp:getWidth()/2-5, disp:getHeight()/2-5, 10, 10)
disp:drawStr(0, disp:getHeight()-10, "RAM: " .. node.heap())
disp:drawStr(0, 0, "raxp off ("..tim.." sec)")
until disp:nextPage() == false
gpio.write(dpin, gpio.HIGH);
trig=1
tim=0

end
end       
if(gpio.read(dpin) == 0)then _on1=sel_msg; else _off1=sel_msg; end
buf = buf.."<option".._on1..">ON</option><option".._off1..">OFF</option></select></form>\n";
--SETTINGS
buf = buf.."<form src=\"/\"><br><button type=\"submit\" name=\"set\" value=\"RST\">Reset WiFi</button></form>\n";
buf=buf.."</body></html>";
client:send(buf);
client:close();
collectgarbage();
if(_GET.set == "RST")then
node.restart(); 
end
end)
end)
end

trig=0
tim=0
flag=0
powersat()

-- таймер на экран
tmr.alarm(1, 1000, 1, function()

if(flag==1)then
if(trig==0)then
disp:setRot180()
disp:firstPage()
repeat
disp:drawBox(disp:getWidth()/2-15, disp:getHeight()/2-15, 30, 30)
disp:drawStr(0, disp:getHeight()-10, "RAM: " .. node.heap())
disp:drawStr(0, 0, "raxp on ("..tim.." sec)")
until disp:nextPage() == false
elseif(trig==1)then
disp:setRot180()
disp:firstPage()
repeat
disp:drawBox(disp:getWidth()/2-5, disp:getHeight()/2-5, 10, 10)
disp:drawStr(0, disp:getHeight()-10, "RAM: " .. node.heap())
disp:drawStr(0, 0, "raxp off ("..tim.." sec)")
until disp:nextPage() == false
end
tim=tim+1
end

end)
Ресурсы
  1. u8g Module on Lua https://nodemcu.readthedocs.io/en/master/en/modules/u8g/
  2. Стабильная прошивка-компилятор NodeMCU 0.9.6.bin с поддержкой операций с плавающей точкой https://github.com/nodemcu/nodemcu-firmware/releases
  3. Утилита-загрузчик скриптов LuaLoader https://github.com/GeoNomad/LuaLoader
  4. Утилита-прошивальщик компилятора NodeMCU - ESP8266Flasher https://github.com/nodemcu/nodemcu-flasher
 Проекты на базе ESP8266
  1. Прозрачный мост UART/Wi-Fi --- Wi-Fi/UART на базе ESP8266 на Lua 
  2. Wi-Fi лампа. Контроль DIO модуля ESP-01 (ESP8266) по Wi-Fi  
  3. Монтаж мезонином прозрачного моста Wi-Fi-UART на ESP8266
  4. Автономный датчик температуры по Wi-Fi на базе ESP8266
  5. Аномальная разрядная кривая ионисторов проекта "вечный" Wi-Fi логгер. Луна однако
  6. Работа "вечного" Wi-Fi логгера на солнечную панель из... аморфного кремния 
  7. #ESP.Meteo: Wi-Fi логгер с автономным питанием в Twitter-e  
  8. Вывод отладочной информации с ESP-12 на дисплей SSD1306

Комментариев нет:

Отправить комментарий

В комментариях уважайте собеседника, внимательно читайте посты и не додумывайте. Выход новых версий ПО, внешняя ссылка, переставшая работать с течением времени и т.п. не является основанием для претензий. Желающие спокойно подискутировать и высказаться — Welcome. Желающие спонсировать блог — Donate. Нарушение этих простых правил ведет к бану и удалению комментариев без предупреждения.