Electromag1 Circuits électroniques et Picaxes

Petit site pour ceux qui bricolent en électronique en général et sur les PICAXES en particulier.
Les PICAXES sont des microprocesseurs (PIC de Microship) programmables en BASIC. Pleins de qualités, pas chers, ultra faciles à programmer.
Tout (ou presque) est sur le site du distributeur Gotronic (voir les liens).
Les pages  seront ajoutées ou modifiées petit à petit.
Dans le but d'améliorer ce blog, communiquez moi vos remarques et les erreurs que vous pouvez constater.
Pour me contacter: Envoyez un mail à l'adresse : mag1mic@free.fr .  Tout message reçoit une réponse
Pour retourner au menu, Cliquer sur "LISTE DES PAGES", ici ou en haut de la colonne de gauche
Pour laisser un message, allez dans le "LIVRE D'OR"
Bonne visite
 
 
;Ex: sonde de niveau capacitive MM 16/11/2020 mod3
;**** calibration de la sonde par action 3 sec sur le poussoir de validation  ***********
;**** La réponse de la comande TOUCH16 est considérée comme linéaire (elle l'est...)
;**** Le sous programme "calib:" mesure deux points arbitraires 0 et 100%  *********
;**** mesure de la référence interne de température dans l'émetteur 08M2
;**** Ces trois mesures sont mémorisées en EEPROM
;**** Calcul de la proportionnalité entre la mesure et les valeurs mémorisées ****
;**** Calcul d'une correction de température (par rapport à la t° lors de la calibration)
;**** Affichage du Niveau en %, en litres et en Gallons Impériaux
;**** Affiche les étapes successives *********
#picaxe 14M2    ;directive picaxe utilisé (pour erreur de commandes)
setfreq M16        ;fréquence 16MHz            
;****** Nominations constantes ********
symbol baud= N2400_16      ;vitesse liaison RS232
symbol capacit= 323            ;capacité réservoir en L
symbol gallon=7105            ;capacité en /100 de Gallon Imp
;****** noms variables word *********  
symbol mesur        = w13       ;(b27,b26)
symbol compens        = w12       ;(b25,b24)
symbol bas            = w11       ;ref niveau bas
symbol memcomp       = w10         ;mémo réf compensation t°
symbol delta        = w9        ;delta haut-bas
symbol total        = w8        ;total réservoirs en %
symbol varw           = w7        ;variable tempotaire
symbol deb           = w6        ;debut texte  
symbol cpt            = w5        ;compteur
;***** noms variables bytes ****************
 ; b1,b2,b3,b4 utilisés dans bintoascii
symbol car        =b5            ;caractère à afficher
symbol dat        =b6            ;data I2C
symbol sonde    =b7            ;n° sonde
symbol posi        =b8            ;position curseur
symbol flagerr =b9            ;flag erreur
;******* noms variables bit sur b0 ***********
symbol rsbit    =bit0            ;bit commande/data afficheur
;******* Nominations ports ***********
symbol sonde0     = C.0       ;entrée sonde0 n°broche=8
symbol sonde1     = C.1       ;entrés sonde1 n°broche=9
symbol sonde2    = C.2          ;entrée sonde2 n°broche=10
symbol valid      = pinC.3    ;valeur poussoir de validation
symbol potaj2    = B.1        ;valeur ajustage sonde C.1
symbol potaj3    = B.2        ;valeur ajustage sonde C.2
; Initialisation I2C . pour 14M2:sda sur B.4 ; scl sur B.3
    hi2csetup i2cmaster,%01001110, i2cfast_16, i2cbyte
;** Entrée des données texte dans "table" ***********
    table 0,(51,50,40,12,6,1)        ;initialisation LCD 4 bits
    table 20,("  calibration 0%    ")
    table 40,("  mesure   0%=      ")
    table 60,("  calibraton 100%   ")
    table 80,("  mesure 100%=      ")
    table 100,("    calibration     ")
    table 120,("    effectu",1,"e       ")    ;1 pour é
    table 140,("   DEFAUT SONDE   ")    ;décalé de 2 à droite avec "#x" devant
    table 160,("   DEFAUT TIMEOUT ")    ;idem
    table 180,(2,4,14,17,31,16,14,0)    ;descripton lettre é    
    table 200,("  SONDE nß          ")    ;ß= alt+0223 =° sur écran chinois
    table 220,("RESERVES D'EAU:    %")
    table 240,("#1    %    L   ,  GI")
    table 260,("#2    %    L   ,  GI")
    table 280,("#3    %    L   ,  GI")
    pullup %0100000000000            ;pullup sur C.3
;***** macro texte ***************
    #macro text(posi,deb,varw)
    car=posi:gosub EnvoiByteComm        ;pos curseur en 128
    for cpt=deb to varw                
        readtable cpt,car            ;texte
        gosub EnvoiByteData        
    next
    #endmacro
; Initialisation LCD *********
    for cpt=0 to 5
        readtable cpt,car        
        gosub EnvoiByteCommInit
    next
    pause 500    ;temps init du LCD
    ; définition des caractères ajoutés en CGRAM
    ; def du é en CGRAM 1 **************************
    car=1*8|$40 :gosub EnvoiByteComm
    for cpt=180 to 187
        readtable cpt,car            ;description du é vers CGRAM n°1
        gosub EnvoiByteData        
    next
;******* Début Programme principal *****************      
    car=1:gosub EnvoiByteComm                ; raz afficheur
    read 0,word bas, word delta,word memcomp        ; lecture param droire + t° pendant calib
    if bas =0 then calib                       ; Vers calib si aucun paramètre enregistré    
;***** boucle pricipale **************************************     
      text(128,220,239)            ;texte "RESERVES D'EAU:    %"
    Do  
        time=0
        do while valid=0                    ;si valid=1, on entre pas
            if time> 3 then calib        ;demande de calibration
        loop         
        total=0
        for sonde=8 to 10    ;n° des broches : broches C.0=8,C.1=9,C.2=10            
           gosub mesure    
            gosub calcul
            gosub affich    
            total=total+mesur                            
        next
        gosub afftotal
        flagerr=0            ;reset flag pour sonde suivante                
    loop
;******* Fin programme principal *************
;******* Les sous programmes: ********************
;************** Mesure des sondes, liaison RS232 ***********
mesure:    
    serin [10000,geser2],sonde  ,baud,b27,b26,b25,b24  ;(b27;b26)mesur ; (b25,b24)compens
    ;mesur=w13 = (b27;b26)    ;reconstitution de la mesure brute
    ;compens = (b25,b24) ft tempé interne
    if mesur =0 then geser2    ;erreur de mesure, dépassement 65535
;***** compensation dispersion °C ************
    if sonde=8 then                
        mesur=mesur/100
    elseif sonde=9 then        
        readadc potaj2,varw        ;varw=0 à 255
        varw=varw/5            ;255/5=50 curseur milieu=25
        varw=75+varw            ;varw = de 75 à 125
        mesur=mesur/varw
    elseif sonde=10 then    
        readadc potaj3,varw
        varw=varw/5            
        varw=75+varw            
        mesur=mesur/varw            
    endif
;******* compensation température ************
    if memcomp>compens then     
      compens=memcomp- compens    ;plus froid
      compens=compens /4        ;ici un rapport 4 entre les variations mesure et ref t° interne
      mesur=mesur + compens      
    else
      compens=compens - memcomp   ;plus chaud
      compens=compens /4
      mesur=mesur - compens     ;on garde les chiffres significatifs    
    endif    
    return
'******** Affichage des valeurs lues ***********
affich:    
    if flagerr=sonde then        ;sonde en défaut => pas d'affichage
        return
    endif
     if sonde=8 then
        text(192,240,259)            ;texte fixe #1...
        posi=192                
    elseif sonde=9 then
        text(148,260,279)            ;texte fixe #2...
        posi=148        
    elseif sonde=10 then
        text(212,280,299)         ;texte fixe #3...
        posi=212    
    endif
;********** affichage en % **************
    car=posi+3:gosub EnvoiByteComm    ;pos curseur aff %
    bintoascii mesur,b1,b1,b1,b2,b3     ;décomposition ascii
    for cpt=0 to 2
        lookup cpt,(b1,b2,b3),car      ;affichage valeur en %
        gosub EnvoiByteData
    next
;********* affichage en litres ***********        
    car=posi+8:gosub EnvoiByteComm    ;pos curseur aff L
    varw=capacit *mesur/100
    bintoascii varw,b1,b1,b1,b2,b3     
    for cpt=0 to 2
        lookup cpt,(b1,b2,b3),car    ;affichage valeur en L
        gosub EnvoiByteData
    next
;*********** affichage en gallon imp ************    
    car=posi+13:gosub EnvoiByteComm    ;pos curseur
    varw=70*mesur                ;décomposition 7105*mesur/100 =70*mesur >> 7000
    varw=1*mesur+varw                ;+1*mesur    >> 100 + 7000 >> 7100
    varw=mesur/20+varw            ;+ mesur/20  >> 100/20 + 7100 >> 7105    
    bintoascii varw,b1,b1,b2,b3,b4      ;pas écraser les octets utiles      
    for cpt=0 to 1
        lookup cpt,(b1,b2),car        ;affichage partie entière
        gosub EnvoiByteData
    next    
    car=posi+16:gosub EnvoiByteComm    ;pos curseur
    for cpt=0 to 1
        lookup cpt,(b3,b4),car        ;affichage décimales, après virgule
        gosub EnvoiByteData
    next    
    pause 1000                    ;pour stabiliser l'affichage
  return
;afichage du total des 3 réservoirs en % (max=100%)
afftotal:
    total=total/3                ;moyenne de la somme des trois réservoirs
    bintoascii total,b1,b1,b1,b2,b3   
    car=144 :gosub EnvoiByteComm        ;position % global
     for cpt=0 to 2
        lookup cpt,(b1,b2,b3),car    ;affichage valeur en %
        gosub EnvoiByteData
    next
    return
;******* Calibration, Calcul paramètres, Affichage, Mise en mémoires ***
calib:
    car=1:gosub EnvoiByteComm        ;raz afficheur        
    text(128,20,39)                ;texte "calibration 0%"
    do:loop while valid=0        ;attente relachement poussoir
    text(192,40,59)                ;texte "mesure 0=%"      
    do  
        serin [20000,geser1],8,baud,b27,b26,b25,b24 ;(b27,b26) mesur (b25,b24) comprend        
        if mesur =0 then gosub geser1  ;erreur de mesure, dépassement 65535        
        mesur=mesur/100                ;on garde les chiffres significatifs         
        bas=mesur                           ;mesure du point 0%         
        bintoascii mesur,b1,b1,b1,b2,b3     ;affichage
        car=207: gosub EnvoiByteComm        ;pos curseur en 205
        for cpt=0 to 2
            lookup cpt,(b1,b2,b3),car    ;affichage valeur 0%
            gosub EnvoiByteData
        next
        pause 500    
    loop while valid=1                  ;attente validation                           
    car=1:gosub EnvoiByteComm        ;raz affichage
    text(128,60,79)                    ;texte calibration 100%
    do:loop while valid=0            ;attente relachement poussoir
    text(192,80,99)                    ;texte valeur mesure 100%=
    do
        serin [20000,geser1],8   ,baud,b27,b26,b25,b24
        if mesur =0 then gosub geser1   ;erreur de mesure sonde, dépassement 65535
        mesur=mesur/100                    ;on garde les chiffres significatifs               
        bintoascii mesur,b1,b1,b1,b2,b3            
        car=207: gosub EnvoiByteComm        ;pos curseur en 205
        for cpt=0 to 2
            lookup cpt,(b1,b2,b3),car    ;affichage mesure   100%
            gosub EnvoiByteData
        next    
    pause 500                    
    loop while valid=1
    if bas>mesur then calib                ;erreur de procédure. retour début      
    do:loop while valid=0                ;attente relachement poussoir
    delta=mesur-bas
    write 0,word bas,word delta,word compens      ;Mise en mémoire EEPROM
    text(128,100,119)                ;texte calibration   
    text(192,120,139)                ;texte effectuée
    pause 4000                      ;Temps d'affichage
    reset
;*********** Calcul pourcentage ***********************
calcul:
    if flagerr=sonde then    ;sonde en défaut => ps de calcul
         return
    endif    
    if mesur <=bas then         ; on est en dessous de 0
        mesur=0                    ;butée à 0
    else
        mesur=mesur-bas         ;calage à l'origine    
         mesur=100*mesur/delta              ;proportionnalité ,unités en pourcents
    endif                              
    return
  ;***** Alarmes dépassement Time Out liaison sonde (temporaire) et défaut sonde **********
geser1:  ;défaut en mode calibration
     car=1:gosub EnvoiByteComm    ;raz afficheur
    if mesur=0 then             ;erreur de mesure, dépassement 65535
        text(128,140,159)
    else                    ;temps TIMEOUT dépassé (liaison coupée ?)  
        text(128,160,179)
    endif    
    pause 6000                ;temps de lecture        
    return
geser2:
    flagerr=sonde            ;on a détecté une erreur sur cette sonde    
    if sonde=8 then
        if mesur=0 then
            text(194,140,157)    ;on écrit "DEFAUT SONDE" sur ligne correspoondante
        else
            text(194,160,177)    ;on écrit "DEFAUT TIME OUT" sur ligne correspoondante
        endif
    elseif sonde=9 then
        if mesur=0 then
            text(150,140,157)    ;decalage de 2 à droite pour garder #2 à gauche
        else
            text(150,160,177)
        endif
    elseif sonde=10 then
        if mesur=0 then
            text(214,140,157)
        else
            text(214,160,177)
        endif
    endif
    return
; Sub envoi vers LCD via I2C *************
EnvoiByteCommInit:
    pause 15
EnvoiByteComm:
    rsbit=0
EnvoiByteData:
;1ère moitié
    dat=car & $F0 | %1000 | rsbit ;%1000 pour l'éclairage
    hi2cout (dat)
    pause 2        
    dat=dat | %1100
    hi2cout (dat)        ;pulse sur E cad P2
    pause 2                ;pause 2 pour 32 MHz
    dat=dat | %1000    ;fin pulse
    hi2cout (dat)
    pause 2    
;2ème moitié
    dat=car & $0F * 16 | %1000 | rsbit
    hi2cout (dat)
    pause 2
    dat=dat | %1100
    hi2cout (dat)
    pause 2  
    dat=dat | %1000 & %1011
    hi2cout (dat)    
    rsbit=1
    return



Créer un site
Créer un site