Skocz do zawartości

ENS160 + FireBeetle ESP32-E -> thinger.io


pawel32640

Pomocna odpowiedź

Jestem początkującym, nie potrafię programować, używam oprogramowania Arduino, które na razie bardziej uczy mnie pokory niż programowania. Więc mam duży problem.
Postanowiłem podłączyć czujnik jakości powietrza ENS160 do thinger.io. Podłączenie elektryczne do FireBeetle ENS32-E jest wykonane zgodnie z rysunkiem na stronie producenta tj. DFRobot (cztery przewody).

Po wgraniu kodu dostępnego na stronie producenta czujnika (również DFRobot) dane wyświetlane na porcie szeregowym są poprawne.
Np.
Sensor operating ststus : 2
Air quality index : 1
Contecration of total volatile organic compouds : 20 ppb
Carbon dioxide equivalent: 400 ppm

Po wgraniu "mojego kodu" dane wyświetlane na thinger.io są nieprawidłowe.
Np.
AQI; 0
TVOC: 16380 ppb
eCO2: 16380 ppm

Nie wiem, czy błąd tkwi w kodzie, czy w konfiguracji thinger.io.
Dziękuję za pomoc.

"Mój kod":

#define THINGER_SERIAL_DEBUG

#include <ThingerESP32.h>

#define USERNAME "pawel32640"
#define DEVICE_ID "FireBeetle"
#define DEVICE_CREDENTIAL "aGyulfoXOx$e9H&m"

#define SSID "TP-LINK_C6E0EE"
#define SSID_PASSWORD "marchewka"

ThingerESP32 thing(USERNAME, DEVICE_ID, DEVICE_CREDENTIAL);

#include <DFRobot_ENS160.h>

#define I2C_COMMUNICATION

  DFRobot_ENS160_I2C ENS160(&Wire, /*I2CAddr*/ 0x53);

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

  pinMode(D9, OUTPUT);
      
  thing.add_wifi(SSID, SSID_PASSWORD);

  pinMode(LED_BUILTIN, OUTPUT);

  ENS160.setPWRMode(ENS160_STANDARD_MODE);

  ENS160.setTempAndHum(/*temperature=*/15.0, /*humidity=*/50.0);

    thing["ENS160"] >> [] (pson& out) {
    out["AQI"] = ENS160.getAQI();
    out["TVOC"] = ENS160.getTVOC();
    out["ECO2"] = ENS160.getECO2();
  };
}

void loop() {  
   thing.handle();
}

 

thinger_serial.png

Link do komentarza
Share on other sites

@pawel32640 witam na forum 🙂 Nie korzystałem w praktyce z tej platformy, ale postaram się pomóc jakoś ogólnie.

Częstym powodem takich błędów jest wysyłanie zmiennych złego typu - przykładowo odbiorca czeka na zmienną 16-bitową, a wysyłamy tylko 8-bitów lub odwrotnie. Jeśli sam czujnik działa, to warto przetestować drugą część systemu, czyli wysyłanie danych na serwer. Proponowałbym dla testu, zamiast danych z czujnika, wysłać jakąś wartość wpisaną na sztywno (typu 123). Zobaczysz wtedy czy ta część kodu działa poprawnie. Jeśli tak to będzie można szukać błędu dalej. Alternatywnie, zamiast wysyłać dane z czujnika prosto na serwer, możesz odczytać je najpierw do jakiejś zmiennej i wtedy oprócz wysyłania ich na serwer, wyślij dokładnie te same dane przez UART. Będziesz miał pewność co jest wysyłane na serwer.

Link do komentarza
Share on other sites

hmm...mam nadzieję, że nie jestem pierwszym przypadkiem na forum użytkownika, który upublicznia dane logowania 🙄

 

Bardzo dziękuję za podpowiedź, prawdopodobnie to problem z typem danych, wpisałem na sztywno:

    thing["ENS160"] >> [] (pson& out) {
    out["AQI"] = 1;
    out["TVOC"] = 30;
    out["ECO2"] = 400;
  };

dane na thinger.io są poprawne.

thinger.thumb.png.93ee2f7d9948311ef320c4961116ce89.png

W przykładowym kodzie, na stronie producenta dane wysyłane na port szeregowy są zapisane jak poniżej:

  uint8_t AQI = ENS160.getAQI();
  Serial.print("Air quality index : ");
  Serial.println(AQI);

Myślę, że "połączenie" obu fragmentów kodu będzie rozwiązaniem, na razie jednak nie wiem jednak jak to zrobić. Pozostaje nauka, albo metoda prób i błędów.

Link do komentarza
Share on other sites

@pawel32640 ok, to dobra wiadomość. W takim razie możesz najpierw zrobić właśnie test z użyciem powyższego kodu. Na początek sprawdzić takie coś:

uint8_t AQI = ENS160.getAQI();

thing["ENS160"] >> [] (pson& out) {
    out["AQI"] = AQI;
    out["TVOC"] = 30;
    out["ECO2"] = 400;
};

