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