Overblog Suivre ce blog
Editer la page Administration Créer mon blog

Temporisateur rapport cyclique programmable picaxe + LCD série

 

Retrouvez cette page
et toutes les mises à jour
sur

http://electromag1.wifeo.com/ 

 

 

    Voici une application du LCD série "fait maison" basé sur un LCD HD44770 décrit sur ce blog. 
 Le problème du timer à cyclique programmable revient souvent  dans les forums d'électronique avec des temporisations diverses, voici une solution picaxe au problème.
 
MISE à JOUR: 28/11/2012
Nouveau cahier des charges:
Plages de temporisation de 0 seconde à 17h 59 mn 59s
Résolution 1 seconde.
Introduction des temps par appui sur le poussoir à la mise sous tension.
Réglage des temps par potensiomètre, format "hhmmss"
Mémorisation de la programmation en EEPROM 
Passage d'un cycle à l'autre par poussoir à tout moment.
Affichage des réglages et des temps restants sur LCD série 
 
Le schéma:
 
    rapcyclique08M2   
 Pour le LCD série "fait maison", voir cette page,.
 Il serait possible d'utiliser un LCD HD44780 standart, avec un picaxe 14M2 et une programmation plus lourde.
 
Le résultat final:
 
La sortie est dans le coin en haut à droite, juste en dessous
(en attendant la mise à jour de la vidéo)     
 
 
Le maximum des temporisations est ici de 17h 59 mn 59 s (la variable système "time" compte jusqu'à 65535 secondes avant de repasser à 0). Il est possible, avec quelques lignes de programmation supplémentaires de pousser jusqu'à 99h 59mn 59s, affichable sur un LCD 1602.
Il n'est pas plus difficile de compter des jours, heures et minutes. 
  
Le programme:  (modif 28/11/2012) 
 
      ' LCD ALPHANUMERIQUE SERIE ET PICAXE 08M2
  
 #picaxe 08M2  'directive 08M2
 
 symbol baud=N4800_16 'liaison série à 4800bauds 16Mhz
 pause 1000   'pause pour initialisation LCD
'*********** Nomination des I/O ***************
 symbol sortie=C.0  'Sortie sur C.0
     'Poussoir sur pinC3
'*********** Nomination des variables type byte ********* 
 symbol potar=b1
 symbol dhr=b2
 symbol hr=b3
 symbol dmn=b4
 symbol mn=b5
 symbol dsec=b6
 symbol sec=b7
 symbol var1=b8
'*********** Nomination des variables type word *********  
 symbol var2=w9
 symbol temps= w10
 symbol memo = w11
 symbol tempsON= w12
 symbol tempsOFF= w13
'****************************************** 
 setfreq m16  'fréquence horloge 16 MHz 
 
 '***** Affichage fixe *************************************** 
 serout C.1,baud,(254,1)    'Effacement écran
 serout C.1,baud,(254,128,"MA       /")  'position ligne 1
 serout C.1,baud,(254,192,"AR       /")    'position ligne 2 
 read 0,word TempsOn,word TempsOff  'lecture réglages en mémoire
 If pinC.3=1 then     'test poussoir appuyé à la mise sous tension
  do:pause 100:loop while pinC.3=1 'attente relachement poussoir
  gosub lectemps    'lecture et enregistrement des temps ON et OFF
   else     'sinon, reprise des temps enregistrés
  temps=tempsOn
  gosub conver    'conversion temps On
  serout C.1,baud,(254,138,dhr,hr,dmn,mn,dsec,sec) 'affichage
  temps=tempsOff    '
  gosub conver    'conversion temps Off
  serout C.1,baud,(254,202,dhr,hr,dmn,mn,dsec,sec)
 end if
'******************************************************
debut:  'En inversant les lignes, on change le cycle de départ
 goto arret 'demarrage par le cycle "Arret"
 goto marche 'cette ligne, en option, n'est pas prise en compte 
'*****************************************************************
marche: 'Sub  moteur ON
 time=0  'variable système: +1 toutes les secondes
 memo=0
 high sortie  'sortie  passe à 5 volts
  
 Do   'boucle sortie ON
 temps=tempsON-time
 if memo<>time then 'affichage temps UNE fois chaque seconde,pas plus  
  gosub conver 
  serout C.1,baud,(254,131,dhr,hr,dmn,mn,dsec,sec)'position ligne4, col8
  memo=time
 endif
 
 
 if pinC.3 =1 then     'Bascule entre les deux boucles par poussoir C.3 
  Do:pause 100:Loop while pinC.3=1 'attente relachement du poussoir  
  serout C.1,baud,(254,131,"      ") 'effacement position ligne4, col8    
  goto arret    
 endif  
 
 Loop while time < TempsOn    'fin de boucle tant que time < ...
 serout C.1,baud,(254,131,"      ")  ' effacement
 goto arret
'*******************************************************
arret: 'Sub  sortie OFF 
 time=0
 memo=0
 low sortie  'C.1 passe à 0 volt
 
 Do 'Boucle sortie OFF 
 temps=TempsOff-time 'affichage temps restant
 if memo<>time then 'exécution de serout UNE fois chaque seconde seconde
  gosub conver
  serout C.1,baud,(254,195,dhr,hr,dmn,mn,dsec,sec)
  memo=time
 endif
 
 'Bascule entre les deux boucles par poussoir C.3
 if pinC.3 =1 then
  
  Do:pause 100:Loop while pinC.3=1  'attente relachement du poussoir  
  serout C.1,baud,(254,195,"      ")  'position ligne4, col13
  goto marche
 endif  
 
 Loop while time < TempsOff    'fin de boucle sortie Off
 serout C.1,baud,(254,195,"      ")  'effacement position ligne4, col13
 goto marche
'*********** 'Sous programmes réglage de TempsON et TempsOFF *****************
lectemps: 
  'et mise à l'echelle
 serout C.1,baud,(254,128,"MA hhmmss/")  'position ligne 1
 serout C.1,baud,(254,192,"AR hhmmss/")    'position ligne 2  
  
'Lecture temps ON
 memo=0
 var1=138  'position curseur 
 gosub lecpot 'lecture potentiomètre
 TempsOn= memo  'enregistrement du temps en secondes
 
'Lecture temps OFF
 memo=0
 var1=202
 gosub lecpot
 TempsOff= memo
 write 0,word TempsOn,word TempsOff 'sauvegarde en EEPROM
 serout C.1,baud,(254,131,"      ")  'position ligne 1 col 4
 serout C.1,baud,(254,195,"      ")  'position ligne 2 col 4
 return 
'******* 'Sous programme lecture du potentiomètre ***************************  
lecpot:  
 Do     'boucle Do principale
  readadc C.4, potar 'lecture du pot   
  hr= 17 *potar/254  'mise à l'échelle     
  var2=hr   'mémo hr 
  dhr=hr/10+48  'dizaines d'hr
  hr=hr//10+48  'unités hr 
  serout C.1,baud,(254,var1,dhr,hr) 'écriture LCD
   If pinC.3=1 then   'pression poussoir
    Do:loop while pinC.3=1 'attente relachement
    Exit     'sortie boucle Do principale
   endif
 loop
 memo=var2*3600 'mémo nombre hr en secondes
 var1=var1+2  'incrémentation curseur
 Do 
  readadc C.4, potar     
  mn= 59 *potar/254
  var2=mn 
  dmn=mn/10+48
  mn=mn//10+48 '
  serout C.1,baud,(254,var1,dmn,mn)
   If pinC.3=1 then
    Do:loop while pinC.3=1
    Exit
   endif
 loop
 memo=var2*60+memo
 var1=var1+2 
 Do 
  readadc C.4, potar   
  sec= 59 *potar/254
  var2=sec
  dsec=sec/10+48
  sec=sec//10+48
  serout C.1,baud,(254,var1,dsec,sec)
   If pinC.3=1 then
    Do:loop while pinC.3=1   
    Exit
   endif
 loop
 memo=memo+var2
 return
'***************************************************
conver: 'Ici, on décompose en heures, minutes et secondes
  'puis +48 pour le code ascii  
 hr=temps/3600 'heures entières
 sec=temps//60 'reste secondes
 var2=3600*hr  'heures entières en minutes
 var2=temps-var2-sec 'minutes entières en secondes
 mn=var2/60  'minutes entières en mn 
 dhr=hr/10+48 'chiffre diz heures
 hr=hr//10+48 'chiffre heures    
 dmn=mn/10+48 'chiffre diz mn
 mn=mn//10+48 'chiffre mn  
 dsec=sec/10+48 'chiffre dizaines de secondes
 sec=sec//10+48 'chiffre unités de secondes    
 return  
'****************************************************************
 

 

Partager cette page

Repost 0
Pour être informé des derniers articles, inscrivez vous :