Czujniki w bibliotece SuplaDevice

dogu18
Posty: 94
Rejestracja: czw paź 11, 2018 8:35 pm

pn maja 18, 2020 8:18 pm

mam problem ze znikającymi pomiarami z DTH22.
wcześniej ten problem miałem na mutiboard. po napisaniu nowego programu do sonoff basic z nową biblioteką miesiąc był spokój a od kilku dni znowu gubi się pomiar. Wyłączenie z zasilania i ponowne podpięcia rozwiązuje problem.

czy jest jakieś rozwiązanie tego problemu żeby ciągłe był pomiar?

pozdrawiam
Awatar użytkownika
klew
Posty: 815
Rejestracja: czw cze 27, 2019 12:16 pm

pn maja 18, 2020 8:42 pm

dogu18 pisze:
pn maja 18, 2020 8:18 pm
mam problem ze znikającymi pomiarami z DTH22.
wcześniej ten problem miałem na mutiboard. po napisaniu nowego programu do sonoff basic z nową biblioteką miesiąc był spokój a od kilku dni znowu gubi się pomiar. Wyłączenie z zasilania i ponowne podpięcia rozwiązuje problem.

czy jest jakieś rozwiązanie tego problemu żeby ciągłe był pomiar?

pozdrawiam
Masz jakieś logi z Seriala?
Odczyty znikają na stałe Aż do resetu, czy raz dział raz nie?
dogu18
Posty: 94
Rejestracja: czw paź 11, 2018 8:35 pm

wt maja 19, 2020 2:54 am

Logów żadnych niemam niestety. Zanika stale aż do wyłączenia.
Awatar użytkownika
klew
Posty: 815
Rejestracja: czw cze 27, 2019 12:16 pm

wt maja 19, 2020 8:05 am

dogu18 pisze:
wt maja 19, 2020 2:54 am
Logów żadnych niemam niestety. Zanika stale aż do wyłączenia.
Jakiej płytki używasz? Wszystko inne działa poprawnie, tylko DHT przestaje czytać?
Jak masz podłączonego DHT? Jaka długość przewodów (mniej więcej)?
dogu18
Posty: 94
Rejestracja: czw paź 11, 2018 8:35 pm

wt maja 19, 2020 11:17 am

Sonoff Basic pierwszej generacji. Przewód ekranowany około metra. Pod gpio1 podpięte teraz sprawdzałem
lukfud
Posty: 217
Rejestracja: czw lis 23, 2017 11:33 pm
Lokalizacja: Warszawa

czw maja 21, 2020 9:47 am

@klew, co można/należy tu poprawić?

Kod: Zaznacz cały

#ifndef _bh1750_h
#define _bh1750_h

#include <BH1750.h>

#include "thermometer.h"

namespace Supla {
namespace Sensor {
class LightBH1750 : public Thermometer {
 public:
  LightBH1750() : sensorStatus(false) {
  }

  double getIntensity() {
    float value = TEMPERATURE_NOT_AVAILABLE;
    bool retryDone = false;
    do {
      if (!sensorStatus || isnan(value)) {
        sensorStatus = lightSensor.begin();
        retryDone = true;
      }
      value = TEMPERATURE_NOT_AVAILABLE;
      if (sensorStatus) {
        value = lightSensor.readLightLevel();
      }
    } while (isnan(value) && !retryDone);
    return value;
  }

  void onInit() {
    sensorStatus = lightSensor.begin();
    channel.setNewValue(getIntensity());
  }

 protected:
  bool sensorStatus;
  BH1750 lightSensor;  // I2C
};

};  // namespace Sensor
};  // namespace Supla

#endif
.newbie
Awatar użytkownika
klew
Posty: 815
Rejestracja: czw cze 27, 2019 12:16 pm

czw maja 21, 2020 10:57 am

lukfud pisze:
czw maja 21, 2020 9:47 am
@klew, co można/należy tu poprawić?
Zamień "getIntensity" na "getValue", bo tej metody używa termometr do robienia pomiaru co 10 s.

Ten "ifndef/define" - z reguły define'a robie zgodnego z nazwą pliku (z podkreślnikiem). U Ciebie wygląda tak jakby ten plik miał się nazywać tak samo jako include ten zewnętrznej biblioteki.

Dodaj w komentarzu opis/link skąd można pobrać zewnętrzną bibliotekę.

Ta metoda "getIntensity" może zwrócić NAN. Powinieneś na końcu jeszcze sprawdzić czy isnan(value) i wtedy value napidać tym TEMPERATURE_NOT_AVAILABLE.

W ostatnim kroku trzeba będzie podmienić kanał termometru na kanał ogólnego przeznaczenia - ale dopiero jak pojawi się dla niego wsparcie :)
lukfud
Posty: 217
Rejestracja: czw lis 23, 2017 11:33 pm
Lokalizacja: Warszawa

czw maja 21, 2020 10:28 pm

Faktycznie nazwa pliku jest tożsama z nazwą z biblioteki - zmienię (choć błędu przy kompilacji nie było)
klew pisze:
czw maja 21, 2020 10:57 am
Ta metoda "getIntensity" może zwrócić NAN. Powinieneś na końcu jeszcze sprawdzić czy isnan(value) i wtedy value napidać tym TEMPERATURE_NOT_AVAILABLE.
Metodę skopiowałem z BME, tam nie użyłeś tego warunku, nie był potrzebny?

Po kosmetycznych poprawkach.
Odczyt jest :)

Kod: Zaznacz cały

//https://github.com/claws/BH1750

#ifndef _lsbh1750_h
#define _lsbh1750_h

#include <BH1750.h>

#include "thermometer.h"

namespace Supla {
namespace Sensor {
class LSBH1750 : public Thermometer {
 public:
  LSBH1750() : sensorStatus(false) {
  }

  double getValue() {
    float lux = TEMPERATURE_NOT_AVAILABLE;
    bool retryDone = false;
    do {
      if (!sensorStatus || isnan(lux)) {
        sensorStatus = lightSensor.begin();
        retryDone = true;
      }
      lux = TEMPERATURE_NOT_AVAILABLE;
      if (sensorStatus) {
        lux = lightSensor.readLightLevel();
	  }
    } while (isnan(lux) && !retryDone);
    return lux;
  }

  void onInit() {
    sensorStatus = lightSensor.begin();
    channel.setNewValue(getValue());
  }

 protected:
  bool sensorStatus;
  BH1750 lightSensor;  // I2C
};

};  // namespace Sensor
};  // namespace Supla

#endif
.newbie
Awatar użytkownika
klew
Posty: 815
Rejestracja: czw cze 27, 2019 12:16 pm

czw maja 21, 2020 11:04 pm

lukfud pisze:
czw maja 21, 2020 10:28 pm
Metodę skopiowałem z BME, tam nie użyłeś tego warunku, nie był potrzebny?
Jest potrzebny. Dodam to :)
lukfud
Posty: 217
Rejestracja: czw lis 23, 2017 11:33 pm
Lokalizacja: Warszawa

pt maja 22, 2020 10:19 am

klew pisze:
czw maja 21, 2020 11:04 pm
lukfud pisze:
czw maja 21, 2020 10:28 pm
Metodę skopiowałem z BME, tam nie użyłeś tego warunku, nie był potrzebny?
Jest potrzebny. Dodam to :)
Wstawiłem jeszcze korektę czasu pomiaru:

Kod: Zaznacz cały

/*

https://github.com/claws/BH1750

*/

#ifndef _lsbh1750_h
#define _lsbh1750_h

#include <BH1750.h>
#include "thermometer.h"

namespace Supla {
namespace Sensor {
class LSBH1750 : public Thermometer {
 public:
  LSBH1750() : sensorStatus(false) {
  }

  double getValue() {
    float lux = TEMPERATURE_NOT_AVAILABLE;
    bool retryDone = false;
    do {
      if (!sensorStatus || isnan(lux)) {
        sensorStatus = lightSensor.begin();
        retryDone = true;
      }
      lux = TEMPERATURE_NOT_AVAILABLE;
      if (sensorStatus) {
        lux = lightSensor.readLightLevel();
	  }
    } while (isnan(lux) && !retryDone);
	if (isnan(lux)) {
	  lux = TEMPERATURE_NOT_AVAILABLE;
	}
	if (lux > 40000.00) { 
	  lightSensor.setMTreg(32);
	}
	else if (lux > 10.00) {
	  lightSensor.setMTreg(69);
	}
    else if (lux <= 10.00) {
	  lightSensor.setMTreg(138);
	}
    return lux;
  }

  void onInit() {
    sensorStatus = lightSensor.begin();
    channel.setNewValue(getValue());
  }

 protected:
  bool sensorStatus;
  BH1750 lightSensor;  // I2C
};

};  // namespace Sensor
};  // namespace Supla

#endif
Ostatnio zmieniony sob maja 23, 2020 1:27 pm przez lukfud, łącznie zmieniany 1 raz.
.newbie
ODPOWIEDZ