[résolu]Concaténation de 2 programmes

Bonjour,
Novice en C et Arduino, j’ai besoin de votre aide, je me suis inspiré de plusieurs exemples :

J’ai testé la fonction télérupteur avec un bouton poussoir :

int rel=9;
int bp=4;
int etat=0;
boolean mem_etat_rel=false;
boolean mem_front_bp=false;

void setup ()
{
pinMode (bp,INPUT);
pinMode (rel,OUTPUT);
digitalWrite (bp,LOW); // permet d'activer la résistance de pull-up interne à l'arduino si besoin
digitalWrite (rel,HIGH);

}
void loop()
{
etat=digitalRead(bp);

if (etat && !mem_etat_rel && !mem_front_bp) {
  digitalWrite (rel,LOW);
  mem_etat_rel=true;
  mem_front_bp=true;  //memorisation appui sur bp
}
else if(etat && mem_etat_rel && !mem_front_bp){
  digitalWrite (rel,HIGH);
  mem_etat_rel=false;
  mem_front_bp=true;  //memorisation appuie sur bp
}

if (!etat) {
  mem_front_bp=false;  //raz memoire sur relachement du bp
}

delay(10); // pour filtrer les rebonds du contact si besoin

}

J’ai essayé la fonction télérupteur avec la touche 1 de ma télécommande infrarouge :

#include <IRremote.h>
#include <IRremoteInt.h>


int rel=9;
int ir=7;
int etat=0;
boolean mem_etat_rel=false;
boolean mem_front_ir=false;

IRrecv irrecv(ir);
decode_results results;

void setup ()
{
Serial.begin(9600);
irrecv.enableIRIn();
pinMode (rel,OUTPUT);
digitalWrite (rel,HIGH);

}
void loop()
{
if (irrecv.decode(&results)){
  if (results.value == 0xFF30CF){
  

if (!mem_etat_rel && !mem_front_ir) {
  digitalWrite (rel,LOW);
  mem_etat_rel=true;
  mem_front_ir=true;  //memorisation appui sur telecommande
}
else if(mem_etat_rel && !mem_front_ir){
  digitalWrite (rel,HIGH);
  mem_etat_rel=false;
  mem_front_ir=true;  //memorisation appui sur telecommande
}

if (!etat) {
  mem_front_ir=false;  //raz memoire sur relachement de la telecommande
}

delay(10); // pour filtrer les rebonds du contact si besoin


}
irrecv.resume();
}
}

Les deux fonctionnent séparément, j’ai voulu concaténer les deux, c’est à dire allumer ou éteindre par le BP ou la télécommande, mais j’ai une erreur quelque part :

#include <IRremote.h>
#include <IRremoteInt.h>


int rel=9;  //sortie relais sur 9
int ir=7;   //entrée infra-rouge sur 7
int bp=4;   //entrée bouton poussoir sur 4
int etat=0;
int etat_bp=0;
boolean mem_etat_rel=false;
boolean mem_front_ir=false;
boolean mem_front_bp=false;

IRrecv irrecv(ir);
decode_results results;

void setup ()
{
Serial.begin(9600);
irrecv.enableIRIn();
pinMode (rel,OUTPUT);
digitalWrite (rel,HIGH);
pinMode (bp,INPUT);
digitalWrite (bp,LOW);

}
void loop()
{
if (irrecv.decode(&results)){
  if (results.value == 0xFF30CF){
  

if (!mem_etat_rel && !mem_front_ir) {
  digitalWrite (rel,LOW);
  mem_etat_rel=true;
  mem_front_ir=true;  //memorisation appui sur telecommande
}
else if(mem_etat_rel && !mem_front_ir){
  digitalWrite (rel,HIGH);
  mem_etat_rel=false;
  mem_front_ir=true;  //memorisation appui sur telecommande
}

if (!etat) {
  mem_front_ir=false;  //raz memoire sur relachement de la telecommande
}

delay(10); // pour filtrer les rebonds du contact si besoin


}
irrecv.resume();
}

etat=digitalRead(bp);

if (etat_bp && !mem_etat_rel && !mem_front_bp) {
  digitalWrite (rel,LOW);
  mem_etat_rel=true;
  mem_front_bp=true;  //memorisation appui sur bp
}
else if(etat_bp && mem_etat_rel && !mem_front_bp){
  digitalWrite (rel,HIGH);
  mem_etat_rel=false;
  mem_front_bp=true;  //memorisation appuie sur bp
}

if (!etat_bp) {
  mem_front_bp=false;  //raz memoire sur relachement du bp
}

delay(10); // pour filtrer les rebonds du contact si besoin

}

Merci d’avance pour votre aide !

si tu ne nous décrit pas les symptômes…

et pense à décaler les lignes dans les { }, ce sera plus lisible. je te mets ton code en plus lisible :

#include <IRremote.h>
#include <IRremoteInt.h>

int rel=9;  //sortie relais sur 9
int ir=7;   //entrée infra-rouge sur 7
int bp=4;   //entrée bouton poussoir sur 4
int etat=0;
int etat_bp=0;
boolean mem_etat_rel = false;
boolean mem_front_ir = false;
boolean mem_front_bp = false;
IRrecv irrecv(ir);
decode_results results;

void setup (){
  Serial.begin(9600);
  irrecv.enableIRIn();
  pinMode (rel,OUTPUT);
  digitalWrite (rel,HIGH);
  pinMode (bp,INPUT);
  digitalWrite (bp,LOW);
}

void loop(){

  if (irrecv.decode(&results)){
    if (results.value == 0xFF30CF){
      if (!mem_etat_rel && !mem_front_ir) {
        digitalWrite (rel,LOW);
        mem_etat_rel=true;
        mem_front_ir=true;  //memorisation appui sur telecommande
      } else if(mem_etat_rel && !mem_front_ir){
        digitalWrite (rel,HIGH);
        mem_etat_rel=false;
        mem_front_ir=true;  //memorisation appui sur telecommande
      }
      if (!etat) {
        mem_front_ir=false;  //raz memoire sur relachement de la telecommande
      }
      delay(10); // pour filtrer les rebonds du contact si besoin
    }
    irrecv.resume();
  }

  etat=digitalRead(bp);

  if (etat_bp && !mem_etat_rel && !mem_front_bp) {
    digitalWrite (rel,LOW);
    mem_etat_rel=true;
    mem_front_bp=true;  //memorisation appui sur bp
  } else if(etat_bp && mem_etat_rel && !mem_front_bp){
    digitalWrite (rel,HIGH);
    mem_etat_rel=false;
    mem_front_bp=true;  //memorisation appuie sur bp
  }
  if (!etat_bp) {
    mem_front_bp=false;  //raz memoire sur relachement du bp
  }
  delay(10); // pour filtrer les rebonds du contact si besoin
}

Merci Super_Cinci pour tes conseils.

Le premier programme alimente un relais lorsque l'on appuie sur un bouton poussoir. Quand on relache le bouton, le relais reste alimenté. Quand on rappuie sur le bouton poussoir, le relais n'est plus alimenté. Et ainsi de suite (fonction télérupteur).

Le deuxième programme, c'est la même chose mais avec la touche 1 de la télécommande IR.

Le but recherché est d'alimenter le relais, soit avec le bouton, soit avec la télécommande.

Bonne journée à tous.

Erreur sur une variable, voici la version qui fonctionne :

/*
* Allumer et éteindre une lampe par l'intermédiaire d'un shield relais
* Soit par l'intermédiare d'un bouton poussoir
* Soit par l'intermédiare de la touche 1 de la télécommande IR
*/


#include <IRremote.h>
#include <IRremoteInt.h>

int rel=9;  //sortie relais sur 9
int ir=7;   //entrée infra-rouge sur 7
int bp=4;   //entrée bouton poussoir sur 4
int etat_ir=0;
int etat_bp=0;
boolean mem_etat_rel = false;  // Etat de la sortie relais
boolean mem_front_ir = false;  // Front montant de la détection touche ir
boolean mem_front_bp = false;  // Front montant de la détection appui sur bp
IRrecv irrecv(ir);
decode_results results;

void setup (){
  Serial.begin(9600);
  irrecv.enableIRIn();
  pinMode (rel,OUTPUT);
  digitalWrite (rel,HIGH);
  pinMode (bp,INPUT);
  digitalWrite (bp,LOW);
}

void loop(){

  if (irrecv.decode(&results)){
    if (results.value == 0xFF30CF){
      if (!mem_etat_rel && !mem_front_ir) {
        digitalWrite (rel,LOW);
        mem_etat_rel=true;
        mem_front_ir=true;  //memorisation appui sur telecommande
      } else if(mem_etat_rel && !mem_front_ir){
        digitalWrite (rel,HIGH);
        mem_etat_rel=false;
        mem_front_ir=true;  //memorisation appui sur telecommande
      }
      if (!etat_ir) {
        mem_front_ir=false;  //raz memoire sur relachement de la telecommande
      }
      delay(10); // pour filtrer les rebonds du contact si besoin
    }
    irrecv.resume();
  }

  etat_bp=digitalRead(bp);

  if (etat_bp && !mem_etat_rel && !mem_front_bp) {
    digitalWrite (rel,LOW);
    mem_etat_rel=true;
    mem_front_bp=true;  //memorisation appui sur bp
  } else if(etat_bp && mem_etat_rel && !mem_front_bp){
    digitalWrite (rel,HIGH);
    mem_etat_rel=false;
    mem_front_bp=true;  //memorisation appuie sur bp
  }
  if (!etat_bp) {
    mem_front_bp=false;  //raz memoire sur relachement du bp
  }
  delay(10); // pour filtrer les rebonds du contact si besoin
}

Bonne journée à tous !