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);
}
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);
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 {
...
}
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
}
}
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);
#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();
}
}
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!