Skocz do zawartości

Problem z kompilacją DS18B20 (OneWire) na Heltec WiFi LoRa 32 V3 – SDK 3.0.3


Pomocna odpowiedź

Napisano (edytowany)

Cześć, próbuję skompilować własny szkic nadajnika (TX) dla Heltec WiFi LoRa 32 V3 w Arduino IDE, korzystając z Heltec ESP32 SDK 3.0.3.

Kod używa następujących bibliotek:

  • LoRaWan_APP.h (inicjalizacja przez Mcu.begin() + API radia),

  • HT_SSD1306Wire.h (OLED),

  • czujnik DS18B20,

  • OneWire + DallasTemperature.

Na starszych wersjach SDK wszystko działało, natomiast na SDK 3.0.3 kompilacja kończy się błędem:

 
Library Heltec ESP32 Dev-Boards has been declared precompiled:
Using precompiled library in c:\Users\x\Documents\Arduino\libraries\Heltec_ESP32_Dev-Boards\src\esp32s3
In file included from .../esp32-hal.h:75,
                 from .../Arduino.h:36,
                 from ...\OneWire.cpp:147:
...\OneWire_direct_gpio.h: In function 'void directModeInput(uint32_t)':
...\esp32-hal-gpio.h:67:34: error: 'GPIO_IS_VALID_GPIO' was not declared in this scope; did you mean 'RTC_GPIO_IS_VALID_GPIO'?
   67 | #define digitalPinIsValid(pin)   GPIO_IS_VALID_GPIO(pin)
      |                                  ^~~~~~~~~~~~~~~~~~
...
exit status 1

 

Wygląda na to, że OneWire korzysta z makra GPIO_IS_VALID_GPIO, które w nowym HAL dla ESP32‑S3 (SDK 3.x) już nie istnieje. W efekcie nie da się skompilować żadnego szkicu z klasyczną biblioteką OneWire.

 

Pytania

  1. Czy OneWire jest oficjalnie nieobsługiwane w SDK 3.x?

  2. Czy istnieje jakiś patch lub obejście tego problemu?

  3. Czy powinienem przejść na inną bibliotekę (np. OneWireNg) – czy jest to rekomendowane rozwiązanie?

  4. Czy Heltec planuje przywrócić kompatybilność (GPIO_IS_VALID_GPIO) w kolejnych wersjach SDK?

 

Kontekst

Mój pełny szkic nadajnika LoRa z DS18B20 wygląda tak:

// -------------------------------------------------------------------
// Heltec ESP32 LoRa V3 Transmitter (TX) - WERSJA FINALNA Z DS18B20
// Używa Heltec SDK do poprawnej inicjalizacji OLED i LoRa.
// -------------------------------------------------------------------

// --- NAGŁÓWKI SYSTEMOWE I LORA ---
#include "Arduino.h"
#include "LoRaWan_APP.h" // KLUCZOWA BIBLIOTEKA DLA Mcu.begin()

// --- NAGŁÓWKI WYŚWIETLACZA ---
#include <Wire.h> 
#include "HT_SSD1306Wire.h"

// --- NAGŁÓWKI CZUJNIKA DS18B20 ---
#include <OneWire.h>
#include <DallasTemperature.h>

// --- KONFIGURACJA CZUJNIKA ---
#define ONE_WIRE_BUS 4
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

// --- KONFIGURACJA WYSWIETLACZA ---
static SSD1306Wire display(0x3c, 500000, SDA_OLED, SCL_OLED, GEOMETRY_128_64, RST_OLED); 

// --- KONFIGURACJA LORA ---
#define RF_FREQUENCY 868000000 
#define TX_OUTPUT_POWER 14 
#define LORA_BANDWIDTH 0 
#define LORA_SPREADING_FACTOR 7 
#define LORA_CODINGRATE 1 
#define LORA_PREAMBLE_LENGTH 8 
#define LORA_IQ_INVERSION_ON false 

#define BUFFER_SIZE 30 
#define TX_INTERVAL 5000 // Co 5 sekund

// --- ZMIENNE LORA TX ---
char txpacket[BUFFER_SIZE];
static RadioEvents_t RadioEvents;
float currentTemperature; // Zmienna globalna dla temperatury

// -------------------------------------------------
// --- FUNKCJE POMOCNICZE (VEXT I LORA HANDLERY) ---
// -------------------------------------------------

