Comparaison donnée reçue

Bonjour,
J’ai 2 arduinos nano équipés de module Lora. L’un envoi l’information d’un capteur d’angle via Lora. Sur cette partie là tout va bien.
EN réception (suivant le programme ci-dessous) je reçois donc l’info (un 0 ou un 1, 1 étant la valeur déclenchant une alarme). Cependant, je n’arrive pas à exploiter cette information pour pouvoir l’utiliser dans une condition SI.
Si quelqu’un à une idée ! mille mercis à vous.

#include <SPI.h>
#include <LoRa.h>
#define Interval    10000



void setup() {
  Serial.begin(9600);
  while (!Serial);

  Serial.println("LoRa Receiver");

  if (!LoRa.begin(433E6)) {
    Serial.println("Starting LoRa failed!");
    while (1);
  }
}

void loop() {

  int packetSize = LoRa.parsePacket();
  if (packetSize) {

    Serial.print("Received packet '");


    while (LoRa.available()) {
      Serial.print((char)LoRa.read());
      static int           flag    = 0;
      static unsigned long msecLst = 0;
      unsigned long msec    = millis ();
      if ((char) LoRa.read() == "0") {
        if (flag)  {
          flag = 0;
          Serial.println("more than 10 degree");
        }
      }

      else {
        if (! flag)  {
          flag    = 1;
          msecLst = msec;
        }
        else if ( (msec - msecLst) > Interval)  {

          Serial.println("DO1 less than 10 degree");
          beep(1500);
          delay(500);
        }
      }
    }


    Serial.print("' with RSSI ");
    Serial.println(LoRa.packetRssi());
  }




}

void beep (int dTime)
{

  tone(4, 3900);
  delay(dTime);
  noTone(4);


}

Bonjour,

Il y a quelques éléments que je ne suis pas sûr de saisir.
si je comprends bien, LoRa.read() est ta réception de ta valeur.
Pourquoi tu la cast en char ? Pourquoi ne pas comparer directement en entier ?

Il me semble que caster un int en char va te donner le caractère ascii associer. Par exemple pour `(char)65{ ça va te donner ‘A’ car c’est le caractère associé à 65 dans la table ascii. Si jamais tu veux tout de même convertir un int en char tu a la fonction itoa().

j’espère t’avoir aidé et ne pas être à côté de la plaque ^^".

J’ai utilisé le code exemple Lora Receive fournit. J’ai testé le Lora.read() sans (char) ou (String) et je n’obtiens aucune info . Je sais que l’autre carte envoi comme info un O ou un 1 (cf code carte envoi ci-dessous)

 int sensorValue = digitalRead(DO1);
  if (sensorValue == LOW) {
    Serial.println("DO1 more than 10 degree");
    Serial.println("Sending packet: ");

    LoRa.beginPacket();

    LoRa.print(digitalRead(DO1));
    Serial.print(digitalRead(DO1));
    LoRa.endPacket();
    delay(1000);
    while (sensorValue == HIGH) {}
  }
  else {
    Serial.println("DO1 less than 10 degree");
    Serial.println("Sending packet: ");

    LoRa.beginPacket();

    LoRa.print(digitalRead(DO1));
    Serial.print(digitalRead(DO1));
    LoRa.endPacket();
    delay(1000);

Serial.print((char)LoRa.read()); cette ligne te donne quoi ?
et essaie avec

Serial.print(LoRa.read());
Serial.print(atoi(LoRa.read()));

voir ce que ça donne.

Hélas rien.
Je reçois bien en char
4:33:32.641 -> Received packet '0' with RSSI -33,
mais ne peut rien faire de ce 0 ou de ce 1 que je reçois pour l’utiliser dans une condition SI ensuite

quand vous faites Serial.print((char)LoRa.read()); vous enlevez déjà un octet du buffer en appelant read() donc (outre l’erreur de syntaxe) quand vous essayez de faire if ((char) LoRa.read() == "0") { vous allez essayer de lire l’octet d’après, pas celui que vous avez imprimé.

donc ce serait plus:

char reçu = (char) LoRa.read();
Serial.println(recu);
if (recu == '0') { // <-- simples apostrophes pour un char, pas de guillemets 
  ...
} else {
  ...
}

cela me fait recevoir un ? à l’envers:


14:58:36.310 -> recu
14:58:36.310 -> ⸮

est-ce envoyé en binaire ou en ASCII ?

essayez

byte reçu = (char) LoRa.read();
Serial.println(recu, HEX); // pour voir le code hexa reçu
if (recu == '0') { // <-- simples apostrophes pour un char, pas de guillemets 
  ...
} else {
  ...
}

if (recu == 0) { // si c'est envoyé sous forme de nombre on testerait comme cela 
  ...
} else {
  ...
}

EDIT: bien sûr il faut mettre cela dans la partie réception, donc bien conserver

int packetSize = LoRa.parsePacket();
  if (packetSize) {
    Serial.print("Received packet '");
    while (LoRa.available()) {
      // ------ c'est ici qu'on met le code
   }
}

mon envoi est celui-ci:


LoRa.beginPacket();

LoRa.print(digitalRead(DO1));

avec

byte reçu = (char) LoRa.read();
Serial.println(recu, HEX);

je reçois : 255

postez le code exact

voici le code côté envoi

#include <SPI.h>
#include <LoRa.h>



#include "TM1651.h"
#define CLK 5//pins definitions for TM1651 and can be changed to other ports
#define DIO 4
TM1651 batteryDisplay(CLK, DIO);


#include "ITG3200.h"

const int DO1 = 6;



void setup() {
  Serial.begin(9600);
  while (!Serial);

  Serial.println("LoRa Sender");

  if (!LoRa.begin(433E6)) {
    Serial.println("Starting LoRa failed!");
    while (1);
  }

  LoRa.setTxPower(20);

}

void loop() {

  charging();


  int sensorValue = digitalRead(DO1);
  if (sensorValue == LOW) {
    Serial.println("DO1 more than 10 degree");
    Serial.println("Sending packet: ");

    LoRa.beginPacket();

    LoRa.print(digitalRead(DO1));
    Serial.print(digitalRead(DO1));
    LoRa.endPacket();
    delay(1000);
    while (sensorValue == HIGH) {}
  }
  else {
    Serial.println("DO1 less than 10 degree");
    Serial.println("Sending packet: ");

    LoRa.beginPacket();

    LoRa.print(digitalRead(DO1));
    Serial.print(digitalRead(DO1));
    LoRa.endPacket();
    delay(1000);



  }

}

void charging()
{
  for (uint8_t level = 0; level < 6; level ++)
  {
    batteryDisplay.displayLevel(level);
    delay(500);
  }
}

essayez un truc comme cela (virez l’afficheur de batterie pour le moment et passez le moniteur série à 115200 bauds)

#include <SPI.h>
#include <LoRa.h>
const byte sensorPin = 6;

void setup() {
  Serial.begin(115200); // ouvrir à 115200 bauds
  Serial.println("LoRa Sender");

  if (!LoRa.begin(433E6)) {
    Serial.println(F("Erreur LoRa"));
    while (true) yield();
  }
  LoRa.setTxPower(20);
}

void loop() {
  static int oldSensorValue = 100; // pour être sûr de déclencher la première fois
  int sensorValue = digitalRead(sensorPin);

  if (sensorValue != oldSensorValue) {
    LoRa.beginPacket();
    LoRa.print((sensorValue == LOW) ? "0" : "1");
    LoRa.endPacket();
    Serial.print(F("J'ai envoyé : "));
    Serial.println((sensorValue == LOW) ? "0" : "1");
    oldSensorValue = sensorValue;
  }
}

Hello à tous,

Après recherche j’ai trouvé une commande Lora qui facilite mon retour de données. Du coup maintenant en lecture j’ai bien un 1 ou un 0 suivant état du capteur. Cependant ma condition Si Loradata=0 ne fonctionne pas du tout. probleme avec le While qui bloque tout?

#include <SPI.h>
#include <LoRa.h>
#define Interval    10000

static int           flag    = 0;
static unsigned long msecLst = 0;
unsigned long msec    = millis ();

void setup() {
  Serial.begin(9600);
  while (!Serial);

  Serial.println("LoRa Receiver");

  if (!LoRa.begin(433E6)) {
    Serial.println("Starting LoRa failed!");
    while (1);
  }
}

void loop() {

  int packetSize = LoRa.parsePacket();
  if (packetSize) {

    Serial.print("Received packet '");


    while (LoRa.available()) {
      String LoRaData = LoRa.readString();
      Serial.println("LoRaData");
      Serial.println(LoRaData);
      if ( LoRaData == 0) {
        if (flag)  {
          flag = 0;
          Serial.println("more than 10 degree");
        }
      }

      else {
        if (! flag)  {
          flag    = 1;
          msecLst = msec;
        }
        else if ( (msec - msecLst) > Interval)  {

          Serial.println("DO1 less than 10 degree");
          beep(1500);
          delay(500);
        }
      }



    }
  }






}




void beep (int dTime)
{

  tone(4, 3900);
  delay(dTime);
  noTone(4);

Vous avez lu une String (était-ce ce qui était envoyé ?) il ne faut pas la comparer au nombre 0 mais à la String 0 . Essayez avec


if ( LoRaData == "0") {

après comparaison à la string 0, j’obtiens ce résultat:

09:53:22.567 -> Received packet 'LoRaData
09:53:22.567 -> 1
09:53:22.567 -> datalora
09:53:22.602 -> 1
09:53:26.625 -> Received packet 'LoRaData
09:53:26.625 -> 0
09:53:26.625 -> datalora
09:53:26.658 -> 0
09:53:26.658 -> more than 10 degree
09:53:30.689 -> Received packet 'LoRaData
09:53:30.689 -> 0
09:53:30.689 -> datalora
09:53:30.689 -> 0

Le if ne fonctionne qu’une fois quand le capteur revient à 0 pour signaler “more than 10°”

essayez ce code:

#include <SPI.h>
#include <LoRa.h>

const byte pinBuzzer = 4;
const unsigned long periodeAlerte = 10000UL;
unsigned long debutAlerte = 0;

enum : byte {ETAT_INCONNU, MOINS_DE_10, PLUS_DE_10} etatCourant = ETAT_INCONNU;

void setup() {
  pniMode(pinBuzzer, OUTPUT);
  Serial.begin(115200); while (!Serial);
  Serial.print(F("Récepteur LoRa "));

  if (!LoRa.begin(433E6)) {
    Serial.println("Erreur LoRa. Stop!");
    while (true);
  }
  Serial.println(F(": prêt !"));
}

void loop() {
  if (LoRa.parsePacket() > 0) {
    while (LoRa.available()) { // on vide le buffer d'arrivée de messages
      String LoRaData = LoRa.readString();
      if (LoRaData == "0") { // more than 10 degree
        etatCourant = PLUS_DE_10;
      } else {
        if (etatCourant != MOINS_DE_10)  { // transition, on enregistre le moment de debutAlerte
          Serial.println("Debut Alerte: Moins de 10°");
          etatCourant = MOINS_DE_10;
          debutAlerte = millis();
        }
      } // fin if-else
    } // fin LoRa available
  } // fin of LoRa reception

  // si on est en état d'alerte depuis plus de periodeAlerte
  if ((etatCourant == MOINS_DE_10) && (millis() - debutAlerte > periodeAlerte))  {
    Serial.println("Moins de 10°");
    tone(pinBuzzer, 3900, 1500);
    debutAlerte = millis();
  }
}

(j’ai tapé cela ici, donc totalement non testé)

je viens de tester et cela fonctionne parfaitement ! mille mercis à vous…je vais décortiquer et comprendre ce code, car j’ai hâte d’apprendre toujours plus sur Arduino (je ne m’y suis mis que depuis 2 mois) et les possibilitsé ont l’air infinies et passionnantes. Encore merci à vous et ce forum où des personnes prennent le temps et transmettent leur connaissances!

le code utilise ce qu’on appelle la programmation par machine à états (cf mon tuto éventuellement)

amusez vous bien :slight_smile:

(idéalement on n’envoie pas de String, on envoie juste un octet qui est à 0 ou 1)