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.5KB

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