On-off led pour le même bouton sur télécommande

Bonjour, je voudrais allumer ou éteindre une led en contrôlant par télécommande avec un même bouton.
Je sais utiliser une télécommande et je sais allumer ou éteindre une led avec un bouton poussoir, mais je ne comprends pas du tout comment faire avec une télécommande.

Le code qu'il faut pour utiliser ma télécommande: j'ai mis que le bouton power pour faciliter la chose

#include "IRremote.h"

int receiver = 3; 

IRrecv irrecv(receiver);    
decode_results results;     


void translateIR() 

{

  switch(results.value)

  {
  case 0xFFA25D: digitalWrite(13, HIGH);  /*c'est ici qu'il faudrait que si on appuie sur le bouton
et que la lampe est éteinte alors il faut allumer la lampe et vice-versa
  

  }

  delay(500); 


} 
void setup()   
{
  Serial.begin(9600);
  irrecv.enableIRIn(); 

}


void loop() 
{
  if (irrecv.decode(&results)) /

  {
    translateIR(); 
    irrecv.resume(); 
  }  
}

et le code pour allumer et éteindre une led avec le même bouton poussoir:

int LEDpin = 5;     
int switchPin = 13; 
boolean running = false;

void setup()
{
  pinMode(LEDpin, OUTPUT);
  pinMode(switchPin, INPUT_PULLUP);
   
}

void loop()
{
  if (digitalRead(switchPin) == LOW){
    delay(100); 
while(  digitalRead(switchPin) == LOW){digitalWrite(LEDpin, running);}
                 
    running = !running;               
    digitalWrite(LEDpin, running);     
  }
}

Bonjour,

Il suffit d'inverser l'état de la led quand tu reçois le code télécommande

  switch (results.value)
  {
    case 0xFFA25D: digitalWrite(13, HIGH);
      digitalWrite(ledPin, !digitalRead(ledPin));  // inverse l'état de la led
      break;
  }

Merci encore.
Ton code a l'air très bien ;D mais malheureusement mon récepteur IR a un mauvais contact et la livraison d'un nouveau va mettre environ 10 jours .
Je te redirais bientôt.

même si ça marche, pour la beauté de la chose moi je mettrais:

  switch (results.value)
  {
    case 0xFFA25D: digitalWrite(13, HIGH);
      digitalWrite(ledPin, (digitalRead(ledPin) == LOW ? HIGH : LOW));  // inverse l'état de la led
      break;
  }

C’est vraiment pour la «beauté de la chose» :slight_smile:

oui - on me dit parfois un peu trop à cheval sur certains principes de cohérence sémantique :slight_smile:

(prendre de bonne habitudes, ça sert ensuite quand on change de langage pour aller vers des outils ou la rigueur sémantique est obligatoire)

ensuite si on veut être dans l’efficacité, vu qu’on sait que LEDpin c’est la pin N° 5 donc dans le PORT D , on pourrait écrire

const byte LEDpin = 5;
...
 switch (results.value)
  {
    case 0xFFA25D:
      PIND = (1 << LEDpin) ; // inverse l'état de la pin N° 5, (1 << LEDpin) sera évalué à la compilation, surtout si on pense à mettre const dans sa définition 
      break;
  }

J-M-L, je comprends pas trop le code de ton dernier message

ne cherchez pas, c'est un peu plus avancé... faites comme au post #1 ou #3

(si vous êtes curieux vous pouvez lire la doc sur "Port Manipulation" puis la spec de votre ATMEGA et ce que fait le registre PIN quand on écrit dedans)

Pourquoi pas ceci ? :slight_smile:

PIND = bit(LEDpin) ; // inverse l'état de la pin N° 5

globalement oui , c'est similaire - mais suivant les optimisations ça prendra 4 octets au lieu de deux, puis ensuite les convertir en 1 octet. faudrait regarder le binaire généré
(la macro bit si je me souviens bien est câblé pour fonctionner avec un unsigned long)

(pour être sûr on pourrait tout forcer en 1 octet)