Advertisement
le_lukasz

Untitled

Nov 4th, 2020
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.53 KB | None | 0 0
  1. #include "PMS7003.h"
  2.  
  3. PMS7003::PMS7003() {
  4.   dataReady = false;
  5.   initialized = false;
  6.   debug = false;
  7. }
  8.  
  9.  
  10. void PMS7003::init() {
  11.   Serial1.begin(9600);
  12.   init(&Serial1);  
  13. }
  14.  
  15. void PMS7003::init(Stream *s) {
  16.   dataReady = false;
  17.   serial = s;
  18.   nextByte = 0;
  19.   lastByte = 0;
  20.   bufferIndex = 0;
  21.   initialized = true;
  22. }
  23.  
  24. void PMS7003::updateFrame() {
  25.   if (!initialized) {
  26.     Serial.println("Error: must call PMS7003::init()");
  27.     return;
  28.   }
  29.   dataReady = false;
  30.   if (serial->available()) {
  31.     nextByte = serial->read();
  32.    
  33.     if (nextByte == 0x4d && lastByte == 0x42 ) {
  34.       sensorData.bytes[0] = 0x42;
  35.       bufferIndex=1;
  36.     }
  37.     sensorData.bytes[bufferIndex] = nextByte;    
  38.     bufferIndex++;
  39.     lastByte = nextByte;
  40.   }
  41.  
  42.   if (bufferIndex == PMS7003_DATA_SIZE) {
  43.     if (sensorData.bytes[0] == 0x42 && sensorData.bytes[1] == 0x4d) {
  44.       if (debug) {
  45.         dumpBytes();
  46.       }
  47.       convertSensorData();
  48.       if (debug) {
  49.         dumpBytes();
  50.       }
  51.      
  52.       if(isValidChecksum()) {
  53.         dataReady = true;
  54.       } else {
  55.         if (debug) {
  56.           Serial.println("Invalid data checksum");
  57.         }
  58.       }
  59.     } else {
  60.       if (debug) {
  61.         Serial.println("Malformed first byte");
  62.       }
  63.     }
  64.     bufferIndex=0;
  65.   }  
  66.  
  67. }
  68.  
  69. bool PMS7003::hasNewData() {
  70.   return dataReady;
  71. }
  72.  
  73.  
  74. uint16_t PMS7003::getPM_1_0() {
  75.   return sensorData.values.pm_1_0;
  76. }
  77. uint16_t PMS7003::getPM_2_5() {
  78.   return sensorData.values.pm_2_5;
  79. }
  80. uint16_t PMS7003::getPM_10_0() {
  81.   return sensorData.values.pm_10_0;
  82. }
  83. uint16_t PMS7003::getPM_1_0_atmos() {
  84.   return sensorData.values.pm_1_0_atmos;
  85. }
  86. uint16_t PMS7003::getPM_2_5_atmos() {
  87.   return sensorData.values.pm_2_5_atmos;
  88. }
  89. uint16_t PMS7003::getPM_10_0_atmos() {
  90.   return sensorData.values.pm_10_0_atmos;
  91. }
  92.  
  93. uint16_t PMS7003::getRawGreaterThan_0_3() {
  94.   return sensorData.values.raw_gt_0_3;
  95. }
  96. uint16_t PMS7003::getRawGreaterThan_0_5() {
  97.   return sensorData.values.raw_gt_0_5;
  98. }
  99. uint16_t PMS7003::getRawGreaterThan_1_0() {
  100.   return sensorData.values.raw_gt_1_0;
  101. }
  102. uint16_t PMS7003::getRawGreaterThan_2_5() {
  103.   return sensorData.values.raw_gt_2_5;
  104. }
  105. uint16_t PMS7003::getRawGreaterThan_5_0() {
  106.   return sensorData.values.raw_gt_5_0;
  107. }
  108. uint16_t PMS7003::getRawGreaterThan_10_0() {
  109.   return sensorData.values.raw_gt_10_0;
  110. }
  111.  
  112. uint8_t PMS7003::getHWVersion() {
  113.   return sensorData.values.version_number;
  114. }
  115. uint8_t PMS7003::getErrorCode() {
  116.   return sensorData.values.error_code;
  117. }
  118.  
  119.  
  120.  
  121.  
  122. void PMS7003::dumpBytes() {
  123.   for(int i=0; i<PMS7003_DATA_SIZE; i++) {
  124.     Serial.print(sensorData.bytes[i]);
  125.     Serial.print(" ");
  126.   }
  127.   Serial.println();
  128. }
  129.  
  130. // fix sensor data endianness
  131. void PMS7003::convertSensorData() {
  132.   int loc=0;
  133.  
  134.   // first word (bytes 0 and 1) are 8 bit
  135.   loc += 1;
  136.  
  137.   // next 13 words are 16-bit ints
  138.   for (int i=0; i<13; i++) {
  139.     sensorData.words[loc] = uint16FromBufferData(sensorData.bytes, loc*2);
  140.     loc++;
  141.   }
  142.  
  143.   // next word is 2 8-bit bytes
  144.   loc += 1;
  145.  
  146.   // final checksum word is 16-bit
  147.   sensorData.words[loc] = uint16FromBufferData(sensorData.bytes, loc*2);
  148. }
  149.  
  150. bool PMS7003::isValidChecksum() {
  151.   uint16_t sum = 0;
  152.  
  153.   for(int i=0; i<(PMS7003_DATA_SIZE-2); i++){
  154.     sum += sensorData.bytes[i];
  155.   }
  156.   if(sum == sensorData.values.checksum)
  157.   {
  158.     return 1;
  159.   }
  160.   return 0;
  161. }
  162.  
  163. uint16_t PMS7003::uint16FromBufferData(unsigned char *buff, int loc) {
  164.   if (loc > PMS7003_DATA_SIZE-2 || loc < 2) {
  165.     return -1;
  166.   }
  167.   return ((buff[loc]<<8) + buff[loc+1]);
  168. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement