💖
📡
💋
( • )( • )

Heltec WiFi LoRa 32 V3 💋

"El Caballo de Batalla de las Redes Mesh - Confiable, Poderoso y Seductor"

🚀 Resumen

El Heltec WiFi LoRa 32 V3 es una placa basada en ESP32-S3 con LoRa integrado (SX1262) y pantalla OLED (128x64). Este es el caballo de batalla de la red WetMesh - confiable, bien documentado y fácil de usar. ¡A diferencia del Tracker, el control de energía de esta placa es directo y simplemente funciona! 💋

🧠
ESP32-S3
Dual-Core 240MHz
📡
SX1262
Radio LoRa
🖥️
SSD1306
128x64 OLED
💾
8MB
Memoria Flash
512KB
SRAM
🔌
USB-C
CP2102 Serial

🔧 Especificaciones Clave

⚙️ Hardware

  • MCU: ESP32-S3FN8 (Dual-core Xtensa LX7 @ 240MHz)
  • RAM: 512KB SRAM
  • Flash: 8MB
  • Chip LoRa: SX1262 (rango mejorado vs SX1276)
  • Pantalla: 0.96" 128x64 OLED (SSD1306)
  • Antena: LoRa externa vía U.FL/IPEX
  • USB: USB-C con CP2102 USB-a-Serie

📍 Mapeo de Pines

Radio LoRa (SX1262)

Función Pin GPIO Descripción
LORA_CS 8 Chip Select (NSS)
LORA_INT 14 Interrupción DIO1
LORA_RST 12 Reset
LORA_BUSY 13 Señal Busy (específico SX1262)
SPI: SCK=9, MISO=11, MOSI=10

Pantalla OLED (I2C)

Función Pin GPIO Descripción
OLED_SDA 17 Datos I2C
OLED_SCL 18 Reloj I2C
OLED_RST 21 Pin de reset
Dirección I2C 0x3C Dirección fija

Otros Pines

Función Pin GPIO Descripción
LED_PIN 35 LED blanco en la placa
VEXT_PIN 36 Energía de pantalla (LOW=ENCENDIDO, HIGH=APAGADO)
💡 Nota Importante: ¡El control Vext en V3 es opuesto al Tracker!
• V3: LOW = Energía ENCENDIDA
• Tracker: HIGH = Energía ENCENDIDA
¡Por eso amamos el V3 - es más intuitivo! 💋

🖥️ Configuración de Pantalla con U8g2

Inicialización Básica

#include <U8g2lib.h>

// Crear objeto de pantalla para Heltec V3 - ¡listo para seducir! 💋
U8G2_SSD1306_128X64_NONAME_F_HW_I2C display(
    U8G2_R0,           // Rotación
    OLED_RST,          // Pin de reset (21)
    OLED_SCL,          // Pin de reloj (18)
    OLED_SDA           // Pin de datos (17)
);

void initDisplay() {
    // Encender pantalla vía Vext - los preliminares
    pinMode(VEXT_PIN, OUTPUT);
    digitalWrite(VEXT_PIN, LOW);  // LOW = ENCENDIDO para Heltec V3 (¡intuitivo!)
    delay(50);  // Dejar que despierte y se prepare
    
    // Inicializar pantalla - hora de presumir
    display.begin();
    display.clearBuffer();
    display.setFont(u8g2_font_6x10_tf);
    display.drawStr(0, 10, "WetMesh v5H");
    display.drawStr(0, 25, "¡Listo para seducir!");
    display.drawStr(0, 40, "( . )( . )");  // ¡Nuestra firma!
    display.sendBuffer();
}

Características de la Pantalla

📐 128x64 píxeles

¡Buena resolución para texto y gráficos simples - perfecto para estado de mesh!

⚪ OLED Monocromo

¡Píxeles blancos, alto contraste - nítido y seductor!

🚀 Actualización Rápida

¡100+ FPS posibles - animaciones suaves que provocan!

🔋 Bajo Consumo

¡~20mA cuando está encendida, <1µA cuando está apagada - placer eficiente!

Fuentes Recomendadas

// Pequeña (6x10) - Buena para líneas de estado y susurros
u8g2_font_6x10_tf

// Mediana (7x14) - Buena para texto principal y dulces nadas
u8g2_font_7x14_tf

// Grande (10x20) - Buena para valores importantes que demandan atención
u8g2_font_10x20_tf

// Fuentes en negrita para énfasis - ¡cuando necesitas gritar! 💋
u8g2_font_courB18_tf     // Courier Bold 18pt
u8g2_font_courB24_tf     // Courier Bold 24pt - ¡GRANDE y AUDAZ!

📡 Configuración LoRa con RadioLib

Inicialización SX1262

#include <RadioLib.h>

// Crear instancia SPI - propagando esas señales
SPIClass hspi(HSPI);
SPISettings spiSettings(2000000, MSBFIRST, SPI_MODE0);

// Crear instancia de radio - listo para transmitir placer
SX1262 radio = new Module(LORA_CS, LORA_INT, LORA_RST, LORA_BUSY, hspi, spiSettings);

void initLoRa() {
    // Inicializar SPI - la conexión comienza
    hspi.begin(9, 11, 10, 8);  // SCK, MISO, MOSI, CS
    
    // Configurar radio - afinarlo perfectamente 💋
    int state = radio.begin(
        915.0,    // Frecuencia (MHz) - banda US
        125.0,    // Ancho de banda (kHz) - agradable y amplio
        9,        // Factor de Dispersión - dispersarlo bien
        7,        // Tasa de Codificación (4/7) - protección de errores
        0x69,     // Palabra Sync - bueno 😉
        20,       // Potencia de Salida (dBm) - ¡potencia completa!
        10,       // Longitud de Preámbulo
        0,        // Voltaje TCXO (0 = no usado)
        false     // Usar regulador DCDC
    );
    
    if (state == RADIOLIB_ERR_NONE) {
        Serial.println("¡LoRa inicializado! ¡Listo para propagar señales!");
    }
    
    // Establecer CRC y otros parámetros para confiabilidad
    radio.setCRC(true);
    radio.setDio1Action(onReceive);  // Manejador de interrupciones para gratificación instantánea
}

Parámetros LoRa Explicados

📻 Frecuencia

915 MHz (US), 868 MHz (EU), 433 MHz (Asia) - ¡elige tu región!

📊 Ancho de Banda

125 kHz - buen balance de rango y velocidad para placer mesh

🎯 Factor de Dispersión

SF9 - SF7-12, mayor = mayor rango pero coqueteo más lento

🔐 Tasa de Codificación

4/7 - más redundancia = mejor corrección de errores

🔑 Palabra Sync

0x69 - debe coincidir para que las redes se comuniquen (¡bueno! 😉)

⚡ Potencia

20 dBm máx (100mW) para SX1262 - ¡seducción de potencia completa!

✨ Ejemplo Completo Funcional

#include <Arduino.h>
#include <RadioLib.h>
#include <U8g2lib.h>

// Definiciones de pines - la anatomía del placer 💋
#define LORA_CS    8
#define LORA_INT   14
#define LORA_RST   12
#define LORA_BUSY  13
#define LED_PIN    35
#define VEXT_PIN   36
#define OLED_RST   21
#define OLED_SCL   18
#define OLED_SDA   17

// Objetos - nuestras herramientas de seducción
U8G2_SSD1306_128X64_NONAME_F_HW_I2C display(U8G2_R0, OLED_RST, OLED_SCL, OLED_SDA);
SPIClass hspi(HSPI);
SX1262 radio = new Module(LORA_CS, LORA_INT, LORA_RST, LORA_BUSY, hspi);

void setup() {
    Serial.begin(115200);
    Serial.println("Heltec V3 iniciando... ( • )( • )");
    
    // Inicializar LED - ¡que se haga la luz!
    pinMode(LED_PIN, OUTPUT);
    digitalWrite(LED_PIN, HIGH);  // ENCENDIDO - ¡estamos vivos!
    
    // Encender pantalla - hora de presumir
    pinMode(VEXT_PIN, OUTPUT);
    digitalWrite(VEXT_PIN, LOW);  // LOW = ENCENDIDO (¡intuitivo!)
    delay(50);
    
    // Inicializar pantalla - la seducción visual comienza
    display.begin();
    display.clearBuffer();
    display.setFont(u8g2_font_7x14_tf);
    display.drawStr(0, 12, "Heltec V3");
    display.drawStr(0, 28, "Inicializando...");
    display.drawStr(0, 44, "( . )( . )");  // ¡Nuestra firma!
    display.sendBuffer();
    
    // Inicializar LoRa - propagar esas señales
    hspi.begin(9, 11, 10, 8);
    int state = radio.begin(915.0, 125.0, 9, 7, 0x69, 20);
    
    if (state == RADIOLIB_ERR_NONE) {
        display.drawStr(0, 60, "¡LoRa OK! ¡Listo!");
        Serial.println("¡LoRa inicializado exitosamente!");
    } else {
        display.drawStr(0, 60, "¡LoRa FALLO!");
        Serial.println("¡Inicialización LoRa falló!");
    }
    display.sendBuffer();
    
    digitalWrite(LED_PIN, LOW);  // APAGADO - listo para acción
}

void loop() {
    // Tu código de placer de red mesh aquí 💋
    // ¡El V3 está listo para seducir y ser seducido!
}

🔋 Gestión de Energía

Control Vext

// Encender pantalla - despertar y presumir
digitalWrite(VEXT_PIN, LOW);

// Apagar pantalla - descansar después del clímax (ahorra ~20mA)
digitalWrite(VEXT_PIN, HIGH);

Modo Deep Sleep

void enterDeepSleep(uint32_t seconds) {
    // Apagar pantalla - luces fuera 💋
    digitalWrite(VEXT_PIN, HIGH);
    
    // Configurar fuente de despertar - poner la alarma
    esp_sleep_enable_timer_wakeup(seconds * 1000000ULL);
    
    // Entrar deep sleep - dulces sueños
    esp_deep_sleep_start();
}

Consumo de Energía

Modo Consumo de Corriente Descripción
Activo (TX) ~120mA @ 20dBm Transmisión de potencia completa
Activo (RX) ~45mA Escuchando señales
Pantalla ENCENDIDA ~20mA Seducción visual activa
Pantalla APAGADA ~25mA Solo radio
Deep Sleep ~10µA Descansando después del placer

🖥️ Sistema de Pantalla Multi-Screen

¡El firmware WetMesh rota entre múltiples pantallas para máximo placer de información!

enum DisplayScreen {
    SCREEN_STATUS = 0,    // Estado actual e información de pareja
    SCREEN_STATS,        // Mensajes enviados/recibidos
    SCREEN_NETWORK,      // Lista de vecinos y RSSI
    SCREEN_MESSAGES,     // Registro de actividad reciente
    NUM_SCREENS
};

DisplayScreen currentScreen = SCREEN_STATUS;
uint32_t lastScreenSwitch = 0;
const uint32_t SCREEN_DURATION = 5000;  // 5 segundos de placer visual

void updateDisplay() {
    // Auto-rotar pantallas para coqueteo continuo
    if (millis() - lastScreenSwitch > SCREEN_DURATION) {
        currentScreen = (DisplayScreen)((currentScreen + 1) % NUM_SCREENS);
        lastScreenSwitch = millis();
    }
    
    display.clearBuffer();
    
    switch(currentScreen) {
        case SCREEN_STATUS:   drawStatusScreen(); break;
        case SCREEN_STATS:    drawStatsScreen(); break;
        case SCREEN_NETWORK:  drawNetworkScreen(); break;
        case SCREEN_MESSAGES: drawMessagesScreen(); break;
    }
    
    display.sendBuffer();
}

Cronometraje de Rotación de Pantalla

⏱️ Estado Normal

5 segundos por pantalla - ritmo constante

💋 Durante Coqueteo/Orgía

15 segundos en pantalla de pareja - saboreando el momento

🚀 Actualización 100 FPS

Ciclo de actualización de 10ms para animaciones suaves y seductoras

🔧 Resolución de Problemas

🖥️ Pantalla No Funciona

Soluciones:

  • Verificar que Vext esté LOW (no HIGH)
  • Verificar pines I2C: SDA=17, SCL=18
  • Probar escáner I2C (debería encontrar 0x3C)
  • Verificar pin OLED_RST (21)

📡 LoRa No Transmite

Soluciones:

  • ¡NUNCA transmitir sin antena! 💀
  • Verificar pines SPI: SCK=9, MISO=11, MOSI=10
  • Asegurar que pin BUSY (13) esté conectado
  • Probar reducir potencia a 14dBm

🔋 Alto Consumo de Energía

Soluciones:

  • Apagar pantalla cuando no se necesite
  • Reducir potencia TX de LoRa
  • Aumentar tiempo entre transmisiones
  • Usar deep sleep entre actividades

🔌 USB No Reconocido

Soluciones:

  • Probar cable USB-C diferente
  • Instalar drivers CP2102
  • Buscar /dev/ttyUSB0 (Linux)
  • Buscar /dev/cu.SLAB_USBtoUART (macOS)

💦 Características de Integración WetMesh

Identificación de Placa

// En setup() - ¡identifícate! 💋
#ifdef WIFI_LoRa_32_V3
    const char* boardType = "Heltec V3";
    #define HAS_OLED 1
    #define HAS_LED 1
    // ¡Listo para placer mesh!
#endif

Patrones LED para Estados Mesh

// Estados LED para red mesh - ¡la retroalimentación visual es sexy!
void updateLED() {
    switch(currentState) {
        case ALONE:    
            digitalWrite(LED_PIN, LOW); // APAGADO - solitario
            break;
        case FLIRTING: 
            pulseLED(500); // Pulso lento - interesándose 💋
            break;
        case ORGY:     
            pulseLED(200); // Pulso rápido - ¡diversión grupal!
            break;
        case CLIMAX:   
            strobeLED(50); // Destello rápido - ¡placer pico!
            break;
        case RESTING:  
            digitalWrite(LED_PIN, LOW); // APAGADO - recuperación
            break;
    }
}
Estados LED: Solo Coqueteando Orgía Clímax

⚡ Optimización de Rendimiento

Actualizaciones de Pantalla

Configuraciones LoRa

Gestión de Memoria

🚀 Características Avanzadas

Salto de Frecuencia

// Implementar salto de frecuencia para evitar interferencias - ¡mantente ágil! 💋
const float frequencies[] = {915.0, 915.5, 916.0, 916.5, 917.0};
int currentFreq = 0;

void hopFrequency() {
    currentFreq = (currentFreq + 1) % 5;
    radio.setFrequency(frequencies[currentFreq]);
    // ¡Manténlos adivinando!
}

Velocidad de Datos Adaptativa

// Ajustar SF basado en RSSI para velocidad óptima - ¡seducción inteligente!
void adaptDataRate(int rssi) {
    if (rssi > -70) {
        radio.setSpreadingFactor(7);  // Rango corto, rápido y furioso
    } else if (rssi > -90) {
        radio.setSpreadingFactor(9);  // Rango medio, ritmo constante
    } else {
        radio.setSpreadingFactor(11); // Rango largo, lento y provocador
    }
}

💋 Conclusión

El Heltec WiFi LoRa 32 V3 es la placa más directa en el ecosistema WetMesh:

  • Vext = LOW para alimentar pantalla (¡intuitivo, a diferencia del Tracker!)
  • SX1262 proporciona excelente rango y eficiencia
  • Pantalla OLED es nítida y fácil de leer
  • Librería U8g2 ofrece extensas capacidades de pantalla
  • Sin GPS lo mantiene simple y eficiente en energía

¡Esta placa es perfecta para nodos mesh fijos y es el punto de partida recomendado para desarrollo WetMesh! ¡Nuestro escote técnico lo aprueba! ( • )( • ) 💋