Trasmissione radio dati protocollo lo.ra e comando led

Salve, ho la necessita di inviare e ricevere pacchetti e comandare un Led, attraverso il modulo "LILYGO®TTGO LoRa32 V2.1 _ 1.6 versione 433/868/915Mhz ESP32 LoRa OLED scheda SD da 0.96 pollici modulo Wireless WIFI Bluetooth ESP-32 SMA".

Funzionamento:
Il modulo A deve rilevare la presenza di un carrello attraverso un sensore IR, inviare un pacchetto al modulo B mostrando a display la disponibilità e accendere un led.

Attualmente il modulo B riceve i pacchetti, ma riceve il comando di accendere il led quando il valore è "1".
In oltre vorrei mostrare a display un determinato messaggio "DISPONIBILE" "NON DISPONIBILE" , anziché il valore "1" o "0" relativi allo stato del sensore.

//Libraries for LoRa
#include <SPI.h>
#include <LoRa.h>

//Libraries for OLED Display
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <IRremote.h>

//define the pins used by the LoRa transceiver module
#define SCK 5
#define MISO 19
#define MOSI 27
#define SS 18
#define RST 23
#define DIO0 26

//433E6 for Asia
//866E6 for Europe
//915E6 for North America
#define BAND 433E6

//OLED pins
#define OLED_SDA 21
#define OLED_SCL 22 
#define OLED_RST 23
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels

//SENSORE
int IR_SENSOR = 36;


// Forward declarations
void displayLoraData(String IR_SENSOR);
void showLogo();

String LoRaData;

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RST);

void setup() {
  //initialize Serial Monitor
  Serial.begin(9600);
  pinMode(IR_SENSOR, INPUT);
  digitalWrite (25,OUTPUT); //LED 
    while (!Serial);
  String LoRaData = LoRa.readString();
  Serial.println(LoRaData);
  Serial.print(LoRaData);
  Serial.println("LoRa Transmitter");

  // Configure the LED an an output
  pinMode(LED_BUILTIN, OUTPUT);
  
 
  //reset OLED display via software
  pinMode(OLED_RST, OUTPUT);
  digitalWrite(OLED_RST, LOW);
  delay(20);
  digitalWrite(OLED_RST, HIGH);

  //initialize OLED
  Wire.begin(OLED_SDA, OLED_SCL);
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3c, false, false)) { // Address 0x3C for 128x32
    Serial.println(F("SSD1306 allocation failed"));
    for(;;); // Don't proceed, loop forever
  }
  
  display.clearDisplay();
  display.setTextColor(WHITE);
  display.setTextSize(1);
  display.setCursor(0,0);
  display.print("LORA SENDER ");
  display.display();
  
  Serial.println("LoRa Sender Test");

  //SPI LoRa pins
  SPI.begin(SCK, MISO, MOSI, SS);
  //setup LoRa transceiver module
  LoRa.setPins(SS, RST, DIO0);
  
  if (!LoRa.begin(BAND)) {
    Serial.println("Starting LoRa failed!");
    while (1);
  }

  Serial.println(IR_SENSOR);
  Serial.print(IR_SENSOR);
 
  Serial.println("LoRa Initializing OK!");
  display.setCursor(0,10);
  display.print("LoRa Initializing OK!");
  display.display();
  delay(2000);
}

void loop() {


  
  Serial.print("VERNICIATURA: ");
  int carrello = !digitalRead(IR_SENSOR);
  digitalWrite (25,OUTPUT);


if (carrello == 0) {
      Serial.println("NON DISPONIBILE");
      LoRa.print("NON DISPONIBILE");
      digitalWrite(LED_BUILTIN, LOW);
        delay(1000); 
    } else {  
      digitalWrite(LED_BUILTIN, HIGH);
      Serial.println("DISPONIBILE");
      LoRa.print("DISPONIBILE");
      delay(1000);

}

  //Send LoRa packet to receiver
  
  LoRa.beginPacket();
  LoRa.print("");
  LoRa.print(carrello);
  LoRa.endPacket();
  
  display.clearDisplay();
  display.setCursor(10,0);
  display.println("** VERNICIATURA **");
  display.setCursor(0,30);
  display.setTextSize(1);
  display.print("Verniciati->Autostore");
  display.setCursor(0,50);
  display.print("Carri:");
  display.setCursor(50,50);
  display.print(carrello);      
  display.display();

  delay(100);
  
}

IMG_7516


Grazie a chi mi può aiutare

Non conosco le librerie LoRa e quindi non so bene entrare nel dettaglio ma alcuna cose le posso dire comunque

