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.

moisture.cpp 2.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. /*
  2. * moisture.cpp
  3. *
  4. * ESP8266 / ESP32 Environmental Sensor
  5. *
  6. * ----------------------------------------------------------------------------
  7. * "THE BEER-WARE LICENSE" (Revision 42):
  8. * <xythobuz@xythobuz.de> wrote this file. As long as you retain this notice
  9. * you can do whatever you want with this stuff. If we meet some day, and you
  10. * think this stuff is worth it, you can buy me a beer in return. Thomas Buck
  11. * ----------------------------------------------------------------------------
  12. */
  13. #include <Arduino.h>
  14. #include "moisture.h"
  15. #if defined(MOISTURE_ADC_ESP32)
  16. #include <driver/adc.h>
  17. #define ADC_OVERSAMPLE 20
  18. #define ADC_BITWIDTH 12
  19. #define ADC_BITS ADC_WIDTH_BIT_12
  20. #define ADC_ATTENUATION ADC_ATTEN_DB_11
  21. #define SENSOR_COUNT 6
  22. adc1_channel_t sensor_pin[SENSOR_COUNT] = {
  23. ADC1_CHANNEL_0, ADC1_CHANNEL_3,
  24. ADC1_CHANNEL_6, ADC1_CHANNEL_7,
  25. ADC1_CHANNEL_4, ADC1_CHANNEL_5
  26. };
  27. static int adc_read_oversampled(adc1_channel_t pin) {
  28. uint32_t sample_sum = 0;
  29. for (int i = 0; i < ADC_OVERSAMPLE; i++) {
  30. sample_sum += adc1_get_raw(pin);
  31. }
  32. return sample_sum / ADC_OVERSAMPLE;
  33. }
  34. void moisture_init(void) {
  35. adc1_config_width(ADC_BITS);
  36. for (int i = 0; i < SENSOR_COUNT; i++) {
  37. adc1_config_channel_atten(sensor_pin[i], ADC_ATTENUATION);
  38. }
  39. }
  40. int moisture_count(void) {
  41. return SENSOR_COUNT;
  42. }
  43. int moisture_read(int sensor) {
  44. if ((sensor < 0) || (sensor > SENSOR_COUNT)) {
  45. return -1;
  46. }
  47. return adc_read_oversampled(sensor_pin[sensor]);
  48. }
  49. int moisture_max(void) {
  50. return (1 << ADC_BITWIDTH) - 1;
  51. }
  52. #elif defined(MOISTURE_ADC_ARDUINO)
  53. // Hardware I2C pins A4 and A5 not usable on Arduino Uno Wifi Dev. Ed.
  54. #define SENSOR_COUNT 6
  55. uint8_t sensor_pins[SENSOR_COUNT] = { A0, A1, A1, A2, A3, A3 };
  56. #define OVERSAMPLE_COUNT 3
  57. void moisture_init(void) {
  58. }
  59. int moisture_count(void) {
  60. return SENSOR_COUNT;
  61. }
  62. int moisture_read(int sensor) {
  63. unsigned long val = 0;
  64. for (int i = 0; i < OVERSAMPLE_COUNT; i++) {
  65. val += analogRead(sensor_pins[sensor]);
  66. }
  67. val /= OVERSAMPLE_COUNT;
  68. if (val >= 1010) val = 1023; // avoid noisy data in db
  69. return (int)((val << 2) | 3);
  70. }
  71. int moisture_max(void) {
  72. return 4095;
  73. }
  74. #else
  75. void moisture_init(void) { }
  76. int moisture_count(void) {
  77. return 0;
  78. }
  79. int moisture_read(int sensor) {
  80. return 0;
  81. }
  82. int moisture_max(void) {
  83. return 0;
  84. }
  85. #endif