Czujnik pyłków PMS5003 kod działający

Zbiór tutoriali związanych z Arduino.
ODPOWIEDZ
scalak77
Młodszy majsterkowicz
Posty: 1
Rejestracja: 23 mar 2017, 21:57

Czujnik pyłków PMS5003 kod działający

Post autor: scalak77 » 23 mar 2017, 22:29

Witam
Dziś po południu rozpakowałem paczuszkę od skośnookich z czujnikiem pyłków PMS5003 i zabrałem się za uruchomienie, kod już miałem więc postanowiłem uruchomić moduł, po kilku poprawka udało się uruchomić i działa.

Kod: Zaznacz cały

/*   PMS5003
 *    PIN OUT
 *    1  +5V
 *    2  GND
 *    3  SET (3,3V) pin 31   MEGA256 
 *    4  RX  (3,3V) pin TX3  MEGA256 
 *    5  TX  (3,3V) pin RX3  MEGA256
 *    6  RESET (3,3V)
 
 KOD DZIAŁA NA ARDUINO MEGA256 na porcie UART3 (piny TX3 i RX3) przez konwerter napięć 5/3,3V)
 Zasilanie bezpośrednie 5V
 */


#define LENG 31   //0x42 + 31 bytes equal to 32 bytes
unsigned char buf[LENG];

int PM01Value=0;          //define PM1.0 value of the air detector module
int PM2_5Value=0;         //define PM2.5 value of the air detector module
int PM10Value=0;         //define PM10 value of the air detector module



void setup() {
  pinMode(31, OUTPUT); //pin on/off dust sensor

  Serial.begin(9600); // this is to start serial monitoring with your Arduino IDE Serial monitor.
  Serial3.begin(9600); //serial dust sensor

}


void loop() {
  digitalWrite(31, LOW);
  
  dust();
  delay(10000);
}


void dust () {
  digitalWrite(31, HIGH);
  Serial.println("High Pms5003");
  delay(5000);
  for (int i=0; i <= 10; i++){
  if(Serial3.find(0x42)){    //start to read when detect 0x42
    Serial3.readBytes(buf,LENG);

    if(buf[0] == 0x4d){
      if(checkValue(buf,LENG)){
        PM01Value=transmitPM01(buf); //count PM1.0 value of the air detector module
        PM2_5Value=transmitPM2_5(buf);//count PM2.5 value of the air detector module
        PM10Value=transmitPM10(buf); //count PM10 value of the air detector module 
      }           
    } 
  }

  Serial.print("PM1.0: ");  
  Serial.print(PM01Value);
  Serial.println("  ug/m3");            

  Serial.print("PM2.5: ");  
  Serial.print(PM2_5Value);
  Serial.println("  ug/m3");     

  Serial.print("PM10: ");  
  Serial.print(PM10Value);
  Serial.println("  ug/m3");   
  Serial.println();
  delay(1000);
  }
  
  delay(100);
  Serial.println("Low Pms5003");
  digitalWrite(31, LOW);
  Serial.println();
  int i=0;
}


char checkValue(unsigned char *thebuf, char leng)
{  
  char receiveflag=0;
  int receiveSum=0;

  for(int i=0; i<(leng-2); i++){
  receiveSum=receiveSum+thebuf[i];
  }
  receiveSum=receiveSum + 0x42;

  if(receiveSum == ((thebuf[leng-2]<<8)+thebuf[leng-1]))  //check the serial data 
  {
    receiveSum = 0;
    receiveflag = 1;
  }
  return receiveflag;
}

int transmitPM01(unsigned char *thebuf)
{
  int PM01Val;
  PM01Val=((thebuf[3]<<8) + thebuf[4]); //count PM1.0 value of the air detector module
  return PM01Val;
}

//transmit PM Value to PC
int transmitPM2_5(unsigned char *thebuf)
{
  int PM2_5Val;
  PM2_5Val=((thebuf[5]<<8) + thebuf[6]);//count PM2.5 value of the air detector module
  return PM2_5Val;
  }

//transmit PM Value to PC
int transmitPM10(unsigned char *thebuf)
{
  int PM10Val;
  PM10Val=((thebuf[7]<<8) + thebuf[8]); //count PM10 value of the air detector module  
  return PM10Val;
} //cod dust sensor

Pin 31 ustawiany w stan HIGH.
Pomiar dokonuje się 10 razy (pętla int = 0).
Pin w stanie LOW.
Powrót do pętli loop
odczekanie 10s ( delay(10000) ).
Ponownie pin31 w stan HIGHT.
Wykonanie pętli 10 razy.


Kod działa na Arduino mega256 i nie potrzebuje pobierania dodatkowych bibliotek, na UNO potrzeba będzie wykorzystać bibliotekę software Serial ze względu na tylko 1 port UART.

Jeśli są błędy to postaram się je odszukać aby uprościć kod, a jeśli ktoś potrafi go dopracować to prosiłbym o umieszczenie go w tym wątku.

Pozdrawiam

Co miesiąc do wygrania nagrody o wartości ponad 1600 zł!


ODPOWIEDZ

Strony partnerskie: