Automazione per pompa

forse non mi sono spiegato. Ho una scheda in prossimita’ del galleggiante che mi controlla il livello dell acqua in una cisterna.
Quando il livello si abbassa il contatto del galleggiante si chiude e la scheda deve trasmettere via radio questo segnale a una scheda che si trova a 500 metri di distanza dove si trova la pompa che una volta ricevuto il segnale dovrebbe accendersi e riempire la cisterna fino a quando il galleggiante ritorna a riposo

the Heltec LoRa V3 ESP32S3 uses 3.3v logic
make sure your relay uses 3.3V logic (the majority of relays used with Arduino board use 5V logic)
make sure the current carrying capacity of your relay will support the pump
the majority of relays used with Arduino board typically have a rating printed on them of 10amps 250volts
this would be for a resistive load - for an inductive load such as a pump the rating would be 2 to 3 amps
have a look at Electrical Standards For Contactors AC1, AC2, AC3, AC4, DC1, DC2 DC3
for example, I was recently switching a Jabsco_28520_pump rated at 230V 2.2.kW where the ESP32 relay was switching a 20amp contactor

#include <RadioLib.h>

#include <SPI.h> // Necessario per la comunicazione SPI con il modulo LoRa

// Pin LoRa per Heltec WiFi LoRa 32 V3 (definiti automaticamente se la scheda è selezionata correttamente)

// Se per qualche motivo non fossero definiti, potresti aggiungerli qui manualmente:

// #define LORA_CS 8

// #define LORA_DIO1 47

// #define LORA_RST 12

// #define LORA_BUSY 13

// #define LORA_SCK 9

// #define LORA_MISO 11

// #define LORA_MOSI 10

// Pin del LED integrato sulla Heltec V3

#define HELTEC_LED 35 // LED onboard, visibile nello schema

// Pin per il galleggiante (scelto GPIO 26)

#define FLOAT_SWITCH_PIN 26 // GPIO 26 è un pin digitale disponibile nello schema

// Frequenza LoRa (per l’Europa)

#define BAND 868.0 // MHz

// Creazione istanza del modulo LoRa (SX1262 è quello sulla Heltec V3)

// Parametri: NSS (CS), DIO1, RST, BUSY, SPI_INSTANCE (HSPI)

SX1262 radio = new Module(LORA_CS, LORA_DIO1, LORA_RST, LORA_BUSY, SPI);

C’e’ qualcosa di sbagliato in queste prime righe di programma .Penso in relazione alla numerazione dei pin Lora . Sapreste indicarmi cosa c’e’ di sbagliato?

for the Heltec LoRa V3 I have DIO1 as pin: 14
e.g.

// Heltec LoRa V3  SX1262 has the following connections:
// NSS pin:   8
// DIO1 pin:  14
// NRST pin:  12
// BUSY pin:  13
SX1262 radio = new Module(8, 14, 12, 13);

You will need to have a fail safe built in to your code - transmissions on the ISM band are not guaranteed because it is shared with other users - so interference or leafy tree or heavy rain or large metal objects (like trucks) can all stop the message getting through. So it may take a few goes to get the message through - you need to work out would happen if there is a break in transmission.

ChatGPT is the problem, or more accurately, you using it. The pins for the radio are defined but commented out. This will NEVER work. There is no “definiti automaticamente se la scheda è selezionata correttamente” because that’s not how RadioLib does things unless you use the RadioBoards extension: See https://github.com/radiolib-org/RadioBoards/ which has the definitions for this board included: https://github.com/radiolib-org/RadioBoards/blob/main/src/maintained/Heltec/WiFi_LoRa32_v3.h

There is no need to setup the SPI, which the code doesn’t use the #defines anyway.

The LED is already defined in the board variants file.

Without seeing all the code, it is hard to know what else it is getting wrong.

Plus, please format code with </> to make it easier to read. And include the log output so we can see the error messages ourselves.

[quote=“nmcc, post:45, topic:19062”]
Potrebbero quindi essere necessari alcuni tentativi per far passare il messaggio: devi capire cosa succederebbe in caso di interruzione della trasmissione.

Se si interrompe la trasmissione la pompa non potrebbe partire (e questo impedirebbe il riempimento della cisterna). Se la trasmissione si interrompesse nel momento in cui la pompa è attiva questo comporterebbe che la pompa non si fermerebbe mai a meno che ritornasse la trasmissione.
Penso sarebbe opportuno mettere un timer di massimo funzionamento della pompa in caso di mancanza di segnale.

Appena posso ti mando il codice completo formattato come hai detto e il serial log

1 Like

If you’re still thinking about the fundamental problem of pump control, the discussion here, on the subject of power control, and here, on the subject of reliable message delivery, might help in working out what might be required in your situation.

The primary motivation for my own development of a pump control application (employing Heltec WiFi LoRa 32 and CubeCell boards) was the failure of a commercial system that I was using to turn off the pump after a communications failure—the result was the loss of 20,000L of water at a time when I could ill afford it.

1 Like

ecco il codice

#include <RadioLib.h>
#include <SPI.h> // Necessario per la comunicazione SPI con il modulo LoRa

// Pin LoRa per Heltec WiFi LoRa 32 V3 (definiti automaticamente se la scheda è selezionata correttamente)
// Li definiamo esplicitamente qui per chiarezza e per evitare errori di "not declared in this scope"
#define LORA_CS   8   // Corrisponde a NSS nello schema
#define LORA_DIO1 47  // Corrisponde a DIO1 nello schema
#define LORA_RST  12  // Corrisponde a RST nello schema
#define LORA_BUSY 13  // Corrisponde a BUSY nello schema
#define LORA_SCK  9   // Corrisponde a SPI CLK nello schema
#define LORA_MISO 11  // Corrisponde a SPI MISO nello schema
#define LORA_MOSI 10  // Corrisponde a SPI MOSI nello schema

// Pin del LED integrato sulla Heltec V3
#define HELTEC_LED 35 // LED onboard, visibile nello schema

// Pin per il galleggiante (scelto GPIO 26)
#define FLOAT_SWITCH_PIN 26 // GPIO 26 è un pin digitale disponibile nello schema

// Definizione per il pin Vext (alimentazione esterna)
// Anche questo dovrebbe essere definito dal core Heltec, ma lo mettiamo come fallback
#ifndef Vext
#define Vext 21 // GPIO21 è il pin Vext sulla Heltec V3
#endif

// Frequenza LoRa (per l'Europa)
#define BAND 868.0 // MHz

// Creazione istanza del modulo LoRa (SX1262 è quello sulla Heltec V3)
// Parametri: NSS (CS), DIO1, RST, BUSY, SPI_INSTANCE (HSPI)
SX1262 radio = new Module(LORA_CS, LORA_DIO1, LORA_RST, LORA_BUSY, SPI);

// Variabile per memorizzare lo stato del galleggiante
bool waterLevelLow = false;

void setup() {
  Serial.begin(115200);
  Serial.println("--- TRASMETTITORE GALLEGGIANTE ---");

  // Accendi Vext per alimentare l'OLED e potenzialmente il modulo LoRa (se necessario)
  // LOW accende Vext sulla Heltec V3
  pinMode(Vext, OUTPUT);
  digitalWrite(Vext, LOW);
  delay(100); // Dai tempo all'alimentazione di stabilizzarsi

  // Inizializza il pin del galleggiante come input con pull-up interno
  pinMode(FLOAT_SWITCH_PIN, INPUT_PULLUP);

  // Inizializza il pin del LED come output
  pinMode(HELTEC_LED, OUTPUT);
  digitalWrite(HELTEC_LED, LOW); // Assicurati che il LED sia spento all'inizio

  // Inizializza il modulo LoRa
  Serial.print("[LoRa] Inizializzazione LoRa su ");
  Serial.print(BAND);
  Serial.println(" MHz...");

  int state = radio.begin(BAND);

  if (state == RADIOLIB_ERR_NONE) {
    Serial.println("[LoRa] Inizializzazione riuscita!");
    // Imposta il fattore di spread (SF) e la banda passante (BW)
    // Questi valori devono corrispondere tra TX e RX!
    // SF7BW125 è una buona combinazione per iniziare.
    radio.setSpreadingFactor(7);
    radio.setBandwidth(125.0); // kHz
    radio.setCodingRate(5); // 4/5
  } else {
    Serial.print("[LoRa] Inizializzazione LoRa fallita, codice errore: ");
    Serial.println(state);
    // Loop infinito per indicare un errore critico
    while (true) {
      digitalWrite(HELTEC_LED, HIGH);
      delay(200);
      digitalWrite(HELTEC_LED, LOW);
      delay(200);
    }
  }
}

