Refactorisé mon projet mesure de température en mesures et ajouté le projet mesure de la consommation électrique en temps réel

This commit is contained in:
Christian Zufferey
2019-08-03 19:18:35 +02:00
parent a66311937a
commit 7cb3c0654a
131 changed files with 1506 additions and 2 deletions

118
Mesures/energy/README.md Normal file
View File

@@ -0,0 +1,118 @@
# temp_zf
Petit projet pour mesurer la consommation électrique en temps réel chez moi avec un NodeMCU en LUA, et l'afficher sur ThingSpeak.
![Image of Yaktocat](.jpg)
![Image of Yaktocat](.png)
On peut voir, avec ce projet assez complet, toutes les possibilités offertes de la programmation des NodeMCU en LUA, en mode événementiel. <br>
Choses qui ne seraient pas possible si on l'avait fait en C++ (mode Arduino), comme par exemple:
* serveur WEB Active Server Pages ZYX, permet de faire des pages HTML dynamique avec du code LUA in line
* serveur WEB service pour le HUB (API GET)
* serveur WEB pour l'affichage de la consommation électrique
* serveur WEB pour l'IDE, modification du code source en remote directement depuis une page WEB, pas besoin d'IDE
* crontab, horloge pour les mesures de la consommation
* serveur TELNET, utilisation de la console en remote pour le debug
Toutes les fonctions sont bien séparées dans des scripts, ce qui facilite la portabilité entre les projets mais aussi sa mise au point.
## Astuces de mesures
Dans ce projet il y a 1x NodeMCU qui mesure la consommation électrique en détectant simplement le petite LED du compteur électrique
:
Il envoie la puissance sur le NodeMCU de la mesure **extérieure sud** fait office de hub des deux autres mesures de températures et, envoie en même temps les 4x mesures à Thingspeak. Ceci afin de les avoir tous dans le même channel (on économise les channels).<br>
Cela permet de mesurer des valeurs physiques éloignées dans la maison en utilisant le WIFI comme câble de liaison entre les sondes !
## Installation
Il faut *flasher* le NodeMCU avec ce firmware:
https://github.com/zuzu59/NodeMCU_Lua/blob/master/Firmware/nodemcu-master-20-modules-2019-07-01-06-35-13-float.bin
Avec ces modules:
```
adc ds18b20 file gpio http i2c mdns mqtt net
node ow pcm rtctime sntp spi tmr uart wifi ws2812
```
## Utilisation
### Distribution des rôles de NodeMCU
Comme la mesure de consommation est faite avec 1x NodeMCU, il y a donc 1x fichiers de *secrets*. C'est dans ce fichier de *secrets* qu'il y a l'information de l'adresse IP du NodeMCU qui fait office de *hub* !<br>
```
secrets_energy.lua
```
C'est aussi là qu'il y a le *numéro du field* (zfield), c'est à dire le rôle joué par le NodeMCU_Lua:
* **4**, consommation électrique
Et c'est le NodeMCu de mesure de température *sud* qui fait office de *hub*, qui concentre les mesures et les envoie en une fois à Thingspeek !
**faut encore modifier le readme depuis ici ! zf190803.1917**
### Affichage des températures en local sur le NodeMCU
On peut lire la température directement sur le NodeMCU au moyen de cet url (il faut modifier l'adresse IP du NodeMCU en question):
nodemcu 28 int, http://192.168.0.171/disp_temp.html
nodemcu 29 sud, http://192.168.0.180/disp_temp.html
nodemcu 30 nord, http://192.168.0.105/disp_temp.html
### Affichage du petit serveur web du NodeMCU_Lua
Chaque NodeMCU a son propre serveur WEB, on peut l'accéder simplement depuis son adresse IP:
nodemcu 28 int, http://192.168.0.171
nodemcu 29 sud, http://192.168.0.180
nodemcu 30 nord, http://192.168.0.105
### Modification du code source du NodeMCU en remote
Très pratique pour le debug, on peut directement modifier le code source Lua du NodeMCU en remote avec cet url:
nodemcu 28 int, http://192.168.0.171:88
nodemcu 29 sud, http://192.168.0.180:88
nodemcu 30 sord, http://192.168.0.105:88
### Utilisation de la console du NodeMCU en remote
Très pratique pour le debug, on peut accéder à la console du NodeMCU en remote avec telnet:
nodemcu 28 int, **telnet -rN 192.168.0.171**
nodemcu 29 sud, **telnet -rN 192.168.0.180**
nodemcu 30 nord, **telnet -rN 192.168.0.105**
## Visualisation sur ThingSpeak
La totale en détail
https://thingspeak.com/channels/817940
Seulement la corrélation entre les trois température
https://thingspeak.com/apps/plugins/300559
zf190803.1917

View File

@@ -0,0 +1,17 @@
-- Petit script pour configurer les choses secrètes que l'on n'aimerait
-- pas être exportées sur Internet (github)
-- faut donc le mettre ailleurs que dans le dépôt !
function secrets()
print("\n secrets_temp_zf_out_sud.lua zf190727.1006 \n")
cli_ssid="xxx"
cli_pwd="xxx"
thingspeak_url="http://api.thingspeak.com/update?api_key=xxx&"
hub_url="http://192.168.0.180/api_hub_temp.html?"
zfield=1 ou 2 ou 3 !
end
secrets()
secrets=nil

37
Mesures/energy/boot.lua Normal file
View File

@@ -0,0 +1,37 @@
-- Scripts à charger après le boot pour démarrer son appli
print("\n boot.lua zf190803.1908 \n")
function heartbeat()
f= "flash_led_xfois.lua" if file.exists(f) then dofile(f) end
flash_led_xfois()
boottimer1=tmr.create()
boottimer1:alarm(1*1000, tmr.ALARM_AUTO, function()
xfois =2
blink_LED ()
end)
end
-- charge ses propres secrets
f= "secrets_energy.lua" if file.exists(f) then dofile(f) end
--f= "led_rgb.lua" if file.exists(f) then dofile(f) end
--f= "wifi_ap_start.lua" if file.exists(f) then dofile(f) end
f= "wifi_ap_stop.lua" if file.exists(f) then dofile(f) end
f= "wifi_cli_conf.lua" if file.exists(f) then dofile(f) end
f= "wifi_cli_start.lua" if file.exists(f) then dofile(f) end
f= "telnet_srv2.lua" if file.exists(f) then dofile(f) end
f= "web_ide2.lua" if file.exists(f) then dofile(f) end
f= "web_srv2.lua" if file.exists(f) then dofile(f) end
--f= "0_get_temp.lua" if file.exists(f) then dofile(f) end
--f= "0_send_temp.lua" if file.exists(f) then dofile(f) end
--f= "0_cron_temp.lua" if file.exists(f) then dofile(f) end
f=nil
--heartbeat=nil
heartbeat()

View File

Before

Width:  |  Height:  |  Size: 439 KiB

After

Width:  |  Height:  |  Size: 439 KiB

View File

Before

Width:  |  Height:  |  Size: 681 KiB

After

Width:  |  Height:  |  Size: 681 KiB

View File

Before

Width:  |  Height:  |  Size: 655 KiB

After

Width:  |  Height:  |  Size: 655 KiB

View File

Before

Width:  |  Height:  |  Size: 670 KiB

After

Width:  |  Height:  |  Size: 670 KiB

View File

Before

Width:  |  Height:  |  Size: 406 KiB

After

Width:  |  Height:  |  Size: 406 KiB

View File

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 13 KiB

View File

Before

Width:  |  Height:  |  Size: 210 KiB

After

Width:  |  Height:  |  Size: 210 KiB

View File

@@ -0,0 +1,19 @@
-- Petit script pour faire office de crontab pour les mesures de température
print("\n 0_cron_temp.lua zf190728.1054 \n")
cron1=tmr.create()
cron1:alarm(10*1000, tmr.ALARM_AUTO, function()
get_temp()
end)
if zfield == 2 then
cron2=tmr.create()
cron2:alarm(20*1000, tmr.ALARM_AUTO, function()
print("cron2........................")
zurl=thingspeak_url.."field1="..tostring(ztemp1).."&field2="..tostring(ztemp2).."&field3="..tostring(ztemp3)
send_temp()
end)
end

View File

@@ -0,0 +1,34 @@
-- Lit le capteur de température solaire en fonction de son field qui se trouve dans les secrets !
print("\n 0_get_temp.lua zf190728.1014 \n")
-- lecture: https://thingspeak.com/channels/802784/private_show
-- source: https://nodemcu.readthedocs.io/en/master/modules/ds18b20/
local ow_pin = 3
ds18b20.setup(ow_pin)
function get_temp()
ds18b20.read(
function(ind,rom,res,temp,tdec,par)
print(ind, temp, zfield)
if zfield == 1 then
ztemp1 = temp
zurl=hub_url.."field1="..tostring(ztemp1)
send_temp()
elseif zfield == 2 then
ztemp2 = temp
elseif zfield == 3 then
ztemp3 = temp
zurl=hub_url.."field3="..tostring(ztemp3)
send_temp()
end
print(ztemp1, ztemp2, ztemp3)
end,{})
end
--[[
get_temp()
]]

View File

@@ -0,0 +1,25 @@
-- Petit script pour envoyer les valeurs de température sur un serveur WEB via un HTTP GET
print("\n 0_send_temp.lua zf190727.1331 \n")
function send_temp()
print("send_web_temp: ")
print(zurl)
http.get(zurl, nil, function(code, data)
-- print("toto")
if (code < 0) then
print("HTTP request failed")
print("zuzu", code, data)
else
print(code, data)
end
-- print("tutu")
end)
-- print("titi")
end
--[[
send_temp()
]]

View File

@@ -5,11 +5,12 @@
function secrets()
print("\n secrets_temp_zf_out_sud.lua zf190727.1006 \n")
cli_ssid=""
cli_pwd=""
cli_ssid="xxx"
cli_pwd="xxx"
thingspeak_url="http://api.thingspeak.com/update?api_key=xxx&"
hub_url="http://192.168.0.180/api_hub_temp.html?"
zfield=1 ou 2 ou 3 !
end
secrets()

View File

@@ -0,0 +1,23 @@
-- programme pour faire un test depuis de le webide
-- source: https://nodemcu.readthedocs.io/en/master/modules/ds18b20/
function a1()
print("\n a1.lua zf190601.1627 \n")
end
a1()
local ow_pin = 3
ds18b20.setup(ow_pin)
print("toto182538")
-- read all sensors and print all measurement results
ds18b20.read(
function(ind,rom,res,temp,tdec,par)
print(ind,string.format("%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X",string.match(rom,"(%d+):(%d+):(%d+):(%d+):(%d+):(%d+):(%d+):(%d+)")),res,temp,tdec,par)
end,{})
print("tutu152603")

View File

@@ -0,0 +1 @@
-- programme pour faire un test depuis de le webide

View File

@@ -0,0 +1 @@
-- programme pour faire un test depuis de le webide

View File

@@ -0,0 +1,30 @@
<!DOCTYPE html>
<html lang="fr" dir="ltr">
<head>
<meta charset='utf-8' name='viewport' content='width=device-width, initial-scale=1.0'>
<title>Affichage des températures</title>
</head>
<body>
<h1>Affichage des températures 190727.1349</h1>
<br>
Les températures mesurées sont:<br>
<%
if (ztemp1 ~= nil) then
zout("<br>Température intérieure chambre à coucher "..ztemp1.."°C")
end
if (ztemp2 ~= nil) then
zout("<br>Température extérieure sud (nodemcu 29) "..ztemp2.."°C")
end
if (ztemp3 ~= nil) then
zout("<br>Température extérieure nord (nodemcu 30) "..ztemp3.."°C")
end
zout("<br><br>RAM: "..node.heap().."<br>")
%>
</body>
</html>

View File

@@ -0,0 +1,39 @@
-- programme pour faire clignoter x fois une LED avec un rapport on/off
function flash_led_xfois()
print("\n flash_led_xfois.lua zf190601.1618 \n")
--zLED=0 --NodeMCU
zLED=4 --EPS-M3
zTm_On_LED = 50 --> en ms
zTm_Off_LED = 100 --> en ms
nbfois = 0
gpio.write(zLED, gpio.HIGH)
gpio.mode(zLED, gpio.OUTPUT)
ztmr_Flash_LED = tmr.create()
function blink_LED ()
if nbfois >= xfois then
-- print(nbfois)
nbfois = 0
else
if gpio.read(zLED)==gpio.HIGH then
gpio.write(zLED, gpio.LOW)
-- tmr.alarm(ztmr_Flash_LED, zTm_Off_LED, tmr.ALARM_SINGLE, blink_LED)
ztmr_Flash_LED:alarm(zTm_Off_LED, tmr.ALARM_SINGLE, blink_LED)
else
gpio.write(zLED, gpio.HIGH)
nbfois = nbfois+1
-- tmr.alarm(ztmr_Flash_LED, zTm_On_LED, tmr.ALARM_SINGLE, blink_LED)
ztmr_Flash_LED:alarm(zTm_On_LED, tmr.ALARM_SINGLE, blink_LED)
end
end
end
-- xfois =2
-- blink_LED ()
end

View File

@@ -0,0 +1 @@
-- programme pour faire un test depuis de le webide

View File

@@ -0,0 +1 @@
-- programme pour faire un test depuis de le webide

View File

@@ -0,0 +1 @@
-- programme pour faire un test depuis de le webide

View File

@@ -0,0 +1 @@
-- programme pour faire un test depuis de le webide

View File

@@ -0,0 +1,6 @@
-- Scripts pour afficher toutes les variables et fonctions en cours dans le système
print("\n a_tst_variable.lua zf190310.1525 \n")
for n in pairs (_G) do print(n) end

View File

@@ -0,0 +1,37 @@
-- Scripts juste pour allumer ou éteindre une LED sur un ruban RGB
-- tout sur la couleur: https://www.w3schools.com/colors/default.asp
-- roue des couleurs: https://iro.js.org/?ref=oldsite
print("\n led_rgb.lua zf190303.1436 \n")
nbleds=3
ws2812.init()
myLedStrip = ws2812.newBuffer(nbleds, 3)
function RGB_clear()
myLedStrip:fill(0, 0, 0) ws2812.write(myLedStrip)
end
function RGB_reform(R1, G1, B1) --conversion de RGB à BRG
rR1=B1 rG1=R1 rB1=G1
end
function zled_rgb(num_led, R1, G1, B1, zpower)
RGB_reform(R1, G1, B1)
myLedStrip:set(num_led, rR1*zpower, rG1*zpower, rB1*zpower)
ws2812.write(myLedStrip)
end
function zled_write()
ws2812.write(myLedStrip)
end
RGB_clear()
--[[
zled_rgb(1,255,0,0,1)
zled_rgb(2,0,255,0,1)
zled_rgb(2,0,255,0,0.05)
zled_rgb(3,0,0,255,1)
]]

Some files were not shown because too many files have changed in this diff Show More