Hai una generale confusione nella scrittura del programma,
Non vedo il programma del ricevitore
Confondi inizializzazione ed uso dei piedini
Dichiari variabili doppie
Non è chiaro se le scritte che vuoi devono uscire al ricevitore o al trasmettitore

Comincia almeno col mettere il secondo programma, poi si vede...

Innanzitutto la ringrazio per la risposta.
Allora, attualmente il programma trasmettitore esegue tutte le azioni che ho provato a riprodurre, ovvero: mostra sull lcd del dispositivo Lo.Ra le descrizioni, visualizza lo stato del sensore 1 o 0, e comanda sia il led integrato nella scheda integrata che il pin 25.

Il programma del ricevitore invece, riceve correttamente i pacchetti e cambia lo stato da 0 ad 1 quando il sensore rileva la presenza, ma non accende né il led della scheda, né comanda il pin 25.
In oltre vorrei che sul display della scheda, visualizzassi al posto di 1 o 0 1= DISPONIBILE , 0= NON DISPONIBILE.

il codice del ricevitore che ho provato a scrivere è il seguente:


//Libraries for LoRa
#include <SPI.h>
#include <LoRa.h>

//Libraries for OLED Display
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <IRremote.h>
#include <string.h>

//define the pins used by the LoRa transceiver module
#define SCK 5
#define MISO 19
#define MOSI 27
#define SS 18
#define RST 23
#define DIO0 26

#define BAND 433E6

//OLED pins
#define OLED_SDA 21
#define OLED_SCL 22 
#define OLED_RST 23
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels

// LED collegato al pin digitale 25
#define LED 25                


int IR_SENSOR = 36;

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RST);

String LoRaData;
void displayLoraData(String IR_SENSOR);

void setup() { 
  //initialize Serial Monitor
  Serial.begin(9600);
  
  //SET LED OUTPUT
  
  pinMode(LED_BUILTIN, OUTPUT);
  pinMode(25,OUTPUT);
  digitalWrite(OLED_RST, LOW);
  delay(20);
 
 
  //initialize OLED
  Wire.begin(OLED_SDA, OLED_SCL);
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3c, false, false)) { // Address 0x3C for 128x32
    Serial.println(F("SSD1306 allocation failed"));
    for(;;); // Don't proceed, loop forever
  }

  display.clearDisplay();
  display.setTextColor(WHITE);
  display.setTextSize(1);
  display.setCursor(0,0);
  display.print("LORA RECEIVER ");
  display.display();

  Serial.println("LoRa Receiver Test");
  
  //SPI LoRa pins
  SPI.begin(SCK, MISO, MOSI, SS);
  //setup LoRa transceiver module
  LoRa.setPins(SS, RST, DIO0);

  if (!LoRa.begin(BAND)) {
    Serial.println("Starting LoRa failed!");
    while (1);
  }
  Serial.println("LoRa Initializing OK!");
  display.setCursor(0,10);
  display.println("LoRa Initializing OK!");
  display.display();  
}

void loop() {



  //try to parse packet

  int packetSize = LoRa.parsePacket();
     if (packetSize) {
        Serial.print(LoRaData);

    //read packet
    
    while (LoRa.available()) {
      LoRaData = LoRa.readString();
     Serial.print(LoRaData);
     Serial.read();

  }
    
{


   // Display information
  display.clearDisplay();
  display.setCursor(25,0);
  display.print("** AUTOSTORE **");
  display.setCursor(0,30);
  display.print("Verniciati:");
  display.setCursor(0,50);
  display.print("Carri:");
  display.setCursor(50,50);
  display.print(LoRaData);      
  display.display();   
   }

  }

 }

dopo ci guardo

a proposito, io non sono un lei, sono un tu qualsiasi
in generale qui siamo tutti dei tu

1 Like

Ok, sono andato lungo, ma adesso ci sono

la variabile di stato che cambia nel ricevitore è loRaData?

comunque ci credo che non accendi il led, non hai alcuna digitalWrite...

si, la variabile di stato che cambia nel ricevitore è loRaData, e mi visualizza lo stato del sensore IR.

Se inserisco un digitalWrite, il led del ricevitore rimane perennemente acceso, perché interpreta che quando riceve dei pacchetti deve rimanere acceso; sia che lo stato del sensore sia 0 oppure 1..

//** ricevitore **

  int packetSize = LoRa.parsePacket();
     if (packetSize) {
        Serial.print(LoRaData);

//read packet
    
    while (LoRa.available()) {
      LoRaData = LoRa.readString();
     Serial.print(LoRaData);
     Serial.read();

  }

dovrei associare il valore 0 ad una determinato pacchetto ed il valore 1 ad un altro pacchetto mediante una stringa univoca per ciascun valore

@fort90 : Buongiorno e benvenuto nella sezione Italiana del forum,

cortesemente, come prima cosa, leggi attentamente il REGOLAMENTO di detta sezione, (prestando molta attenzione al punto 15), dopo di che, come da suddetto regolamento, fai la tua presentazione NELL'APPOSITA DISCUSSIONE spiegando bene quali esperienze hai in elettronica e programmazione, affinché noi possiamo conoscere la tua esperienza ed esprimerci con termini adeguati.

Grazie,

Guglielmo

Grazie Guglielmo, avevo già fatto la presentazione prima di scrivere il primo messagio

Perdona, all'epoca avevo cercato e non l'avevo trovata ... magari la cosa è avvenuta contemporaneamente :slight_smile:

Comunque grazie !

Guglielmo

Giusto per capire chi è chi : @fort_90 e @fort90 sono la stessa persona?

Ciao, Ale.

Si, è lo stesso

E allora metti tutti e due i programmi
Le ultime versioni
E descrivi esattamante i problemi
Della versione postata

Che sappiamo di cosa si parla

Attenzione, REGOLAMENTO, punto 16.12 ... ora, se vuoi evitare un BAN definitivo, dimmi quale dei due vuoi che io elimini e quale devo lasciare. Grazie. :slight_smile:

Guglielmo

elimini fort_90 per piacere;
Utilizzo fort90

Ok, grazie, ho bloccato fort_90.

Guglielmo

La scheda è la seguente : "TTGO ESP32 LoRa32-OLED V.2.1.6" 433MHZ

http://www.lilygo.cn/claprod_view.aspx?TypeId=62&Id=1130&FId=t28:62:28

Lo scopo è far sì che il ricevitore C.SPOT mantenga il led spento quando il segnale è basso, ed acceso quando il segnale è alto.
In oltre voglio far sì che il carattere "1" venga visualizzato sull LCD LoRa con "DISPONIBILE" e lo "0" "NON DISPONIBILE".

//SENDER

void loop() {
 Serial.print("AUTOSTORE: ");
  int carrello = !digitalRead(IR_SENSOR);
  
  //digitalWrite (LED_BUILTIN,OUTPUT);

if (carrello == 0) {
      Serial.println("NON DISPONIBILE");
      digitalWrite(LED_BUILTIN, LOW);
        delay(1000); 
    } else {  
      digitalWrite(LED_BUILTIN, HIGH);
      Serial.println("DISPONIBILE");
      delay(1000);

Attualmente il ricevitore riceve correttamente il segnale 1 o 0, ma non riesco a fargli accendere o spegnere il Led in base al segnale.
Se do un digitalWrite, il led rimane perennemente acceso;
Devo scrivere un altra stringa che distingua quando spegnere il led, ma non ne sono capace.

In rete ho trovato degli esempi per utilizzare l'invio di multistringhe, ma non sono stato in grado di applicarli.

Link: Sending multiple Strings from one LoRa to another

A seguire lo sketch del trasmettitore

/********************
TRASMETTITORE
 AUTOSTORE -> C.SPOT
*********************/

//Libraries for LoRa
#include <SPI.h>
#include <LoRa.h>

//Libraries for OLED Display
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

//Lib.Sensore
#include <IRremote.h>

//define the pins used by the LoRa transceiver module
#define SCK 5
#define MISO 19
#define MOSI 27
#define SS 18
#define RST 23
#define DIO0 26

#define BAND 433E6

//OLED pins
#define OLED_SDA 21
#define OLED_SCL 22 
#define OLED_RST 23
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RST);

//SENSORE
int IR_SENSOR = 36;

// Forward declarations
String carrello;
String LoRaData;
void displayLoraData(String IR_SENSOR);

void setup() {
// Configure the LED an an output and SENSOR as Input
  pinMode(LED_BUILTIN, OUTPUT);    // LED SCHEDA
  pinMode(IR_SENSOR, INPUT);       // Sensore Infrarossi
  
//initialize Serial Monitor
  Serial.begin(9600);
  digitalWrite (LED_BUILTIN,OUTPUT); //  LED SCHEDA
    while (!Serial);
    
  String LoRaData = LoRa.readString();
 
  //Serial.println(LoRaData);
  Serial.print(LoRaData);
  LoRa.print(LoRaData);
  Serial.println("LoRa Transmitter");
 
  //reset OLED display via software
  pinMode(OLED_RST, OUTPUT);
  digitalWrite(OLED_RST, LOW);
  delay(20);
  digitalWrite(OLED_RST, HIGH);

  //initialize OLED
  Wire.begin(OLED_SDA, OLED_SCL);
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3c, false, false)) { // Address 0x3C for 128x32
    Serial.println(F("SSD1306 allocation failed"));
    for(;;); // Don't proceed, loop forever
  }
  
  display.clearDisplay();
  display.setTextColor(WHITE);
  display.setTextSize(1);
  display.setCursor(0,0);
  display.print("LORA SENDER ");
  display.display();
  
  Serial.println("LoRa Sender Test");

  //SPI LoRa pins
  SPI.begin(SCK, MISO, MOSI, SS);
  
  //setup LoRa transceiver module
  LoRa.setPins(SS, RST, DIO0);
    if (!LoRa.begin(BAND)) {
    Serial.println("Starting LoRa failed!");
    while (1);
  }

  Serial.println(IR_SENSOR);
  Serial.print(IR_SENSOR);
   display.setCursor(0,10);
  display.print("LoRa Initializing OK!");
  display.display();
  delay(2000);
}

void loop() {
   
  Serial.print("AUTOSTORE: ");
  int carrello = !digitalRead(IR_SENSOR);
  
  //digitalWrite (LED_BUILTIN,OUTPUT);

 if (!digitalRead(carrello== 0)) {
  digitalWrite(LED_BUILTIN, LOW);
  Serial.println("NON DISPONIBILE");
    delay(100); 
        } else { digitalWrite(LED_BUILTIN, HIGH);
    Serial.println("DISPONIBILE"); 
    LoRa.println ("DISPONIBILE");
    delay(100);

}

  //Send LoRa packet to receiver
  LoRa.beginPacket();
  LoRa.print("");
  LoRa.print(carrello);
  delay(100);
  LoRa.endPacket();
  
  display.clearDisplay();
  display.setCursor(11,0);
  display.println(" ** AUTOSTORE **");
  display.setCursor(0,30);
  display.setTextSize(1);
  display.print("AUTOSTORE -> C.SPOT");
  display.setCursor(0,50);
  display.print("Carri:");
  display.setCursor(50,50);
  display.print(carrello);      
  display.display();
  delay(100);
}

E del Ricevitore

//Libraries for LoRa
#include <SPI.h>
#include <LoRa.h>

//Libraries for OLED Display
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <IRremote.h>

//define the pins used by the LoRa transceiver module
#define SCK 5
#define MISO 19
#define MOSI 27
#define SS 18
#define RST 23
#define DIO0 26

#define BAND 433E6

//OLED pins
#define OLED_SDA 21
#define OLED_SCL 22 
#define OLED_RST 23
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels

int IR_SENSOR = 36;
int carrello = !digitalRead(IR_SENSOR);

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RST);
String LoRaData;
void displayLoraData(String IR_SENSOR);

void setup() { 
  //initialize Serial Monitor
  Serial.begin(9600);
  
  //SET LED OUTPUT
  
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(OLED_RST, LOW);
  delay(20);
 
 
  //initialize OLED
  Wire.begin(OLED_SDA, OLED_SCL);
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3c, false, false)) { // Address 0x3C for 128x32
    Serial.println(F("SSD1306 allocation failed"));
    for(;;); // Don't proceed, loop forever
  }

  display.clearDisplay();
  display.setTextColor(WHITE);
  display.setTextSize(1);
  display.setCursor(0,0);
  display.print("LORA RECEIVER ");
  display.display();

  Serial.println("LoRa Receiver Test");
  
  //SPI LoRa pins
  SPI.begin(SCK, MISO, MOSI, SS);
  //setup LoRa transceiver module
  LoRa.setPins(SS, RST, DIO0);

  if (!LoRa.begin(BAND)) {
    Serial.println("Starting LoRa failed!");
    while (1);
  }
  Serial.println("LoRa Initializing OK!");
  display.setCursor(0,10);
  display.println("LoRa Initializing OK!");
  display.display();  
}

void loop() {   
//try to parse packet
  int packetSize = LoRa.parsePacket();
     if (packetSize) {
     Serial.print(LoRaData);
        
//read packet
     while (LoRa.available()) {
     LoRaData = LoRa.readString();
     Serial.print(LoRaData);
     Serial.read();

  }
    
{

   // Display information
  display.clearDisplay();
  display.setCursor(25,0);
  display.print("** C.SPOT **");
  display.setCursor(0,30);
  display.print("C.SPOT -> AUTOSTORE");
  display.setCursor(0,50);
  display.print("Carri:");
  display.setCursor(50,50);
  display.print(LoRaData);      
  display.display();   
   }

  }

 }

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.