code-lua-iot/screen.lua
2024-10-24 17:49:35 +02:00

133 lines
4.1 KiB
Lua

-- introduction IOT / UBS
-- (c) Gildas Menier
-- gildas.menier@univ-ubs.fr
-- contient les définitions de
-- cls()
-- console()
-- fonction permettant se s'attacher à l'écran
function attachscreen(sda, scl, i2cadd)
try (
function ()
i2c.setpins(0,sda,scl)
gdisplay.attach(gdisplay.SSD1306_128_64, gdisplay.LANDSCAPE, false, i2cadd)
gdisplay.clear()
gdisplay.setfont(gdisplay.FONT_LCD)
gdisplay.setwrap(false)
end,
function (where, line, error, message)
print("Couldn't attach the screen.\nError in "..where.." at "..line.." "..error..": "..message)
end,
function () end
)
end
local consolepos = 0
local consoletab = {}
local consolemax = 6
local oledflip = 1
function flip()
oledflip = oledflip+1; if oledflip > 3 then oledflip = 0 end
if oledflip==0 then
consolemax = 6
gdisplay.attach(gdisplay.SSD1306_128_64, gdisplay.LANDSCAPE_FLIP, false, i2cadd)
elseif oledflip==1 then
consolemax = 6
gdisplay.attach(gdisplay.SSD1306_128_64, gdisplay.LANDSCAPE, false, i2cadd)
elseif oledflip==2 then
consolemax = 13
gdisplay.attach(gdisplay.SSD1306_128_64, gdisplay.PORTRAIT, false, i2cadd)
else
consolemax = 13
gdisplay.attach(gdisplay.SSD1306_128_64, gdisplay.PORTRAIT_FLIP, false, i2cadd)
end
cls()
end
function cls()
if (consolemax==6) then gdisplay.clear()
else
gdisplay.rect( {0,0}, 128, 9*consolemax, {0,0,0}, {0,0,0} )
end
if oledflip ~= 1 then gdisplay.clear() end
consolepos = 0
consoletab={}
for i=0, consolemax do
consoletab[i] = ""
end
end
function console(msg)
if (consolepos <= consolemax) then
consoletab[consolepos] = msg
gdisplay.write({0, consolepos*9},msg)
consolepos = consolepos+1
else
for i = 1, consolemax do
consoletab[i-1] = consoletab[i]
end
consoletab[consolemax] = msg
if (consolemax==6) then gdisplay.clear()
else
gdisplay.rect( {0,0}, 128, 9*consolemax+9, {0,0,0}, {0,0,0} )
end
for i=0, consolemax do
gdisplay.write({0, i*9},consoletab[i])
end
end
end
function top()
local l = thread.list(true)
cls()
for k,v in pairs(l) do
console(l[k]["thid"].." "..l[k]["name"].." "..l[k]["used_stack"])
end
end
-- fonction permettant de dessiner une courbe selon l'humidité captée par le capteur DHT22
function displayhumi()
s = sensor.attach("DHT22", pio.GPIO21)
tmr.delayms(500)
width, height = gdisplay.getscreensize()
values = {}
min_val = s:read("humidity")
max_val = s:read("humidity")
while true do
humi = s:read("humidity")
-- changement des valeurs min et max
if humi < min_val then min_val = humi
elseif humi > max_val then max_val = humi end
-- si le tableau est plein alors on affiche la courbe
if #values == 10 then
for i=1,9 do
values[i] = values[i + 1]
end
values[10] = humi
cls()
-- on dessine chaque partie de la courbe
for i=1,9 do
-- on dessine la partie de courbe
gdisplay.line(
{
math.floor(i/10 * width), -- coordonnée x du premier point
math.floor((values[i] - min_val)/(max_val - min_val) * (height - 10) + 5) -- valeur comprise entre la val min et la val max avec des espaces de 5px et haut et en bas
},
{
math.floor((i + 1)/10 * width), -- coordonnée x du deuxième point
math.floor((values[i + 1] - min_val)/(max_val - min_val) * (height - 10) + 5) -- valeur comprise entre la val min et la val max avec des espaces de 5px et haut et en bas
}
)
end
else
values[#values + 1] = humi
end
tmr.delayms(500)
end
end