system
March 7, 2014, 7:13pm
1
Bonjour à tous,
Après 20 ans d'abstinence, je me remet à faire de la programmation.
Pour les besoins d'un petit montage, j'ai acheté une Nano.
Mon projet :
A partir de 3 configurations de 2 contacts, je dois renvoyer une impulsion sur 3 sorties :
Switch 1 fermé + switch 2 ouvert = impulsion sortie Clean
Switch 1 ouvert + switch 2 fermé = impulsion sortie Crunch
Switch 1 fermé + switch 2 fermé = impulsion sortie Disto
Le soucis est que lorsqu'une sortie à reçu une impulsion, elle ne doit pas en recevoir une autre lors de la lecture suivante du programme.
J'ai donc écrit un programme en passant du temps sur les tutos, mais ça ne marche pas.
Si une âme charitable pouvait me consacrer quelques minutes de son temps, ce serait super.
Mon code :
const int Pin_s1 = 2; //input FCB switch 1
const int Pin_s2 = 3; //input FCB switch 2
const int Pin_cl = 4; //output reed canal Clean
const int Pin_cr = 5; //output reed canal Crunch
const int Pin_d = 6; //output reed canal Disto
boolean clx = false; //inhibition canal Clean
boolean crx = false; //inhibition canal Crunch
boolean dx = false; //inhibition canal Disto
int s1 = 0;
int s2 = 0;
int cl = 0;
int cr = 0;
int d = 0;
void setup()
{
pinMode(Pin_s1, INPUT);
pinMode(Pin_s2, INPUT);
pinMode(Pin_cl, OUTPUT);
pinMode(Pin_cr, OUTPUT);
pinMode(Pin_d, OUTPUT);
}
void loop()
{
s1 = digitalRead(Pin_s1);
s2 = digitalRead(Pin_s2);
if(s1 == HIGH && s2 == LOW && clx == false);
{
digitalWrite(cl, HIGH);
delay (50);
digitalWrite(cl, LOW);
clx == true;
crx == false;
dx == false;
}
if(s1 == LOW && s2 == HIGH && crx == false);
{
digitalWrite(cr, HIGH);
delay (50);
digitalWrite(cr, LOW);
crx == true;
clx == false;
dx == false;
}
if(s1 == HIGH && s2 == HIGH && dx == false);
{
digitalWrite(d, HIGH);
delay (50);
digitalWrite(d, LOW);
dx == true;
clx == false;
crx == false;
}
}
B83s
March 7, 2014, 7:48pm
2
Si tu fais clx == true ... Et bien tu fais un test (comparaison)... Alors que tu veux affecter true a clx, ce qui s'écrit clx=true, idem pour drx et crx
J'en ai pas regardé plus loin ton programme
system
March 7, 2014, 7:56pm
3
Merci, je vais déjà corriger ça
Salut, si tu veux que ton prog reste tranquille entre deux actions sur s1 ou s2, il faut que tu mette une while d'attente d'action sur s1 ou s2, avec un flag d'état; genre:
void loop(){
lire état s1 et s2
while(s1==olds1 and s2=olds2){
//tourne dans la boucle en attendant un changement
}
//ici tu stocke dans olds1 et olds2 le nouvel état
//et tu traite les sorties en fonction des entrées
// quand c'est traité, le prog retourne dans la boucle
}
Edit: Tu sera certainement obligé de mettre un inter de marche/Arrêt, because tu est obligé d'initialiser s1 et s2 dans un des états fonctionels.
system
March 8, 2014, 10:15am
5
Merci, je vais essayer avec des While
system
March 8, 2014, 11:40pm
6
Après une après-midi de test, je me suis rendu compte qu'il fallait une résistance sur les entrées...
Ensuite, en remaniant le programme et en considérant que je pouvais avoir des impulsions sur les entrées, ça marche XD
Merci à ceux qui on pris le temps de se pencher sur mon problème.
Si tu postais ton code, y'a des chances que tu pourrais enlever les résistances.
system
March 9, 2014, 11:24am
8
Le voici :
const int Pin_s1 = 2; //input FCB switch 1
const int Pin_s2 = 3; //input FCB switch 2
const int Pin_cl = 4; //output reed canal Clean
const int Pin_cr = 5; //output reed canal Crunch
const int Pin_d = 6; //output reed canal Disto
boolean clx = false; //inhibition canal Clean
boolean crx = false; //inhibition canal Crunch
boolean dx = false; //inhibition canal Disto
void setup()
{
pinMode(Pin_s1,INPUT);
pinMode(Pin_s2,INPUT);
pinMode(Pin_cl,OUTPUT);
pinMode(Pin_cr,OUTPUT);
pinMode(Pin_d,OUTPUT);
}
void loop()
{
if(digitalRead(Pin_s1) == HIGH && digitalRead(Pin_s2) == LOW && clx == false)
{
digitalWrite(Pin_cl, HIGH);
delay(50);
digitalWrite(Pin_cl, LOW);
clx = true;
crx = false;
dx = false;
}
if(digitalRead(Pin_s1) == LOW && digitalRead(Pin_s2) == HIGH && crx == false)
{
digitalWrite(Pin_cr, HIGH);
delay(50);
digitalWrite(Pin_cr, LOW);
crx = true;
clx = false;
dx = false;
}
if(digitalRead(Pin_s1) == HIGH && digitalRead(Pin_s2) == HIGH && dx == false)
{
digitalWrite(Pin_d, HIGH);
delay(50);
digitalWrite(Pin_d, LOW);
dx = true;
clx = false;
crx = false;
}
}
Et bien à ce genre de ligne:
pinMode(Pin_s1,INPUT); tu mets INPUT_PULLUP, et tu peux enlever la résistance.
Elle est pas belle la vie ?
system
March 9, 2014, 11:44am
10
Merci, j'avais pas bien compris le principe du INPUT_PULLUP.
Quand tu définies ce type d'entrée, tu actives une résistance en série, c'est ça?
PlarN:
Merci, j'avais pas bien compris le principe du INPUT_PULLUP.
Quand tu définies ce type d'entrée, tu actives une résistance en série, c'est ça?
Non, tu actives une résistance de tirage au plus 5V.