[Résolu] Besoins d'aide pour un petit programme

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;
  }
}

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

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.

Merci, je vais essayer avec des While

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.

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 ?

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.