Odczyt temperatur - nie działa gdy kod w klasie

0

Cześć.

Zaczynam zabawy z programowaniem pod ESP8266 (mam dokładnie Moduł WiFi ESP8266 + NodeMCU v3).
Nie mam pojęcia czemu ten sam kod wrzucony w main.cpp działa a jak wydzielę go do osobnej klasy to nie działa.

Działający kod:
main.cpp:

#include <Arduino.h>
#include <OneWire.h>
#include <DallasTemperature.h>

OneWire oneWire = OneWire(D7);
DallasTemperature sensors = DallasTemperature(&oneWire);

void setup()
{
  Serial.begin(115200);

  sensors.begin();
}

void loop()
{
  delay(100);

  sensors.requestTemperatures();
  
  Serial.print("Liczba czujników: ");
  Serial.println(sensors.getDeviceCount());
  Serial.println("");

  for (int i = 0; i < sensors.getDeviceCount(); i++)
  {
    Serial.print("Czujnik ");
    Serial.print(i + 1);
    Serial.print(" temperatura: ");
    Serial.print(sensors.getTempCByIndex(i));
    Serial.println(" °C");
  }

  Serial.println("");
  Serial.println("-----------------------");
  Serial.println("");

  delay(5000);
}

wynik:
screenshot-20240508015128.png

Niedziałający kod:
main.cpp

#include <Arduino.h>
#include "TemperatureSensorController.cpp"

TemperatureSensorController temperatureSensorController;

void setup()
{
  Serial.begin(115200);
}

void loop()
{
  temperatureSensorController.printTemperatures();
  delay(5000);
}

TemperatureSensorController.cpp

#include <DallasTemperature.h>
#ifndef MYCLASS_H
#define MYCLASS_H

class TemperatureSensorController
{
public:
    TemperatureSensorController()
    {
        _oneWire = OneWire(D7);
        _sensors = DallasTemperature(&_oneWire);
    }

    void printTemperatures()
    {
        delay(100);

        _sensors.requestTemperatures();

        Serial.print("Liczba czujników: ");
        Serial.println(_sensors.getDeviceCount());
        Serial.println("");

        for (int i = 0; i < _sensors.getDeviceCount(); i++)
        {
            Serial.print("Czujnik ");
            Serial.print(i + 1);
            Serial.print(" temperatura: ");
            Serial.print(_sensors.getTempCByIndex(i));
            Serial.println(" °C");
        }

        Serial.println("");
        Serial.println("-----------------------");
        Serial.println("");
    }

private:
    OneWire _oneWire;
    DallasTemperature _sensors;
};

#endif

screenshot-20240508015003.png

Zastanawia mnie również czemu kod (w wersji gdy wszystko jest w main.cpp) nie działa poprawnie (nie wykrywa czujników - efekt jest taki sam jak w przypadku wydzielenia kodu do osobnej klasy) gdy usunę opóźnienie delay(100); (linia 17)

Z góry dziękuję za pomoc.

3
hipekk napisał(a):

void setup()
{
Serial.begin(115200);

sensors.begin();
}

W drugim przykładzie nie masz sensors.begin(), może dlatego nie działa?

0

Prostszego błędu nie dało się zrobić - dziękuję :).

Nadal pozostaje pytanie czemu konieczne jest wprowadzanie opóźnień.

Gdy dodałem tylko _sensors.begin() czyli miałem konstruktor:

    TemperatureSensorController()
    {
        _oneWire = OneWire(D7);
        _sensors = DallasTemperature(&_oneWire);

        _sensors.begin();
    }

to nadal nie było odczytów, ale gdy dodałem jeszcze delay(100)

    TemperatureSensorController()
    {
        _oneWire = OneWire(D7);
        _sensors = DallasTemperature(&_oneWire);

        delay(100);

        _sensors.begin();
    }

to mam poprawne odczyty

Metodą prób i błędów sprawdzałem dla jakich czasów w delay() odczyty nadal będą poprawne i okazuje się, że wystarczy delay(1)

1

Moze potrzebny jest po prostu pewien czas na przeprowadzenie komunikacji miedzy ESP8266 a Dallasem po I2C badz SPI? Poszukaj w dokumentacji albo zrodlach biblioteki ktorej uzywasz do komunikacji z Dallasem jak poprawnie przeprowadzac taka komunikacje. Czyli np. czy musisz odpytywac jakies API czy dane juz przyszly czy moze raczej jest to jakims przerwaniem obslugiwane.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.