ESP32 / ESP8266 & BME280 / SHT2x sensor with InfluxDB support
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

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. }