#picaxe 14M2
#no_data
symbol rang=b1
symbol Amp=b4; valeur courant (apres calcul) TIC,on utilise b2 et b3 pour la reception, b4 non utilise
symbol Papp=b9; indicateur puissance apparente (apres calcul) TIC, on utilise b5,b6,b7,b8 pour la reception
symbol boucles=b17; mot 8 bits nb boucles cumul energie;
symbol charge=b18; consigne niveau de charge par potentiometre
symbol cumul=w11; mot 16 bits cumul pour calcul energie
symbol puiss=w12;pour calcul puissance injectee
symbol pce=w13;valeur puissance chauffe-eau dans mot 16 bits (octets b0 et b1)
symbol infonuit=pinC.1 ;; test entree jour/nuit sur C.1
symbol creneau=pinC.2 ; test entree creneau horaire sur C.2 : contact ouvert >>entree etat bas = chauffe
high B.1; LED jaune eteinte
high B.3; LED rouge eteinte
init:
PWMOUT B.2,OFF;sortie pwm a l'arret
cumul=0 :boucles=0:pce=0
sertxd ("Version programme :2_3_outdata mod4",$0A,$0D)
jour:
do
if Infonuit = 0 then nuit ; test entree jour/nuit sur C.1
; test entree creneau horaire sur C.2 : contact ouvert >>entree etat bas = chauffe
if creneau = 0 then demchauff; dans creneau chauffage
pwmout B.2,OFF;arret chauffe
low B.1: low B.3; pour cligno des 2 led
pause 500
high B.1:High B.3
pause 500
pce=0; pour reprise ulterieure dans prochain creneau horaire valide
loop
;
demchauff:
SERIN [3000,norecep],C.0,T1200,($C9,$C9,$4E,$53,$D4,$A0),b2,b3,Amp;reception de la valeur
;intensite instantanee avec "qualifier" correspondant a l'etiquette IINST et space en
;tenant compte de la parite paire de la TIC.
;I en amperes, recue sur 3 caracteres en ascii unite en b4, dizaines en b3 (b2= centaines inutilisee)
;
high B.1; reset LED erreur com
low B.3; LED reception OK on
;
; on masque les 1/2 octets de poids fort >>> on ne garde que la valeur 0-9 en bin de chaque octet
b4=b4 and %00001111 ;
b3=b3 and %00001111 ;
b3= b3*10; b3 contient les dizaines ;<=> Amp=10*b3+Amp (à vérifier..)
Amp=Amp+b3; Amp contient la valeur globale intensite ;
sertxd ("Intensite lue TIC = ",#Amp," A ",$0A,$0D); emission intensite lue en provenance de la TIC
;
SERIN [3000,norecep],C.0,T1200,($50,$41,$50,$50,$A0),b5,b6,b7,b8,Papp; reception de la valeur
;de P apparente avec "qualifier" correspondant a l'etiquette "PAPP" et "space" et tenant compte
;de la parite paire de la TIC.
;P apparente en VA,recue sur 5 caract.si P=0 tous les caracteres sont a 0 ascii >>> en injection
;
high B.3; LED reception OK off (pour cligno ...)
;
; on masque les 1/2 octets de poids fort >>> on ne garde que la valeur 0-9 en bin de chaque octet
b5=b5 and %00001111
b6=b6 and %00001111
b7=b7 and %00001111
b8=b8 and %00001111
Papp= Papp and %00001111
Papp=Papp+b8+b7+b6+b5; somme de toutes les valeurs
if Papp<>0 then
rang=0
elseif Amp>=3 then
rang=1
elseif Amp<2 then
rang=2
endif
on rang gosub dim,aug,Diminj ;retour après le on gosub
; intensite dispo =2A, on ne change pas la puissance
PWMOUT PWMDIV4,B.2,249,pce; ecriture puissance
; emission valeur % puissance CE
puiss=pce:puiss=puiss/9; mise a l'echelle
sertxd ("Niveau commande chauffe eau = ",#puiss,"%",$0A,$0D) ;
gosub energie; calcul energie
readadc B.5,charge; lecture consigne charge
if boucles >= charge then goto finchauff; on est arrive a la consigne de chauffe
;
goto jour; nouvelle boucle
;____________________________________________________________________________
;Fin de chauffe en journee, on attend le passage nuit, puis le retour en jour
;pour nouveau cycle
;____________________________________________________________________________
finchauff:
pwmout B.2,OFF;sortie pwm a l'arret
low B.3; LED reception OK en permanent indique fin de chauffe;
do ; attente passage en nuit
pause 1000
loop while infonuit=1
do
pause 1000
loop while infonuit=0 ;attente passage en jour
high B.3
goto init
;____________________________________
;Chauffe et/ou fin de chauffe en nuit
;____________________________________
nuit: ;
do
if infonuit=1 then jour ; entree en mode jour
; test de l'entree nuit (cas de coupure de tension et d'init calybox en jour)
readadc B.5,charge; lecture consigne charge
IF boucles>= charge then goto finnuit; test energie totale envoyee(en journee et ou nuit en cours)
pause 900; pause totale env. 1,85s pour sp calcul energie, equivalent a une boucle TIC en journee
low B.1; cligno led rouge,indique chauffe nuit en cours
pause 900
high B.1
pce=900; puissance chauffe au maxi
PWMOUT PWMDIV4,B.2,249,pce
gosub energie; calcul energie
loop
finnuit:
PWMOUT B.2,OFF; pwm a l'arret
low B.3; LED jaune "reception OK" on permanent indique fin de chauffe
high B.3
do
pause 1000
loop while infonuit=0
goto init
;
;______________________________________________________________________________
; S/P augmentation de puissance en fonction de I dispo et du niveau en cours
; La variable Amp contient la derniere valeur de courant lue depuis la TIC
; A la sortie,la variable PCE contient la valeur puissance pour le PWM
;______________________________________________________________________________
Aug:
if amp >= 7 and pce < 800 then
pce=pce + 100
elseif amp >= 6 and pce <850 then
pce =pce+ 50
elseif amp>=5 and pce< 860 then
pce =pce + 40
elseif amp >=4 and pce < 870 then
pce =pce +30
elseif amp>=3 and pce <890 then
pce=pce+10
elseif pce < 900 then
pce=pce+5
endif
return
;;
;______________________________________________________________________________________
;S/P diminution de puissance en fonction du niveau de I en cours en injection (0 ou 1A)
; La variable Amp contient la derniere valeur de courant lue depuis la TIC
;______________________________________________________________________________________
;
diminj:
if amp=0 and pce >= 20 then
pce=pce-20
elseif amp> 0 and pce >= 10 then
pce=pce-10
elseif amp > 0 and pce >= 5 then
pce=pce-5
elseif amp > 0 then
pce=0
endif
return
;;___________________________________________________________________________________
; S/P diminution de puissance en fonction de I soutiree (P apparente non nulle)et/ou
; du niveau en cours
; La variable Amp contient la derniere valeur de courant lue depuis la TIC
; A la sortie,la variable PCE contient la valeur puissance pour le PWM
;___________________________________________________________________________________
Dim:
if amp>=7 and pce>=400 then
pce=pce-400
elseif amp>=6 and pce>=200 then
pce=pce-200
elseif amp>=5 and pce >=100 then
pce=pce-100
elseif amp>=4 and pce>=50 then
pce=pce-50
elseif amp>=3 and pce>=30 then
pce=pce-30
elseif pce>=5 then
pce=pce-5
endif
return
;;__________________________________________________________________________________________________
;S/P cumul pour calcul energie
;
;Evaluation puissance injectee dans le CE : PCE est la valeur de commande du gradateur via le PWM et
;en consequence une image approximative de la valeur de la tension appliquee au CE
;Pour PCE = 100 a 900, le calcul de puissance donne = 10 a 810
;__________________________________________________________________________________________________
energie: ;
; Emission valeur energie atteinte (en 1/100 heure equivalent pleine puissance)
; On emploie le mot puiss et les octets b5, b6, b7 utilises pour la reception TIC
; pour la conversion afin de mettre une virgule entre les digits ;
puiss = boucles
puiss = puiss*100/51; mise a l'echelle (boucles = 51 pour 1H pleine puissance)
BINTOascii puiss,b5,b6,b7
sertxd ("Temps chauffe equivalent pleine puissance = ",b5,",",b6,b7," H",$0A,$0D) ;
if pce>=100 then
; on ne fait rien si pce<100, la conduction du gradateur est negligeable
puiss=pce: puiss=puiss/10; mise a l'echelle
puiss=puiss*puiss; mise au carre
puiss=puiss/10; mise a l'echelle
cumul=cumul+puiss
if cumul >= 32670 then ;
boucles=boucles+1
cumul=0
endif
endif
return
;;
norecep:
sertxd ("Erreur communication avec Linky",$0A,$0D)
low B.1; allumage voyant erreur pas de reception
PWMOUT B.2,OFF;arret ou confirmation arret pwm
goto jour
end