Intégrer plusieurs "fonctions" dans un code

Bonjour à tous :slight_smile:

Je suis en ce moment sur un projet domotique rpi/arduino et me retrouve devant un soucis qui je pense pour vous est la base, mais j’apprends donc …

Voici ce que je souhaite faire :

Je dispose d’un émetteur RF433Mhz ainsi que d’un émetteur IR , (je prévois également un émetteur par la suite de 2,4Ghz) ainsi qu’une carte arduino uno (vouée à changer en fonction des ressources requise), j’utilise ensuite node-red pour avoir une interface de controle. Mais j’ai un soucis avec mon code arduino,
mes deux code séparément fonctionne très bien, seulement lorsque je met le tout ensemble je n’ai rien qui tourne voici le code que j’essaye de faire :

#include <IRremote.h>
#include <RCSwitch.h>

IRsend irsend = IRsend();
RCSwitch mySwitch = RCSwitch();

void setup()
{
  Serial.begin(9600);
  mySwitch.enableTransmit(10);
}

void loop() {

  if (Serial.available())
  {
    if (Serial.readString() == "LED-ON")            // Vérifie sur node-red (si variable "LED-ON" est vraie)
      irsend.sendNEC(0xF7C03F, 32);                 // Envoi le signal IR (code sniffé de la télécommande) commande "ON"
    else if (Serial.readString() == "LED-OFF");     // Vérifie sur node-red (si variable "LED-OFF" est vraie)
    irsend.sendNEC(0xFC40BF, 32);                   // Envoi le signal IR (code sniffé de la télécommande) commande "OFF"
  }


   {
    if (Serial.readString() == "SW1-1")             // Vérifie sur node-red (si variable "SW1-1" est vraie)
      mySwitch.send(1381717, 24);                   // Envoi le signal 433Mhz (code sniffé de la télécommande) commande "ON"
    else if (Serial.readString() == "Sw1-0")        // Vérifie sur node-red (si variable "SW1-0" est vraie)
      mySwitch.send(1381716, 24);                   // Envoi le signal 433Mhz (code sniffé de la télécommande) commande "OFF"


  }

}

Si vous auriez une solution, j’en serais très content :slight_smile: :slight_smile: :slight_smile:

Merci à tous et passez de bonnes fêtes de fin d’années

Chris

Pour déboguer, commence par mettre le résultat de Serial.readString() dans une String et l'afficher sur le moniteur.
Le problème c'est que la liaison série est utilisée par ton module RF donc il faudrait le mettre sur un autre port ou en créer un avec softwareserial

Bonsoir,

Tout d’abord merci pour cette piste :slight_smile: , je l’ai donc suivi et refais mon code, mais toujours rien, j’ai mal du faire la chose… voici mon code avec SoftwareSerial

#include <IRremote.h>
#include <RCSwitch.h>
#include <SoftwareSerial.h>

// software serial #1: RX = digital pin 10, TX = digital pin 11
SoftwareSerial rf433mhz(10, 11);

// software serial #2: RX = digital pin 8, TX = digital pin 9
// on the Mega, use other pins instead, since 8 and 9 don't work on the Mega
SoftwareSerial infrarouge(2, 3);


IRsend irsend = IRsend();
RCSwitch mySwitch = RCSwitch();


void setup() {
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }


  // Start each software serial port
  rf433mhz.begin(9600);
  infrarouge.begin(9600);
}

void loop()
{ // run over and over
  if (rf433mhz.available())
  {
    if (rf433mhz.readString() == "SW1-1")                 // Vérifie sur node-red (si variable "SW1-1" est vraie)
      mySwitch.send(1381717, 24);                         // Envoi le signal 433Mhz (code sniffé de la télécommande) commande "ON"
    else if (rf433mhz.readString() == "Sw1-0")            // Vérifie sur node-red (si variable "SW1-0" est vraie)
      mySwitch.send(1381716, 24);                         // Envoi le signal 433Mhz (code sniffé de la télécommande) commande "OFF"
  }
  if (infrarouge.available())
  {
    if (infrarouge.readString() == "LED-ON")              // Vérifie sur node-red (si variable "LED-ON" est vraie)
      irsend.sendNEC(0xF7C03F, 32);                       // Envoi le signal IR (code sniffé de la télécommande) commande "ON"
    else if (infrarouge.readString() == "LED-OFF");       // Vérifie sur node-red (si variable "LED-OFF" est vraie)
    irsend.sendNEC(0xFC40BF, 32);                         // Envoi le signal IR (code sniffé de la télécommande) commande "OFF"
  }
}

Comme dis plus tôt, je débute :wink: places aux erreur pour s’améliorer :wink:

Merci encore

Le soucis (ou l’un des soucis) c’est que vous lisez continuellement le port série...

Quand vous faites le premier if (Serial.readString() == ...) vous avez enlevé le message du buffer et donc vous ne comparez la réception qu’à une seule des possibilités, le prochain readString va aller attendre le prochain message...

Ce qu’il faut faire, c’est lire une fois le message, le stocker quelque part et le comparer à tous les cas possibles, jusqu’à en trouver un qui correspond et effectuer l’action correspondante puis recommencer

Si vous voulez comprendre comment bien écouter le port série (ou gérer un flux asynchrone genre keypad) vous pouvez jeter un oeil à mon petit tuto sur le sujet