void loop() {
  // Leggi lo stato del galleggiante
  // digitalRead restituirà LOW se il contatto è chiuso (acqua bassa)
  // digitalRead restituirà HIGH se il contatto è aperto (acqua alta)
  waterLevelLow = (digitalRead(FLOAT_SWITCH_PIN) == LOW); // True se acqua bassa

  String message = "";
  if (waterLevelLow) {
    message = "ACQUA_BASSA";
    Serial.println("[Galleggiante] Stato: ACQUA BASSA (richiesta pompa ON)");
  } else {
    message = "ACQUA_ALTA";
    Serial.println("[Galleggiante] Stato: ACQUA ALTA (richiesta pompa OFF)");
  }

  // Prepara e invia il pacchetto LoRa
  Serial.print("[LoRa] Invio pacchetto: ");
  Serial.println(message);

  digitalWrite(HELTEC_LED, HIGH); // Accendi il LED per indicare la trasmissione
  int state = radio.transmit(message);
  digitalWrite(HELTEC_LED, LOW); // Spegni il LED dopo la trasmissione

  if (state == RADIOLIB_ERR_NONE) {
    Serial.println("[LoRa] Pacchetto inviato con successo!");
  } else {
    Serial.print("[LoRa] Errore nell'invio del pacchetto: ");
    Serial.println(state);
  }

  // Tempo di attesa tra le trasmissioni (es. ogni 5 secondi)
  delay(5000);
}

ecco il serial output

you still have DIO1 defined as GPIO47
for the Heltec LoRa V3 I have DIO1 defined as GPIO14 and LoRa P2P is working

And the error message from the serial log - why not copy & paste it so we can easily read it - has an id of -2 which is RADIOLIB_ERR_CHIP_NOT_FOUND.

We’ve reached my limit on a thread of 50 posts & no real progress, so I’ll say arrivederci for now and good luck Horace!

#include <RadioLib.h>

#include <SPI.h>       // Necessario per la comunicazione SPI con il modulo LoRa

#include <U8g2lib.h>   // Libreria per il display OLED

#include <Wire.h>      // Necessario per la comunicazione I2C (OLED)

// Pin LoRa per Heltec WiFi LoRa 32 V3 (CORRETTI SECONDO SCHEMA E TUO SKETCH FUNZIONANTE)

#define LORA_CS   8    // Corrisponde a NSS nello schema

#define LORA_DIO1 14   // Corrisponde a DIO1 nello schema

#define LORA_RST  12   // Corrisponde a RST nello schema

#define LORA_BUSY 13   // Corrisponde a BUSY nello schema

#define LORA_SCK  9    // Corrisponde a SPI CLK nello schema

#define LORA_MISO 11   // Corrisponde a SPI MISO nello schema

#define LORA_MOSI 10   // Corrisponde a SPI MOSI nello schema

// Pin del LED integrato sulla Heltec V3

#define HELTEC_LED 35  // LED onboard, visibile nello schema

// Pin per il galleggiante (scelto GPIO 26)

#define FLOAT_SWITCH_PIN 26 // GPIO 26 è un pin digitale disponibile nello schema

// Definizione per il pin Vext (alimentazione esterna)

// Sulla Heltec V3, Vext è GPIO21 e va messo LOW per accendere l'OLED

#ifndef Vext

#define Vext 21

#endif

// Definizione dell'oggetto U8g2 per l'OLED sulla Heltec WiFi LoRa 32 (V3)

// U8G2_SSD1306_128X64_NONAME_F_SW_I2C(mode, sck, sda, res)

// SCL = GPIO18, SDA = GPIO17 sulla Heltec V3

U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, /* clock=*/ 18, /* data=*/ 17, /* reset=*/ U8X8_PIN_NONE);

// Frequenza LoRa (per l'Europa)

#define BAND 868.0 // MHz

// Creazione istanza del modulo LoRa (SX1262 è quello sulla Heltec V3)

// Parametri: NSS (CS), DIO1, RST, BUSY, SPI_INSTANCE (HSPI)

