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