Problème LED + BOUTON sur I2C

Bonjour à tous,

Je viens ici avec un léger problème. Sur mon expendeur I2C, j’arrive à faire clignoter une LED que je souhaiterai rendre fixe après l’appui sur un bouton poussoir. En appuyant sur ce bouton, elle reste fixe tant que j’ai le doigt qui l’écrase, mais dès que je le relâche elle se remet à clignoter de plus belle. Que faire ? :astonished:

Merci d’avance ! :slight_smile:

#include <Adafruit_MCP23017.h>


int memoire_ledb1 = LOW; 
int bouton_changeledb1 = false;


void setup() {

mcp.pinMode(0, OUTPUT); //LED
mcp.pinMode(1, INPUT); // bouton


mcp1.digitalWrite(0, LOW);

}

 void loop(){

  if(millis() - temps > 100)
        {
            etat_led = !etat_led; //on inverse l'état de la LED
            mcp.digitalWrite(0, etat_led); //on allume ou éteint
            temps = millis(); //on stocke la nouvelle heure
        }
       

etat_bouton = mcp.digitalRead(1);

if((etat_bouton != memoire_ledb1) && (etat_bouton == HIGH))

{
  mcp.digitalWrite(0, HIGH);
 
}

  bouton_changeledb1=false;

}

bonjour,
tu es certain que le code compile?
j'ai un gros doute.

jètes un oeil fonction boolean

ce code ne peut pas compiler, d'accord avec infobarquee. la variable etat_led n'est déclarée nulle part.

l'objet mcp non plus, et encore moins mcp1 (à moins que ce soi interne à la lib ? )

à quoi sert la variable memoire_ledb1 ? là elle n'est jamais modifiée, du coup la condition dans le if((etat_bouton != memoire_ledb1) && (etat_bouton == HIGH)) est redondante, cela revient à écrire : if((etat_bouton!=LOW)&&(etat_bouton==HIGH))

il faudrait que quand ton bouton est appuyé tu enregistre cela dans une variable. la variable memoire_ledb1 qui ne sert pour le moment à rien par exemple

Merci à tous les deux de m’avoir répondu ! :wink:

J’ai modifié le code, comme ci-dessous, en tenant compte de vos suggestions. Mais ça ne change encore rien :-(…

#include <Adafruit_MCP23017.h>


int memoire_ledb1 = LOW;
int bouton_changeledb1 = false;
boolean etat_bouton; 
boolean etat_led;
long temps;


void setup() {

mcp.pinMode(0, OUTPUT); //LED
mcp.pinMode(1, INPUT); // bouton


mcp.digitalWrite(0, LOW);

}

 void loop(){

  if(millis() - temps > 100)
        {
            etat_led = !etat_led; //on inverse l'état de la LED
            mcp.digitalWrite(0, etat_led); //on allume ou éteint
            temps = millis(); //on stocke la nouvelle heure
        }
      

etat_bouton = mcp.digitalRead(1);

if((etat_bouton != memoire_ledb1) && (etat_bouton == HIGH))

{
  mcp.digitalWrite(0, HIGH);
 
}

  else bouton_changeledb1=false;
  memoire_ledb1 = etat_bouton;

}

A quoi sert ce bout de code?

 if(millis() - temps > 100)
        {
            etat_led = !etat_led; //on inverse l'état de la LED
            mcp.digitalWrite(0, etat_led); //on allume ou éteint
            temps = millis(); //on stocke la nouvelle heure
        }

toutes les 100ms tu un digitalWrite tu changes l’état de la led au lieu de créer un antirebond du bouton.

suis dans un bon jour, et je sais pas pourquoi, ca sent le projet exam, mais sinon on ne va pas en sortir pour un truc qui est simple avec un peu de recherche.

#include <Adafruit_MCP23017.h>


boolean etat_bouton = false ;
int led = 0;
int bouton = 1;

void setup() {

mcp.pinMode(led, OUTPUT); //LED
mcp.pinMode(bouton, INPUT_PULLUP); // bouton


mcp.digitalWrite(led, LOW);

}

 void loop(){
if( mcp.digitalRead(bouton) == HIGH){ // peut etre inverser high en low
delay(250);
 etat_bouton = !etat_bouton; 
  mcp.digitalWrite(led,  etat_bouton);
 
}

}

le premier bout de code c’est celui qui fait clignoter la led, si j’ai bien suivi le but de la manœuvre :stuck_out_tongue:

donc avec ton code, pour garder le clignotement au départ, ça pourrait donner :

#include <Adafruit_MCP23017.h>


boolean etat_bouton = false ;
boolean etat_led=false;
int led = 0;
int bouton = 1;

void setup() {

mcp.pinMode(led, OUTPUT); //LED
mcp.pinMode(bouton, INPUT_PULLUP); // bouton


mcp.digitalWrite(led, LOW);

}

 void loop()
{
    if(millis() - temps > 100)
        {
            etat_led = !etat_led; //on inverse l'état de la LED
            mcp.digitalWrite(0, etat_led); //on allume ou éteint
            temps = millis(); //on stocke la nouvelle heure
        }    



   if( mcp.digitalRead(bouton) == HIGH)
    { // peut etre inverser high en low
         delay(250);
         etat_bouton = !etat_bouton; 
    }

    if(etat_bouton==true)
        mcp.digitalWrite(led,  HIGH);
}

Bonjour et merci à tous de m’avoir répondu ! :slight_smile:

Non, il ne s’agit pas d’un projet scolaire mais personnel :slight_smile: j’ai quitté les études il y a quelques années maintenant.

J’ai essayé de modifier mon code en intégrant ce que vous m’avez écrit, mais ça ne fonctionne pas: la LED reste clignotante !

Ça me désespère.
:confused:

as tu essayé le code que j'ai donné juste au dessus?
ca serait bien de faire ce que l'on dit :wink:

par contre, dans les exemples de la lib, il y a un include wire.h

infobarquee: J'ai mis le Wire.h dès le début, je l'ai pas précisé dans la copie de mon code, désolé.

J'ai bien essayé ta solution qui ne fonctionne malheureusement pas. La Led clignote toujours après appui sur le bouton.

Merci en tout cas de vouloir m'aider :wink:

Pourtant dans le code d'infobarquee il n'y a rien qui fasse clignoter la led...
Seulement si le bouton est maintenu appuyé, elle va clignoter (toutes les 250ms), sinon une fois le bouton relaché elle sera ou allumée fixe ou éteinte, selon son état au moment ou tu laches le bouton.

tout a fait.
tu veux allumer ou éteindre une led en appuyant sur le même bouton.
le code fait ca, SAUF comme le dit bricofoy, si tu ne relache pas le bouton, l'état va passer de true à false en permanence.

c'est ce que j'ai compris dans ce que tu voulais faire.

moi j'ai compris que l'idée était d'avoir une led qui clignote, puis devient fixe après appui sur un bouton.

C'est que fait le mix que j'ai fait entre ton code et celui d'origine.

A l'heure actuelle ma LED clignote sans problème.

Je veux quelle reste fixe après avoir appuyé sur le bouton.

Or, en essayant vos codes, certe elle reste fixe lorsque je maintien le bouton appuyé, mais quand je le relâche elle reclignote ! Alors que j'aimerai quelle reste en HIGH...

avec le code que l'on t'a fourni, elle doit rester allumée si tu relaches le bouton alors qu'elle est allumée

essayes avec ça, la bascule pour la mémoire du bouton est peut-être plus claire comme ça ?

#include <Adafruit_MCP23017.h>


boolean etat_bouton = false ;
boolean etat_led=false;
int led = 0;
int bouton = 1;

void setup() {

mcp.pinMode(led, OUTPUT); //LED
mcp.pinMode(bouton, INPUT_PULLUP); // bouton


mcp.digitalWrite(led, LOW);

}

 void loop()
{
    if(millis() - temps > 100)
        {
            etat_led = !etat_led; //on inverse l'état de la LED
            mcp.digitalWrite(0, etat_led); //on allume ou éteint
            temps = millis(); //on stocke la nouvelle heure
        }    



   if(etat_bouton==true)
        while( mcp.digitalRead(bouton) == HIGH)
        { 
            etat_bouton=false;
        }
   else
        while( mcp.digitalRead(bouton) == HIGH)
        { 
            etat_bouton=true;
        }

    if(etat_bouton==true)
        mcp.digitalWrite(led,  HIGH);
}