[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:

Nordic poszerza opcje rozwojowe serii nRF54L o płytkę nRF7002 EBII do łączności Wi-Fi 6
Technologie End of Life i bezpieczeństwo sieci – wyzwania Europy związane z tzw. długiem technologicznym
Najczęstsze błędy firm przy wyborze dostawcy energii i jak ich uniknąć 



