LinkedIn YouTube Facebook
Szukaj

Wstecz
IoT

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