Sonde de niveau capacitive
compensation de température
Le projet ci dessous est destiné à mesurer la hauteur d'un mélange glycol+eau dans des réservoirs de différentes hauteurs.
La partie mécanique de la sonde d'essai est composée d'un tube de cuivre de diamètre 10mm, avec comme électrode centrale une tige de 3mm isolée par une gaine thermorétractable. c'est l'épaisseur de cette gaine qui constitue le diélectrique du condensateur variable.
La longueur est fonction du réservoir, on peut modifier l'épaisseur de l'isolant pour adapter la variation de capacité.
Le contact accidentel de l'électrode centrale avec le liquide provoque un message d'erreur "DEFAUT SONDE".
Cet ensemble est directement reliée à un picaxe 08M2 contenant le code émetteur transmettant les données par liaison RS232. Cette tête de sonde est très reduite (un 08M2 et deux condensateurs de découplage).
Ces données sont reçues par un second picaxe 08M2, gestionnaire du système.
Lorque l'on soumet la tête de capteur à des variations de température, on introduit une erreur de quelques pourcents.
Il y a dans ces µC un capteur de température interne donnant une variable fonction de cette température.
La lecture de cette variable est envoyée au µC de traitement.
Après calcul d'une compensation adaptée, les variations de températures, du chauffage au décapeur thermique (modéré quand même, j'ai pas de sèche cheveux) à la projection de réfrigérant donnent des variations de mesure de l'ordre de 1%.
Le schéma précédent, légèrement modifié: 
La sonde:
C'est la sonde du test précédent, 20 cm de long, le picaxe est reprogrammé pour la correction de température
Les résultats dépendent de la qualité mécanique de cette sonde.
Un simple fil rigide isolé ou une barre gainée donne de bons résultats, voir la vidéo page précédente.
Pour les sondes courtes, une spirale augmente la résolution, sans modifer la configuration de la commande "touch16"
Pour le tube de cuivre, il faut un bon drainage du liquide et un espace suffisant entre les électrodes pour un bon écoulement, éviter les phénomènes de capilarité, etc
On obtient un bon résultat avec du fil fin émaillé (récup bobinage), la faible épaisseur de l'isolant donne des variations de capacité rapides, pour adapter la sensibilité de la commande, voir la tableau sur cette
page de test.
(La suite des explications arrive...) Le code émetteur modifié:
(Faire un copier-coller des codes dans l'éditeur PE6 pour leur rendre couleurs et tabulation) ;EMETTEUR SERIE pour sonde capacitive MM 08072016
;Avec correction de température
#picaxe 08M2 ;directive pour cohérence commandes
#no_data ;pour gagner 3 s au chargement code
;******* Nominations ports et variables***********
setfreq m4 ;rappel fréq de base
symbol baud= N2400_4 ;constante fréq rs232
;**** Nomination des ports
symbol sonde = 4 ;canal commande touch idem C.4 sur M2
symbol portS = C.1 ;port liaison série
;****** Boucle de mesure et liaison série ***********
Do
touch16 [%11001001],sonde,w13 ;w13 (type word est composé des deux bytes (b27;b26)
readinternaltemp IT_RAW_H,0,w12 ;transmission référence t° interne pour Vcc 5v
serout portS,baud,(b27,b26,b25,b24) ;deux octets de w13 et 2 octets w12 par serout
pause 100 ;Faut pas aller trop vite
loop Le code récepteur avec la compensation de température: ;Ex: Sonde de niveau capacitive MM 13/09/2015
;**** calibration de la sonde à la mise sous tension. ***************
;**** La réponse de la comande TOUCH est considérée comme linéaire
;**** Le sous programme "calib:" mesure deux points arbitraires 0 et 100% *********
;**** mesure de la référence interne de température
;**** Ces trois mesures sont mémorisées en EEPROM
;**** Calcule de la proportionnalité entre la mesure et les valeurs mémorisées ****
;**** Calcul d'une correction de température
;**** Affichage du Niveau et de la correction
;**** Affiche les étapes successives **************
#picaxe 08M2 ;directive picaxe utilisé (pour erreur de commandes)
;****** Nominations variables ********
symbol baud= N2400 ;le même pour serin et serout (facilité)
;****** variables word *********
symbol mesur = w13 ;(b27,b26)
symbol compens = w12 ;(b25,b24)
symbol haut = w11 ;réf niveau haut
symbol bas = w10 ;ref niveau bas
symbol rapcycl = w9 ;rapport cyclique PWM
symbol memcomp = w8 ;mémo réf compensation t°
symbol delta = w7 ;delta haut-bas
;***** noms variables bytes ****************
; b1,b2,b3 utilisés dans bintoascii
symbol sig = b4
;******* Nominations ports ***********
symbol LCD = C.0 ;sortie LCD série
symbol SONDE = C.4 ;entrés sonde
symbol SPWM = C.2 ;sortie PWM
symbol valid = pinC.3 ;valeur poussoir de validation
;******* Début Programme principal *****************
pause 200 ' initiation LCD
pullup %01000 ;pullup sur C.3
pwmout pwmdiv4, C.2, 249, 999
read 0,word bas, word haut,word memcomp ; lecture paramdroire +compens pendant calib
if bas =0 or valid=0 then calib ; Vers calib: si paramétre nul ou nouvelle calibration
;***** boucle pricipale **************************************
Do
gosub mesure
gosub calcul
gosub affich
gosub sortiePWM
loop
;******* Fin programme principal *****************
;******* Les sous programmes: ***********************
;************** Mesure de la sonde, liaison RS232 ***************
mesure:
serin [2000,alarmSonde],SONDE,baud,b27,b26,b25,b24 ;(b27;b26)mesur et (b13,b12)
;mesur=w13 = (b27;b26) ;reconstitution de la mesure brute
;compens = (b25,b24) ft tempé interne
if mesur =0 then gosub alarmsonde ;erreur de mesure, dépassement 65535
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/100 + compens
sig = "+"
else
compens=compens - memcomp ;plus chaud
compens=compens /4
mesur=mesur/100 - compens ;on garde les chiffres significatifs
sig="-"
endif
return
'******** Affichage des valeurs lues ***********
affich:
bintoascii mesur,b1,b1,b1,b2,b3 ;décomposition ascii
serout LCD,baud,(254,128,"niveau = ",b1,b2,b3," %") ;envoi LCD série
bintoascii compens,b1,b1,b1,b2,b3
serout LCD,baud,(254,192,"compens= ",sig,b1,b2,b3," " ) ;envoi LCD série
return
;******* Calibration, Calcul paramétres, Affichage, Mise en mémoires ***
calib:
do:loop while valid=0 ;attente relachement poussoir
serout LCD,baud,(254,1) ;effacement écran
serout LCD,baud,(254,128, "calibration 0 %") ;titre
do
serin [4000,alarmSonde],SONDE,baud,b27,b26,b25,b24 ;(b27,b26) mesur (b25,b24) compens
if mesur =0 then gosub alarmsonde ;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
serout LCD,baud,(254,192,"mesure 0% =",b1,b2,b3) ;pour voir
loop while valid=1 ;attente validation
serout LCD,baud,(254,128,"calibration 100%") ;titre
do:loop while valid=0 ;attente relachement poussoir
do
serin [4000,alarmSonde],SONDE,baud,b27,b26,b25,b24
if mesur =0 then gosub alarmsonde ;erreur de mesure, dépassement 65535
mesur=mesur/100 ;on garde les chiffres significatifs
haut=mesur ;mesure du point 100%
bintoascii mesur,b1,b1,b1,b2,b3
serout LCD,baud,(254,192,"mesure 100%=",b1,b2,b3)
loop while valid=1
if bas>haut then calib ;erreur de procédure. retour début
do:loop while valid=0 ;attente relachement poussoir
write 0,word bas,word haut,word compens ;Mise en mémoire EEPROM
serout LCD,baud,(254,1) ;Effacement écran
serout LCD,baud,(254,128, "calibration ") ;affichage
serout LCD,baud,(254,192, "effectu",1,"e ") ;1 est le é en CGRAM du LCD maison
pause 1000 ;Temps d'affichage 1 seconde
reset
;*********** Calcul pourcentage ***********************
calcul:
if mesur <=bas then ; on est en dessous de 0
mesur=0 ;butée à 0
else
mesur=mesur-bas ;calage à l'origine
delta=haut-bas ;delta calibration
mesur=100*mesur/delta ;proportionnalité ,unités en pourcents
endif
return
;***** Alarmes dépassement Time Out liaison sonde (temporaire) et défaut sonde **********
AlarmSonde:
if mesur=0 then
serout LCD,baud,(254,128,"DEFAUT SONDE 000")
else
serout LCD,baud,(254,128," DEFAUT TIMEOUT ")
endif
pause 2000 ;temps de lecture
serout LCD,baud,(254,1) ;effacement message
return
;**** Sortie du PWM niveau 100% = PWM 100%
SortiePWM:
if mesur > haut then
rapcycl=1000 ;pas de dépassement de 100% de rap cyclique
else
rapcycl=mesur * 10 ;rapport 10 entre % et rap cyclique
endif
pwmduty C.2, rapcycl ;sortie rap cyclique sur C.2
return