Minuterie un peu speciale

Gapak

Senior Member
Bonjour a tous, j’ai un projet de minuterie un peu spécial que je souhaiterais résoudre avec Picaxe mais je ne sais pas comment faire.
La commande est un seul bouton poussoir (momentané).
La sortie active un relais qui commande une pompe.
Le fonctionnement désiré est le suivant :
Une impulsion sur le bouton active la pompe pendant 15 secondes
Deux impulsions successives donnent 30 secondes … etc jusqu'à cinq impulsions qui donnent 75 secondes.
Si pendant la marche de la pompe on appuie sur le bouton et le maintient pendant trois secondes ou plus, tout doit s’arrêter.
J’ai des Picaxe 08M2 et 20X2 mais je peux bien sur en avoir d’autres
1.Est- ce possible ?
2. Est-ce possible de le programmer en Logicator ?
Merci pour vos réponses
 

BESQUEUT

Senior Member
Je propose une chtite "state machine" :

Code:
symbol Etat=b2
symbol Duree=b3
gosub RAZ	

do
	select case Etat
	case 0
		if pin1=1 then
			Etat=1	' bouton activé
		endif
		
	case 1
		if pin1=0 then
			Etat=2	' bouton relaché
			if b1<5 then
				high b1
				inc b1
			endif
			time=0	' on initialise un chronomètre
		endif
		
	case 2	' on attends une autre pression (3s maxi)
		if time<3 then
			if pin1=1 then
				Etat=1	' bouton activé
			endif
		else
			Etat=3		' pressions prises en compte
		endif
		
	case 3			
		Etat=4		' Pompe en marche
		high 7		' port du relais
		Duree=b1*15
		Time=0
		
	case 4
		if time>Duree then
			gosub RAZ
		endif
		
	end select

loop



RAZ:
	low 7		' port du relais
	Etat=0	' en attente de pressions
	b1=0
	Duree=0
	low 0		' option leds de visualisation de
	low 1		' la durée choisie,
	low 2		' par pas de 15 s
	low 3
	low 4
	return
Sur le simulateur, ça à l'air de marcher. Vous pouvez en particulier observer la valeurs des variables Etat et Duree ainsi que la sortie 7 destinée au relais.
NB : pour simuler l'appui sur un bouton, il faut cliquer 2 fois sur C.1 : une pour enfoncer le bouton, et une pour le relâcher !
Il manque l'arrêt forcé par appui long (fo bien vous laisser un peu de taf...)
 

MGU

Senior Member
Bonjour,

voici une autre proposition.
15 s par pression , 3 s de délais
Un flash par tranche de 15 s
Une tempo et arrêt si appui sur le poussoir
Ah zut, j'ai pas les 3s pour l’arrêt (ça devrait s'arranger...)

MM


Code:
#picaxe 08M2
symbol	valid=pinC.3
symbol	relais =C.0
symbol	tempo=b1

Do
	tempo=0	
	Do 
		low C.1
		Do 
			If tempo>0 and time >3 then marche
		loop while pinC.3=0
		time=0
		do loop while pinC.3=0
		do loop while pinC.3=1
		tempo= tempo+15	
		high C.1		
	loop	

marche:
	time=0
		high relais 
	do
		if pinC.3=1 then exit		
	loop while tempo>time
	low relais
	do loop while pinC.3=1	
loop
 

MGU

Senior Member
Bon, c'est arrangé

Code:
#picaxe 08M2
symbol	valid=pinC.3
symbol	relais =C.0
symbol	tempo=b1
symbol	arret=b2
symbol	flag=bit0

Do
	tempo=0		;reset tempo
	flag=0	
	Do 
		;low C.1		;arret sortie
		Do 
			If tempo>0 and time >3 then marche ;sortie si après le délais de 3 s
		loop while pinC.3=0
		time=0
		do loop while pinC.3=0	; cliquet sur C.3
		do loop while pinC.3=1
		tempo= tempo+15			;incrémentation tempo
		high C.1
		pause 200				; 1 flash par incrémentation
		low C.1
	loop	

marche:
	time=0					;reset time
		high relais 		; départ marche
	do
		if pinC.3=1 and flag=0 then ; appui sur poussoir 1 seul passage ici
			flag=1					;flag pour 1 seul passage
			arret=time				;memo début tempo poussoir
			arret=arret+2			;durée tempo poussoir
		endif
	
		if pinC.3=1 and flag=1 then	; pour test tempo poussoir
			if time>arret then exit	; tempo arret>3 s => sortie	
			else flag=0				;sinon reset flag
		endif			
			
	loop while tempo>time			; boucle jusqu'à fin tempo 
	low relais						;arret 
	do loop while pinC.3=1			; on attend le relachemnt poussoir
loop
MM
 

BESQUEUT

Senior Member
do loop while pinC.3=1
Pas illogique dans la mesure où si le bouton a été enfoncé, l'utilisateur devra bien retirer son doigt un jour ou l'autre...

do loop while pinC.3=0
Par contre là, j'ai comme un doute : à priori, il ne se passe plus rien si l'utilisateur ne clique pas de nouveau ?
 
Last edited:

MGU

Senior Member
Bonne remarque, cette ligne ne sert à rien.
J'avais fait un essai en activant les pullup, ce qui oblige à inverser la logique, mais pour la simulation, ça complique.
et puis il y a des noms inutilisées, plus une modif sur time =0
copie revue: mais je serais incapable de faire le programme en logicator
(je viens de voir que "do loop while" sans : au milieu était accepté...)

Code:
#picaxe 08M2
symbol	pous=pinC.3	;poussoir appuyé =>pous=1 
symbol	relais =C.0	;high relais allimenté
symbol	tempo=b1	;tempo marche
symbol	arret=b2	;tempo arret
symbol	flag=bit0	;mémo passage

Do
	tempo=0		;reset tempo
	flag=0	
	Do 		
		Do 
			If tempo>0 and time >3 then marche ;sortie si après le délais de 3 s
		loop while pous=0		
		do loop while pous=1
		tempo= tempo+15			;incrémentation tempo
                time=0
		high C.1
		pause 200				; 1 flash sur C.1 par incrémentation
		low C.1
	loop	

marche:
	time=0					;reset time
		high relais 		; moteur  ON
	do
		if pous=1 and flag=0 then ; appui sur poussoir 1 seul passage ici
			flag=1					;flag pour 1 seul passage
			arret=time				;memo début tempo poussoir
			arret=arret+2			;durée tempo poussoir
		endif
	
		if pous=1 and flag=1 then	; pour test tempo poussoir
			if time>arret then exit	; tempo arret>3 s => sortie	
			else flag=0				;sinon reset flag
		endif			
			
	loop while tempo>time			; boucle jusqu'à fin tempo 
	low relais						;arret moteur
	do loop while pous=1			; on attend le relachemnt poussoir
loop
 
Last edited:
Top