// Funkcje VextON/VextOFF z Twojego działającego kodu
void VextON(void)
{
    pinMode(Vext, OUTPUT);
    digitalWrite(Vext, LOW); 
}

void VextOFF(void)
{
    pinMode(Vext, OUTPUT);
    digitalWrite(Vext, HIGH); 
}

/**
 * @brief Funkcja wywoływana po udanym wysłaniu pakietu LoRa (IRQ Handler).
 */
void OnTxDone(void)
{
    Radio.Sleep( ); 
    Serial.println("TX Done callback.");
}

/**
 * Odczytuje temperaturę z DS18B20.
 */
float getTemperature() {
    sensors.requestTemperatures(); 
    float tempC = sensors.getTempCByIndex(0);
    if (tempC == DEVICE_DISCONNECTED_C) {
        return -999.0; 
    }
    return tempC;
}

/**
 * Aktualizuje wyświetlacz OLED nowymi danymi.
 */
void updateDisplay(String statusLine) {
    String tempStr = (currentTemperature != -999.0) ? 
                     String(currentTemperature, 2) + " C" : 
                     "--- BLAD ---";

    display.clear();
    display.setFont(ArialMT_Plain_10);
    display.setTextAlignment(TEXT_ALIGN_LEFT);
    display.setColor(WHITE);

    display.drawString(0, 0, "Nadajnik LoRa (SDK)"); 
    display.drawHorizontalLine(0, 10, 128);

    display.setFont(ArialMT_Plain_16);
    display.drawString(0, 15, tempStr);
    
    display.setFont(ArialMT_Plain_10);
    display.drawString(0, 40, statusLine);
    display.drawString(0, 52, "Czekam " + String(TX_INTERVAL / 1000) + " s...");
    
    display.display();
}

// -------------------------------------------------
// --- ARDUINO SETUP ---
// -------------------------------------------------
void setup() {
    Serial.begin(115200);
    delay(2000);

    // 1. RĘCZNY RESET I STABILIZACJA ZASILANIA VEXT (KLUCZOWE DLA OLED)
    VextOFF();
    delay(10);
    VextON();
    delay(500); 

    // 2. Mcu.begin() - KLUCZOWA INICJALIZACJA GPIO I I2C
    Mcu.begin(HELTEC_BOARD, SLOW_CLK_TPYE); 
    
    // 3. Inicjalizacja wyświetlacza OLED
    display.init();
    display.setContrast(255); 
    display.setFont(ArialMT_Plain_10);
    updateDisplay("Inicjalizacja...");

    // 4. Inicjalizacja czujnika
    sensors.begin();
    
    // 5. INICJALIZACJA RADIA LORA (SDK)
    RadioEvents.TxDone = OnTxDone;
    Radio.Init( &RadioEvents );
    Radio.SetPublicNetwork(false); 
    Radio.SetChannel( RF_FREQUENCY );
    
    Radio.SetTxConfig( MODEM_LORA, TX_OUTPUT_POWER, RF_FREQUENCY,
                      LORA_BANDWIDTH, LORA_SPREADING_FACTOR, LORA_CODINGRATE,
                      LORA_PREAMBLE_LENGTH, LORA_IQ_INVERSION_ON, false,
                      0, 0, false, 3000 );

    updateDisplay("Radio OK. Czekam...");
}

// -------------------------------------------------
// --- ARDUINO LOOP ---
// -------------------------------------------------
void loop()
{
    // 1. Pomiar temperatury
    currentTemperature = getTemperature();
    
    if (currentTemperature != -999.0) {
        // 2. Tworzenie wiadomości (wysyłamy tylko surową wartość)
        String payload = String(currentTemperature);
        payload.toCharArray(txpacket, BUFFER_SIZE);
        
        // 3. Wysłanie pakietu
        Serial.printf("\r\nWysylanie: %s, dlugosc %d\r\n", txpacket, strlen(txpacket));
        updateDisplay("Wysylam: " + payload);

        Radio.Send( (uint8_t *)txpacket, strlen(txpacket) );
        
        // 4. Oczekiwanie na zakończenie transmisji
        Radio.IrqProcess( );
        
        // 5. Aktualizacja statusu
        updateDisplay("Wyslano OK.");
    } else {
        Serial.println("\r\nBlad odczytu czujnika!");
        updateDisplay("BLAD CZUJNIKA.");
    }

    // 6. Opóźnienie przed kolejną wysyłką
    delay(TX_INTERVAL); 
}
 

Na starszym SDK działało bez problemu, teraz kompilacja zatrzymuje się na błędzie w OneWire.

Przypakiem przy kolejnej próbie zmiany płytki lub biblioteki kompilacja powiodla się i kod działał. Niestety nie wiem co się zmieniło i co miało na to wpływ ale teraz nie kompiluje się.

Czy ktoś z Was uruchamiał DS18B20 na Heltec V3 z SDK 3.0.3? Czy jedynym wyjściem jest zmiana biblioteki (np. OneWireNg), czy może Heltec planuje poprawkę w SDK? Zależy mi na tym, żeby zostać przy DS18B20 – ale jeśli nie ma wsparcia, rozważę zmianę czujnika.

Z góry dzięki za wszelkie wskazówki!

Edytowano przez mmllmm
  • Lubię! 1

Dzieki za wskazówki. Niestety nie przechodzi kompilacji. poniżej kod i błąd w zasadzie ten sam jaki był.

// -------------------------------------------------------------------
// Heltec ESP32 LoRa V3 Transmitter (TX) - WERSJA DS18B20
// Rozwiązanie konfliktu OneWire + Radio LoRa
// -------------------------------------------------------------------

#include "Arduino.h"
#include "LoRaWan_APP.h"
#include "driver/gpio.h" // Wymagany sterownik GPIO dla ESP32
#include <Wire.h> 
#include "HT_SSD1306Wire.h"

// --- NAGŁÓWKI CZUJNIKA DS18B20 ---
#include <OneWire.h>
#include <DallasTemperature.h>

// --- KONFIGURACJA CZUJNIKA ---
#define ONE_WIRE_BUS 6 // Pin danych czujnika DS18B20
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

// --- KONFIGURACJA WYŚWIETLACZA ---
static SSD1306Wire display(0x3c, 500000, SDA_OLED, SCL_OLED, GEOMETRY_128_64, RST_OLED); 

// --- KONFIGURACJA LORA ---
#define RF_FREQUENCY 868000000 
#define TX_OUTPUT_POWER 14 
#define BUFFER_SIZE 50 
#define TX_INTERVAL 5000 

char txpacket[BUFFER_SIZE];
static RadioEvents_t RadioEvents;
float currentTemp = -999.0;

// --- FUNKCJE ZASILANIA VEXT ---
void VextON(void) {
    pinMode(Vext, OUTPUT);
    digitalWrite(Vext, LOW); 
}

void VextOFF(void) {
    pinMode(Vext, OUTPUT);
    digitalWrite(Vext, HIGH); 
}

// Callback po wysłaniu danych
void OnTxDone(void) {
    Radio.Sleep(); 
    Serial.println("LoRa: Pakiet wyslany pomyślnie.");
}

void updateDisplay(String statusLine) {
    display.clear();
    display.setFont(ArialMT_Plain_10);
    display.drawString(0, 0, "Heltec V3 - DS18B20 TX");
    display.drawHorizontalLine(0, 10, 128);

    display.setFont(ArialMT_Plain_16);
    if (currentTemp == -127.0 || currentTemp == -999.0) {
        display.drawString(0, 20, "Blad czujnika!");
    } else {
        display.drawString(0, 20, "Temp: " + String(currentTemp, 2) + " C");
    }
    
    display.setFont(ArialMT_Plain_10);
    display.drawString(0, 52, statusLine);
    display.display();
}

void setup() {
    Serial.begin(115200);
    
    // Stabilizacja zasilania
    VextOFF();
    delay(100);
    VextON();
    delay(500); 

    // 1. Inicjalizacja GPIO (używając driver/gpio.h pośrednio przez SDK)
    Mcu.begin(HELTEC_BOARD, SLOW_CLK_TPYE); 
    
    // 2. Inicjalizacja OLED
    display.init();
    display.setContrast(255);
    updateDisplay("Inicjalizacja...");

    // 3. Inicjalizacja DS18B20
    sensors.begin();
    sensors.setWaitForConversion(true); // Czekaj na odczyt

    // 4. Inicjalizacja Radia LoRa
    RadioEvents.TxDone = OnTxDone;
    Radio.Init( &RadioEvents );
    Radio.SetChannel( RF_FREQUENCY );
    Radio.SetTxConfig( MODEM_LORA, TX_OUTPUT_POWER, 0, 0, 7, 1, 8, false, false, 0, 0, false, 3000 );

    updateDisplay("System gotowy.");
}

void loop() {
    // Odczyt temperatury
    sensors.requestTemperatures(); 
    currentTemp = sensors.getTempCByIndex(0);
    
    if (currentTemp != -127.0) {
        // Przygotowanie danych
        String payload = "T:" + String(currentTemp, 2);
        payload.toCharArray(txpacket, BUFFER_SIZE);
        
        Serial.println("Wysylam temperature: " + payload);
        updateDisplay("Wysylam LoRa...");

        // Wysłanie przez LoRa
        Radio.Send( (uint8_t *)txpacket, strlen(txpacket) );
        
        // Procesowanie radia
        uint32_t startWait = millis();
        while(millis() - startWait < 1000) Radio.IrqProcess();
        
        updateDisplay("Wyslano. Czekam...");
    } else {
        Serial.println("Blad odczytu DS18B20!");
        updateDisplay("Blad odczytu!");
    }

    delay(TX_INTERVAL); 
}

 

@mmllmm, gdybyś szukał, to aht20 jest całkiem ok czujnikiem na i2c, ale w modułach przeważnie parowany z bmp280. Jednak (u nas) kosztuje mniej niż bme280 (też dobry). Na ali można spotkać same aht20 za grosze. Aht20, bmp280, bme280 testowałem, pokrywające się pomiary mają bardzo zbliżone. Chociaż na fb trafiłem też na komentarz, że wskazania były mocno rozbieżne, być może ktoś trafił na wadliwe.

  • Lubię! 1
(edytowany)
19 godzin temu, orb777 napisał:

Aht20, bmp280, bme280 testowałem, pokrywające się pomiary

Sprawdziłem na BME280- nie ma problemu z kompilacją.

Będę musiał jednak poszukać takiego który pracuje powyżej 150 stopni C bo takie temperatury mogą się pojawiac w moim projekcie. 

 

8 godzin temu, kostuch napisał:

A jak wejdzie nowa wersja SDK i przestanie się kompilować, to zmienisz czujnik?

Czy są jakieś niepokojące przecieki odnośnie I2C?

Ktoś z Was wie dlaczego sensory OneWire są tak "niedopieszczone"?

 

Tutaj ktoś zrobił małe podsumowanie sensorów: https://www.espboards.dev/blog/esp32-temperature-sensor-types/

Edytowano przez mmllmm
14 godzin temu, mmllmm napisał:

Czy są jakieś niepokojące przecieki odnośnie I2C?

Ale błąd masz gdzie indziej

Ktoś uznał, że makro jest zbędne i wyciął.

Jak sobie poczytasz changelog do kolejnych wersji to zwróć uwagę na "breaking changes" - zmiany które powodują że zależny kod może przestać się kompilować. Zawsze (przynajmniej w platformio) możesz wskazać konkretną wersję sdk, której chcesz użyć do kompilacji. Albo jak ktoś już napisał, dodać sobie ręcznie brakujący fragment.

esp32-hal-gpio.h:67:34: error: 'GPIO_IS_VALID_GPIO' was not declared in this scope;
  • Lubię! 1

 

 

7 godzin temu, kostuch napisał:

Jak sobie poczytasz changelog do kolejnych wersji to zwróć uwagę na "breaking changes" - zmiany które powodują że zależny kod może przestać się kompilować. Zawsze (przynajmniej w platformio) możesz wskazać konkretną wersję sdk, której chcesz użyć do kompilacji. Albo jak ktoś już napisał, dodać sobie ręcznie brakujący fragment.

Dzięki za wskazówki.

Aktualnie nie mam takiej wiedzy żeby ten problem rozwiązać szybko bez dodatkowego rozeznania w temacie.

Muszę popchać mój projekt do przodu więc spróbuję z I2C bo działa bez problemu z aktualnymi bibliotekami w Arduino IDE. 

Czy jest jakaś przewaga sensorów OneWire nad I2C w realnym działaniu? 

 

Zalety oneWire:

  • One wire (czyli mniejsza ilość przewodów),
  • Można w prosty sposób podłączyć większą ilość czujników,
  • Czujniki mogą być dalej  od kontrolera - przy i2c może być  jakiś metr (?),

A wada - DS18B20 ma dość długi czas pomiaru - do 0,7s przy największej dokładności.

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...