SX1262 radio = new Module(LORA_CS, LORA_DIO1, LORA_RST, LORA_BUSY, SPI);

// Variabile per memorizzare lo stato del galleggiante

bool waterLevelLow = false;

void setup() {

  Serial.begin(115200);

  Serial.println("--- TRASMETTITORE GALLEGGIANTE CON OLED ---");

  // Accendi Vext per alimentare l'OLED e il modulo LoRa

  // LOW accende Vext sulla Heltec V3

  pinMode(Vext, OUTPUT);

  digitalWrite(Vext, LOW);

  delay(100); // Dai tempo all'alimentazione di stabilizzarsi

  // Inizializzazione OLED

  u8g2.begin();

  u8g2.setFont(u8g2_font_ncenB08_tr); // Imposta un font predefinito

  u8g2.clearBuffer();

  u8g2.drawStr(0, 12, "Starting...");

  u8g2.sendBuffer();

  delay(1000);

  // Inizializzazione esplicita della SPI

  SPI.begin(LORA_SCK, LORA_MISO, LORA_MOSI, LORA_CS); // Inizializza la SPI con i pin specifici

  delay(10); // Piccolo ritardo dopo l'inizializzazione SPI

  // Inizializza il pin del galleggiante come input con pull-up interno

  pinMode(FLOAT_SWITCH_PIN, INPUT_PULLUP);

  // Inizializza il pin del LED come output

  pinMode(HELTEC_LED, OUTPUT);

  digitalWrite(HELTEC_LED, LOW); // Assicurati che il LED sia spento all'inizio

  // Inizializza il modulo LoRa

  Serial.print("[LoRa] Inizializzazione LoRa su ");

  Serial.print(BAND);

  Serial.println(" MHz...");

  u8g2.clearBuffer();

  u8g2.drawStr(0, 12, "LoRa Init...");

  u8g2.sendBuffer();

  int state = radio.begin(BAND);

  if (state == RADIOLIB_ERR_NONE) {

    Serial.println("[LoRa] Inizializzazione riuscita!");

    u8g2.drawStr(0, 24, "LoRa OK!");

    u8g2.sendBuffer();

    // Imposta il fattore di spread (SF) e la banda passante (BW)

    radio.setSpreadingFactor(7);

    radio.setBandwidth(125.0); // kHz

    radio.setCodingRate(5); // 4/5

  } else {

    Serial.print("[LoRa] Inizializzazione LoRa fallita, codice errore: ");

    Serial.println(state);

    u8g2.clearBuffer();

    u8g2.drawStr(0, 12, "LoRa Failed!");

    u8g2.drawStr(0, 24, ("Code: " + String(state)).c_str());

    u8g2.sendBuffer();

    // Loop infinito per indicare un errore critico

    while (true) {

      digitalWrite(HELTEC_LED, HIGH);

      delay(200);

      digitalWrite(HELTEC_LED, LOW);

      delay(200);

    }

  }

}

Questo e’ lo sketch del ricevitore dal serial monitor vedo l’invio dei pacchetti inviato con successo,con la scritta acqua alta (perche’ adesso il galleggiante e’ aperto) e Pompa OFF. Il problema che dovrebbero vedersi questi messaggi anche sull OLED della scheda ma non si vede niente , schermo nero.
Posso mandare anche il serial monitor ma devo mandare un immagina perche non me lo fa copiare, Cosa puo’ essere che non vedo sull OLED ?

never used the U8g2lib so cannot help

example File>Examples>Heltec ESP32 Dev-Boards>OLED>SimpleDemo works OK on my Heltec LoRa V3

Controlla queste righe potrebbero essere sbagliate?

Comunque ho provato il Simple Demo e mi funziona

Ragazzi vi informo che sono riuscito a programmare le due schede con visualizzazione dei parametri su Oled , Praticamente sbagliavo il pin dell alimentazione Oled che doveva essere il 36 e a me AI mi faceva mettere un pin 38. Comunque vi ringrazio per il tempo che mi avete dedicato. Vorrei sapere se ci sono delle basette per montare queste schede con le morsettiere a vite per il cablaggio, In rete ho visto che ci sono a 30 pin ma sono larghe . Per le schede Heltec lora 32 non ho trovato niente.Grazie