ESP32 / ESP8266 & BME280 / SHT2x sensor with InfluxDB support
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

main.cpp 6.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. #include <Arduino.h>
  2. #include <Wire.h>
  3. #include <ESP8266WiFi.h>
  4. #include <ESP8266WebServer.h>
  5. #include <ESP8266mDNS.h>
  6. #include <ESP8266HTTPUpdateServer.h>
  7. #include <Adafruit_BME280.h>
  8. #include <SHT2x.h>
  9. #include "config.h"
  10. #ifdef ENABLE_DATABASE_WRITES
  11. #include <InfluxDb.h>
  12. Influxdb influx(INFLUXDB_HOST, INFLUXDB_PORT);
  13. #endif // ENABLE_DATABASE_WRITES
  14. ESP8266WebServer server(80);
  15. ESP8266HTTPUpdateServer updater;
  16. TwoWire Wire2;
  17. SHT2x sht(HTDU21D_ADDRESS, &Wire2);
  18. Adafruit_BME280 bme;
  19. bool found_bme = false;
  20. bool found_sht = false;
  21. unsigned long last_server_handle_time = 0;
  22. unsigned long last_db_write_time = 0;
  23. unsigned long last_led_blink_time = 0;
  24. void handleRoot() {
  25. String message = F("ESP8266 Environment Sensor");
  26. message += F("\n\n");
  27. message += F("Version: ");
  28. message += esp_env_version;
  29. message += F("\n");
  30. message += F("Location: ");
  31. message += sensor_location;
  32. message += F("\n");
  33. message += F("MAC: ");
  34. message += WiFi.macAddress();
  35. #ifdef HTTP_SHOW_ESP_STATS
  36. message += F("\n");
  37. message += F("Reset reason: ");
  38. message += ESP.getResetReason();
  39. message += F("\n");
  40. message += F("Free heap: ");
  41. message += String(ESP.getFreeHeap());
  42. message += F(" (");
  43. message += String(ESP.getHeapFragmentation());
  44. message += F("% fragmentation)");
  45. message += F("\n");
  46. message += F("Free sketch space: ");
  47. message += String(ESP.getFreeSketchSpace());
  48. message += F("\n");
  49. message += F("Flash chip real size: ");
  50. message += String(ESP.getFlashChipRealSize());
  51. if (ESP.getFlashChipSize() != ESP.getFlashChipRealSize()) {
  52. message += F("\n");
  53. message += F("WARNING: sdk chip size (");
  54. message += (ESP.getFlashChipSize());
  55. message += F(") does not match!");
  56. }
  57. #endif // HTTP_SHOW_ESP_STATS
  58. if (found_bme) {
  59. message += F("\n\n");
  60. message += F("BME280:");
  61. message += F("\n");
  62. message += F("Temperature: ");
  63. message += String(bme.readTemperature());
  64. message += F("\n");
  65. message += F("Humidity: ");
  66. message += String(bme.readHumidity());
  67. message += F("\n");
  68. message += F("Pressure: ");
  69. message += String(bme.readPressure());
  70. }
  71. if (found_sht) {
  72. message += F("\n\n");
  73. message += F("SHT21:");
  74. message += F("\n");
  75. message += F("Temperature: ");
  76. message += String(sht.GetTemperature());
  77. message += F("\n");
  78. message += F("Humidity: ");
  79. message += String(sht.GetHumidity());
  80. }
  81. if ((!found_bme) && (!found_sht)) {
  82. message += F("\n\n");
  83. message += F("No Sensor available!");
  84. }
  85. message += F("\n\n");
  86. message += F("Try /update for OTA firmware updates!");
  87. message += F("\n");
  88. server.send(200, "text/plain", message);
  89. }
  90. void setup() {
  91. pinMode(1, OUTPUT);
  92. // Blink LED for init
  93. for (int i = 0; i < 2; i++) {
  94. digitalWrite(1, LOW); // LED on
  95. delay(LED_INIT_BLINK_INTERVAL);
  96. digitalWrite(1, HIGH); // LED off
  97. delay(LED_INIT_BLINK_INTERVAL);
  98. }
  99. // Init I2C and try to connect to sensors
  100. Wire2.begin(2, 0);
  101. found_bme = (!bme.begin(0x76, &Wire2)) ? false : true;
  102. found_sht = sht.GetAlive();
  103. #ifdef DONT_RUN_WITHOUT_SENSORS
  104. if ((!found_bme) && (!found_sht)) {
  105. // no sensor available
  106. while (1) {
  107. digitalWrite(1, !digitalRead(1));
  108. delay(LED_ERROR_BLINK_INTERVAL);
  109. }
  110. }
  111. #endif // DONT_RUN_WITHOUT_SENSORS
  112. // Set hostname
  113. String hostname = SENSOR_HOSTNAME_PREFIX;
  114. hostname += sensor_location;
  115. WiFi.hostname(hostname);
  116. // Connect to WiFi AP
  117. WiFi.mode(WIFI_STA);
  118. WiFi.begin(ssid, password);
  119. while (WiFi.status() != WL_CONNECTED) {
  120. delay(LED_CONNECT_BLINK_INTERVAL);
  121. digitalWrite(1, !digitalRead(1));
  122. }
  123. #ifdef ENABLE_DATABASE_WRITES
  124. // Setup InfluxDB Client
  125. influx.setDb(INFLUXDB_DATABASE);
  126. #endif // ENABLE_DATABASE_WRITES
  127. // Setup HTTP Server
  128. MDNS.begin(hostname);
  129. updater.setup(&server);
  130. server.on("/", handleRoot);
  131. server.begin();
  132. MDNS.addService("http", "tcp", 80);
  133. }
  134. void handleServers() {
  135. server.handleClient();
  136. MDNS.update();
  137. }
  138. #ifdef ENABLE_DATABASE_WRITES
  139. void writeDatabase() {
  140. if (found_bme) {
  141. InfluxData measurement("environment");
  142. measurement.addTag("location", sensor_location);
  143. measurement.addTag("device", WiFi.macAddress());
  144. measurement.addTag("sensor", "bme280");
  145. measurement.addValue("temperature", bme.readTemperature());
  146. measurement.addValue("pressure", bme.readPressure());
  147. measurement.addValue("humidity", bme.readHumidity());
  148. boolean success = influx.write(measurement);
  149. if (!success) {
  150. for (int i = 0; i < 10; i++) {
  151. digitalWrite(1, LOW); // LED on
  152. delay(LED_ERROR_BLINK_INTERVAL);
  153. digitalWrite(1, HIGH); // LED off
  154. delay(LED_ERROR_BLINK_INTERVAL);
  155. }
  156. }
  157. }
  158. if (found_sht) {
  159. InfluxData measurement("environment");
  160. measurement.addTag("location", sensor_location);
  161. measurement.addTag("device", WiFi.macAddress());
  162. measurement.addTag("sensor", "sht21");
  163. measurement.addValue("temperature", sht.GetTemperature());
  164. measurement.addValue("humidity", sht.GetHumidity());
  165. boolean success = influx.write(measurement);
  166. if (!success) {
  167. for (int i = 0; i < 10; i++) {
  168. digitalWrite(1, LOW); // LED on
  169. delay(LED_ERROR_BLINK_INTERVAL);
  170. digitalWrite(1, HIGH); // LED off
  171. delay(LED_ERROR_BLINK_INTERVAL);
  172. }
  173. }
  174. }
  175. }
  176. #endif // ENABLE_DATABASE_WRITES
  177. void loop() {
  178. unsigned long time = millis();
  179. if ((time - last_server_handle_time) >= SERVER_HANDLE_INTERVAL) {
  180. last_server_handle_time = time;
  181. handleServers();
  182. }
  183. #ifdef ENABLE_DATABASE_WRITES
  184. if ((time - last_db_write_time) >= DB_WRITE_INTERVAL) {
  185. last_db_write_time = time;
  186. writeDatabase();
  187. }
  188. #endif // ENABLE_DATABASE_WRITES
  189. #ifdef ENABLE_LED_HEARTBEAT_BLINK
  190. if ((time - last_led_blink_time) >= LED_BLINK_INTERVAL) {
  191. last_led_blink_time = time;
  192. digitalWrite(1, !digitalRead(1));
  193. }
  194. #endif // ENABLE_LED_HEARTBEAT_BLINK
  195. }