Lora problema di ricezione

salve , sto inviando dei pacchetti tramite modulo lora Sx1278 dau Arduino mega questo è il codice:

#include <SPI.h>
//Incuding LoRa library
#include <LoRa.h>

//define the pins used by the transceiver module

#define NSS 53
#define RST 9
#define DI0 8
#define BUTTON 3

//this variable is for update the status of the push button
uint8_t button_status = 0;


// this function is called the Interrupt Setvice Routine (ISR).
// When button is pressed, this function will trigger.
// and, update the "button_status" variable to (1 to 0) or (0 to 1)
void isr() {
 Serial.println("interrupt triggered");
 //every time the interrupt is triggered,
 // button_status value will inverse (0 to 1) or (1 to 0)
 button_status = !button_status;
}

void setup() {
 //initialize Serial Monitor
 Serial.begin(9600);
 //take pin 25 as INPUT with PULL-UP.
 //PULLUP means pin 15 is normally high. When button pressed it gets LOW
 pinMode(BUTTON, INPUT_PULLUP);
 //Attaching an Interrupt to pin 25 (BUTTON pin) 

 // when button goes (high to low) state, then interrupt will triggered
 attachInterrupt(digitalPinToInterrupt(BUTTON), isr, CHANGE);

 Serial.println("LoRa Sender");

pinMode(NSS, OUTPUT);
digitalWrite(NSS, HIGH);
LoRa.setPins(NSS, RST, DI0);
 //setup LoRa sender
 //Select the frequency accordng to your location
 //433E6 for Asia
 //866E6 for Europe
 //915E6 for North America
 while (!LoRa.begin(433E6)) {
   Serial.println(".");
   delay(500);
 }
 // Change sync word (0xF1) to match the receiver LoRa
 // This code ensure that you don't get LoRa messages
 // from other LoRa transceivers
 // ranges from 0-0xFF
 LoRa.setSyncWord(0xF1);
 Serial.println("LoRa Initializing Successful!");
}

void loop() {
 Serial.print("Sending packet: ");
 //If the button_status is 1, Send LoRa packet "on" to receiver LoRa
 if(button_status == 1){
     LoRa.beginPacket();
     LoRa.print("true");
     LoRa.endPacket();
     Serial.println("sent lora to on");
     
  }
   //If the button_status is 0, Send LoRa packet "off" to receiver LoRa
  if(button_status == 0){
     LoRa.beginPacket();
     LoRa.print("false");
     LoRa.endPacket();
     Serial.println("sent lora to off");
  }
  delay(500);
}

ricevo il pacchetto "true" o "false" su un altro modulo Lora Sx1278 integrato , su un esp32 ..... ma il problema è che ricevo il pacchetto "false" o "true" non sempre, dal serial Monitor mi viene stampata la ricezione del pacchetto ogni 7 secondi , se stampo sul serial monitor la variabile packetSize del mio esp32 mi legge ogni 0.5 secondi il valore "0" e dopo molti secondi "5" equivalente a "false", anche se il mio mega lo sta inviando ogni 0.5 secondi.
..... come mai ? qualcuno ha idea di come risolvere questo problema?

Io credo tu abbia alcuni problemi

Primo mi sembra che tu trasmetti di continuo, non al cambio di stato del pulsante
Poi la variabile modificata nella isr deve essere dichiarata volatile
Poi non si stampa durante una isr

Altro non saprei

Inoltre lora è configurato per l'asia e per come è costruito il programma la isr è inutile

si trasmetto di continuo per sapere ogni istante lo stato del del pulsante , la variabile nel isr perche deve essere dichiarata volatile ? quali problemi ho se non la dichiaro volatile ? scusa ma non sono molto esperto.
in che senso non si stampa durante la isr , ti riferisci al " Serial.println("interrupt triggered");"

Adesso ho modificato il "delay(500)" con un valore più basso e dal altra parte ora ricevo ogni 2 secondi circa rispetto a prima che ricevevo ogni 7 secondi .

si e configurato a 433 Mhz per ora sto solo facendo dei test.

Per l'uso di volatile devi guardare il C e l'uso degli interrupt

Per la cadenza di trasmissione non saprei

Il trasmettitore ti stampa correttamente "sent lora to...." quando deve?

Vedere il ricevitore

@giobob: prima di tutto comincia con studiarti attentamente QUESTO articolo di Gammon (vecchio utente molto esperto di questo forum) ... così ti chiarisci tutte le idee sugli Interrupts e su cosa si fa e non si fa ... poi andiamo avanti :wink:

Guglielmo

Ottimo consiglio ! grazie

Ma dato che trasmette sempre il fatto che gli manchino ricezioni non dovrebbe dipendere dalla isr

Forse la risposta alla domanda di @Salvorhardin sarebbe utile

Oltre naturalmente a vedere il ricevitore

In effetti...

Comunque delle due l'una
O trasmette e si vede quindi la riga "sent lora to...

E quindi è colpa del ricevitore

O non si vedono quelle righe, e quindi è il trasmettitore

si il trasmettitore stampa correttamente "sent lora to false "

potrebbe essere il delay()? che non invia pacchetti in quel istante e dal altra parte il ricevitore legge packetSize=0 e non fa nulla
poiché il pacchetto false inviato è uguale a packetSize=4
e il pacchetto true inviato è uguale a packetSize=5,
pero in qualche modo il ritardo sul ricevitore è maggiore del tempo di delay().

Ricorda che LoRa ha regole ben precise sull'impegno delle bande di frequenza e con i tempi tra una trasmissione ed un'altra ... oltre agli interrupt, prima di giocare con una cosa che non conosci e che ha delle regole piuttosto severe ... io andrei a studiarmi anche come funziona LoRa (e LoRaWAN) ... :wink:

Guglielmo

Mi puoi consigliare un po di materiale dove studiare ?

Beh ... il posto migliore da dove cominciare è QUI ... ti si aprirà un mondo :grin:

Poi c'è naturalmente il SITO ufficiale :wink:

Guglielmo

Pero non la vedo tanto complicata è severa come dici ... la frequenza di trasmissione non è quella giusta ma basta cambiare una riga di codice , la trasmissione dei pacchetti che invia il modulo si è interessante , ma il mio obietivo e far comunicare i due moduli in maniera stabile e efficiente , ce qualche progetto a cui posso far riferento ?

In alternativa poiche il mio ricevitore esp32 gestisce linvio dei dati a un server uno schermo lcd e un modulo rfid secondo me il loop ritarda la lettura dei pacchetti , anche perche ci sono un po di delay()sparsi qui e li , allora avevo pensato di associare un arduino nano che mi gestisce solo il modulo lora , il quale quando riceve il pacchetto true mi alza un pin , collegato al esp32 il quale poi mi carica il valore true sul server. Puo essere una soluzione poiche non capisco perche esp32 mi salta dei pacchetti?

Così in primis direi, metti da parte lora e riparti dalle basi. Tuttavia potrebbe pure essere che usi un pulsante speciale che non soffre di rimbalzi.
Se invece usi un normale pulsante elettromeccanico allora considera che quando pigi il pulsante nei primi 20ms(circa) di tempo c'è un treno di impulsi on/off. Quasi stessa cosa accade quando rilasci il pulsante.

Per quanto scritto, un interrupt attaccato ad un pin a cui è connesso un pulsante (o interruttore) elettromeccanico è una delle tante cose da non fare.

Prova sulla tua mega questo sketch:

bool btn0_s = true;
bool btn0_os = true;
#define PIN_BTN0 3

void setup() {
 
  Serial.begin(115200);
  pinMode(PIN_BTN0, INPUT_PULLUP);
}

void loop() { 
    //testSerialReadByte();
    btn0_s = digitalRead(PIN_BTN0);
    if (btn0_s != btn0_os) {
        if (btn0_s == LOW)
          Serial.println("is pressed");
        else 
          Serial.println("is released");
        btn0_os = btn0_s;
        
    }
  
}

Se il pulsante non rimbalza vedrai una sola scritta premendo e tenendo premuto.
Rilasciando comparirà una sola scritta.

Fammi sapere.

Ciao.

... o da fare come si deve, con l'apposito hardware anti rimbalzo, che, nel caso più semplice, è solo una rete R/C, funzione di come si gestisce il pin (pull-up interna, pull-up esterna, pull-down):

... fino invece, nei casi più critici, ad arrivare ad usare appositi IC di debuncing, come, ad esempio, il: MAX6816.pdf (1.3 MB).

Guglielmo

Debounce o no non ha importanza
Il trasmettitore trasmette di continuo
senza controllo o simili, solo un delay
E la libreria non onora i vincoli di duty cycle
Quindi non ci interessa altro:
Il trasmettitore trasmette (illegalmente ma trasmette)

Altro da dire al trasmettitore non c'è
È al ricevitore il problema