[PROJEKT] Czujnik pyłu PMS3003 i Arduino
Mając przygotowany i połączony sprzęt można przejść do oprogramowania Arduino (przygotowany program dla Arduino można pobrać na końcu artykułu). Na początek należy wskazać, z których linii korzysta wyświetlacz. Konieczne jest również zadeklarowanie niezbędnych zmiennych.
LiquidCrystal lcd(8, 9, 4, 5, 6, 7); char linia1[16], linia2[16]; unsigned char bufor [N]; int PM25 = 0, PM10 = 0;
Następnie potrzebne będą funkcje, które z podanego bufora wydobędą i skonwertują potrzebne dane. Tą rolę pełnią: int wartoscPM25 (unsigned char *buf) i int wartoscPM10 (unsigned char *buf). Argumentem obu funkcji jest bufor, w którym znajduje się ramka przesłana przez czujnik, a wartościami – współczynniki odpowiednio PM2,5 i PM10.
int wartoscPM25(unsigned char *buf) // generacja wartosci PM2,5 { int PM25v; PM25v=((buf[11]<<8) + buf[12]); return PM25v; } int wartoscPM10(unsigned char *buf) // generacja wartosci PM10 { int PM10v; PM10v=((buf[13]<<8) + buf[14]); return PM10v; }
Przydatna będzie funkcja, która sprawdzi czy dane zostały odebrane poprawnie. Taką rolę pełni funkcja bool sprawdzLancuch(unsigned char *buf, int dlugosc), która sprawdza czy suma pierwszych 22 bajtów jest równa liczbie zapisanej w bajtach 23 i 24. Argumentami wejściowymi są w tym przypadku bufor oraz jego długość.
bool sprawdzLancuch(unsigned char *buf, int dlugosc) // sprawdzenie poprawności lancucha { bool flaga=0; int suma=0; for(int i=0; i<(dlugosc-2); i++) { suma+=buf[i]; } suma=suma + 0x42; if(suma == ((buf[dlugosc-2]<<8)+buf[dlugosc-1])) { suma = 0; flaga = 1; } return flaga; }
W funkcji setup() inicjalizujemy transmisję szeregową oraz ekran LCD.
void setup() { Serial.begin(9600); lcd.begin(16,2); lcd.setCursor(0,0); }
W funkcji loop() odbywa się transmisja oraz wyświetlanie. Warto zauważyć, że aktualizacja wartości PM2,5 i PM10 odbędzie się tylko wtedy, gdy dwa pierwsze bajty oraz suma kontrolna zgadzają się z protokołem. Następnie dane zapisywane są do tablic znaków linia1 i linia 2 i wyświetlane na ekranie.
void loop() { if(Serial.find(0x42)) Serial.readBytes(bufor,N); if(bufor[0] == 0x4d) { if(sprawdzLancuch(bufor,N)) { PM25=wartoscPM25(bufor); PM10=wartoscPM10(bufor); } } lcd.setCursor(0,0); sprintf(linia1,"PM2.5=%d ug/m3",PM25); lcd.print(linia1); lcd.setCursor(0,1); sprintf(linia2,"PM10=%d ug/m3",PM10); lcd.print(linia2); }
Działanie programu zostało przedstawione w poniższym filmie: