Community project

Voglio Creare Un Ripetitore/nodo Per Meshtastic

ESP32
Photo of Voglio Creare Un Ripetitore/nodo Per Meshtastic
Generated with AI

Tommaso Costanza

Published August 29, 2026

Build a solar-powered Meshtastic repeater node that extends mesh network coverage outdoors. This project combines an ESP32 with a 868 MHz LoRa radio, solar charging system, and weatherproof enclosure to create an autonomous relay that receives and forwards Meshtastic messages across extended distances.

This guide provides a complete parts list, wiring diagram, assembly steps, and Arduino firmware to get the node receiving and relaying LoRa packets. The solar panel and MPPT charger keep the system running continuously, while the boost converter ensures stable 5V power for the radio module. Once assembled and deployed, the repeater will automatically extend your mesh network's range without requiring manual intervention.

Wiring diagram

Wiring diagram for Voglio Creare Un Ripetitore/nodo Per Meshtastic

Gather all the parts

QtyComponent
1

6V 4W Solar Panel

6 V, 4 W

Polycrystalline or monocrystalline solar panel rated 4W peak output at 6V nominal. Typical small-panel values are Vmp about 6V and Imp about 667mA; open-circuit voltage is higher than the nominal working voltage and must stay within the charger module input rating. Two-wire output (V+ and GND). Outdoor/weatherproof rating depends on the exact panel. Directly compatible with CN3791 MPPT solar charger modules only when that module's input-voltage rating is not exceeded. No firmware library required — purely a passive power source.

1

CN3791 MPPT Solar Charger

1S Li-ion solar charger

CN3791-based MPPT-style switch-mode charger module for single-cell Li-ion/LiPo solar charging. Routes solar input to battery charge terminals and needs a downstream regulator/load path for stable MCU power.

1

Protected 1S Li-ion battery pack

3.7 V nominal, 20 Ah, protected

A ready-made protected 3.7 V, 20 Ah lithium battery pack that keeps the node running when there is no sun.

1

5 V boost converter module

3.7 V to 5 V, 1 A minimum

Converter that raises the battery voltage to a stable 5 V supply for the Heltec USB-C port.

1

868 MHz outdoor LoRa antenna

868 MHz, 3–6 dBi

An external antenna tuned for the European 868 MHz LoRa band, used to send and receive mesh signals.

Assemble it in 6 steps

1. Prepara la scatola e il pannello

Fissa il pannello solar_panel all'esterno della scatola, in un punto non ombreggiato e rivolto verso sud. Fai entrare i suoi due fili attraverso un pressacavo, così la pioggia non può entrare.

  • Lascia un piccolo gocciolatoio nel cavo prima del pressacavo: l'acqua scende via invece di arrivare alla scatola.
  • Non forare o piegare il pannello: un pannello danneggiato può lasciar entrare acqua e smettere di caricare la batteria.

2. Collega pannello e caricatore

Con il pannello coperto o al buio, collega il filo positivo del solar_panel V+ al morsetto SOLAR+ del solar_charger (carica dal sole). Collega il filo negativo del solar_panel GND al morsetto SOLAR- del solar_charger (ritorno della corrente).

  • Di solito il positivo è rosso e il negativo è nero, ma controlla sempre i simboli + e − stampati sul modulo.
  • Non scambiare i fili del pannello: un collegamento invertito può danneggiare il caricatore.

3. Collega la batteria protetta

Collega B+ della battery_pack a BAT+ del solar_charger (energia accumulata) e B- della battery_pack a BAT- del solar_charger (ritorno della corrente). Usa un pacco batteria già protetto, non celle sciolte saldate a mano.

  • Metti un piccolo fusibile sul filo positivo vicino alla batteria, seguendo le indicazioni del pacco batteria.
  • Non cortocircuitare mai i due fili della batteria: possono scaldarsi molto, danneggiare il pacco e provocare un incendio. Non caricare celle Li-ion quando sono sotto 0 °C.

4. Aggiungi il convertitore a 5 V

Collega OUT+ del solar_charger a IN+ del boost_5v (alimentazione dalla batteria) e OUT- del solar_charger a IN- del boost_5v (ground). Prima di collegare la Heltec, misura con un multimetro tra OUT+ e OUT- del boost_5v: deve leggere 5 V stabili.

  • Regola il convertitore, se ha una piccola vite di regolazione, prima di collegare la scheda.
  • Se il convertitore supera 5 V puoi danneggiare la porta USB-C e la Heltec.

5. Alimenta e antenna la Heltec

Collega l'uscita OUT+ del boost_5v al positivo di un cavetto USB-C e OUT- al suo ground, poi inserisci il cavetto nella Heltec V3. Avvita o innesta antenna_868, con il pigtail adatto, nel piccolo connettore LoRa della Heltec prima di darle alimentazione (segnale radio).

  • Tieni il cavo tra antenna e Heltec più corto possibile e monta l'antenna in verticale.
  • Non alimentare la Heltec senza antenna collegata: durante la trasmissione la radio può danneggiarsi. Assicurati che l'antenna sia davvero per 868 MHz.

6. Sistema tutto nella scatola

Fissa Heltec, solar_charger, battery_pack e boost_5v dentro la scatola, senza schiacciare fili o lasciare parti metalliche scoperte. La Heltec usa il display spento; lascia comunque un po' di spazio attorno alla scheda per non intrappolare troppo calore.

  • Metti la batteria lontana da sole diretto e controlla che i pressacavi stringano bene i cavi.
  • Una batteria lasciata al sole dentro una scatola chiusa può surriscaldarsi e perdere capacità o diventare pericolosa.

Review all connections

1. Connections between "solar_panel" and "ESP32"

Functionsolar_panelESP32
powerV+CN3791 MPPT Solar Charger SOLAR+EXT
groundGNDCN3791 MPPT Solar Charger SOLAR-EXT

2. Connections between "battery_pack" and "ESP32"

Functionbattery_packESP32
powerB+CN3791 MPPT Solar Charger BAT+EXT
groundB-CN3791 MPPT Solar Charger BAT-EXT

3. Connections between "solar_charger" and "ESP32"

Functionsolar_chargerESP32
powerOUT+5 V boost converter module IN+EXT
groundOUT-5 V boost converter module IN-EXT

4. Connections between "boost_5v" and "ESP32"

Functionboost_5vESP32
powerOUT+Heltec V3 USB-C positive supplyEXT
groundOUT-Heltec V3 USB-C groundEXT

5. Connections between "antenna_868" and "ESP32"

Functionantenna_868ESP32
dataRFHeltec V3 LoRa u.FL/IPEX antenna socket via matching short pigtailEXT

Deploy the firmware

#include <Arduino.h>
#include <WiFi.h>
#include <esp_bt.h>
#include <RadioLib.h>

// Heltec WiFi LoRa 32 V3: these are hard-wired to its onboard SX1262.

// Forward declarations
void IRAM_ATTR onReceive();
void stopUnusedHardware();

static constexpr int LORA_NSS = 8;
static constexpr int LORA_DIO1 = 14;
static constexpr int LORA_RST = 12;
static constexpr int LORA_BUSY = 13;

// Heltec V3 onboard display controls. VEXT HIGH removes display power;
// OLED_RST LOW also holds the display controller inactive.
static constexpr int VEXT_CONTROL = 36;
static constexpr int OLED_RST = 21;

// EU_868 receive-test parameters. This sketch is not Meshtastic firmware.
static constexpr float RF_FREQUENCY_MHZ = 868.0F;
static constexpr float RF_BANDWIDTH_KHZ = 125.0F;
static constexpr uint8_t RF_SPREADING_FACTOR = 11;
static constexpr uint8_t RF_CODING_RATE = 5;
static constexpr uint8_t RF_SYNC_WORD = 0x12;
static constexpr int8_t RF_POWER_DBM = 14;
static constexpr uint16_t RF_PREAMBLE_LENGTH = 8;

SX1262 radio = new Module(LORA_NSS, LORA_DIO1, LORA_RST, LORA_BUSY);
volatile bool packetReceived = false;

void IRAM_ATTR onReceive() {
  packetReceived = true;
}

void stopUnusedHardware() {
  pinMode(VEXT_CONTROL, OUTPUT);
  digitalWrite(VEXT_CONTROL, HIGH);
  pinMode(OLED_RST, OUTPUT);
  digitalWrite(OLED_RST, LOW);
  WiFi.mode(WIFI_OFF);
  btStop();
}

void setup() {
  stopUnusedHardware();
  Serial.begin(115200);
  delay(100);

  const int state = radio.begin(RF_FREQUENCY_MHZ, RF_BANDWIDTH_KHZ,
                                RF_SPREADING_FACTOR, RF_CODING_RATE,
                                RF_SYNC_WORD, RF_POWER_DBM,
                                RF_PREAMBLE_LENGTH);
  if (state != RADIOLIB_ERR_NONE) {
    Serial.printf("SX1262 start failed: %d\n", state);
    while (true) {
      delay(1000);
    }
  }

  radio.setDio1Action(onReceive);
  const int receiveState = radio.startReceive();
  Serial.printf("EU_868 receive test started: %d\n", receiveState);
}

void loop() {
  if (!packetReceived) {
    delay(50);
    return;
  }

  packetReceived = false;
  String packet;
  const int state = radio.readData(packet);
  if (state == RADIOLIB_ERR_NONE) {
    Serial.printf("Packet received, RSSI %.1f dBm, SNR %.1f dB, %u bytes\n",
                  radio.getRSSI(), radio.getSNR(), packet.length());
  } else {
    Serial.printf("Receive error: %d\n", state);
  }
  radio.startReceive();
}

Remix this project

Make it yours in one click

Open a full copy of this project in your own Schematik workspace — diagram, code, parts, and assembly steps included. Swap the sensor, add features, or redesign the whole thing with AI. The author's original stays untouched.

Open in Schematik