Niestety nie wiem jakich danych oczekuje ten serwer (musiałbyś to sprawdzić w dokumentacji). Możesz też testowo podmienić później uint8_t na uint16_t. To zupełne strzelanie w ciemno i nie powinno się tak robić, ale cóż - czasami trzeba 😉

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

kompilator zwraca błąd:

/home/pawel/IoT_konfiguracja/new_from_thinger_037/new_from_thinger_037.ino: In lambda function:
new_from_thinger_037:36:18: error: 'AQI' is not captured
     out["AQI"] = AQI;
                  ^
/home/pawel/IoT_konfiguracja/new_from_thinger_037/new_from_thinger_037.ino:35:25: note: the lambda has no capture-default
     thing["ENS160"] >> [] (pson& out) {
                         ^
/home/pawel/IoT_konfiguracja/new_from_thinger_037/new_from_thinger_037.ino:33:11: note: 'uint8_t AQI' declared here
   uint8_t AQI = ENS160.getAQI();

po małej zmianie:

    thing["ENS160"] >> [] (pson& out) {
    out["AQI"] = ENS160.getAQI();
    out["TVOC"] = 30;
    out["ECO2"] = 400;
  };
}

void loop() {  
    uint8_t AQI = ENS160.getAQI();
    
   thing.handle();
} 

kompilator nie zgłasza błędu, ale na serwerze zapisywane są zera.

Udało i się jednak znaleźć rozwiązanie pośrednie, zmodyfikowałem kod dostępny na stronie producenta

https://wiki.dfrobot.com/SKU_SEN0515_Fermion_ENS160_Air_Quality_Sensor

dodając dane dotyczące transmisji wi-fi. Dane odbierane przez serwer są prawidłowe.

Kod aktualny (działający):

/*!
 * @file  getMeasureData.ino
 * @brief  Get the sensor data by polling (use 3.3V main controller for Fermion version)
 * @details  Configure the sensor power mode and parameters (for compensating the calibrated temperature and relative humidity in gas measurement)
 * @copyright  Copyright (c) 2010 DFRobot Co.Ltd (http://www.dfrobot.com)
 * @license  The MIT License (MIT)
 * @author  [qsjhyy](yihuan.huang@dfrobot.com)
 * @version  V1.0
 * @date  2021-10-26
 * @url  https://github.com/DFRobot/DFRobot_ENS160
 * @
 * @added support for wi-fi and connection to thinger.io (https://thinger.io/)
 * @removed comments and partially data sent to the serial port
 * @license The MIT License (MIT)
 * @author  pawel32640
 * @version  v.0.1
 * @date  2022-10-30
 */


#define THINGER_SERIAL_DEBUG

#include <ThingerESP32.h>

#define USERNAME "*****"
#define DEVICE_ID "*****"
#define DEVICE_CREDENTIAL "*****"

#define SSID "*****"
#define SSID_PASSWORD "******"

ThingerESP32 thing(USERNAME, DEVICE_ID, DEVICE_CREDENTIAL);
#include <DFRobot_ENS160.h>

#define I2C_COMMUNICATION

#ifdef  I2C_COMMUNICATION

  DFRobot_ENS160_I2C ENS160(&Wire, /*I2CAddr*/ 0x53);
#else

  uint8_t csPin = D3;
  DFRobot_ENS160_SPI ENS160(&SPI, csPin);
#endif

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

  while( NO_ERR != ENS160.begin() ){
    Serial.println("Communication with device failed, please check connection");
    delay(3000);
  }
  Serial.println("Begin ok!");

thing.add_wifi(SSID, SSID_PASSWORD);

  pinMode(LED_BUILTIN, OUTPUT);

  ENS160.setPWRMode(ENS160_STANDARD_MODE);

  ENS160.setTempAndHum(/*temperature=*/15.0, /*humidity=*/50.0);

    thing["ENS160"] >> [] (pson& out) {
    out["AQI"] = ENS160.getAQI();
    out["TVOC"] = ENS160.getTVOC();
    out["ECO2"] = ENS160.getECO2();
  };

}

void loop()
{

  uint8_t Status = ENS160.getENS160Status();
  Serial.print("Sensor operating status : ");
  Serial.println(Status);

  uint8_t AQI = ENS160.getAQI();
  uint16_t TVOC = ENS160.getTVOC();
  uint16_t ECO2 = ENS160.getECO2();

  Serial.println();
  delay(1000);

     thing.handle();
}

Teraz porównanie obu kodów powinno pokazać czego brakowało.

To jednak nie koniec zabawy, płytka FireBeetle ESP32-E na na pokładzie diodę RGB (i WS2812) i może w tym przypadku sygnalizować odpowiednią barwą stan jakości powietrza.

Bardzo dziękuję za pomoc, pomogła mi nieco inaczej spojrzeć na problem.

thinger_4.png

  • Lubię! 1
Link do komentarza
Share on other sites

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...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.