PM2.5_PMSA003.ino 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. /*
  2. Description:Use PM2.5 module and SHT20 base to read, the current particulate matter concentration and temperature and humidity data.
  3. */
  4. #include <M5Stack.h>
  5. #include "Free_Fonts.h"
  6. #include <Wire.h>
  7. #include "DFRobot_SHT20.h"
  8. DFRobot_SHT20 sht20;
  9. #define TFT_GREY 0x7BEF
  10. #define DATA_LEN 32
  11. #define X_LOCAL 40
  12. #define Y_LOCAL 30
  13. #define X_OFFSET 160
  14. #define Y_OFFSET 23
  15. uint16_t CheckSum;
  16. uint16_t CheckCode;
  17. // Print the header for a display screen
  18. void header(const char *string, uint16_t color)
  19. {
  20. M5.Lcd.fillScreen(color);
  21. M5.Lcd.setTextSize(1);
  22. M5.Lcd.setTextColor(TFT_MAGENTA, TFT_BLUE);
  23. M5.Lcd.fillRect(0, 0, 320, 30, TFT_BLUE);
  24. M5.Lcd.setTextDatum(TC_DATUM);
  25. M5.Lcd.drawString(string, 160, 3, 4);
  26. }
  27. void setup() {
  28. M5.begin();
  29. M5.Power.begin();
  30. Serial.begin(9600);
  31. Serial2.begin(9600, SERIAL_8N1, 16, 17);
  32. pinMode(10, OUTPUT);
  33. digitalWrite(10, 1);
  34. M5.Lcd.fillScreen(TFT_BLACK);
  35. header("P M 2.5", TFT_BLACK);
  36. sht20.initSHT20(); // Init SHT20 Sensor
  37. delay(100);
  38. sht20.checkSHT20();
  39. }
  40. uint8_t Air_val[32]={0};
  41. int16_t p_val[16]={0};
  42. uint8_t i=0;
  43. #define FRONT 2
  44. void LCD_Display_Val(void){
  45. for(int i=0,j=0;i<32;i++){
  46. if(i%2==0){
  47. p_val[j] = Air_val[i];
  48. p_val[j] = p_val[j] <<8;
  49. }else{
  50. p_val[j] |= Air_val[i];
  51. j++;
  52. }
  53. }
  54. // M5.Lcd.setTextSize(FRONT);
  55. M5.Lcd.setTextColor(TFT_RED,TFT_BLACK);
  56. M5.Lcd.setCursor(X_LOCAL, Y_LOCAL , FRONT);
  57. M5.Lcd.print("Standard");
  58. M5.Lcd.setTextColor(TFT_WHITE,TFT_BLACK);
  59. M5.Lcd.setCursor(X_LOCAL, Y_LOCAL + Y_OFFSET, FRONT);
  60. M5.Lcd.print(" ");
  61. M5.Lcd.setCursor(X_LOCAL, Y_LOCAL + Y_OFFSET, FRONT);
  62. M5.Lcd.print("PM1.0 : ");
  63. M5.Lcd.print( p_val[2]);
  64. M5.Lcd.setCursor(X_LOCAL, Y_LOCAL + Y_OFFSET*2 , FRONT);
  65. M5.Lcd.print(" ");
  66. M5.Lcd.setCursor(X_LOCAL, Y_LOCAL + Y_OFFSET*2 , FRONT);
  67. M5.Lcd.print("PM2.5 : ");
  68. M5.Lcd.print(p_val[3]);
  69. M5.Lcd.setCursor(X_LOCAL, Y_LOCAL + Y_OFFSET*3, FRONT);
  70. M5.Lcd.print(" ");
  71. M5.Lcd.setCursor(X_LOCAL, Y_LOCAL + Y_OFFSET*3, FRONT);
  72. M5.Lcd.print("PM10 : ");
  73. M5.Lcd.print(p_val[4]);
  74. M5.Lcd.setTextColor(TFT_RED,TFT_BLACK);
  75. M5.Lcd.setCursor(X_LOCAL+ X_OFFSET, Y_LOCAL , FRONT);
  76. M5.Lcd.print("Ambient ");
  77. M5.Lcd.setCursor(X_LOCAL + X_OFFSET, Y_LOCAL + Y_OFFSET, FRONT);
  78. M5.Lcd.print(" ");
  79. M5.Lcd.setTextColor(TFT_WHITE,TFT_BLACK);
  80. M5.Lcd.setCursor(X_LOCAL + X_OFFSET, Y_LOCAL + Y_OFFSET, FRONT);
  81. M5.Lcd.print("PM1.0 : ");
  82. M5.Lcd.print(p_val[5]);
  83. M5.Lcd.setCursor(X_LOCAL+ X_OFFSET, Y_LOCAL + Y_OFFSET*2 , FRONT);
  84. M5.Lcd.print(" ");
  85. M5.Lcd.setCursor(X_LOCAL+ X_OFFSET, Y_LOCAL + Y_OFFSET*2 , FRONT);
  86. M5.Lcd.print("PM2.5 : ");
  87. M5.Lcd.print(p_val[6]);
  88. M5.Lcd.setCursor(X_LOCAL+ X_OFFSET, Y_LOCAL + Y_OFFSET*3 , FRONT);
  89. M5.Lcd.print(" ");
  90. M5.Lcd.setCursor(X_LOCAL+ X_OFFSET, Y_LOCAL + Y_OFFSET*3 , FRONT);
  91. M5.Lcd.print("PM10 : ");
  92. M5.Lcd.print(p_val[7]);
  93. M5.Lcd.setTextColor(TFT_RED,TFT_BLACK);
  94. M5.Lcd.setCursor(X_LOCAL+ X_OFFSET/4, Y_LOCAL + Y_OFFSET*4 , FRONT);
  95. M5.Lcd.print("Number of particles");
  96. M5.Lcd.setCursor(X_LOCAL, Y_LOCAL + Y_OFFSET*5 , FRONT);
  97. M5.Lcd.print(" ");
  98. M5.Lcd.setTextColor(TFT_WHITE,TFT_BLACK);
  99. M5.Lcd.setCursor(X_LOCAL, Y_LOCAL + Y_OFFSET*5 , FRONT);
  100. M5.Lcd.print("0.3um : ");
  101. M5.Lcd.print(p_val[8]);
  102. M5.Lcd.setCursor(X_LOCAL, Y_LOCAL + Y_OFFSET*6 , FRONT);
  103. M5.Lcd.print(" ");
  104. M5.Lcd.setCursor(X_LOCAL, Y_LOCAL + Y_OFFSET*6 , FRONT);
  105. M5.Lcd.print("0.5um : ");
  106. M5.Lcd.print(p_val[9]);
  107. M5.Lcd.setCursor(X_LOCAL, Y_LOCAL + Y_OFFSET*7 , FRONT);
  108. M5.Lcd.print("1.0um : ");
  109. M5.Lcd.print(p_val[10]);
  110. M5.Lcd.setCursor(X_LOCAL + X_OFFSET, Y_LOCAL + Y_OFFSET*5 , FRONT);
  111. M5.Lcd.print(" ");
  112. M5.Lcd.setCursor(X_LOCAL + X_OFFSET, Y_LOCAL + Y_OFFSET*5 , FRONT);
  113. M5.Lcd.print("2.5um : ");
  114. M5.Lcd.print(p_val[11]);
  115. M5.Lcd.setCursor(X_LOCAL+ X_OFFSET, Y_LOCAL + Y_OFFSET*6 , FRONT);
  116. M5.Lcd.print(" ");
  117. M5.Lcd.setCursor(X_LOCAL+ X_OFFSET, Y_LOCAL + Y_OFFSET*6 , FRONT);
  118. M5.Lcd.print("5.0um : ");
  119. M5.Lcd.print(p_val[12]);
  120. M5.Lcd.setCursor(X_LOCAL+ X_OFFSET, Y_LOCAL + Y_OFFSET*7 , FRONT);
  121. M5.Lcd.print(" ");
  122. M5.Lcd.setCursor(X_LOCAL+ X_OFFSET, Y_LOCAL + Y_OFFSET*7 , FRONT);
  123. M5.Lcd.print("10um : ");
  124. M5.Lcd.print(p_val[13]);
  125. }
  126. void TempHumRead(void)
  127. {
  128. float humd = sht20.readHumidity(); // Read Humidity
  129. float temp = sht20.readTemperature(); // Read Temperature
  130. M5.Lcd.setTextColor(TFT_GREEN,TFT_BLACK);
  131. M5.Lcd.setCursor(X_LOCAL, Y_LOCAL + Y_OFFSET*8, FRONT);
  132. M5.Lcd.print(" ");
  133. M5.Lcd.setCursor(X_LOCAL, Y_LOCAL + Y_OFFSET*8 , FRONT);
  134. M5.Lcd.print("T M P : ");
  135. M5.Lcd.print(temp);
  136. M5.Lcd.setCursor(X_LOCAL + X_OFFSET, Y_LOCAL + Y_OFFSET*8, FRONT);
  137. M5.Lcd.print(" ");
  138. M5.Lcd.setCursor(X_LOCAL + X_OFFSET, Y_LOCAL + Y_OFFSET*8, FRONT);
  139. M5.Lcd.print("H U M : ");
  140. M5.Lcd.print(humd);
  141. }
  142. void loop() {
  143. if(Serial2.available()) {
  144. Air_val[i] = Serial2.read();
  145. Serial.write( Air_val[i]);
  146. i++;
  147. }else{
  148. i=0;
  149. }
  150. if(i==DATA_LEN){
  151. LCD_Display_Val();
  152. TempHumRead();
  153. }
  154. }