Cette fois c'est bon j'ai une bonne mesure de la puissance. Me reste encore à l'envoyer sur la DB InfluxDB ;-)

This commit is contained in:
Christian Zufferey
2019-09-16 19:57:45 +02:00
parent 8d7fb39c46
commit 6d34e6325b
3 changed files with 27 additions and 86 deletions

View File

@@ -1,25 +1,29 @@
-- Lit le convertisseur ADC connecté sur le transformateur de courant
-- pour mesurer le courant électrique de l'installation PV
print("\n 0_get_data.lua zf190916.1925 \n")
print("\n 0_get_data.lua zf190916.1945 \n")
-- Astuce de mesure:
-- au lieu de découper la sinusoïde en 100 parties, c'est à dire toutes
-- On converti le courant en tension avec la résistance de charge du
-- transformateur de courant 1/800 et le mesure avec l'ADC
-- Au lieu de découper la sinusoïde en 100 parties, c'est à dire toutes
-- les 0.2ms (5'000x /s), pour en faire l'intégrale. On lit l'adc toutes
-- les 11ms (91x /s) beaucoup plus lentement.
-- les 11ms (91x /s) donc beaucoup plus lentement.
-- Comme la sinusoïde fait 20ms et est répétitive, on balaye (par décalage)
-- statistiquement la sinusoïde.
-- On redresse l'alternance par rapport à la masse fictive (env 0.5),
-- ce qui nous permet d'estimer une valeur RMS du courant
-- quelque soit sa forme !
-- On le somme sur 2.1 secondes avec une moyenne glissante sur 3 valeurs
-- quelque soit sa forme et on le somme sur 2.1 secondes
-- Les mesures min et max ne sont là juste pour vérifier que nous sommes
-- bien dans la plage de mesure avec le choix de la résistance de conversion
-- la conversion courant/tension/puissance est faite avec une simple régle de 3
zpow_cal=401 --puissance mesurée de la charge étalon
zadc_cal=189 --valeur de l'adc pour zpow_cal
zadc_offset=548
zpow_cal=401
zadc_cal=189
zadc_err=-5
zadc_sum=0 zadc_offset_sum=0 znb_mes=0
zadc_rms1=0 zadc_rms2=0 zadc_rms3=0
zadc_min=zadc_offset zadc_max=zadc_offset
if adc.force_init_mode(adc.INIT_ADC)
then
@@ -39,19 +43,20 @@ end)
function read_adc()
zadc=adc.read(0)
if zadc<=zadc_min then zadc_min=zadc end
if zadc>=zadc_max then zadc_max=zadc end
zadc_offset_sum=zadc_offset_sum+zadc
zadc=zadc-zadc_offset if zadc<=0 then zadc=zadc*-1 end
zadc_sum=zadc_sum+zadc znb_mes=znb_mes+1
end
function calc_rms()
zadc_rms=math.floor(zadc_sum/znb_mes)+zadc_err
if zadc_rms<=0 then zadc_rms=0 end
-- zadc_rms1=zadc_rms2 zadc_rms2=zadc_rms3 zadc_rms3=zadc_rms
-- zadc_rms=math.floor((zadc_rms1+zadc_rms2+zadc_rms3)/3)
zadc_rms=math.floor(zadc_sum/znb_mes)
if zadc_rms<=8 then zadc_rms=0 end
zadc_offset=math.floor(zadc_offset_sum/znb_mes)
zpower=math.floor(zadc_rms*zpow_cal/zadc_cal)
print(zadc_offset,zadc_rms,zpower.."W")
print(zadc_min,zadc_max,zadc_max-zadc_min,zadc_offset,zadc_rms,zpower.."W")
zadc_min=zadc_offset zadc_max=zadc_offset
zadc_sum=0 zadc_offset_sum=0 znb_mes=0
zadc_min=zadc_offset zadc_max=zadc_offset
end

View File

@@ -1,66 +0,0 @@
-- Lit le convertisseur ADC connecté sur le transformateur de courant
-- pour mesurer le courant électrique de l'installation PV
print("\n 0_get_data.lua zf190916.1904 \n")
-- Astuce de mesure:
-- au lieu de découper la sinusoïde en 100 parties, c'est à dire toutes
-- les 0.2ms (5'000x /s), pour en faire l'intégrale. On lit l'adc toutes
-- les 11ms (91x /s) beaucoup plus lentement.
-- Comme la sinusoïde fait 20ms et est répétitive, on balaye (par décalage)
-- statistiquement la sinusoïde.
-- On redresse l'alternance par rapport à la masse fictive (env 0.5),
-- ce qui nous permet d'estimer une valeur RMS du courant
-- quelque soit sa forme !
-- On le somme sur 2.1 secondes avec une moyenne glissante sur 3 valeurs
zadc_offset=550
zpow_cal=401
zadc_cal=189
zadc_err=-5
zadc_min=zadc_offset zadc_max=zadc_offset
zadc_sum=0 zadc_min_sum=0 zadc_max_sum=0 znb_mes=0
zadc_rms1=0 zadc_rms2=0 zadc_rms3=0
if adc.force_init_mode(adc.INIT_ADC)
then
node.restart()
return
end
tmr_read_adc=tmr.create()
tmr_read_adc:alarm(11, tmr.ALARM_AUTO, function()
read_adc()
end)
tmr_calc_rms=tmr.create()
tmr_calc_rms:alarm(2.1*1000, tmr.ALARM_AUTO, function()
calc_rms()
end)
function read_adc()
zadc=adc.read(0)
if zadc<=zadc_min then zadc_min=zadc end
if zadc>=zadc_max then zadc_max=zadc end
zadc_min_sum=zadc_min_sum+zadc_min
zadc_max_sum=zadc_max_sum+zadc_max
zadc=zadc-zadc_offset if zadc<=0 then zadc=zadc*-1 end
zadc_sum=zadc_sum+zadc znb_mes=znb_mes+1
end
function calc_rms()
zadc_rms=math.floor(zadc_sum/znb_mes)+zadc_err
if zadc_rms<=0 then zadc_rms=0 end
zadc_rms1=zadc_rms2 zadc_rms2=zadc_rms3 zadc_rms3=zadc_rms
zadc_rms=math.floor((zadc_rms1+zadc_rms2+zadc_rms3)/3)
zadc_min=math.floor(zadc_min_sum/znb_mes)
zadc_max=math.floor(zadc_max_sum/znb_mes)
zadc_offset=math.floor((zadc_min+zadc_max)/2)
zpower=math.floor(zadc_rms*zpow_cal/zadc_cal)
print(zadc_min,zadc_max,zadc_max-zadc_min,zadc_offset,zadc_rms,zpower.."W")
zadc_min=zadc_offset zadc_max=zadc_offset
zadc_sum=0 zadc_min_sum=0 zadc_max_sum=0 znb_mes=0
end

View File

@@ -37,11 +37,13 @@ Toutes les fonctions sont bien séparées dans des scripts, ce qui facilite la p
## Astuces de mesures
Dans ce projet il y a 1x NodeMCU qui mesure la production électrique de mon installation solaire PV. On mesure le courant injecté dans le réseau électrique de la maison avec un petit transformateur de courant 1/800 *clipsé* sur la phase de l'onduleur.
Comme le convertisseur ADC du NodeMCU ne peut mesurer que des valeurs positives comprises entre 0V et 1V, on ajoute une masse fictive au signal du transformateur de courant de 0.5V afin de *remonter* l'alternance négative.
De plus, on lit l'ADC toutes les 11ms, soit 91x par seconde. Comme l'alternance fait 20ms, on balaye (déphasage) statistiquement l'alternance. On redresse l'alternance négative par rapport à la masse fictive, ce qui nous permet de mesurer une valeur RMS du courant quelque soit sa forme !
On le fait toutes les 2.1 secondes avec une moyenne glissante sur 3 valeurs.
Le calcul de la puissance mesurée est très simpliste, un simple ```P=U*I```. On ne tient pas compte ici du ```cos(phy)`` qui pourrait varier en fonction des charges inductives dans la maison !
Dans ce projet il y a 1x NodeMCU qui mesure la production électrique de mon installation solaire PV. On mesure le courant injecté dans le réseau électrique de la maison avec un petit transformateur de courant 1/800 *clipsé* sur la phase de l'onduleur.<br>
Comme le convertisseur ADC du NodeMCU ne peut mesurer que des valeurs positives comprises entre 0V et 1V, on ajoute une masse *fictive* au signal du transformateur de courant de 0.5V afin de *remonter* l'alternance négative.<br>
Au lieu de *découper* la sinusoïde en 100 *parties*, c'est à dire toutes les 0.2ms (5'000x /s), pour en faire l'intégrale. On lit l'ADC toutes les 11ms (91x /s) donc beaucoup plus lentement.<br>
Comme la sinusoïde fait 20ms et est *répétitive*, on balaye (par *décalage*) statistiquement la sinusoïde.<br>
On *redresse* l'alternance par rapport à la masse fictive (env 0.5V), ce qui nous permet d'estimer une valeur RMS du courant quelque soit sa forme et on le somme sur 2.1 secondes.<br>
Les mesures min et max ne sont là juste pour vérifier que nous sommes bien dans la plage de mesure avec le choix de la résistance de *conversion* du transformateur de courant.<br>
Le calcul de la puissance mesurée est très simpliste, un simple ```P=U*I```. On ne tient pas compte ici du ```cos(phy)``` qui pourrait varier en fonction des charges inductives dans la maison !
@@ -133,7 +135,7 @@ Seulement la corrélation entre les trois température
https://thingspeak.com/apps/plugins/300559
zf190909.0119
zf190916.1957
pense bête: