[Outils/Fab/Comp] Jauge capacitive
Répondre à la discussion
Page 1 sur 2 1 DernièreDernière
Affichage des résultats 1 à 30 sur 33

Jauge capacitive



  1. #1
    Yex2

    Jauge capacitive


    ------

    Bonjour à tous,

    Ce post est pour faire suite à une discussion que j'ai démarré en 2017. Après de nombreuses suggestions, j'ai retenu celle de Mag1, soit 3 sondes capacitives utilisant les MP Picaxe. Je résume rapidement le projet :

    Il y a 3 réservoirs d'eau de forme cubique et de volume identique. Je voulais un affichage LCD me donnant le volume d'eau dans chaque réservoir et la sommes totales. Le LCD affiche en %, Litres et Gallons Impériaux.

    Les sondes qui m'ont donné le meilleur résultat sont fait en plastique PVC avec un fil émaillé et un fil d'inox pour le gnd. (voir les photos plus bas).

    Les programmes sont de Mag1.

    Le programme principale :

    Code:
    ;Ex: sonde de niveau capacitive MM 13/06/2018
    ;**** calibration de la sonde par action 3 sec sur le poussoir de validation  ***********
    ;**** La réponse de la comande TOUCH 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 % et en litres
    ;**** 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 ajust	=b9			;ajustement °C lue sur potar
    ;******* noms variables bit sur b0 ***********
    symbol rsbit=bit0				;bit commande/data afficheur
    symbol calibr=bit1			;memo phase calibration
    ;******* 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     ")
    	table 160,("   DEFAUT TIMEOUT   ")
    	table 180,(2,4,14,17,31,16,14,0)	;descripton lettre é	
    	table 200,("  SONDE nß          ")	;ß= alt+0223 =° sur clavier
    	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 ************************************** 
    debut:
    	calibr=0				;on est pas en calibration	
          text(128,220,239)			;texte "RESERVES D'EAU:    %"
    	text(192,240,259)			;texte fixe
    	text(148,260,279)
    	text(212,280,299) 
    	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	   
    	loop
    ;******* Fin programme principal *************
    
    ;******* Les sous programmes: ********************
    ;************** Mesure des sondes, liaison RS232 ***********
    ; Pour les essais avec une seule sonde, le port serin est bloqué à 8 (C.1) au lieu de scanner les 3 sondes
    ; Pour le scanne réel, il faut remplacer le "8" par "sonde" dans la commande serin ci dessous
    mesure:	
    	serin [10000,alarmsonde],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 alarmsonde    ;erreur de mesure, dépassement 65535
    ;***** compensation dispersion °C ************ 
    	if sonde=8 then
    		mesur=mesur/100
    	elseif sonde=9 then
    		readadc potaj2,ajust		;ajust=0 à 255
    		ajust=ajust/5			;255/5=50 curseur milieu=25
    		ajust=75+ajust			;ajust = de 75 à 125
    		mesur=mesur/ajust
    	elseif sonde=10 then
    		readadc potaj3,ajust
    		ajust=ajust/5			
    		ajust=75+ajust			
    		mesur=mesur/ajust			
    	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 sonde=8 then
    		posi=192				
    	elseif sonde=9 then
    		posi=148		
    	elseif sonde=10 then
    		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 	
    	calibr=1 	
    	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,alarmsonde],8,baud,b27,b26,b25,b24 ;(b27,b26) mesur (b25,b24) comprend        
    		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
    		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,alarmsonde],8   ,baud,b27,b26,b25,b24
    		if mesur =0 then gosub alarmsonde   ;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 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 **********    
    Alarmsonde:
    	car=1:gosub EnvoiByteComm	;raz afficheur
    	if mesur=0 then 			;erreur de mesure sonde (défaut isolant ?)
    	text(128,140,159)
    	else					;temps TIMEOUT dépassé (liaison coupée ?)
    	text(128,160,179)
    	endif
    	text(192,200,219)			;texte sonde n°
    	sonde =sonde-7			;pour numéroter les sondes de 1 à 3
    	bintoascii sonde,b1,b2,b3
    	car=203:gosub EnvoiByteComm	;pos curseur en 128
    	car=b3: gosub EnvoiByteData 	;sonde en défaut 	
    	pause 6000        		;temps de lecture		
    	if calibr=1 then calib		;on tait en calibration. On y retourne
    	goto debut  			;retour au dbut de la boucle principale 
     
    ; 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

    Le programme pour les sondes est le suivant. Noté qu'il a fallu jouer avec la sensibilité du PICAXE afin de s'adapter le mieux possible avec la sonde.

    Code:
    ;EMETTEUR SERIE pour sonde capacitive  MM 020619
    ;Avec correction de température
    ;sondes Yex2
    #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		= C.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 [%11010001],sonde,w13		;w13 (type word est composé  des deux bytes (b27;b26)
    ;touch16 [%10010001],sonde,w13		;Pour x2:
    touch16 [%01010001],sonde,w13			;Pour x3: (semble parfaite pour les nouvelles sondes du bateau 11/2020)
    ;touch16 [%00010001],sonde,w13		;Pour x4: valeur par défaut 
    ;touch16 [%01011001],sonde,w13		; (sonde nu2)
    ;touch16 [%01011000],sonde,w13		;Meilleur résultat à date 
    ;touch16 [%11111011],sonde,w13		; moins grande sensibilité (de l'ordre de 100 pF à 10 nF (utilisé pour la sonde du chalet) (sonde nu3)
       	readinternaltemp IT_RAW_H,0,w12    	;transmission réfrence t° interne pour Vcc 5v              
       	serout portS,baud,(b27,b26,b25,b24)     ;deux octets de w13 et 2 octets w12 par serout
          pause 500        ;Faut pas aller trop vite  
      loop

    Voici le circuit :

    niveaux3sondes-LCD2004.JPG

    Voici les sondes :

    IMG_20201113_142706016.jpg IMG_20201111_135844793.jpgIMG_20201113_142727118.jpg


    Bon ma question s'adresse à Mag1. Si je peux me permettre, il y a selon moi il y a un bug de logique dans le programme principale. À la ligne 125 on trouve le code suivant :

    Code:
    if mesur =0 then alarmsonde    ;erreur de mesure, dépassement 65535
    Si une sonde venait qu'à faire défaut, ce qui est plus que possible dans l'environnement salin, alors le programme va dans la sous routine "alarmsone", affiche l'erreur approprié de la ligne 56 ou 57, soit

    table 140,(" DEFAUT SONDE ")
    table 160,(" DEFAUT TIMEOUT ")

    et n'en ressort plus. C'est là le problème selon moi. Il faudrait plutôt afficher l'erreur en question sur la ligne de la mesure de la sonde et permettre au programme de continuer à donner de l'information sur les deux autres réservoirs. Ex. disons que la sonde 3 fait défaut :

    Si tout va bien, l'afficheur LCD renvoi ceci lorsque les réservoirs sont pleins :

    RESERVES D'EAU: 100%
    #1 100% 323L 71,05GI
    #2 100% 323L 71,05GI
    #3 100% 323L 71,05GI

    Si la sonde #3 cesse e fonctionner, au lieu de sortir, il faudrait plutôt afficher quelques chose comme ceci :

    RESERVES D'EAU: 66%
    #1 100% 323L 71,05GI
    #2 100% 323L 71,05GI
    #3 DEFAUT SONDE

    ou

    RESERVES D'EAU: 66%
    #1 100% 323L 71,05GI
    #2 100% 323L 71,05GI
    #3 DEFAUT TIMEOUT

    Au moins dans ce cas, nous avons toujours les deux première sondes fonctionnelles. J'ai tenté d'ajuster ton programme mais pas trop compris comment tout se jouait... Peux-tu m'aider stp ?

    Merci,

    Yex2

    -----

  2. #2
    mag1

    Re : Jauge capacitive

    Re bonjour Yex2

    Pour les plus curieux, ceci est la suite d'une discussion qui date un peu:
    https://forums.futura-sciences.com/e...veau-deau.html
    La maquette d'essai de l'époque a été démontée, elle sera remontée si nécessaire. Seuls, les affichages de LCD série sont simulables sur l'éditeur PE6

    Le problème est qu'une détection de défaut sur une sonde bloque le système.
    Tu as bien vu la source du problème. Le sous programme de gestion de défaut se termine par un goto debut...erreur fatale due au seul "goto" du programme, solution de facilité qu'il va falloir corriger.
    En attendant, un palliatif est la suppression de la gestion de défaut, en mettant un ";" en début de ligne "if mesure =0...". La ligne ne sera plus exécutée.
    A suivre
    MM
    Si il y a des erreurs ci dessus, c'est que je n'ai pas eu le temps de les corriger...

  3. #3
    Yex2

    Re : Jauge capacitive

    Citation Envoyé par mag1 Voir le message
    En attendant, un palliatif est la suppression de la gestion de défaut, en mettant un ";" en début de ligne "if mesure =0...". La ligne ne sera plus exécutée.
    A suivre
    MM
    C'est ce que j'ai fait cette semaine. Lorsque la sonde est débranchée ou défectueuse, elle renvoie 0, m'indiquant ainsi qu'il y a un problème.

    J'ai une piste. Dans la sous routine "affich", il y a ceci :

    Code:
    affich:		
     	if sonde=8 then
    		posi=192				
    	elseif sonde=9 then
    		posi=148		
    	elseif sonde=10 then
    		posi=212	
    	endif

    Si on ajoutait quelques chose du genre :

    Code:
    if if mesur =0 then 
    text(posi,140,159)			;DEFAUT SONDE
    text(posi,160,179)			;DEFAUT TIMEOUT
    elsif
    
    ; le reste de la sou-routine...
    
    ;********** 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

    Qu'en penses-tu ? Est-ce que la mention "défaut" sera affiché sur la ligne défectueuse ?

  4. #4
    Yex2

    Re : Jauge capacitive

    Ça serait plutôt ceci :

    Code:
    if mesur =0 then 
    text(posi,140,159)			;DEFAUT SONDE
    else text(posi,160,179)			;DEFAUT TIMEOUT
    elsif...

  5. A voir en vidéo sur Futura
  6. #5
    mag1

    Re : Jauge capacitive

    Citation Envoyé par Yex2 Voir le message
    C'est ce que j'ai fait cette semaine. Lorsque la sonde est débranchée ou défectueuse, elle renvoie 0, m'indiquant ainsi qu'il y a un problème.

    J'ai une piste. Dans la sous routine "affich", il y a ceci :
    Code:
    affich:		
     	if sonde=8 then
    		posi=192				
    	elseif sonde=9 then
    		posi=148		
    	elseif sonde=10 then
    		posi=212	
    	endif
    Si on ajoutait quelques chose du genre :
    Code:
    if if mesur =0 then 
    text(posi,140,159)			;DEFAUT SONDE
    text(posi,160,179)			;DEFAUT TIMEOUT
    elsif
    ; le reste de la sou-routine...
    ;********** 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
    Qu'en penses-tu ? Est-ce que la mention "défaut" sera affiché sur la ligne défectueuse ?
    Le problème est plus global. Tant qu'il y aura le "goto debut" en fin de sub alarme, il y aura un problème.
    Le but était de signaler un défaut pour y remédier, sans plus.

    En fait, il y a deux sources d'erreurs:
    Pas de réception de signal => défaut de liaison (timeout du serin)
    valeur nulle => défaut de sonde
    Les deux pointent dans la sub, doù le test "valeur=0" pour différentier le texte dans la sub
    De plus, la même sub est utilisée dans le mode calibration.

    Le but du "goto debut" était de rétablir l'affichage du texte permanent => à revoir

    Donc, c'est le bazar. Il y a quelques retouches à faire pour faire un peu plus "propre" .

    MM
    Dernière modification par mag1 ; 14/11/2020 à 16h15.
    Si il y a des erreurs ci dessus, c'est que je n'ai pas eu le temps de les corriger...

  7. #6
    Yex2

    Re : Jauge capacitive

    Citation Envoyé par mag1 Voir le message
    Le problème est plus global. Tant qu'il y aura le "goto debut" en fin de sub alarme, il y aura un problème.
    Le but était de signaler un défaut pour y remédier, sans plus.

    En fait, il y a deux sources d'erreurs:
    Pas de réception de signal => défaut de liaison (timeout du serin)
    valeur nulle => défaut de sonde
    Les deux pointent dans la sub, doù le test "valeur=0" pour différentier le texte dans la sub
    De plus, la même sub est utilisée dans le mode calibration.

    Le but du "goto debut" était de rétablir l'affichage du texte permanent => à revoir

    Donc, c'est le bazar. Il y a quelques retouches à faire pour faire un peu plus "propre" .

    MM
    En effet c'est le bazar...

    J'aurais espéré que ce sois une correction facile mais les lois de Murphey font en sorte que ça l'est rarement...

    Bon bien je te laisse faire puisque c'est toi l'expert des Picaxe ici...

  8. #7
    mag1

    Re : Jauge capacitive

    Citation Envoyé par Yex2 Voir le message
    En effet c'est le bazar...
    Merci de confirmer...

    Des photos de sondes sont floues. Où est le fil émaillé, au bout ?

    MM
    Dernière modification par mag1 ; 14/11/2020 à 18h52.
    Si il y a des erreurs ci dessus, c'est que je n'ai pas eu le temps de les corriger...

  9. #8
    Yex2

    Re : Jauge capacitive

    Oui je sais ma caméra n'est pas des plus parfaites...

    Oui il s'agit bien d'un fil émaillé à droite et d'un fil d'inox à gauche pour la mise à la terre....

    Nom : 425160d1605297109-jauge-capacitive-img_20201113_142727118.jpg
Affichages : 149
Taille : 83,5 Ko
    Dernière modification par Yex2 ; 14/11/2020 à 23h25.

  10. #9
    mag1

    Re : Jauge capacitive

    Bonjour,

    Le fil émaillé est peu mouillable, mais pour un bon drainage, il est préférable de l'écarter du tube, en le centrant sur la barre de retour, une encoche au centre,par ex, pour éviter qu'il glisse.
    Au sujet du défaut apparaissant à partir de 90% évoqué en MP, il est important de vérifier quelque chose:
    Les picaxes ne sont pas rigoureusement identiques, il y a deux potars pour annuler la dispersion des sondes branchées en 2 et 3.
    Mais pour chaque sonde, il faut vérifier qu'il n'y a pas de dépassement de capacité, ce qui entraine défaut.
    Pour le vérifier, il faut passer par le mode calibration, on peut lire la valeur brute retournée par la commande.Elle varie de 0 (jamais lu car il y a toujours une capacité parasite résiduelle), à 65535. Si pendant l'immersion, cette valeur max est dépassée, la valeur passe à 0 d'où détection de défaut.
    Si c'est le cas, il faut choisir un octet de configuration diminuant la sensibilité.
    A vérifier avant de faire une nouvelle sonde.

    MM
    Si il y a des erreurs ci dessus, c'est que je n'ai pas eu le temps de les corriger...

  11. #10
    mag1

    Re : Jauge capacitive

    Indépendamment de la vérif du dépassement de capacité, voici un programme avec gestion d'erreur revisité.
    Il devrait répondre au problème.
    Mais attention, il n'a pas été testé, ni sur simu, ni en réalité, il n'a tourné que dans ma tête, donc, tout est possible...
    A tester en réel, si ça fonctionne en débranchant une soude et en la rebranchant, ça devrait aller.
    A suivre
    Code:
    ;Ex: sonde de niveau capacitive MM 15/11/2020
    ;**** calibration de la sonde par action 3 sec sur le poussoir de validation  ***********
    ;**** La réponse de la comande TOUCH 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 % et en litres
    ;**** 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 ajust	=b9			;ajustement °C lue sur potar
    ;******* noms variables bit sur b0 ***********
    symbol rsbit	=bit0			;bit commande/data afficheur
    symbol calibr	=bit1			;memo phase calibration
    symbol flagerr	=bit2			;flag erreur
    symbol memoflag=bit3
    ;******* 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     ")
    	table 160,("   DEFAUT TIMEOUT   ")
    	table 180,(2,4,14,17,31,16,14,0)	;descripton lettre é	
    	table 200,("  SONDE nß          ")	;ß= alt+0223 =° sur clavier
    	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 ************************************** 
    	calibr=0				;on est pas en calibration	
    	flagerr=0			;cnfirmation
    	memoflag=0			;idem
      	gosub texte   		;écriture texte fixe
    	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
    			flagerr=0			;reset du flag erreur pour n°sonde suivant
    	   	gosub mesure    
    			gosub calcul
    			gosub affich	
    			total=total+mesur							
    		next
    		gosub afftotal
    		if memoflag<>flagerr then	;si en fin de cycle sonde flagerr=0 => plus d'erreur
    			gosub texte			;réécriture du texte fixe (les trois lignes
    			memoflag=0			;effacement mémoire erreur
    		endif	   				;après fin erreur
    	loop
    ;******* Fin programme principal *************
    
    ;******* Les sous programmes: ********************
    ;************** Mesure des sondes, liaison RS232 ***********
    ; Pour les essais avec une seule sonde, le port serin est bloqué à 8 (C.1) au lieu de scanner les 3 sondes
    ; Pour le scanne réel, il faut remplacer le "8" par "sonde" dans la commande serin ci dessous
    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,ajust		;ajust=0 à 255
    		ajust=ajust/5			;255/5=50 curseur milieu=25
    		ajust=75+ajust			;ajust = de 75 à 125
    		mesur=mesur/ajust
    	elseif sonde=10 then	
    		readadc potaj3,ajust
    		ajust=ajust/5			
    		ajust=75+ajust			
    		mesur=mesur/ajust			
    	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=1 then	;erreur de mesure sonde, on passe
    		 return 
    	endif    	
     	if sonde=8 then
    		posi=192				
    	elseif sonde=9 then
    		posi=148		
    	elseif sonde=10 then
    		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 	
    	calibr=1 	
    	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=1 then	;erreur de mesure sonde, on passe
    		 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
    texte:
    	text(128,220,239)			;texte "RESERVES D'EAU:    %"
    	text(192,240,259)			;texte fixe #1...
    	text(148,260,279)			;texte fixe #2...
    	text(212,280,299) 		;texte fixe #3...
    	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 sonde (défaut isolant ?)
    		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=1			;on a détecté une erreur sur une sonde
    	memoflag=flagerr	;mémo du passage => 
    	if sonde=8 then
    		if mesur=0 then
    			text(128,140,159)	;on écrit "DEFAUT SONDE" sur ligne correspoondante
    		else 
    			text(128,160,179)	;on écrit "DEFAUT TIME OUT" sur ligne correspoondante
    		endif
    	elseif sonde=9 then
    		if mesur=0 then
    			text(192,140,159)
    		else 
    			text(192,160,179)
    		endif
    	elseif sonde=10 then
    		if mesur=0 then
    			text(148,140,159)
    		else 
    			text(148,160,179)
    		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

    MM
    Dernière modification par mag1 ; 15/11/2020 à 14h25.
    Si il y a des erreurs ci dessus, c'est que je n'ai pas eu le temps de les corriger...

  12. #11
    Yex2

    Re : Jauge capacitive

    Citation Envoyé par mag1 Voir le message
    Bonjour,

    Le fil émaillé est peu mouillable, mais pour un bon drainage, il est préférable de l'écarter du tube, en le centrant sur la barre de retour, une encoche au centre,par ex, pour éviter qu'il glisse.
    Oui tout à fait. Les première sondes étaient construites comme tu proposes. J'avais placé le fil émaillé dans le centre et le fil de mise à la terre à l'extérieur du tube. Ça fonctionnait super bien jusqu'à ce que l'endroit où je faisais pénétrer le fil de gnd dans le tube. À cette endroit précis, la sensibilité de la sonde explosait...

    J'ai donc refais les sondes en plaçant les deux fils à l'intérieur. Mais comme le fil d'inox n'est pas tout à fait droit, il a fallu que je les écarte un peu...

    J'ai trouvé le problème de la troisième sonde. Elle était un peu plus sensible que les deux premières. J'ai donc réduit la sensibilité global en utilisant cette commande: "touch16 [%01010001],sonde,w13 ". Maintenant les trois sondes fonctionnent très bien...

    PS: le fil ne peut pas glissé. Le tout est saturer d'Epoxy. C'était nécessaire pour imperméabiliser le bout de bois également.

    Au sujet du défaut apparaissant à partir de 90% évoqué en MP, il est important de vérifier quelque chose:
    Les picaxes ne sont pas rigoureusement identiques, il y a deux potars pour annuler la dispersion des sondes branchées en 2 et 3.
    Mais pour chaque sonde, il faut vérifier qu'il n'y a pas de dépassement de capacité, ce qui entraine défaut.
    C'est exactement ce qui se passait et j'ai corrigé en conséquence. Maintenant la plage lu se trouve entre ± 15 à ± 500 (bien en bas du 655 qui fait tout planter) mais suffisamment large pour me donner une grande précision.


    Pour le vérifier, il faut passer par le mode calibration, on peut lire la valeur brute retournée par la commande.Elle varie de 0 (jamais lu car il y a toujours une capacité parasite résiduelle), à 65535. Si pendant l'immersion, cette valeur max est dépassée, la valeur passe à 0 d'où détection de défaut.
    Si c'est le cas, il faut choisir un octet de configuration diminuant la sensibilité.
    A vérifier avant de faire une nouvelle sonde.
    Oui effectivement hier matin je me suis levé en me disant exactement la même chose. J'ai vérifié ça avant de me lancer dans la conception d'une nouvelle sonde, qui soit dit en passant est passablement chiant à faire. J'ai plusieurs niveau de protection contre l'eau et l'humidité. Nécessaire vu qu'elle devra résister aux assaut de la mer tout en restant étanche...

    Il reste seulement à corriger le problème principale.

    Petite note : la fonction d'alarme est ok lorsqu'on calibre. Je la garderais. Ce n'est qu'une fois que le programme est en route qu'il faut modifier sont comportement...

    La première sonde avec le fil inox à l'extérieur qui retourne à l'intérieur à la tête de la sonde. C'est là que l'hypersensibilité apparaissait.
    IMG_20201111_135723988.jpg
    IMG_20201111_155017797.jpg
    IMG_20201111_135623046.jpg

  13. #12
    Yex2

    Re : Jauge capacitive

    Citation Envoyé par mag1 Voir le message
    Indépendamment de la vérif du dépassement de capacité, voici un programme avec gestion d'erreur revisité.
    Il devrait répondre au problème.
    Mais attention, il n'a pas été testé, ni sur simu, ni en réalité, il n'a tourné que dans ma tête, donc, tout est possible...
    A tester en réel, si ça fonctionne en débranchant une soude et en la rebranchant, ça devrait aller.
    A suivre
    Ha merci Mag!

    Je vais tester ça aujourd'hui et je te reviens avec les résultats...

    Encore merci,

    Yex

  14. #13
    Yex2

    Re : Jauge capacitive

    Salut Mag,

    Je viens de tester ton programme. Il y a quelques bug.

    Le premier c'est au niveau de l'affichage. Il faut afficher à partir de la deuxième ligne. J'ai apporté les corrections dans la sous-routine gerser2

    Code:
    geser2:
    	flagerr=1				;on a détecté une erreur sur une sonde
    	memoflag=flagerr			;mémo du passage => 
    	if sonde=8 then
    		if mesur=0 then
    			text(192,140,159)	;on écrit "DEFAUT SONDE" sur ligne correspoondante
    		else 
    			text(192,160,179)	;on écrit "DEFAUT TIME OUT" sur ligne correspoondante
    		endif
    	elseif sonde=9 then
    		if mesur=0 then
    			text(148,140,159)
    		else 
    			text(148,160,179)
    		endif
    	elseif sonde=10 then
    		if mesur=0 then
    			text(212,140,159)
    		else 
    			text(212,160,179)
    		endif
    	endif
    	return
    Le deuxième bug est un peu plus bizarre. Je n'ai pas encore trouvé où il se trouve. Voici ce qui arrive. Si on débranche la 3e sonde, tout fonctionne bien. TIMEOUT apparait sur la dernière ligne et les deux autres sondes se comporte normalement et le total se fait sur les deux réservoir actif.

    Mais lorsqu'on débranche la sonde #1 ou #2, l'affichage se met à faire des cycles... J'ai fait une vidéo pour montrer ce qui se passe.

    http://www.voile.org/VID_20201115_103415764.mp4

  15. #14
    Yex2

    Re : Jauge capacitive

    J'oubliais,

    Pour le mode de calibration c'est super. Si je débranche les sondes 2 ou 3 rien se passe. Je peux continuer à calibrer. Les deux sondes sont ignorées, ce qui est parfait.
    Seule la sonde #1 doit être active...

    Merci,

    Yves

  16. #15
    mag1

    Re : Jauge capacitive

    Citation Envoyé par Yex2 Voir le message
    J'oubliais,
    Pour le mode de calibration c'est super. Si je débranche les sondes 2 ou 3 rien se passe. Je peux continuer à calibrer. Les deux sondes sont ignorées, ce qui est parfait.
    Seule la sonde #1 doit être active...
    Merci,
    Yves
    Oui, la calibration ne se fait que sur la sonde n°1.
    Mais, il faut passer les trois sondes en position 1. Ce qui permet de las classer en ft de la sensibilité.
    Ensuite, il faut placer la sonde de sensibilité médiane en pos1. Les sondes 2 et 3 sont ensuite à aligner (même niveau même valeur). il y en aura une en compensation + et l'autre en compensation -. C'est mieux que de compenser du même côté.

    Première erreur corrigée : décalage des lignes "erreur" vers le haut:

    Code:
    ;Ex: sonde de niveau capacitive MM 15/11/2020
    ;**** calibration de la sonde par action 3 sec sur le poussoir de validation  ***********
    ;**** La réponse de la comande TOUCH 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 % et en litres
    ;**** 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 ajust	=b9			;ajustement °C lue sur potar
    ;******* noms variables bit sur b0 ***********
    symbol rsbit	=bit0			;bit commande/data afficheur
    symbol calibr	=bit1			;memo phase calibration
    symbol flagerr	=bit2			;flag erreur
    symbol memoflag=bit3
    ;******* 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     ")
    	table 160,("   DEFAUT TIMEOUT   ")
    	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 ************************************** 
    	calibr=0				;on est pas en calibration	
    	flagerr=0			;cnfirmation
    	memoflag=0			;idem
      	gosub texte   		;écriture texte fixe
    	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
    			flagerr=0			;reset du flag erreur pour n°sonde suivant
    	   	gosub mesure    
    			gosub calcul
    			gosub affich	
    			total=total+mesur							
    		next
    		gosub afftotal
    		if memoflag<>flagerr then	;si en fin de cycle sonde flagerr=0 => plus d'erreur
    			gosub texte			;réécriture du texte fixe (les trois lignes
    			memoflag=0			;effacement mémoire erreur
    		endif	   				;après fin erreur
    	loop
    ;******* Fin programme principal *************
    
    ;******* Les sous programmes: ********************
    ;************** Mesure des sondes, liaison RS232 ***********
    ; Pour les essais avec une seule sonde, le port serin est bloqué à 8 (C.1) au lieu de scanner les 3 sondes
    ; Pour le scanne réel, il faut remplacer le "8" par "sonde" dans la commande serin ci dessous
    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,ajust		;ajust=0 à 255
    		ajust=ajust/5			;255/5=50 curseur milieu=25
    		ajust=75+ajust			;ajust = de 75 à 125
    		mesur=mesur/ajust
    	elseif sonde=10 then	
    		readadc potaj3,ajust
    		ajust=ajust/5			
    		ajust=75+ajust			
    		mesur=mesur/ajust			
    	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=1 then	;erreur de mesure sonde, on passe
    		 return 
    	endif    	
     	if sonde=8 then
    		posi=192				
    	elseif sonde=9 then
    		posi=148		
    	elseif sonde=10 then
    		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 	
    	calibr=1 	
    	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=1 then	;erreur de mesure sonde, on passe
    		 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
    texte:
    	text(128,220,239)			;texte "RESERVES D'EAU:    %"
    	text(192,240,259)			;texte fixe #1...
    	text(148,260,279)			;texte fixe #2...
    	text(212,280,299) 		;texte fixe #3...
    	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 sonde (défaut isolant ?)
    		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=1			;on a détecté une erreur sur une sonde
    	memoflag=flagerr	;mémo du passage => 
    	if sonde=8 then
    		if mesur=0 then
    			text(192,140,159)	;on écrit "DEFAUT SONDE" sur ligne correspoondante
    		else 
    			text(192,160,179)	;on écrit "DEFAUT TIME OUT" sur ligne correspoondante
    		endif
    	elseif sonde=9 then
    		if mesur=0 then
    			text(148,140,159)
    		else 
    			text(148,160,179)
    		endif
    	elseif sonde=10 then
    		if mesur=0 then
    			text(212,140,159)
    		else 
    			text(212,160,179)
    		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
    Si il y a des erreurs ci dessus, c'est que je n'ai pas eu le temps de les corriger...

  17. #16
    Yex2

    Re : Jauge capacitive

    Citation Envoyé par mag1 Voir le message
    Oui, la calibration ne se fait que sur la sonde n°1.
    Mais, il faut passer les trois sondes en position 1. Ce qui permet de las classer en ft de la sensibilité.
    Ensuite, il faut placer la sonde de sensibilité médiane en pos1. Les sondes 2 et 3 sont ensuite à aligner (même niveau même valeur). il y en aura une en compensation + et l'autre en compensation -. C'est mieux que de compenser du même côté.
    Ok d'accord je comprends ton approche. Je vais vérifier la sensibilité de chacune et j'utiliserai la médiane comme la nu. 1

    Première erreur corrigée : décalage des lignes "erreur" vers le haut:
    Oui je l'avais déjà fait. C'était facile...

  18. #17
    Yex2

    Re : Jauge capacitive

    J'ai vérifier la sensibilité de chaque sonde en faisant ce que tu proposais. Les deux premières sont presque identiques.

    Sonde 1 : ± 20 à 479

    Sonde 2 : ± 20 à 474

    Sonde 3 : ± 20 à ± 540

    Une piste comme ça : est-ce qu'il est possible que le bug rapporté plus haut serait justement causé par la différence entre les sondes ?

  19. #18
    mag1

    Re : Jauge capacitive

    Citation Envoyé par Yex2 Voir le message
    J'ai vérifier la sensibilité de chaque sonde en faisant ce que tu proposais. Les deux premières sont presque identiques.
    Sonde 1 : ± 20 à 479
    Sonde 2 : ± 20 à 474
    Sonde 3 : ± 20 à ± 540
    Une piste comme ça : est-ce qu'il est possible que le bug rapporté plus haut serait justement causé par la différence entre les sondes ?
    Oui , c'est ce qui explique le dépassement de capacité et le message . Le changement d'octet de config à corrigé le dépassement

    Si tu as des 08M2 en rab, tu peux en essayer un autre pour voir.
    Sinon, si la compensation par le potar doit corriger cela, à vérifier.
    Si pas d'autres solution, mettre un condo en série (entre le fil émaillé et la broche, valeur ?) As tu une capacité de l'ordre de 1nF ou 4,7nF?

    MM
    Dernière modification par mag1 ; 15/11/2020 à 20h03.
    Si il y a des erreurs ci dessus, c'est que je n'ai pas eu le temps de les corriger...

  20. #19
    Yex2

    Re : Jauge capacitive

    Citation Envoyé par mag1 Voir le message
    Oui , c'est ce qui explique le dépassement de capacité et le message . Le changement d'octet de config à corrigé le dépassement

    Si tu as des 08M2 en rab, tu peux en essayer un autre pour voir.
    Sinon, si la compensation par le potar doit corriger cela, à vérifier.
    Oui tout fonctionne bien maintenant que j'ai changé la config du 08M2. Mais est-ce qui explique l'affichage bizarre lorsque les sondes 1 ou 2 sont débranchées ?


    Si pas d'autres solution, mettre un condo en série (entre le fil émaillé et la broche, valeur ?) As tu une capacité de l'ordre de 1nF ou 4,7nF?
    Oui j'ai un gros arsenal de composantes variées...

  21. #20
    mag1

    Re : Jauge capacitive

    Citation Envoyé par Yex2 Voir le message
    Oui tout fonctionne bien maintenant que j'ai changé la config du 08M2. Mais est-ce qui explique l'affichage bizarre lorsque les sondes 1 ou 2 sont débranchées ?
    Hello,
    La modif considère un problème sur une sonde, pas prévu pour deux, mais on peut y penser.
    Affichage bizarre ? c'est à dire ? photo.
    Le potar compense entre +/- 25%, il devrait suffire sans autre modif.
    Que donne le nouveau programme? Devrait indiquer le défaut sur une sonde, puis affichage normal si le défaut est corrigé.
    As tu un 08M2 en réserve ?
    En résumé, ça fonctionne ou pas ?

    MM
    Si il y a des erreurs ci dessus, c'est que je n'ai pas eu le temps de les corriger...

  22. #21
    Yex2

    Re : Jauge capacitive

    Citation Envoyé par mag1 Voir le message
    Hello,
    La modif considère un problème sur une sonde, pas prévu pour deux, mais on peut y penser.
    Affichage bizarre ? c'est à dire ? photo.
    Le potar compense entre +/- 25%, il devrait suffire sans autre modif.
    Que donne le nouveau programme? Devrait indiquer le défaut sur une sonde, puis affichage normal si le défaut est corrigé.
    As tu un 08M2 en réserve ?
    En résumé, ça fonctionne ou pas ?

    MM
    Tu n'as pas regardé la vidéo ?

    http://www.voile.org/VID_20201115_103415764.mp4

  23. #22
    mag1

    Re : Jauge capacitive

    Citation Envoyé par Yex2 Voir le message
    Tu n'as pas regardé la vidéo ?
    Ben non, y avait pas de vidéo..
    Mais là,j'ai vu, merci, je suppose qu'il s'agit de la dernière version
    En fait, le système de gestion d'erreur était assez léger, je pensais que le signalement d'une erreur devait entrainer une intervention et un reset.
    Voici une nouvelle mouture. Cette fois, si tout va bien, chaque erreur est traitée indépendamment, avec la possibilité de pannes multiples
    Mais, erreur ou pas, chaque ligne est réécrite en totalité, je ne sais pas si cela se verra ou pas.
    A tester

    Code:
    ;Ex: sonde de niveau capacitive MM 16/11/2020
    ;**** calibration de la sonde par action 3 sec sur le poussoir de validation  ***********
    ;**** La réponse de la comande TOUCH 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 ajust	=b9			;ajustement °C lue sur potar
    symbol flagerr =b10			;flag erreur
    ;******* noms variables bit sur b0 ***********
    symbol rsbit	=bit0			;bit commande/data afficheur
    symbol calibr	=bit1			;memo phase calibration
    ;******* 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     ")
    	table 160,("   DEFAUT TIMEOUT   ")
    	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 ************************************** 
    	calibr=0				;on est pas en calibration	
      	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 ***********
    ; Pour les essais avec une seule sonde, le port serin est bloqué à 8 (C.1) au lieu de scanner les 3 sondes
    ; Pour le scanne réel, il faut remplacer le "8" par "sonde" dans la commande serin ci dessous
    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,ajust		;ajust=0 à 255
    		ajust=ajust/5			;255/5=50 curseur milieu=25
    		ajust=75+ajust			;ajust = de 75 à 125
    		mesur=mesur/ajust
    	elseif sonde=10 then	
    		readadc potaj3,ajust
    		ajust=ajust/5			
    		ajust=75+ajust			
    		mesur=mesur/ajust			
    	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 	
    	calibr=1 	
    	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(192,140,159)	;on écrit "DEFAUT SONDE" sur ligne correspoondante
    		else 
    			text(192,160,179)	;on écrit "DEFAUT TIME OUT" sur ligne correspoondante
    		endif
    	elseif sonde=9 then
    		if mesur=0 then
    			text(148,140,159)
    		else 
    			text(148,160,179)
    		endif
    	elseif sonde=10 then
    		if mesur=0 then
    			text(212,140,159)
    		else 
    			text(212,160,179)
    		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
    MM
    Si il y a des erreurs ci dessus, c'est que je n'ai pas eu le temps de les corriger...

  24. #23
    mag1

    Re : Jauge capacitive

    Je vois un conflit de variables possible, je vais faire un modif.
    MM
    Si il y a des erreurs ci dessus, c'est que je n'ai pas eu le temps de les corriger...

  25. #24
    mag1

    Re : Jauge capacitive

    Avec économie de varables
    Code:
    ;Ex: sonde de niveau capacitive MM 16/11/2020 mod2
    ;**** calibration de la sonde par action 3 sec sur le poussoir de validation  ***********
    ;**** La réponse de la comande TOUCH 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
    symbol calibr	=bit1			;memo phase calibration
    ;******* 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     ")
    	table 160,("   DEFAUT TIMEOUT   ")
    	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 ************************************** 
    	calibr=0				;on est pas en calibration	
      	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 ***********
    ; Pour les essais avec une seule sonde, le port serin est bloqué à 8 (C.1) au lieu de scanner les 3 sondes
    ; Pour le scanne réel, il faut remplacer le "8" par "sonde" dans la commande serin ci dessous
    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 	
    	calibr=1 	
    	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(192,140,159)	;on écrit "DEFAUT SONDE" sur ligne correspoondante
    		else 
    			text(192,160,179)	;on écrit "DEFAUT TIME OUT" sur ligne correspoondante
    		endif
    	elseif sonde=9 then
    		if mesur=0 then
    			text(148,140,159)
    		else 
    			text(148,160,179)
    		endif
    	elseif sonde=10 then
    		if mesur=0 then
    			text(212,140,159)
    		else 
    			text(212,160,179)
    		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
    MM
    Si il y a des erreurs ci dessus, c'est que je n'ai pas eu le temps de les corriger...

  26. #25
    Yex2

    Re : Jauge capacitive

    Super, ça fonctionne bien.

    J'en ai profité pour changer les 08M2 afin d'avoir des sondes relativement identiques en terme de sensibilité. J'ai aussi modifier l'affichage de la sous routine "geser2" afin de conserver le numéro de la sonde lorsqu'il y a défaut détecter.

    Code:
    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)
    		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
    Merci pour tout Mag...

  27. #26
    Yex2

    Re : Jauge capacitive

    Mag,

    Je crois que tu as déjà fait une jauge de liquide avec l'usage d'une sonde acoustique de ce genre : https://www.ebay.com/itm/JSN-SR04T-D...72.m2749.l2649

    Vu que la saison de charter qui vient risque d'être très calme, je pensais rénover mon bateau. Un des éléments que je veux remettre en état sont les réservoirs septiques des toilettes. Certain doivent être retiré et ressoudé pour colmater les fuites.

    À mon avis, une sonde capacitive fera rapidement défaut avec de l'eau noir à cause de tout ce qui est en suspension. Alors je me disais que la meilleur solution serait peut-être une sonde acoustique. Qu'en penses-tu ?

    A+

    Yex

  28. #27
    mag1

    Re : Jauge capacitive

    Citation Envoyé par Yex2 Voir le message
    Super, ça fonctionne bien.
    J'en ai profité pour changer les 08M2 afin d'avoir des sondes relativement identiques en terme de sensibilité. J'ai aussi modifier l'affichage de la sous routine "geser2" afin de conserver le numéro de la sonde lorsqu'il y a défaut détecter.
    Ok, si tout fonctionne, c'est parfait, je n'aurai pas besoin de refaire la maquette.

    MM
    Si il y a des erreurs ci dessus, c'est que je n'ai pas eu le temps de les corriger...

  29. #28
    mag1

    Re : Jauge capacitive

    Citation Envoyé par Yex2 Voir le message
    Mag,
    Je crois que tu as déjà fait une jauge de liquide avec l'usage d'une sonde acoustique de ce genre : https://www.ebay.com/itm/JSN-SR04T-D...72.m2749.l2649
    Vu que la saison de charter qui vient risque d'être très calme, je pensais rénover mon bateau. Un des éléments que je veux remettre en état sont les réservoirs septiques des toilettes. Certain doivent être retiré et ressoudé pour colmater les fuites.
    À mon avis, une sonde capacitive fera rapidement défaut avec de l'eau noir à cause de tout ce qui est en suspension. Alors je me disais que la meilleur solution serait peut-être une sonde acoustique. Qu'en penses-tu ?
    Yex
    Oui, mais le module a un émetteur et un récepteur. Ici, les quatre broches semblent être : +, trig, echo, - . Faudrait une doc plus précise pour savoir si ces modules sont identiques, ou compatibles

    MM
    Si il y a des erreurs ci dessus, c'est que je n'ai pas eu le temps de les corriger...

  30. #29
    mag1

    Re : Jauge capacitive

    Citation Envoyé par mag1 Voir le message
    Ok, si tout fonctionne, c'est parfait, je n'aurai pas besoin de refaire la maquette.
    MM
    J'avais zappé #13...
    Une question: Si le tube est étanche, l'eau comprime l'air qui est dedans. Il y a une évacuation possible ou pas?
    MM
    Si il y a des erreurs ci dessus, c'est que je n'ai pas eu le temps de les corriger...

  31. #30
    Yex2

    Re : Jauge capacitive

    Citation Envoyé par mag1 Voir le message
    Oui, mais le module a un émetteur et un récepteur. Ici, les quatre broches semblent être : +, trig, echo, - . Faudrait une doc plus précise pour savoir si ces modules sont identiques, ou compatibles

    MM
    C'était la sonde que tu m'avais suggéré d'acheter. La doc qui vient avec la sonde est écrite en Chinglais. Difficile à comprendre. Mais en gros je crois qu'il faut mesurer le temps d'aller retour du signal...

    Citation Envoyé par mag1 Voir le message
    J'avais zappé #13...
    Une question: Si le tube est étanche, l'eau comprime l'air qui est dedans. Il y a une évacuation possible ou pas?
    MM
    Oui il y a un trou à la tête des sondes qui n'est pas visible sur les photos...

Page 1 sur 2 1 DernièreDernière

Discussions similaires

  1. calibrage jauge capacitive
    Par yassine2255 dans le forum Électronique
    Réponses: 5
    Dernier message: 30/01/2015, 08h12
  2. Jauge de Coulomb et Jauge de Lorenz
    Par bachir1994 dans le forum Physique
    Réponses: 6
    Dernier message: 08/12/2014, 12h57
  3. Jauge capacitive - Décalage plage de mesure avec ampli op
    Par flyingpim dans le forum Électronique
    Réponses: 26
    Dernier message: 03/03/2013, 14h49
  4. Mesure jauge capacitive avec LM2917
    Par flyingpim dans le forum Électronique
    Réponses: 2
    Dernier message: 18/02/2013, 12h08
  5. Jauge de contrainte - Facteur de jauge
    Par invite47c81765 dans le forum Physique
    Réponses: 5
    Dernier message: 10/05/2010, 15h25
Découvrez nos comparatifs produits sur l'informatique et les technologies.