Advertisement
Guest User

Untitled

a guest
Dec 8th, 2017
506
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 8.41 KB | None | 0 0
  1. #include <Arduino.h>
  2. #include <ESP8266WiFi.h>          //https://github.com/esp8266/Arduino
  3.  
  4. // needed for library
  5. #include <DNSServer.h>
  6. #include <ESP8266WebServer.h>
  7. #include <WiFiManager.h>         //https://github.com/tzapu/WiFiManager
  8. #include <PubSubClient.h>
  9. #include <Wire.h>
  10. #include <SPI.h>
  11.  
  12. // BME280 Sensor
  13. #include <Adafruit_Sensor.h>
  14. #include <Adafruit_BME280.h>
  15.  
  16.  
  17. //Constants
  18. #define TOKEN "TOKEN"
  19. char thingsboardServer[] = "server_address";
  20.  
  21. // Settings for PMS5003
  22. #define LENG 31  //0x42 + 31 bytes equal to 32 bytes
  23. #define TIMEOUT 10000 //Microseconds to wait for PMS do wakeup
  24.  
  25. unsigned char buf[LENG];
  26. char ergebnisstr[50];
  27.  
  28. struct dustvalues {
  29.  unsigned int PM10Val=0; // Byte 4&5
  30.  unsigned int PM2_5Val=0; // Byte 6&7
  31.  unsigned int PM01Val=0; // Byte 8&9
  32.  unsigned int Beyond03=0; // Byte 16&17
  33.  unsigned int Beyond05=0; // Byte 18&19
  34.  unsigned int Beyond1=0; // Byte 20&21
  35.  unsigned int Beyond2_5=0; // Byte 22&23
  36.  unsigned int Beyond5=0; //Byte 24&25
  37.  unsigned int Beyond10=0; //Byte 26&27
  38. };
  39.  
  40. struct dustvalues dustvalues1, dustvalues2;
  41.  
  42. //unsigned char gopassive[]={ 0x42, 0x4d, 0xe1, 0x00, 0x00, 0x01, 0x70 }; //don't need here
  43. //unsigned char readinpassive[]={ 0x42, 0x4d, 0xe2, 0x00, 0x00, 0x01, 0x71 };
  44. unsigned char gosleep[]={ 0x42, 0x4d, 0xe4, 0x00, 0x00, 0x01, 0x73 };
  45. unsigned char gowakeup[]={ 0x42, 0x4d, 0xe4, 0x00, 0x01, 0x01, 0x74 };
  46.  
  47.  
  48. // BME280 init
  49. Adafruit_BME280 bme;
  50.  
  51. // Connection to PubSubClient
  52. WiFiClient espClient;
  53. PubSubClient client(espClient);
  54.  
  55. int status = WL_IDLE_STATUS;
  56. unsigned long lastSend;
  57.  
  58. void setup() {
  59.     Serial.begin(9600);
  60.     WiFiManager wifiManager;
  61.  
  62.     wifiManager.autoConnect("AP", "pass");
  63.     Serial.println("Connected to the network :)");
  64.     delay(500);
  65.     //  pins for RGB diode
  66.     pinMode(12, OUTPUT);
  67.     pinMode(13, OUTPUT);
  68.     pinMode(14, OUTPUT);
  69.     //BME280 sensor check
  70.     if (! bme.begin(0x76)) {
  71.     Serial.println("Could not find a valid BME280 sensor, check wiring!");
  72.     while (1);
  73.     }
  74.     // set server for MQTT PubSubClient Library
  75.     client.setServer( thingsboardServer, 1883 );
  76.     lastSend = 0;
  77.  
  78. }
  79.  
  80. void loop() {
  81.  
  82.  
  83.     if (!client.connected()) {
  84.     reconnect();
  85.     }
  86.     if ( millis() - lastSend > 30000 ) { // Update and send only after 1 seconds
  87.     getpms5003();
  88.     getAndSendTemperatureAndHumidityData();
  89.     lastSend = millis();
  90.     }
  91.     client.loop();
  92. }
  93.  
  94. void reconnect() {
  95.   // Loop until we're reconnected
  96.   while (!client.connected()) {
  97.     Serial.print("Connecting to ThingsBoard node ...");
  98.     // Attempt to connect (clientId, username, password)
  99.     if ( client.connect("Stacja1", TOKEN, NULL) ) {
  100.       Serial.println( "[DONE]" );
  101.     } else {
  102.       Serial.print( "[FAILED] [ rc = " );
  103.       Serial.print( client.state() );
  104.       Serial.println( " : retrying in 5 seconds]" );
  105.       // Wait 5 seconds before retrying
  106.       delay( 5000 );
  107.     }
  108.   }
  109. }
  110.  
  111. void getAndSendTemperatureAndHumidityData()
  112. {
  113.   Serial.println("Collecting temperature data.");
  114.  
  115.   // Reading temperature or humidity takes about 250 milliseconds!
  116.   float humidity = bme.readHumidity();
  117.   // Read temperature as Celsius (the default)
  118.   float temperature = bme.readTemperature();
  119.  
  120.   float pressure = bme.readPressure() / 100.0;
  121.  
  122.   // Check if any reads failed and exit early (to try again).
  123.   if (isnan(humidity) || isnan(temperature) || isnan(pressure)) {
  124.     Serial.println("Failed to read from BME sensor!");
  125.     return;
  126.   }
  127.  
  128.   Serial.print("Humidity: ");
  129.   Serial.print(humidity);
  130.   Serial.print(" %\t");
  131.   Serial.print("Temperature: ");
  132.   Serial.print(temperature);
  133.   Serial.print(" *C ");
  134.   Serial.print("Pressure: ");
  135.   Serial.print(pressure);
  136.   Serial.print("hPa");
  137.  
  138.   String temperature1 = String(temperature);
  139.   String humidity1 = String(humidity);
  140.   String pressure1 = String(pressure);
  141.  
  142.  
  143.   // Just debug messages
  144.   Serial.print( "Sending temperature, humidity & pressure : [" );
  145.   Serial.print( temperature1 ); Serial.print( "," );
  146.   Serial.print( humidity1 ); Serial.print( "," );
  147.   Serial.print( pressure1 );
  148.   Serial.print( "]   -> " );
  149.  
  150.   // Prepare a JSON payload string
  151.   String payload = "{";
  152.   payload += "\"temperature\":"; payload += temperature1; payload += ",";
  153.   payload += "\"humidity\":"; payload += humidity1;  payload += ",";
  154.   payload += "\"pressure\":"; payload += pressure1;
  155.   payload += "}";
  156.  
  157.   // Send payload
  158.   char attributes[150];
  159.   payload.toCharArray( attributes, 100 );
  160.   client.publish( "v1/devices/me/telemetry", attributes );
  161.   Serial.println( attributes );
  162. }
  163.  
  164. char checkValue(unsigned char *buf, char leng){
  165.  /* letzten beiden Bytes sind Summe der Bytes[0] bis Byte[29]
  166.   * Funktion checkValue überprüft diese Quersumme
  167.   */
  168.  int receiveSum=0;
  169.  
  170.  for(int i=0; i<(leng-2); i++){
  171.   receiveSum=receiveSum+buf[i];
  172.  }
  173.  receiveSum=receiveSum + 0x42;
  174.  Serial.print("Checksum calculated: ");
  175.  Serial.println(receiveSum);
  176.  Serial.print("Checksum found: ");
  177.  Serial.println((buf[leng-2]<<8)+buf[leng-1]);
  178.  
  179.  if(receiveSum == ((buf[leng-2]<<8)+buf[leng-1])) return 1; //errechnete Summe und Inhalt der letzten Bytes vergleichen
  180.  
  181.  return 0;
  182. }
  183.  
  184.  
  185. unsigned int transmitPM(char HighB, char LowB, unsigned char *buf){
  186.  unsigned int PMValue;
  187.  PMValue=((buf[HighB]<<8)+buf[LowB]);
  188.  return PMValue;
  189. }
  190.  
  191.  
  192. void getpms5003(void){
  193.   unsigned char found=0;
  194.  
  195.   Serial.println("PMS5003 Wakeup: ");
  196.   Serial.write(gowakeup,7);
  197.   Serial.println();
  198.   Serial.println("gowakeup ist out");
  199.   delay(30000); //Stable data should be got at least 30 Second from wakeup (Datasheet!)
  200.   while (found<2){
  201.    delay(TIMEOUT);
  202.    if(Serial.available()>0){
  203.     if(Serial.find(0x42)){  //start to read when detect 0x42
  204.      Serial.println("0x42 found");
  205.      Serial.readBytes(buf,LENG);
  206.      if (buf[0] == 0x4d){ //second byte should be 0x4D
  207.        found++;
  208.        if(checkValue(buf,LENG)){
  209.         Serial.println("Checksum okay");
  210.  
  211.         if(found==1){
  212.          // dustvalues1.PM01Val=transmitPM(3,4,buf);
  213.          dustvalues1.PM2_5Val=transmitPM(5,6,buf);
  214.          dustvalues1.PM10Val=transmitPM(7,8,buf);
  215.  
  216.          if (dustvalues1.PM10Val <= 60) {
  217.            // digtal write green pin
  218.            digitalWrite(12, LOW);
  219.            // digitalWrite(13, HIGH);
  220.            digitalWrite(14, HIGH);
  221.          }
  222.  
  223.          if ((dustvalues1.PM10Val > 60 ) && (dustvalues1.PM10Val <= 140 )) {
  224.            // dioda swieci na zolto
  225.            digitalWrite(12, LOW);
  226.            // digitalWrite(13, HIGH);
  227.            digitalWrite(14, LOW);
  228.          }
  229.  
  230.          if(dustvalues1.PM10Val > 141) {
  231.            // dioda swieci na czerwono POZIOME 84 a nie 80 !!!!
  232.            digitalWrite(12, HIGH);
  233.            // digitalWrite(13, HIGH);
  234.            digitalWrite(14, LOW);
  235.          }
  236.  
  237.  
  238.          sprintf(ergebnisstr,"PM2.5:%4dug/m3\nPM10: %4dug/m3\n",dustvalues1.PM2_5Val,dustvalues1.PM10Val);
  239.          Serial.println(ergebnisstr);
  240.          Serial.flush();
  241.  
  242.          // pm25 = String(dustvalues1.PM2_5Val);
  243.          // pm10 = String(dustvalues1.PM10Val);
  244.  
  245.          // Just debug messages
  246.          Serial.print( "Sending air quality PM2.5 & PM10 values: [" );
  247.          Serial.print( dustvalues1.PM2_5Val ); Serial.print( "," );
  248.          Serial.print( dustvalues1.PM10Val);
  249.          Serial.print( "]   -> " );
  250.  
  251.          // Prepare a JSON payload string
  252.          String payload = "{";
  253.          payload += "\"pm25\":"; payload += String(dustvalues1.PM2_5Val); payload += ",";
  254.          payload += "\"pm10\":"; payload += String(dustvalues1.PM10Val);
  255.          payload += "}";
  256.  
  257.          // Send payload
  258.          char attributes[100];
  259.          payload.toCharArray( attributes, 100 );
  260.          client.publish( "v1/devices/me/telemetry", attributes );
  261.          Serial.println( attributes );
  262.        }
  263.         // if(found==2){
  264.         //  dustvalues2.PM01Val=transmitPM(3,4,buf);
  265.         //  dustvalues2.PM2_5Val=transmitPM(5,6,buf);
  266.         //  dustvalues2.PM10Val=transmitPM(7,8,buf);
  267.         //  sprintf(ergebnisstr,"PM1: %4dug/m3\nPM2.5:%4dug/m3\nPM10: %4dug/m3\n",dustvalues2.PM01Val,dustvalues2.PM2_5Val,dustvalues2.PM10Val);
  268.         //  Serial.println(ergebnisstr);
  269.         //  Serial.flush();
  270.         // }
  271.       }else{
  272.        Serial.println("Checksum not okay");
  273.        Serial.flush();
  274.        if(found>0)found--;
  275.        delay(500);
  276.       }
  277.      }
  278.    }
  279.    }
  280.    }
  281.  
  282.   found=0;
  283.   Serial.println("PMS5003 - go to sleep");
  284.   Serial.write(gosleep,7);
  285.   Serial.println();
  286.  }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement