Skocz do zawartości

Arduino UNO + SDS011 + LCD 2x16


Pomocna odpowiedź

Napisano

Cześć

Mam problem z działaniem czujnika pyłu sds011 z wyświetlaczem lcd. Czujnik sam podpięty do arduino działa i na serial monitorze pojawiają się odczyty. Problem zaczyna się kiedy chcę wyświetlić te odczyty na lcd 2x16. Wtedy na serial monitorze część rzeczy się nie wyświetla.

Korzystam z tych bibliotek:

https://github.com/lewapek/sds-dust-sensors-arduino-library - do obsługi sds011

https://github.com/mathertel/LiquidCrystal_PCF8574 - do obsługi wyświetlacza 2x16

#include "SdsDustSensor.h"

int rxPin = 2;
int txPin = 4;
SdsDustSensor sds(rxPin, txPin);

void setup() {
  Serial.begin(9600);
  sds.begin();

  Serial.println(sds.queryFirmwareVersion().toString()); 
  Serial.println(sds.setActiveReportingMode().toString());
  Serial.println(sds.setCustomWorkingPeriod(3).toString()); // TA PRZERWA W PRACY NA 3 MINUTY DZIAŁA
}

void loop() {
  PmResult pm = sds.readPm();
  if (pm.isOk()) {
    Serial.print("PM2.5 = ");
    Serial.print(pm.pm25);
    Serial.print(", PM10 = ");
    Serial.println(pm.pm10);

    Serial.println(pm.toString());
  } else {
    Serial.print("Could not read values from sensor, reason: ");
    Serial.println(pm.statusToString());
  }

  delay(5000);
}

Kod powyżej działa po wgraniu do UNO. Wynik działania poniżej.

17:36:24.151 -> Firmware version [year.month.day]: 18.1.18
17:36:24.667 -> Mode: active
17:36:25.182 -> Working period: 3 min cycles: work 30 seconds, measure and sleep
17:36:25.698 -> Could not read values from sensor, reason: Not available
17:36:31.182 -> Could not read values from sensor, reason: Not available
17:36:36.666 -> Could not read values from sensor, reason: Not available
17:36:42.197 -> Could not read values from sensor, reason: Not available
17:36:47.699 -> Could not read values from sensor, reason: Not available
17:36:52.668 -> PM2.5 = 15.80, PM10 = 26.70
17:36:52.715 -> pm25: 15.80, pm10: 26.70

Ale gdy dodam bibliotekę do obsługi lcd i kod do wyświetlenia na lcd (chociaż wystarcza dodanie tylko #include <Wire.h> #include <LiquidCrystal_PCF8574.h>) i już serial monitor wygląda tak:

18:10:22.175 -> 
18:10:22.694 -> 
18:10:23.215 -> 
18:10:23.694 -> Could not read values from sensor, reason: 
18:10:29.195 -> Could not read values from sensor, reason: 
18:10:34.695 -> Could not read values from sensor, reason: 
18:10:39.735 -> PM2.5 = 17.60, PM10 = 28.60
18:10:39.735 -> 
18:10:45.255 -> Could not read values from sensor, reason: 
18:10:50.755 -> Could not read values from sensor, reason:

Sprzęt wydaje się działać ok. To znaczy daje odczyty na lcd co zadany interwał, ale nie wiem dlaczego na serial monitorze wyświetla się wtedy tak, a nie inaczej.

Jeśli ktoś potrafi to wytłumaczyć będę wdzięczny.

 

Użyj Arduino Leonardo/Micro/MEGA i Serial1 dla czujnika pyłu, dołączenie działań na I2C może powodować, że gubisz coś z komunikacji na softserial. Softserial bez problemu poradzi sobie z wysłaniem czegokolwiek, ale odbieranie może być problemem. Na UNO/NANO/PROMINI można ewentualnie podłączyć się do czujnika hardware serial0 (po prostu Serial) ale wtedy nie użyjesz go do komunikacji z PC, podłączasz sobie jakąś przejściówkę USB-UART (np. czerwona FTDI z Allegro) do dowolnych innych pinów i  odpalasz soft serial z komunikatami Arduino->PC.

  • Lubię! 1

Dzięki za odpowiedź. Pomysł z USB-UART przetestuję. Jednak jeśli dalej mógłbym podrążyć temat to mam jeszcze kilka pytań. Do obsługi tego czujnika (SDS011) i wyświetlacza lcd wykorzystałem kombinację kilku różnych bibliotek (4 dla czujnika i 3 dla lcd) i w każdej konfiguracji było podobnie tj. poprawnie wyświetlała się tylko jedna linijka z odczytem zanieczyszczenia.

Dlaczego akurat ta linijka z odczytem była ok, a reszta (jakieś testowanie czujnika, info o uruchomieniu wiatraka, o zakończeniu pomiarów, o interwałach pomiarów - zależy co było dostarczone z biblioteki) akurat się nie wyświetlała?

Te odczyty z mojego pierwszego postu zawsze wyglądały tak samo. Wgrywanie sketcha kilkadziesiąt razy i tylko pomiary wyświetlało. Nie było to randomowo, że raz pomiary, innym razem Firmware version. Zawsze gubiłem z softSeriala akurat te dane?

Obejrzałem w internecie różne sposoby na wykorzystanie tego czujnika z arduino uno, nano, esp8266, RasPi. Część miała podpięte na i2c dodatkowo czujniki temperatur, wilgotności, barometry i inne. W sketchach mieli po kilkadziesiąt linijek kodu na serial monitor i to działało, a u mnie nie.

 

Przyczyn niedziałania może być wiele, ale jest prosta zasada, jak masz kaszel to bierzesz najpierw syrop, dopiero jak nie pomaga to robisz prześwietlenia i biopsje. Dodanie bibliotek generuje dodatkowo bufory i zajmuje RAM. Serial ustawiaj na 115200 i nie używaj delay -  naucz się to samo robić z millis() wywołując tylko raz na 5s część programu. Dodatkowo jakby Ci zadziałało na MEGA, a MICRO nie to może być też ilość RAM, choć MICRO ma trochę więcej niż UNO i może zadziałać jeśli to jest przyczyną. Możesz też na MEGA użyć softserial dla porównania i jak zacznie działać to będziesz miał pewność.

  • Lubię! 1

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