Advertisement
chillichump

Beginners Guide to Automation Episode 16 - ESP32 Code

Aug 9th, 2020
2,630
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.79 KB | None | 0 0
  1. #include <Adafruit_BME280.h>
  2. #include <DHT.h>
  3. #include <WiFi.h>
  4.  
  5. const char* ssid     = "WIFISSID";
  6. const char* password = "WIFIPASSWORD";
  7. const int tempThresholdHigh = 60;
  8. const int tempThresholdLow = -10;
  9.  
  10.  
  11.  
  12. //MQTT Setup Start
  13. #include <PubSubClient.h>
  14. #define mqtt_server "192.168.0.205"
  15. WiFiClient espClient;
  16. PubSubClient client(espClient);
  17. #define mqttTemp1 "hydro1/temp1"
  18. #define mqttHum1 "hydro1/hum1"
  19. #define mqttTemp2 "hydro1/temp2"
  20. #define mqttHum2 "hydro1/hum2"
  21. #define mqttTempExt "hydro1/tempExt"
  22. #define mqttHumExt "hydro1/humExt"
  23. #define mqttFloatSwitch "hydro1/floatSwitch"
  24.  
  25.  
  26. //MQTT incoming
  27. #define mqttFloodInterval "hydro1/floodInt"
  28. #define mqttFloodDuration "hydro1/floodDur"
  29. #define mqttLightsOnDuration "hydro1/lightsOnDur"
  30. #define mqttLightsOffDuration "hydro1/lightsOffDur"
  31. //MQTT Setup End
  32.  
  33. Adafruit_BME280 bme1; // I2C
  34. Adafruit_BME280 bme2; // I2C
  35. #define DHTPIN 33
  36. #define DHTTYPE DHT22
  37. DHT dht(DHTPIN, DHTTYPE);
  38.  
  39. float temp1, temp2,tempExt, hum1, hum2, humExt;
  40.  
  41. unsigned long millisNow = 0; //for delay purposes
  42. unsigned int sendDelay = 20000; //delay before sending sensor info via MQTT
  43.  
  44.  
  45. const byte floatSwitchPin = 16;
  46.  
  47. void topicsSubscribe(){
  48.    client.subscribe(mqttFloodInterval);
  49.    client.subscribe(mqttFloodDuration);
  50.    client.subscribe(mqttLightsOnDuration);
  51.    client.subscribe(mqttLightsOffDuration);
  52. }
  53. void mqttCallback(char* topic, byte* message, unsigned int length) {
  54.   Serial.print("MQTT message received on topic: ");
  55.   Serial.print(topic);
  56.   Serial.print(". Message: ");
  57.   String messageTemp;
  58.   for (int i = 0; i < length; i++) {
  59.     Serial.print((char)message[i]);
  60.     messageTemp += (char)message[i];
  61.   }
  62.   Serial.println();
  63.   Serial.println(messageTemp);
  64.   if (String(topic) == mqttFloodInterval) {
  65.     Serial.print("*** (Flood Interval Received)");
  66.   }
  67. }
  68.  
  69.  
  70.  
  71. void setup() {
  72.   Serial.begin(9600);
  73.  
  74.   pinMode(floatSwitchPin,INPUT_PULLUP);
  75.  
  76.   Serial.println();
  77.  
  78.   // begin Wifi connect
  79.   Serial.print("Connecting to ");
  80.   Serial.println(ssid);
  81.   WiFi.mode(WIFI_STA);
  82.   WiFi.disconnect();
  83.   delay(2000);
  84.   WiFi.begin(ssid, password);
  85.  
  86.   while (WiFi.status() != WL_CONNECTED) {
  87.     delay(500);
  88.     Serial.print(".");
  89.   }
  90.  
  91.   Serial.println("");
  92.   Serial.println("WiFi connected");  
  93.   Serial.println("IP address: ");
  94.   Serial.println(WiFi.localIP());
  95.   //end Wifi connect
  96.  
  97.   client.setServer(mqtt_server, 1883);
  98.   client.setCallback(mqttCallback);
  99.  
  100.   dht.begin();
  101.   delay(5000);
  102.  
  103.   unsigned status;
  104.   status = bme1.begin(0x76);
  105.     if (!status) {
  106.         Serial.println("Could not find a valid BME280 sensor, check wiring, address, sensor ID!");
  107.         Serial.print("SensorID was: 0x"); Serial.println(bme1.sensorID(),16);
  108.         Serial.print("        ID of 0xFF probably means a bad address, a BMP 180 or BMP 085\n");
  109.         Serial.print("   ID of 0x56-0x58 represents a BMP 280,\n");
  110.         Serial.print("        ID of 0x60 represents a BME 280.\n");
  111.         Serial.print("        ID of 0x61 represents a BME 680.\n");
  112.         while (1);
  113.     }
  114.     status = bme2.begin(0x77);
  115.     if (!status) {
  116.         Serial.println("Could not find a valid BME280 sensor, check wiring, address, sensor ID!");
  117.         Serial.print("SensorID was: 0x"); Serial.println(bme2.sensorID(),16);
  118.         Serial.print("        ID of 0xFF probably means a bad address, a BMP 180 or BMP 085\n");
  119.         Serial.print("   ID of 0x56-0x58 represents a BMP 280,\n");
  120.         Serial.print("        ID of 0x60 represents a BME 280.\n");
  121.         Serial.print("        ID of 0x61 represents a BME 680.\n");
  122.         while (1);
  123.     }
  124.  
  125. }
  126.  
  127. bool getValues() {
  128.  
  129.   temp1 = bme1.readTemperature();
  130.   temp2 = bme2.readTemperature();
  131.   tempExt = dht.readTemperature();
  132.   hum1 = bme1.readHumidity();
  133.   hum2 = bme2.readHumidity();
  134.   humExt = dht.readHumidity();
  135.  
  136.   Serial.print("BME 1 Temperature = ");
  137.   Serial.print(temp1);
  138.   Serial.println(" °C");
  139.  
  140.   Serial.print("BME 1 Humidity = ");
  141.   Serial.print(hum1);
  142.   Serial.println(" %");
  143.  
  144.   Serial.print("BME 2 Temperature = ");
  145.   Serial.print(temp2);
  146.   Serial.println(" °C");
  147.  
  148.   Serial.print("BME 2 Humidity = ");
  149.   Serial.print(hum2);
  150.   Serial.println(" %");
  151.  
  152.   Serial.print("Ext Temp = ");
  153.   Serial.print(tempExt);
  154.   Serial.println(" °C");
  155.  
  156.   Serial.print("Ext Humidity = ");
  157.   Serial.print(humExt);
  158.   Serial.println(" %");
  159.  
  160.   Serial.println();
  161.  
  162.   if (temp1 > tempThresholdHigh||temp2 > tempThresholdHigh||temp1 < tempThresholdLow||temp2 < tempThresholdLow){
  163.     return 0;
  164.   }else{
  165.     return 1;  
  166.   }
  167. }
  168.  
  169. void reconnect() {
  170.   // Loop until we're reconnected
  171.   int counter = 0;
  172.   while (!client.connected()) {
  173.     if (counter==5){
  174.       ESP.restart();
  175.     }
  176.     counter+=1;
  177.     Serial.print("Attempting MQTT connection...");
  178.     // Attempt to connect
  179.    
  180.     if (client.connect("growTentController")) {
  181.       Serial.println("connected");
  182.       topicsSubscribe();
  183.     } else {
  184.       Serial.print("failed, rc=");
  185.       Serial.print(client.state());
  186.       Serial.println(" try again in 5 seconds");
  187.       // Wait 5 seconds before retrying
  188.       delay(5000);
  189.     }
  190.   }
  191.   topicsSubscribe();
  192. }
  193.  
  194.  
  195. void loop() {
  196.   if (!client.connected()){
  197.     reconnect();
  198.   }
  199.  
  200.   if (millis() > millisNow + sendDelay){
  201.     if (getValues()) {
  202.       client.publish(mqttTemp1, String(temp1).c_str(),true);
  203.       client.publish(mqttHum1, String(hum1).c_str(),true);
  204.       client.publish(mqttTemp2, String(temp2).c_str(),true);
  205.       client.publish(mqttHum2, String(hum2).c_str(),true);
  206.       client.publish(mqttTempExt, String(tempExt).c_str(),true);
  207.       client.publish(mqttHumExt, String(humExt).c_str(),true);
  208.       client.publish(mqttFloatSwitch, String(digitalRead(floatSwitchPin),DEC).c_str(),true);
  209.       millisNow = millis();
  210.     }
  211.   }
  212.   client.loop();
  213. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement