pawel32640 Napisano Październik 26, 2022 Udostępnij Napisano Październik 26, 2022 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(); }
Treker (Damian Szymański) Październik 26, 2022 Udostępnij Październik 26, 2022 @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.
pawel32640 Październik 27, 2022 Autor tematu Udostępnij Październik 27, 2022 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. 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.
Treker (Damian Szymański) Październik 28, 2022 Udostępnij Październik 28, 2022 @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
pawel32640 Październik 30, 2022 Autor tematu Udostępnij Październik 30, 2022 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]([email protected]) * @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. 1
Pomocna odpowiedź
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ę »