From 6d34e6325be503115ac3de233a9d75427db1ff0f Mon Sep 17 00:00:00 2001 From: Christian Zufferey Date: Mon, 16 Sep 2019 19:57:45 +0200 Subject: [PATCH] =?UTF-8?q?Cette=20fois=20c'est=20bon=20j'ai=20une=20bonne?= =?UTF-8?q?=20mesure=20de=20la=20puissance.=20Me=20reste=20encore=20=C3=A0?= =?UTF-8?q?=20l'envoyer=20sur=20la=20DB=20InfluxDB=20;-)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Mesures/solar_pv_energy/0_get_data.lua | 33 ++++++---- .../0_get_data.lua.190916.1911 | 66 ------------------- Mesures/solar_pv_energy/README.md | 14 ++-- 3 files changed, 27 insertions(+), 86 deletions(-) delete mode 100644 Mesures/solar_pv_energy/0_get_data.lua.190916.1911 diff --git a/Mesures/solar_pv_energy/0_get_data.lua b/Mesures/solar_pv_energy/0_get_data.lua index a5a0a37..8312c0d 100644 --- a/Mesures/solar_pv_energy/0_get_data.lua +++ b/Mesures/solar_pv_energy/0_get_data.lua @@ -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 diff --git a/Mesures/solar_pv_energy/0_get_data.lua.190916.1911 b/Mesures/solar_pv_energy/0_get_data.lua.190916.1911 deleted file mode 100644 index c4fed64..0000000 --- a/Mesures/solar_pv_energy/0_get_data.lua.190916.1911 +++ /dev/null @@ -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 diff --git a/Mesures/solar_pv_energy/README.md b/Mesures/solar_pv_energy/README.md index abc5478..ea92231 100644 --- a/Mesures/solar_pv_energy/README.md +++ b/Mesures/solar_pv_energy/README.md @@ -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.
+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.
+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.
+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.5V), ce qui nous permet d'estimer une valeur RMS du courant 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* du transformateur de courant.
+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: