Gestion d'un terrarium

guil

New Member
Bonjour,

Comme je vous l’avais indiqué dans un précédent post, afin de me familiariser avec les picaxe, j’ai choisis une application de gestion de terrarium. Ce petit développement a pour objectif de me former aux picaxe et aux différents capteurs. Les capteurs choisis sont ceux pour lesquels j’ai trouvé des exemples sur le site electromag1 dont je m’inspire beaucoup (pour ne pas dire que je copie ! ! !) Le forum est aussi une source d’info incontournable.

Un petit Cahier des charges :
- Gestion de l’éclairage avec heure de début et heure de fin
- Gestion de la température d’un tapis chauffant avec heure de début, heure de fin et consigne de température pendant la plage horaire de fonctionnement
- Gestion de la Température ambiante avec heure de début, heure de fin et consigne de température pendant la plage horaire de fonctionnement
- Mesure de l’humidité

- Option (pour plus tard si besoin) :
- Gestion d’un humidificateur.
- Gestion d’un éclairage progressif à LED
- Gestion de la durée d’éclairage en fonction de l’éclairage ambiant (adaptation utile en particulier en été si le terrarium peut bénéficier de la lumière du jour)
Le matériel retenu :
- Afficheur 2004 en I2C (avec module PCF8574) avec affichage de la date, de l’heure, des 2 températures et du niveau d’hygrométrie
- Capteur température hygrométrie DHT22
- Capteur de température pour la mesure au sol, type DS18B20
La saisie des paramètres ci-dessus se fera avec le même principe que la mise à l’heure de l’horloge temps réel DS 1307(voir electromag1)

J'aurai souhaité vous soumettre, pour l’instant uniquement le code car je n’ai pas encore mis au propre le schéma et je n’ai pas non plus fait de cuivre pour ce montage, mais avec le code est 3 fois trop gros pour être intégré dans le message.
Le picaxe utilisé est un 20X2. L’alimentation de ce montage sera faite avec un chargeur de téléphone acheté sur le Net pour quelques euros. Les sorites pour commander les chauffages et l’éclairage commanderont chacune un relais statique Omron trouvé lui aussi sur le net pour un prix dérisoire avec un petit transistor pour ne pas « cramer » les sorties du picaxe.

Le programme que j'aurai souhaité vous joindre est quasi au maxi des possibilité de mon 20x2 avec environ 3500 byte utilisés sur les 4096 possibles et l’utilisation de la totalité des variables, ce qui laisse peu de possibilité pour les évolutions. Il y a surement quelques mises au propre et optimisations du programme à réaliser permettant de « récupérer quelques variables ».
Un petit souci que je vous soumets dans le fonctionnement du programme, j’ai ajouté une ligne de test pour m’assurer que les variables température et humidité ne sont pas à 0 pour rafraichir l’affichage, sans cette ligne toute les données de la DHT22 passe par 0 avant de prendre leur valeur et cela provoque un clignotement des valeurs affichées, ce qui est désagréable.
Autre remarque l'écriture des 40 bits de la sonde DHT22 dans le scratchpad prend près de 2s ce qui perturbe l'affichage des seconde sur l'afficheur, une solution consiste a supprimer les secondes de l'affichage ! !
Aujourd’hui, par faute de variable, je n’ai pas traité les valeurs de temp négative, pas très utile dans le cadre de mon application ainsi que l’octet de verif CHK de la sonde DHT22. Ce dernier point ainsi que mon test sur la température et de l’humidité pour l’affichage ne me permettrons pas d’agir en cas de CHK non conforme.

Le code est environ 3 fois trop gros pour être inséré dans mon message, s'il y a une autre possibilité, je suis preneur pour pouvoir vous le soumettre.

Je pense avoir été assez long sur mon projet et je reste bien sûr à disposition pour tout renseignement complémentaire et à l’écoute de toute suggestion.

Cordialement
 

BESQUEUT

Senior Member
Bonjour,

Quelques points "implicites" (pas clairement indiqués dans le "cahier des charges") :
- il n'y a pas un mais deux chauffages et donc deux sondes de température.

Pourquoi chaque chauffage n'est-il actif que pendant une plage horaire spécifique ?
Pour l'éclairage, ça se comprends, mais pour le chauffage ? Est-ce un arrêt complet, ou des consignes différentes entre jour et nuit ?

Un relais statique est vu par le Picaxe comme une simple LED : donc le transistor est inutile, mais une résistance ad-hoc indispensable.

J'ai bien compris que le projet est à budget minimum ; cela dit pour 5€ de plus un 28X2 (ou un 40 au même prix) dispose de 4 fois plus de programme et de deux fois plus de mémoire...

Pour le reste, il faudrait voir le code. Je suggère de poster ça en deux ou trois fois... (début, suite et fin...)
 
Last edited:

guil

New Member
Bonjour,

Merci pour vos commentaires,
- effectivement il y a deux chauffage, un chauffage d'ambiance et un tapis chauffant au sol
- Pour le chauffage il y a une période de chauffe afin d'imiter le cycle jour / nuit
- Pour le remais statique effectivement le transistor n'est pas indispensable, les relais OMRON étant en fait des opto-triacs
- Quand au choix du picaxe, c'est simplement que pour debuter, j'ai acheté seulement un 08M2 et un 20x2, mais en cas de nécessité, je changerai de modèle.

Je vais mettre le code en 3 ou 4 fois comme vous me l'avez suggéré.

Cordialement
 

guil

New Member
Bonjour

Début du code

Code:
 '    ########################
 '    #  GESTION  TERRARIUM  #
 '    ########################
 ' Guillaume 2016 02 03
 '****************************************************************************
 'Cdc : 	Gestion periode d'eclairage
 '		Gestion periode de mise en route du chauffage
 '		Gestion de la temperature ambiante T1
 '		Gestion de la remperature au sol T2 (chauffage au sol independant)
 '		Affichage normal :date, heure, valeur T1, valeur T2, valeur humidite
 '		Visualisation les parametres sur appui bouton valid
 '			Heure debut et fin eclairage
 '			Heure debut et fin de chauffage
 '			Consigne chauffage T1 et T2
 '		Saisies des parametres horloges DS1307 sur appui simultane des boutons inc et valid a la mise sous tension
 '		Saisie des parametres eclairage et chauffage
 '			Heure debut et fin eclairage
 '			Heure debut et fin de chauffage
 '			Consigne chauffage T1 et T2
 '***************************************************************************
 ' Pour PICAXE-20x2,  
 ' Horloge MAXIM DS1307 RTC en I2C
 ' Affichage des donnees sur LCD I2C  avec expandeur de bit type PCF8574
 ' Gestion chauffage et humidite DHT22
 	  'CHK pas traite par manque de variable
	  'Temperature negative pas traite par manque de Variable et inutile pour un terrarium
 ' Gestion chauffage tapis de sol DS18B20
 	  'Temperature negative pas traite par manque de Variable et inutile pour un terrarium
 
  #picaxe 20X2   'type de picaxe
  setfreq m64    'frequence horloge
  
'***** Nomination des ports *********
  symbol increm  = pinC.4 	'poussoir incrementation
  symbol valid  = pinC.3 	'poussoir validation 
  symbol ds18b20=pinC.2
  symbol eclairage  = pinB.2 	'sortie eclairage
  symbol Chauff1  = pinB.3 	'sortie chauffage ambiant T1
  symbol Chauff2  = pinB.4 	'sortie chauffage tapis T2
  symbol DHT = C.6 	'lecture DHT22
  symbol STT = C.0 	'impulsion start DHT22
 '***** Nomination des variables pour afficheur ***********
  symbol rsbit =bit0
  symbol periodchauff =bit2 	'bit indiquant la periode de chauffage
  symbol cpt =b12
  symbol car =b13
  symbol dat =b14
  symbol col =b15 	'n colonne
  symbol tpsdeb =w17 	'heure debut en mn
  symbol tps =w18 	'heure en mn
  symbol tpsfin =w19 	'heure fin en mn
 '***** Nomination des variables pour RTC DS1307 ***********
  symbol ch  =b1 		'chiffre unite pour calcul
  symbol dch  =b2 	'chiffre diz
  symbol cch  =b3 	'chiffre centaine
  symbol minch =b4 	'chiffre mini
  symbol maxch =b5 	'chiffre maxi
  symbol varb  =b6 	'temporaire byte
  symbol jour  =b7	'jour
  symbol mois  =b8  	'mois 
  symbol heure =b9	'heure
  symbol minut =b10	'minute
  symbol second =b11 	'seconde
  symbol an    =b16  	'annee
  symbol varw  =b17 	'temporaire 
  symbol joursem =w9 	'jour de semaine calcul (pourrait etre un b)
 '***** Variable eclairage *****
  symbol heurede =b20 	'heure debut eclairage
  symbol minutde =b21 	'minute debut eclairage
  symbol heurefe =b22 	'heure fin eclairage
  symbol minutfe =b23 	'minute debut eclairage
 '***** Variable horaire chauffage******     
  symbol heuredt =b24 	'heure debut chauffage
  symbol minutdt =b25 	'minute debut chauffage
  symbol heureft =b26 	'heure fin de chauffage
  symbol minutft =b27 	'minute fin de chauffage
 '***** variable temperature ambiante T1 *****
 '**** DHT 22 *****
  symbol HRE =b28 		'HR partie entiere
  symbol HRD =b29 		'HR partie decimale
  symbol TPE =b30 		'Temp partie entiere
  symbol TPD =b31 		'Temp partie decimale
  symbol bit_num =b32 	'numero lecture bit DHT22
 ' symbol NEGT =b33 	'Temp negative (bitpoids fort=1)
  symbol HR =w23 		'total HR DHT22
  symbol ConsT1 =w24 	'consigne T1
  symbol T1 =w25 		'temeprature  TP DHT22
 '***** variable temperature tapis T2 *****
 '**** DS18B20 ****
  symbol ConsT2 =w26 	'consigne T2
  symbol T2 =w27 		'lecture temparature DS18B20
  symbol valeur =w22 	'valeur de la DS18B20
  
  symbol var1 =w20  	'variable pour calcul
  symbol var2 =w21 	'variable pour calcul
 '*************************************************
 'Initialisation Afficheur I2C 4 bits %01001110 est l'adresse i2c
     hi2csetup i2cmaster,%01001110, i2cslow, i2cbyte        
 'Initialisation DS1307  I2C %11010000 est l'adresse i2c 
     hi2csetup i2cmaster, %11010000, i2cslow, i2cbyte
 
 '*** Initialisation LCD ********* 
     for cpt=0 to 5
         lookup cpt,($33,$32,$28,$c,$6,$01),car
         Gosub EnvoiByteCommInit
     next
     pause 200   'temps init du LCD
 '************************************************* 
 
 if  valid =1 and increm =1 then gosub intDS1307  'mise sous tension avec les 2 boiutons appuyes =>parametrage horloge independant car les donnees sont sauvegardees par la batterie de la DS1307 et ne sont pas a remettre a jour en cas de coupure de courant
 if valid=1  then gosub init 'Mise sous tension avec le bouton init appuye => vers macro saisie des parametres eclairage et chauffage
  
 Do   'boucle principale 
	 
if valid=1 then Gosub visuparam	'macro de visualisation des parametres	 
 
	'Affichage info RTC DS 1307
   hi2cin [%11010000], 3,(varb)  'jour de semaine lu dans le registre 3      
  bcdtoascii varb,dch,ch  	'DS1307 les donnees sont au format BCD
      
     car= 131	 	'Position curseur
     gosub EnvoiByteComm  
    for cpt=0 to 2
     if  ch="1" then lookup cpt,("Dim"),car 'affichage du jour de la semaine
  elseif ch="2" then lookup cpt,("Lun"),car
  elseif ch="3" then lookup cpt,("Mar"),car
  elseif ch="4" then lookup cpt,("Mer"),car
  elseif ch="5" then lookup cpt,("Jeu"),car
  elseif ch="6" then lookup cpt,("Ven"),car
  elseif ch="7" then lookup cpt,("Sam"),car
  endif 
       Gosub EnvoiByteData    
     next    
    
  hi2cin [%11010000], 4,(jour)    'jour lu dans le registre 4
  	bcdtoascii jour,dch,ch 
   car= 135	 	'Position curseur
     Gosub EnvoiByteComm    
   for cpt=0 to 2
     lookup cpt,(dch,ch,"/"),car
     Gosub EnvoiByteData    
     next    
  hi2cin [%11010000], 5,(mois)    'mois lu dans le registre 5
  	bcdtoascii mois,dch,ch
   car= 138	 	'Position curseur
     Gosub EnvoiByteComm 
   for cpt=0 to 2
     lookup cpt,(dch,ch,"/"),car
     Gosub EnvoiByteData    
     next    
  hi2cin [%11010000],6,(an)    	'annee lu dans le registre 6. 
  	bcdtoascii an,dch,ch
  car= 141	 	'Position curseur
     Gosub EnvoiByteComm 
  for cpt=0 to 3	
     lookup cpt,("20",dch,ch),car
     Gosub EnvoiByteData    
     next    
 hi2cin [%11010000], 2,(heure)    'heure lu dans le registre 2
  	bcdtoascii heure,dch,ch
  car= 198	 	'Position curseur
     Gosub EnvoiByteComm 
  for cpt=0 to 1
     lookup cpt,(dch,ch),car
     Gosub EnvoiByteData    
     next    
  hi2cin [%11010000], 1,(minut)    'Minute lu dans le registre  1
  	bcdtoascii minut,dch,ch
   for cpt=0 to 2
     lookup cpt,(":",dch,ch),car
     Gosub EnvoiByteData    
     next    
  hi2cin [%11010000], 0,(second)    'Seconde lu dans le registre  0
  	bcdtoascii second,dch,ch
  for cpt=0 to 2
     lookup cpt,(":",dch,ch),car
     Gosub EnvoiByteData    
     next  

'**************************
'***** gestion dht22 ******
'**************************
setfreq m64 'selection frequence
ptr=0 'scrachpad 20X2
high STT
pulsout STT,32000 'Signal start _/ >18ms
'64MHz 0.625us unit ->20ms ->32000
pulsin DHT,0,@ptrinc 'reponse DHT _/ 80?s puis /? 80?s
'En fait, on attend le 1er bit de donnee
'****** Enregistrement des 40 bits data dans le scratchpad ***
'*******HR 1 a 8 + 9 a 16, T 17 a 24 + 25 a 32 CHK 33 a 40 (CHK pas traite par manque de variable)

pulsin DHT,0,@ptrinc 'HR 1
pulsin DHT,0,@ptrinc
pulsin DHT,0,@ptrinc
pulsin DHT,0,@ptrinc
pulsin DHT,0,@ptrinc
pulsin DHT,0,@ptrinc
pulsin DHT,0,@ptrinc
pulsin DHT,0,@ptrinc 'HR 8

pulsin DHT,0,@ptrinc 'HR 9
pulsin DHT,0,@ptrinc
pulsin DHT,0,@ptrinc
pulsin DHT,0,@ptrinc
pulsin DHT,0,@ptrinc
pulsin DHT,0,@ptrinc
pulsin DHT,0,@ptrinc
pulsin DHT,0,@ptrinc 'fin HR 16

pulsin DHT,0,@ptrinc 'T 17
pulsin DHT,0,@ptrinc
pulsin DHT,0,@ptrinc
pulsin DHT,0,@ptrinc
pulsin DHT,0,@ptrinc
pulsin DHT,0,@ptrinc
pulsin DHT,0,@ptrinc
pulsin DHT,0,@ptrinc 'T 24

pulsin DHT,0,@ptrinc 'T 25
pulsin DHT,0,@ptrinc
pulsin DHT,0,@ptrinc
pulsin DHT,0,@ptrinc
pulsin DHT,0,@ptrinc
pulsin DHT,0,@ptrinc
pulsin DHT,0,@ptrinc
pulsin DHT,0,@ptrinc 'fin T 32

'****** Restitution des 4 octets HRE, HRD, PTE et TPD *******
HRE=0 'octet "entier" HR
for ptr = 1 to 8 'lecture bit 1 a 8
bit_num = 8 - ptr 'position bit dans octet
if @ptr > 60 then
setbit HRE,bit_num 'bit long=1
endif
next

HRD=0 'octet "decimal" HR
for ptr = 9 to 16 'lecture bit 9 a 16
bit_num = 16 - ptr 'position bit dans octet
if @ptr > 60 then
setbit HRD,bit_num 'bit long=1
endif
next

HR=HRE*256+HRD 'reconstitution valeur totale Humidite
'HR=HR-100 'correction hygrom?trie: mettre la valeur en % (ajustez suivant sonde)

TPE=0 'octet "entier" Temperature
for ptr=17 to 24 '3eme octet
bit_num = 24 - ptr 'lecture bit 17 a 24
if @ptr > 60 then '
setbit TPE,bit_num
endif
next

TPD=0 'octet "decimal" Temperature
for ptr=25 to 32 '4eme octet
bit_num = 32 - ptr 'lecture bit 25 a 32
if @ptr > 60 then
setbit TPD,bit_num
endif
next

T1=TPE*256+TPD 'reconstitution valeur totale Temperature
'T1=T1-12 'correction de temperature: mettre la valeur en 1/10 de degre(
 

guil

New Member
Bonjour,

Suite du code
Code:
'*******************************************
'**** gestion sonde temperature DS18B20 ****
'*******************************************
 readtemp12 C.2,valeur   'lecture temperature
   
     w20=valeur/16       'entiers=les 3 premiers octets
     w21=valeur//16      'decimale = le dernier octet: 0.0625 x w21
     w21=625*W21/1000    'reste une d?cimale
     T2=w20*10+w21       'recomposition T en /10 de degres 
     
'T2=T2-12 'correction de temperature: mettre la valeur en 1/10 de degre(ajustez suivant sonde)

'******************************************************
'***** gestion des sorties eclairage et chauffage *****
'******************************************************
  tps = heure*60+minut 'converti les heures en minute pour calcul de periode eclairage et chauffage
'***** Eclairage ******
  tpsdeb = heurede*60+minutde 'converti le temps en minute pour calcul de periode eclairage
  tpsfin = heurefe*60+minutfe 'converti le temps en minute pour calcul de periode eclairage
'Periode eclairage
if tpsdeb <= tps  and tps  <= tpsfin   then 'periode d'eclairage 
	  	high B.2
      else 	low  B.2
end if
'****** chauffage  *******
'*** Periode de chauffage ***
  tpsdeb = heuredt*60+minutdt 'converti le temps en minute
  tpsfin = heureft*60+minutft 'converti le temps en minute

if tpsdeb <= tps  and tps  <= tpsfin   then 'periode de chauffage 
             periodchauff = 1
      else 	 periodchauff = 0
end if
'*** regulation  chauffage ambient T1 ***
if T1 = 0 then goto finregtemp 'pour eviter le clignotement de la sortie lors du passage par 0 des variables DHT22
 if T1 < consT1 and periodchauff = 1  then 'temperature T1 < consigne pendant la periode de chauffage
	high b.3
      else low B.3 
end if 
'*** regulation  chauffage tapis de sol T2 ***
if T2 = 0 then goto finregtemp 'pour eviter le clignotement de la sortie
 if T2 < consT2 and periodchauff = 1  then 'temperature T2 < consigne pendant la periode de chauffage
	high b.4
      else low B.4 
end if 
finregtemp:

'**************************************************
'***** Affichage info temperature et humidite *****
 if T1= 0 or HR=0  then goto finaffichage 'test pour eviter clignotement de l'affichage lors du passage par 0 des variable dans "dht22"

car= 148	 	'Position curseur
     Gosub EnvoiByteComm
    		bintoascii T1,cch,dch,ch 'conversion pour affichage
     for cpt=0 to 8
     if pinB.3=1 then 'affichage du * pour visualiser la sortie chauffage T1
	     lookup cpt,("*T1=",cch,dch,",",ch,$df),car '$dF est le carre degre
     else  lookup cpt,(" T1=",cch,dch,",",ch,$df),car '$dF est le carre degre
	endif
     Gosub EnvoiByteData    
     next 
car= 159	 	'Position curseur
     Gosub EnvoiByteComm
            bintoascii T2,cch,dch,ch 'conversion pour affichage
     for cpt=0 to 8
	
     if pinB.4=1 then	'affichage du * pour visualiser la sortie chauffage T2
	     lookup cpt,("*T2=",cch,dch,",",ch,$df),car '$dF est le carre degre
     else  lookup cpt,(" T2=",cch,dch,",",ch,$df),car '$dF est le carre degre
     endif
     Gosub EnvoiByteData    
     next 

'****** Affichage info humidite ******
car= 218	 	'Position curseur
     Gosub EnvoiByteComm  
 	bintoascii hr,cch,dch,ch 'conversion pour affichage
     for cpt=0 to 8
     lookup cpt,("Hum=",cch,dch,",",ch,"%"),car
     Gosub EnvoiByteData    
     next 
 finaffichage:

loop   'fin boucle principale
end
Cordialement
 

guil

New Member
Bonjour,

Suite 2 du code

Code:
'#####################################################################
visuparam:

Gosub effaceecran

debut:
car= 130	 	'Position curseur
     Gosub EnvoiByteComm
    	for cpt=0 to 15
	 lookup cpt,("** Parametres **"),car
     Gosub EnvoiByteData    
     next 
'***** parametres eclairage *****
car= 192	 	'Position curseur
     Gosub EnvoiByteComm
            bcdtoascii heurede,dch,ch 'conversion pour affichage
     for cpt=0 to 9
	       lookup cpt,("Eclair. ",dch,ch),car 
     Gosub EnvoiByteData    
     next 
car= 202	 	'Position curseur
    Gosub EnvoiByteComm
            bcdtoascii minutde,dch,ch 'conversion pour affichage
     for cpt=0 to 2
	       lookup cpt,(":",dch,ch),car 
     Gosub EnvoiByteData    
     next 
car= 207	 	'Position curseur
     Gosub EnvoiByteComm
            bcdtoascii heurefe,dch,ch 'conversion pour affichage
     for cpt=0 to 1
	       lookup cpt,(dch,ch),car 
     Gosub EnvoiByteData    
     next 
car= 209	 	'Position curseur
    Gosub EnvoiByteComm
            bcdtoascii minutfe,dch,ch 'conversion pour affichage
     for cpt=0 to 2
	       lookup cpt,(":",dch,ch),car 
     Gosub EnvoiByteData
     next 
'***** parametres horaire chauffage *****
car= 148	 	'Position curseur
     Gosub EnvoiByteComm
            bcdtoascii heuredt,dch,ch 'conversion pour affichage
     for cpt=0 to 9
	       lookup cpt,("Chauff. ",dch,ch),car 
     Gosub EnvoiByteData    
     next 
car= 158	 	'Position curseur
    Gosub EnvoiByteComm
            bcdtoascii minutdt,dch,ch 'conversion pour affichage
     for cpt=0 to 2
	       lookup cpt,(":",dch,ch),car 
     Gosub EnvoiByteData    
     next 
car= 163	 	'Position curseur
     Gosub EnvoiByteComm
            bcdtoascii heureft,dch,ch 'conversion pour affichage
     for cpt=0 to 1
	     lookup cpt,(dch,ch),car 
     Gosub EnvoiByteData  
     next 
car= 165	 	'Position curseur
    Gosub EnvoiByteComm
            bcdtoascii minutft,dch,ch 'conversion pour affichage
     for cpt=0 to 2
	    lookup cpt,(":",dch,ch),car 
     Gosub EnvoiByteData    
     next 
'***** Parametre consigne T1 et T2 *****
car= 212	 	'Position curseur
     Gosub EnvoiByteComm
    		bintoascii consT1,cch,dch,ch 'conversion pour affichage
     for cpt=0 to 7
          lookup cpt,("T1=",cch,dch,",",ch,$df),car '$dF est le degre degre,$FF est le carr? plein
     Gosub EnvoiByteData    
     next 
car= 224	 	'Position curseur
     Gosub EnvoiByteComm
    		bintoascii consT2,cch,dch,ch 'conversion pour affichage
     for cpt=0 to 7
          lookup cpt,("T2=",cch,dch,",",ch,$df),car '$dF est le degre degre,$FF est le carr? plein
     Gosub EnvoiByteData    
     next 

if valid=1 then goto debut

 'Effacement d'ecran	
    gosub effaceecran

return
  '##############################################################
  intDS1307:
  '************************************
 '******* Saisie des parametres *******
 '*************************************
 '**** Initialisation du DS1307 *******
 
 'attente que les 2 poussoirs soient relaches
  Do: loop while valid=1 	'attente relachement poussoir 
  Do :loop while increm = 1	'attente relachement poussoir 
 
  car= 132	 	'Position curseur
     Gosub EnvoiByteComm    
     for cpt=0 to 11
     lookup cpt,("* Reglages *"),car
     Gosub EnvoiByteData    
     next 
  car= 194	 	'Position curseur
     Gosub EnvoiByteComm    
     for cpt=0 to 15
     lookup cpt,("20aa/MM/jj hh:mm "),car
     Gosub EnvoiByteData    
     next 
 '********* an ***************
  Do: loop while valid=1 'Attente relachement poussoir
  col=152    	'Position curseur
  minch=0:maxch=9 'plage possible chiffre dizaine
  Gosub chiffre   'routine affichage
  dch=ch    	'memoire dizaine
  col=153    	'Position curseur
  Gosub chiffre 
  an=dch*10+ch   	'nombre annee
 '******* mois ********
  col=155
  minch=0:maxch=1
  Gosub chiffre
  dch=ch 
  col=156
  if dch=0 then
   minch=1:maxch=9
    else
   minch=0:maxch=2   
  endif
  Gosub chiffre 
  mois=dch*10+ch
 '****** jour ********
  col=158  'chiffre des dizaines
  minch=0
  if mois=2 then  
     maxch=2
    else maxch=3
  endif 
  Gosub chiffre
  dch=ch
  col=159  		'chiffre des unites
  if dch=0 then   'si chiffre des dizaines = 0
     minch=1 	'pas de 00
    else minch=0
  endif
  if mois =2 then 'traitement fevrier
    varb=an//4 
    if varb=0 then 'annee bisextile
       maxch=9 	 'max 29
      else maxch=8 'sinon 28
   endif
  endif
  if mois<>2 then  'traitement non fevrier
    maxch=9
    if dch=3  then
     if mois=4 or mois=6 or mois=9 or mois=11 then
        maxch=0 	 'mois de 30j
      else maxch=1 'sinon 31j
     endif
    endif
  endif
  Gosub chiffre 
  jour=dch*10+ch
   '******** heure **************
  col=161
  	minch=0
  	maxch=2
  Gosub chiffre
  	dch= ch
  col=162
  	minch=0
  	maxch=9
  if dch=2 then
   	maxch=3 
  endif
  Gosub chiffre
  heure=dch*10+ch
   '******** minutes **********
  col=164
  	minch=0
  	maxch=5
  Gosub chiffre
  	dch= ch
  col=165
  	minch=0
  	maxch=9
  Gosub chiffre
  minut=dch*10+ch 
   '***** calcul joursem ****************
  'L'algorithme de Mike Keith numerote de 0 a 6
  'Dim=0, Lun=1,...,Sam=6
    an= 2000+an 
  if mois < 3 then
     varw=an-1
    else varw=an
  end if 
  joursem= 23*mois/9 +jour+4+an
  var1=varw/4
  joursem=joursem+var1
  var1=varw/100
  joursem=joursem-var1
  var1=varw/400
  joursem=joursem+var1
  if mois>= 3 then
  joursem=joursem-2
  endif
  joursem=joursem//7+1 '+1 pour numerotation de 1 a 7 idem DS1307
  varb=joursem  'memorisation dans une variable type byte
 '***********************************************
  dch=minut//10  		'Les donnees sont
  minut=minut/10*16  	'mises au format BCD
  minut=minut+dch  	'pour enregistrement
 
  dch=heure//10
  heure=heure/10*16
  heure=heure+dch
  
  dch=jour//10
  jour=jour/10*16
  jour=jour+dch 
  
  dch=mois//10
  mois=mois/10*16
  mois=mois+dch
  
  an=an-2000
  dch=an//10
  an=an/10*16
  an=an+dch  
'Chargement des parametres dans L'horloge DS1307
'	hi2cout [%11010000] ,0, ($00,minut,heure,varb,jour,mois,an,%00010000) 

'Effacement d'ecran
     Gosub Effaceecran	
     return
Cordialement
 

guil

New Member
Bonjour,

Fin du code
Code:
'##########################################################################
init: 
'*************************************
'******* Saisie des parametres *******
'*************************************
' ***** Parametre eclairage *******

'Heure d'allumage de l'eclairage
Do: loop while valid=1 'Attente relachement poussoir 

 car= 132	 	'Position curseur
     Gosub EnvoiByteComm    
     for cpt=0 to 11
     lookup cpt,("* Reglages *"),car
     Gosub EnvoiByteData    
     next  
 car= 193	 	'Position curseur
     Gosub EnvoiByteComm 
     for cpt=0 to 16
     lookup cpt,("H debut eclairage"),car
     Gosub EnvoiByteData    
     next 
 car= 154	 	'Position curseur
     Gosub EnvoiByteComm    
     for cpt=0 to 4
     lookup cpt,("hh:mm "),car
     Gosub EnvoiByteData    
     next 
'******** heure **************
  col=218
  	minch=0
  	maxch=2
  Gosub chiffre
  dch= ch
  col=219
  	minch=0
  	maxch=9
  if dch=2 then
   	maxch=3 
  endif
  Gosub chiffre
  heurede=dch*10+ch
  '******** minutes **********
  col=221
  	minch=0
  	maxch=5
  Gosub chiffre
  dch= ch
  col=222
  	minch=0
  	maxch=9
  Gosub chiffre
  minutde=dch*10+ch 
  
'Effacement d'ecran 	
     gosub effaceecran
     
'**********************************************************     
'Heure de fin d'eclairage    
 car= 132	 	'Position curseur
     Gosub EnvoiByteComm    
     for cpt=0 to 11
     lookup cpt,("* Reglages *"),car
     Gosub EnvoiByteData    
     next  
car= 194	 	'Position curseur
     Gosub EnvoiByteComm 
     for cpt=0 to 14
     lookup cpt,("H fin eclairage"),car
     Gosub EnvoiByteData    
     next 
car= 154	 	'Position curseur
     Gosub EnvoiByteComm    
     for cpt=0 to 4
     lookup cpt,("hh:mm "),car
     Gosub EnvoiByteData    
     next 
'******** heure **************
  col=218
  	minch=0
  	maxch=2
  Gosub chiffre
  dch= ch
  col=219
  	minch=0
  	maxch=9
  if dch=2 then
  	maxch=3 
  endif
  Gosub chiffre
  heurefe=dch*10+ch
 '******** minutes **********
  col=221
  	minch=0
  	maxch=5
  Gosub chiffre
  dch= ch
  col=222
  	minch=0
  	maxch=9
  Gosub chiffre
  minutfe=dch*10+ch 
 
 'mise au format BDC pour comparaison avec registre RTC 1307
  dch=heurede//10
  heurede=heurede/10*16
  heurede=heurede+dch
 
  dch=minutde//10
  minutde=minutde/10*16
  minutde=minutde+dch
    
  dch=heurefe//10
  heurefe=heurefe/10*16
  heurefe=heurefe+dch
 
  dch=minutfe//10
  minutfe=minutfe/10*16
  minutfe=minutfe+dch
   
   'Effacement d'ecran
     gosub effaceecran
 
'*******************************************
'Parametre chauffage
'*******************************************	
'heure d'allumage du chauffage
 car= 132	 	'Position curseur
     Gosub EnvoiByteComm    
     for cpt=0 to 11
     lookup cpt,("* Reglages *"),car
     Gosub EnvoiByteData    
     next
car= 192	 	'Position curseur
     Gosub EnvoiByteComm 
     for cpt=0 to 19
     lookup cpt,("H debut de chauffage"),car
     Gosub EnvoiByteData    
     next 
car= 154	 	'Position curseur
     Gosub EnvoiByteComm    
     for cpt=0 to 4
     lookup cpt,("hh:mm "),car
     Gosub EnvoiByteData    
     next 
'******** heure **************
  col=218
  	minch=0
  	maxch=2
  Gosub chiffre
  dch= ch
  col=219
  	minch=0
  	maxch=9
  if dch=2 then
   	maxch=3 
  endif
  Gosub chiffre
  heuredt=dch*10+ch
'******** minutes **********
  col=221
  	minch=0
  	maxch=5
  Gosub chiffre
  dch= ch
  col=222
  	minch=0
  	maxch=9
  Gosub chiffre
  minutdt=dch*10+ch 
  
'Effacement d'ecran
    gosub effaceecran 
    
'***********************************************     
' Heure de fin de chauffage   
 car= 132	 	'Position curseur
     Gosub EnvoiByteComm    
     for cpt=0 to 11
     lookup cpt,("* Reglages *"),car
     Gosub EnvoiByteData    
     next
car= 194	 	'Position curseur
     Gosub EnvoiByteComm 
     for cpt=0 to 14
     lookup cpt,("H fin chauffage"),car
     Gosub EnvoiByteData    
     next 
car= 154	 	'Position curseur
     Gosub EnvoiByteComm    
     for cpt=0 to 4
     lookup cpt,("hh:mm "),car
     Gosub EnvoiByteData    
     next 
'******** heure **************
  col=218
  	minch=0
  	maxch=2
  Gosub chiffre
  dch= ch
  col=219
 	minch=0
  	maxch=9
  if dch=2 then
   	maxch=3 
  endif
  Gosub chiffre
  heureft=dch*10+ch
 '******** minutes **********
  col=221
  	minch=0
  	maxch=5
  Gosub chiffre
  dch= ch
  col=222
  	minch=0
  	maxch=9
  gosub chiffre
  minutft=dch*10+ch 
  
'Mise au format BCD pour comparaison avec registre horloge RTC 1307
  dch=heuredt//10 
  heuredt=heuredt/10*16
  heuredt=heuredt+dch
 
  dch=minutdt//10
  minutdt=minutdt/10*16
  minutdt=minutdt+dch
    
  dch=heureft//10
  heureft=heureft/10*16
  heureft=heureft+dch
 
  dch=minutft//10
  minutft=minutft/10*16
  minutft=minutft+dch
  
  'Effacement d'ecran
     gosub effaceecran
    
'***** Consigne temperature *********
'*** Seuil temperature 1 ***
 car= 132	 	'Position curseur
     Gosub EnvoiByteComm    
     for cpt=0 to 11
     lookup cpt,("* Reglages *"),car
     Gosub EnvoiByteData    
     next
car= 192	 	'Position curseur
     Gosub EnvoiByteComm 
     for cpt=0 to 19
     lookup cpt,("Seuil Temp1 xx,x deg"),car
     Gosub EnvoiByteData    
     next 

  col=160 'position pour chiffre des dizaines
  	minch=0
  	maxch=9
  Gosub chiffre
  cch= ch
  col=161 'position pour chiffre des unites
  	minch=0
  	maxch=9
  Gosub chiffre
  dch=ch
  col=163  'position pour chiffre decimale
  	minch=0
  	maxch=9
  Gosub chiffre
  
  ConsT1=cch*10+dch*10+ch 'consigne temp avec dizaine, unite et decimale
   
  'Effacement d'ecran
     gosub effaceecran
     
  '*** seuil temperature 2 ***
  car= 132	 	'Position curseur
     Gosub EnvoiByteComm    
     for cpt=0 to 11
     lookup cpt,("* Reglages *"),car
     Gosub EnvoiByteData    
     next
  car= 192	 	'Position curseur
     Gosub EnvoiByteComm 
     for cpt=0 to 19
     lookup cpt,("Seuil Temp2 xx,x deg"),car
     Gosub EnvoiByteData    
     next 
'******** seuil temperature **************
  col=160  'Position pour chiffre des dizaines
  	minch=0
  	maxch=9
  Gosub chiffre
  cch= ch
  col=161  'Position pour chiffre des unites
  	minch=0
  	maxch=9
  Gosub chiffre
  dch=ch
  col=163  'Position pour chiffre decimale
  	minch=0
  	maxch=9
  Gosub chiffre
  
  ConsT2=cch*10+dch*10+ch 'Consigne temp avec dizaine, unite et decimale
  	
  'Effacement d'ecran	
    Gosub effaceecran
 
  return
 '###############################################################
 '***** Sous programme effacement d'ecran *****
effaceecran: 
car= 1	 	'Commande d'effacement d'ecran
     Gosub EnvoiByteComm 
     pause 50  	'Pause necessaire pour l'afficheur
 return
 '################################################################
 '***** Sous programme affichage et incrementation *************** 
 chiffre:
  
  ch=minch  
  Do
  car=col
        Gosub EnvoiByteComm    
   car= ch + 48
	Gosub EnvoiByteData    
          
   if increm=1 then   
    do:loop while increm=1   
    inc ch
    if ch>maxch then
     ch=minch
    endif  
   endif    
   if valid=1 then exit	
  loop  
   Do: loop while valid=1  
  return
'#################################################################### 	
	EnvoiByteCommInit:
		pause 10
	EnvoiByteComm:
		rsbit=0	
	EnvoiByteData:	'1ere moitie
		dat=car & $F0 | %1000 | rsbit 	'%1000 pour le retroeclairage
		hi2cout [%01001110], (dat)
		pause 1
		dat=dat | %1100
		hi2cout [%01001110], (dat) 	'pulse sur E
		pause 1
		dat=dat | %1000 & %1011 	'fin de pulse
		hi2cout [%01001110],(dat)
		Pause 1
				'2eme moitie
		dat=car & $0F * 16 | %1000 | rsbit	'%1000 pour le retroeclairage
		hi2cout [%01001110], (dat)
		pause 1 
		dat=dat |%1100
		hi2cout [%01001110],(dat)
		pause 1 
		dat=dat | %1000 & %1011
		hi2cout [%01001110],(dat)
rsbit=1
 return
Cordialement
 

BESQUEUT

Senior Member
Ouch...
Pas le temps de lire tout ça en détails...
Pourquoi ne pas avoir utilisé OWIN pour lire le DHT22 ?

Le pilotage du LCD via un expandeur I2C est très lourd. Si c'est encore possible, préférer un vrai LCD serie ou I2C...
Il y a moyen d'optimiser certaines choses, mais yadutaff...
Si c'est encore possible de passer sur du 28 ou 40 X2, ça éviterait un travail d'optimisation intéressant, mais chronophage...
- Pour le chauffage il y a une période de chauffe afin d'imiter le cycle jour / nuit
Les horaires de chauffage ne sont pas les mêmes que pour l'éclairage ?
 

PieM

Senior Member
+1 (sauf pour OWIN, le protocole n'est pas le standard sur DHT11/22)

Compte tenu du nombre de réglages et des éventuelles extensions futures, un LCD serait plus indiqué, et moins lourd à gérer!
D'autre part dans ces gestions de timing, je ne pense pas qu'avoir une résolution d'1 minute soit très important.
Utiliser une résolution du dixième d'heure permet de n'utiliser que des variable byte, la journée se réduisant à 240 mn
ça diminue le nombre de variables, et ça simplifie les calculs.

Pas très clair:
la programmation se fait sur la journée ? sur la semaine ? combien de séquences pour l'éclairage, pour la température
quel intérêt de gérer l'année, bissextile ou pas , le mois, le jour de la semaine etc...

Envoyer plutôt un le fichier .bas, car recoller les morceaux n'est pas très pratique...
Et décrire le process avec plus précision:
par exemple, ensemble des séquences sur 24h (ou sur l'année, on ne sait pas...)
 

guil

New Member
Bonjour,

Merci pour vos commentaires et vos conseils,

Je rappelle qu&#8217;il s&#8217;agit de ma première application avec un picaxe et que le choix du matériel avait pour objectif de réaliser un câblage simple, et de pouvoir récupérer des exemples d&#8217;application au travers du site electromag1 pour me familiariser avec les picaxe, car je suis très loin d&#8217;avoir vos compétences.

En réponse aux différents points évoqués
- Le choix de l&#8217;afficheur avec expandeur I2C était pour essayer de faire fonctionner deux esclaves I2Cl&#8217;horloge et l&#8217;afficheur.
- Le changement de picaxe, sauf erreur de ma part ne permettra pas d&#8217;augmenter le nombre de variable il me semble qu&#8217;il y a au maximum 27 mot dans les séries X2.
- Pour la gestion de la sonde DHT22, j&#8217;ai repris ce qui a été fait sur electromag1 et je ne connaissais pas la commande OWIN, mais sans doute à essayer.

Quelques précisions sur le cahier des charges.
- Pour toute les fonctions, (éclairage et les deux chauffage), il n&#8217;y a qu&#8217;une seul période de mise en route programmable par jour. Cette période étant identique toute l&#8217;année (sauf chgt de programmation)
- J'ai prévu des horaires séparés pour le chauffage et l'éclairage car il y a un peu d'inertie avec le chauffage, donc aujourd'hui on arrete le chauffage un peu avant l'éclairage, mais une simplification peu être envisagée.
- La gestion de l&#8217;année, du mois, etc&#8230;., est uniquement pour afficher la date et l&#8217;heure en permanence.
- Effectivement il est possible de faire plus simple dans la programmation des heures d&#8217;éclairage et de chauffage en utilisant les heures et les minutes en décimal, mais dans ce cas, la programmation des horaires sera moins claire car il faudra programmer en dixième de minute, sachant le terrarium doit pouvoir être programmé par des personnes non initiés.

Et le dernier point, je ne sais pas comment on peut joindre le fichier .bas à un message.

Espérant avoir un peu éclaircie le sujet,

Cordialement
 

BESQUEUT

Senior Member
- Le choix de l&#8217;afficheur avec expandeur I2C était pour essayer de faire fonctionner deux esclaves I2Cl&#8217;horloge et l&#8217;afficheur.
- Le changement de picaxe, sauf erreur de ma part ne permettra pas d&#8217;augmenter le nombre de variable il me semble qu&#8217;il y a au maximum 27 mot dans les séries X2.
Il y a 127 bytes sur un 20X2 et 256 sur un 28X2 ou un 40X2 et surtout 4 slots au lieu d'un seul.
Si vous souhaitez faire des essais, gardez une petite platine à tout faire

Mais pour le Terrarium, simplifiez vous la vie : vu le coût des autres composants, un Picaxe haut de gamme n'est pas un luxe. Idem pour l'afficheur.
 

guil

New Member
Bonjour,

Il y a 127 bytes sur un 20X2 et 256 sur un 28X2 ou un 40X2 et surtout 4 slots au lieu d'un seul.
Si vous souhaitez faire des essais, gardez une petite platine à tout faire
Ok mais il y a que 55 bytes à accès direct, ce qui est plus simple à utiliser.

Sinon aucun problème pour changer de picaxe.

Cordialement
 

PieM

Senior Member
Soit vous êtes dans l'expérimentation ( ... essayer de faire fonctionner deux esclaves I2Cl&#8217;horloge et l&#8217;afficheur.) auquel cas une fois que vous avez vu que ça marche, il n'est pas nécessaire de tout conserver pour le projet final, soit vous êtes dans le projet réel et n'utilisez que ce qui est strictement nécessaire.

Vous courrez après un manque de variables mais encombrez votre programme avec des données inutiles. (an, seconde, jour, température sur 2 bytes, etc ...)
Une température sur 1 byte c'est 255 dixièmes de degrés d'amplitude, ajoutés à un offset de x degrés constant.
Ce n'est pas parce que le traitement se ferait sur des heures décimales, que la programmation se fait de la même façon au niveau de l'interface. Comme il semble que vous n'utilisez pas de clavier numérique, l'incrémentation peut se faire de 1 en 1 mais l'affichage de 6mn en 6mn. 8h30 affiché sera traduit par 85 dans le programme.

J'insiste mais la commande OWIN n'est pas utilisable avec les DTH...
 

BESQUEUT

Senior Member
Ok mais il y a que 55 bytes à accès direct, ce qui est plus simple à utiliser.
Sinon aucun problème pour changer de picaxe.
Profitez-en pour changer de LCD : je parierais bien sur au moins 50% de réduction de la taille du code rien que sur ce point, sans parler d'une lisibilité bien meilleure (du code s'entend)

Par ailleurs, avec 4 slots, on peut mettre tout le paramétrage dans un slot et libérer pas mal de place pour le slot principal.
Les commandes Push/pull permettent d'éviter l'utilisation de variables temporaires. Combiné avec #macro, on peut faire des choses très lisibles, très économes en variables "directes" et pas trop gourmandes en taille mémoire.

Par ailleurs on peut utiliser les bytes en accès indirect dans des sous-programmes : on doit réfléchir un peu plus au moment de l'écriture, mais après ça ne complique en rien l'utilisation du programme principal et on économise ces précieuses variables directes. Il y a aussi le cas des variables temporaires utilisées dans un sous-programme. On est vite tenté d'utiliser les mêmes variables puisqu'à priori elles ne seront pas utilisées en même temps. Mais comme la notion de variable "locale" n'existe pas, on risque l'effet de bord. En plaçant les variables locales à des endroits dédiés à chaque sous-programme, on évite tout risque.

Je plussoie les remarques de PieM sur la nécessité de disposer d'un véritable cahier des charges, et en particulier, d'éliminer tout ce qui ne sert à rien.

Je me trompe peut-être, mais l'important dans l'électronique d'un Terrarium, c'est la fiabilité, pas la complexité.
Ça m'étonnerait que les bebêtes râlent parce que la lumière s'est éteinte 5mn trop tôt.
Par contre, si le chauffage se bloque à fond parce qu'il y a un bug dans le programme, il vont avoir des problèmes...

J'insiste mais la commande OWIN n'est pas utilisable avec les DTH...
Oui, c'est bien noté et d'ailleurs ma remarque n'était qu'une question, à laquelle vous avez clairement répondu.
Il semble que ce bidule ne doit être lu que toutes les 2s (d'après le datasheet)
Par contre, il est anormal que ça "perturbe l'affichage" et je ne vois pas ce qui est susceptible de durer 2s dans ce module.

Encore faut-il s'entendre sur ce mot : si cela signifie que l'on passe de la seconde 2 à la seconde 4 (sans afficher le 3),
ça ne me semble pas gravissime.

Si vraiment il faut afficher toutes les secondes, (et de plus de façon très régulière : pile à la seconde ?)
on entre dans le domaine du multitâches, et de ses solutions habituelles (interruptions, pseudo-multitâche, multi-proc et multi-tâche collaboratif. C'est intéressant, mais pas simple...
 
Last edited:

guil

New Member
Bonjour,

je vous remercie pour ces pistes d'amélioration concernant l'organisation, du programme et le choix du matériel, je vais regarder ce que je peux faire. Je vous ai soumis la version qui est ma première version remplissant les fonctionnalités, mais je suis tout a fait conscient qu'il reste beaucoup d'optimisation a réaliser.
Je me trompe peut-être, mais l'important dans l'électronique d'un Terrarium, c'est la fiabilité, pas la complexité.
Ça m'étonnerait que les bebêtes râlent parce que la lumière s'est éteinte 5mn trop tôt.
Par contre, si le chauffage se bloque à fond parce qu'il y a un bug dans le programme, il vont avoir des problèmes...
Tout a fait d'accord, et déjà aujourd'hui ou les chauffages sont sur une prise programmable, leur puissance a été regardée pour ne pas monter à des température eccessive pour les animaux.
Encore faut-il s'entendre sur ce mot : si cela signifie que l'on passe de la seconde 2 à la seconde 4 (sans afficher le 3),
ça ne me semble pas gravissime.
C'est tout a fait cela l'affichage saute des secondes, ce qui n'a rien d'important et peut facilement être resolu en supprimant l'afichage des secondes.

Cordialement
 

BESQUEUT

Senior Member
Pour illustrer mes propos #14, voici quelques propositions de macros et de subprogrammes :
Code:
 [color=Blue]symbol [/color][color=Purple]ch  [/color][color=DarkCyan]=[/color][color=Purple]b1         [/color][color=Green]'chiffre unite pour calcul
 [/color][color=Blue]symbol [/color][color=Purple]dch  [/color][color=DarkCyan]=[/color][color=Purple]b2  [/color][color=Green]'chiffre diz
 [/color][color=Blue]symbol [/color][color=Purple]cch  [/color][color=DarkCyan]=[/color][color=Purple]b3  [/color][color=Green]'chiffre centaine
 [/color][color=Blue]symbol [/color][color=Purple]cpt [/color][color=DarkCyan]=[/color][color=Purple]b12
 [/color][color=Blue]symbol [/color][color=Purple]car [/color][color=DarkCyan]=[/color][color=Purple]b13
  [/color]
[color=Navy]#macro [/color][color=Black]PositionCurseur[/color][color=Blue]([/color][color=Black]P[/color][color=Blue])
      [/color][color=Purple]car[/color][color=DarkCyan]= [/color][color=Black]P
      [/color][color=Blue]gosub [/color][color=Black]EnvoiByteComm[/color]
[color=Navy]#endmacro
  
#macro [/color][color=Black]Ecrire[/color][color=Blue]([/color][color=Black]Texte,Longueur[/color][color=Blue])
      for [/color][color=Purple]cpt[/color][color=DarkCyan]=[/color][color=Navy]0 [/color][color=Blue]to [/color][color=Black]Longueur
            [/color][color=Blue]lookup [/color][color=Purple]cpt[/color][color=Black],[/color][color=Blue]([/color][color=Black]Texte[/color][color=Blue])[/color][color=Black],[/color][color=Purple]car
            [/color][color=Blue]Gosub [/color][color=Black]EnvoiByteData    
      [/color][color=Blue]next [/color]
[color=Navy]#EndMacro

#macro [/color][color=Black]Ecrire4[/color][color=Blue]([/color][color=Black]C1,C2,C3,c4[/color][color=Blue])
      push [/color][color=Black]c4,c3,c2,c1
      [/color][color=Blue]gosub [/color][color=Black]Envoi4Bytes[/color]
[color=Navy]#endmacro

#macro [/color][color=Black]Ecrire3[/color][color=Blue]([/color][color=Black]C1,C2,C3[/color][color=Blue])
      push [/color][color=Black]c3,c2,c1
      [/color][color=Blue]gosub [/color][color=Black]Envoi3Bytes[/color]
[color=Navy]#endmacro

#macro [/color][color=Black]Ecrire2[/color][color=Blue]([/color][color=Black]C1,C2[/color][color=Blue])
      push [/color][color=Black]c2,c1
      [/color][color=Blue]gosub [/color][color=Black]Envoi2Bytes[/color]
[color=Navy]#endmacro
  
 [/color]
[color=Green]; CODE ORIGINAL
; for cpt=0 to 2                          ' 19 bytes
;     lookup cpt,(dch,ch,"/"),car
;     Gosub EnvoiByteData    
; next


' CODE PUSH
' push "/",ch,dch : gosub Envoi3Bytes     ' 11 bytes

' CODE MACRO
 [/color][color=Black]Ecrire3[/color][color=Blue]([/color][color=Purple]dch[/color][color=Black],[/color][color=Purple]ch[/color][color=Black],[/color][color=Red]"/"[/color][color=Blue])                      [/color][color=Green]' 11 bytes


 [/color][color=Black]Envoi4Bytes:[/color][color=Blue]pop [/color][color=Purple]car [/color][color=Black]:[/color][color=Blue]GOSUB [/color][color=Black]EnvoiByteData [/color][color=Green]' 36 bytes
 [/color][color=Black]Envoi3Bytes:[/color][color=Blue]pop [/color][color=Purple]car [/color][color=Black]:[/color][color=Blue]GOSUB [/color][color=Black]EnvoiByteData
 Envoi2Bytes:[/color][color=Blue]pop [/color][color=Purple]car [/color][color=Black]:[/color][color=Blue]GOSUB [/color][color=Black]EnvoiByteData
             [/color][color=Blue]pop [/color][color=Purple]car [/color][color=Black]:[/color][color=Blue]GOSUB [/color][color=Black]EnvoiByteData
 [/color][color=Blue]RETURN
 
 [/color][color=Black]EnvoiByteData:                           [/color][color=Green]' 3 bytes
 [/color][color=Blue]RETURN[/color]
Notez qu'une macro ne change strictement rien à la taille du code, mais améliore largement la lisibilité.
C'est une autre façon de mettre des commentaires, mais bien plus "lisible"

Notez également que les GOSUBs proposés consomment 36 bytes, mais permettent d'en économiser 8 à chaque appel.
Quand à la lisibilités, à vous de juger :
Code:
	'Affichage info RTC DS 1307
   	hi2cin [%11010000], 3,(varb)  'jour de semaine lu dans le registre 3      
 	bcdtoascii varb,dch,ch  	'DS1307 les donnees sont au format BCD
      
      PositionCurseur(131)
	select case ch
		case "1": push "m","i","D"
		case "2": push "n","u","L"
		case "3": push "r","a","M"
		case "4": push "r","e","M"
		case "5": push "u","e","J"
		case "6": push "n","e","V"
		case "7": push "m","a","S"
	end select
      Gosub Envoi3bytes
    
  	hi2cin [%11010000], 4,(jour)    'jour lu dans le registre 4
  	bcdtoascii jour,dch,ch 
   	PositionCurseur(135)
      Ecrire3(dch,ch,"/")
     
  	hi2cin [%11010000], 5,(mois)    'mois lu dans le registre 5
  	bcdtoascii mois,dch,ch
   	PositionCurseur(138)
      Ecrire3(dch,ch,"/")
   
  	hi2cin [%11010000],6,(an)    	'annee lu dans le registre 6. 
  	bcdtoascii an,dch,ch
  	PositionCurseur(141)
      Ecrire4("2","0",dch,ch)
   
 	hi2cin [%11010000], 2,(heure)    'heure lu dans le registre 2
  	bcdtoascii heure,dch,ch
  	PositionCurseur(198)
      Ecrire2(dch,ch)
   
  	hi2cin [%11010000], 1,(minut)    'Minute lu dans le registre  1
  	bcdtoascii minut,dch,ch
	Ecrire3(":",dch,ch)
   
  	hi2cin [%11010000], 0,(second)    'Seconde lu dans le registre  0
  	bcdtoascii second,dch,ch
	Ecrire3(":",dch,ch)
Notez que ce morceau de code utilise 7 variables locales qui ne semblent pas réutilisées plus loin, si ce n'est pour calculer Tps.
Ou pourrait donc probablement les libérer et faire tous ces calculs avec la seule variable Tps
 
Last edited:

BESQUEUT

Senior Member
Autre proposition pour la lecture des bits :
Code:
 [color=Blue]symbol [/color][color=Purple]Retour[/color][color=DarkCyan]=[/color][color=Purple]b1 [/color][color=Green]' Déja utilisé par Ch
                  ' Mais Ch est une variable temporaire, donc en fait il n'y a pas d'effet de bord.
 
 '***** variable temperature ambiante T1 *****
 '**** DHT 22 *****
  [/color][color=Blue]symbol [/color][color=Purple]HRE [/color][color=DarkCyan]=[/color][color=Purple]b28             [/color][color=Green]'HR partie entiere
  [/color][color=Blue]symbol [/color][color=Purple]HRD [/color][color=DarkCyan]=[/color][color=Purple]b29             [/color][color=Green]'HR partie decimale
  [/color][color=Blue]symbol [/color][color=Purple]TPE [/color][color=DarkCyan]=[/color][color=Purple]b30             [/color][color=Green]'Temp partie entiere
  [/color][color=Blue]symbol [/color][color=Purple]TPD [/color][color=DarkCyan]=[/color][color=Purple]b31             [/color][color=Green]'Temp partie decimale
  [/color][color=Blue]symbol [/color][color=Purple]bit_num [/color][color=DarkCyan]=[/color][color=Purple]b32   [/color][color=Green]'numero lecture bit DHT22
  [/color]
[color=Navy]#macro [/color][color=Black]LectureBits[/color][color=Blue]([/color][color=Black]Adresse,Valeur[/color][color=Blue])
      [/color][color=Purple]ptr[/color][color=DarkCyan]=[/color][color=Black]Adresse
      [/color][color=Blue]GOSUB [/color][color=Black]LireBits
      Valeur[/color][color=DarkCyan]=[/color][color=Purple]Retour[/color]
[color=Navy]#endmacro[/color]

[color=Green];HRD=0 'octet "decimal" HR                            ' 28 bytes
;     for ptr = 9 to 16 'lecture bit 9 a 16
;           bit_num = 16 - ptr 'position bit dans octet
;           if @ptr > 60 then
;           setbit HRD,bit_num 'bit long=1
;     endif
;next[/color]


[color=Black]LectureBits[/color][color=Blue]([/color][color=Navy]0[/color][color=Black],[/color][color=Purple]HRE[/color][color=Blue])                        [/color][color=Green]' 10 bytes[/color]
[color=Black]LectureBits[/color][color=Blue]([/color][color=Navy]9[/color][color=Black],[/color][color=Purple]HRD[/color][color=Blue])[/color]
[color=Black]LectureBits[/color][color=Blue]([/color][color=Navy]17[/color][color=Black],[/color][color=Purple]TPE[/color][color=Blue])[/color]
[color=Black]LectureBits[/color][color=Blue]([/color][color=Navy]25[/color][color=Black],[/color][color=Purple]TPD[/color][color=Blue])[/color]



[color=Black]LireBits:                                 [/color][color=Green]' 25 bytes
      [/color][color=Purple]Retour[/color][color=DarkCyan]=[/color][color=Navy]0
      [/color][color=Blue]for [/color][color=Purple]bit_num[/color][color=DarkCyan]=[/color][color=Navy]7 [/color][color=Blue]to [/color][color=Navy]0 [/color][color=Blue]step [/color][color=DarkCyan]-[/color][color=Navy]1
            [/color][color=Blue]if [/color][color=Purple]@ptrinc [/color][color=DarkCyan]> [/color][color=Navy]60 [/color][color=Blue]then
                  setbit [/color][color=Purple]Retour[/color][color=Black],[/color][color=Purple]bit_num
            [/color][color=Blue]endif
      next [/color][color=Purple]bit_num[/color]
[color=Blue]RETURN[/color]
Globalement, on gratte 47 bytes.
Pour la lisibilité, c'est toujours à vous de juger...

Autre remarque :
Je pense que vous pouvez rester en minutes aussi bien pour le chauffage que pour l'éclairage simplement en remplaçant les heures de début et fin de l'un des deux par le décalage en minutes entre l'éclairage et le chauffage.
Genre :
Début chauffage à 8h22mn Arrêt à 22h18
Décalage de 15mn
donc
Début éclairage à 8h37 arrêt à 22h03
(En supposant que l'éclairage commence après et termine avant, mais c'est vous qui savez ce qui est bien...)
 
Last edited:

BESQUEUT

Senior Member
Dernières propositions (en tout cas pour ce soir...) :
Il y a pas mal de bytes à récupérer en mettant en mémoire les chaînes fixes et la position du texte :
Code:
 [color=Black]car[/color][color=DarkCyan]= [/color][color=Navy]193         [/color][color=Green]'Position curseur
     [/color][color=Blue]Gosub [/color][color=Black]EnvoiByteComm 
     [/color][color=Blue]for [/color][color=Black]cpt[/color][color=DarkCyan]=[/color][color=Navy]0 [/color][color=Blue]to [/color][color=Navy]16
     [/color][color=Blue]lookup [/color][color=Black]cpt,[/color][color=Blue]([/color][color=Red]"H debut eclairage"[/color][color=Blue])[/color][color=Black],car
     [/color][color=Blue]Gosub [/color][color=Black]EnvoiByteData    
     [/color][color=Blue]next [/color]
peut être remplacé par :
symbol Txt_H_deb_Ecl=0
TABLE Txt_H_deb_Ecl,(193,17,"H debut eclairage")

ce qui en fait ne consomme aucun octet car fait dans un autre programme qui charge les données dans le Picaxe une fois pour toute.

Du coup la lecture peut se faire avec un GOSUB du genre :
leTexte=Txt_H_deb_Ecl: GOSUB EcriteLeTexte

Qui se simplifie via une macro en
EcrireTxt (Txt_H_deb_Ecl)

On devrait gratter dans les 45 bytes à chaque appel...
J'ai compté dans les 16 séquences de ce genre ; donc on doit pouvoir gratter dans les 600 bytes.

Les 2 procédures de réglage de température sont quasi identiques et pourraient être remplacées par un seul sous-programme, lequel peut être optimisé :minch et maxch ne sont pas modifiés, donc peuvent être initialisés une seule fois.

pas de petits profits :
Vous pouvez remplacer :
dch=heurede//10
heurede=heurede/10*16
heurede=heurede+dch

par
dch=heurede//10
heurede=heurede/10*16+dch

et gratter 1 byte à chaque fois.
 
Last edited:

PieM

Senior Member
et déjà aujourd'hui ou les chauffages sont sur une prise programmable, leur puissance a été regardée pour ne pas monter à des température eccessive pour les animaux.
Approche un peu curieuse; ça veut dire que la puissance de chauffage est telle que l'équilibre de température avec l'environnement, à chauffage constant, ne dépasse pas la température critique ?
Si la criticité du process est la température, alors le plus judicieux est de prévoir une redondance dans l'info. Mieux, un organe externe au Picaxe coupe la puissance en cas de dépassement. (thermostat mécanique par exemple)
 

guil

New Member
Bonjour,

Merci pour toutes ces pistes d'optimisation que je vais essayer de mettre en oeuvre au plus tôt, en particulier pour l'optimisation des formules, pour la mise en oeuvre des macros ainsi que la mise en memoire de texte, ce sera un peu plus long, le temps de cogiter un peu, et surtout que je comprenne bien le fonctionnement des améliorations proposées ! ! .

Pour PIEM, effectivement aujourd'hui le chauffage est dimensionné afin de maintenir une température d'environ 2 à 3 degré au dessus de la température normale qui est regulée par un thermostat mécanique. La temperature de fonctionnement étant de 30°, une température maxi de 32° ne mettra pas en péril la vie des animaux.

Cordialement
 

MGU

Senior Member
Bonjour à tous,

Beau projet

Il est certain que les bouts de programmes du site electromag1 ne sont pas très optimisés, certains datent des débuts sur picaxes (quelques années déjà..).

Je n'ai pas encore lu entièrement le programme de guil.
Le DHT22 nécessite une pirouette pour être lu par un picaxe, les fonctions OnWire picaxe sont adaptées au protocole Dallas et pas au protocole propriétaire des DHT (un arduino fait mieux ici)
L'écriture de texte est un gros consommateur d'octets. Il y a intérêt à placer les textes fixes en fond d'écran et de n'actualiser que les variables.

Je vois tout ça dès que possible, il y a déjà de quoi faire avec les observations de PieM et BESQUEUT

MM
 

guil

New Member
Bonjour,
J'ai mis en oeuvre les propositions d'amélioration avec les économies de mémoire annoncées, en particulier pour la simplification des équations et la manière de lire les données de la sonde DHT22. Un certains nb de commande m'étaient inconnues car je ne les ai pas trouvé dans le tome 2 de la documentation (ex : push et la notion de macro sans gosub)
En ce qui concerne la mise en mémoire des chaînes de caractères fixes, je dois avouer que la mise en oeuvre n'est pas très claire pour moi.
Cordialement
 

BESQUEUT

Senior Member
En ce qui concerne la mise en mémoire des chaînes de caractères fixes, je dois avouer que la mise en oeuvre n'est pas très claire pour moi.
Cordialement
Peut être cet exemple éclaircira-t-il la question :
Code:
[color=Blue]TABLE [/color][color=Navy]0[/color][color=Black],[/color][color=Blue]([/color][color=Red]"Ceci est la chaine de caracteres No un"[/color][color=Blue])
TABLE [/color][color=Navy]40[/color][color=Black],[/color][color=Blue]([/color][color=Red]"Ceci est la chaine de caracteres No deux"[/color][color=Blue])
TABLE [/color][color=Navy]80[/color][color=Black],[/color][color=Blue]([/color][color=Red]"Ceci est la chaine de caracteres No trois"[/color][color=Blue])

symbol [/color][color=Purple]Index[/color][color=DarkCyan]=[/color][color=Purple]b1[/color]
[color=Blue]symbol [/color][color=Purple]Debut[/color][color=DarkCyan]=[/color][color=Purple]b2[/color]
[color=Blue]symbol [/color][color=Purple]Fin[/color][color=DarkCyan]=[/color][color=Purple]b3[/color]
[color=Blue]symbol [/color][color=Purple]Value[/color][color=DarkCyan]=[/color][color=Purple]b4[/color]
[color=Blue]symbol C1[/color][color=DarkCyan]=[/color][color=Navy]0[/color]
[color=Blue]symbol C2[/color][color=DarkCyan]=[/color][color=Navy]40[/color]

[color=Purple]Debut[/color][color=DarkCyan]=[/color][color=Navy]0[/color][color=Black]: [/color][color=Purple]Fin[/color][color=DarkCyan]=[/color][color=Navy]37 [/color][color=Black]: [/color][color=Blue]gosub [/color][color=Black]WriteTable[/color]
[color=Purple]Debut[/color][color=DarkCyan]=[/color][color=Navy]40[/color][color=Black]: [/color][color=Purple]Fin[/color][color=DarkCyan]=[/color][color=Navy]79 [/color][color=Black]: [/color][color=Blue]gosub [/color][color=Black]WriteTable[/color]
[color=Purple]Debut[/color][color=DarkCyan]=[/color][color=Navy]80[/color][color=Black]: [/color][color=Purple]Fin[/color][color=DarkCyan]=[/color][color=Navy]120 [/color][color=Black]: [/color][color=Blue]gosub [/color][color=Black]WriteTable[/color]
[color=Blue]end[/color]


[color=Black]WriteTable:
      [/color][color=Blue]for [/color][color=Purple]Index[/color][color=DarkCyan]=[/color][color=Purple]debut [/color][color=Blue]to [/color][color=Purple]Fin
            [/color][color=Blue]readtable [/color][color=Purple]Index[/color][color=Black],[/color][color=Purple]Value
            [/color][color=Blue]sertxd([/color][color=Purple]Value[/color][color=Blue])
      next
      sertxd ([/color][color=Navy]13[/color][color=Black],[/color][color=Navy]10[/color][color=Blue])
RETURN[/color]
Notez que quel que soit le nombre de lignes "TABLE" la taille du programme reste la même, en l&#8217;occurrence 50 bytes, alors qu'il en faut déjà 120 pour les chaînes de caractères !

Si vous souhaitez séparer le chargement de l'EEprom de sa lecture, il suffit d'utiliser la directive #no_table au début du programme de lecture pour éviter que l'eeprom soit ré_initialisée au chargement du programme.
 

guil

New Member
Bonjour,
Merci beaucoup pour cette réponse rapide. Je vais essayer de mettre en oeuvre ! !
Cordialement
 
Top