ESP32 / ESP8266 & BME280 / SHT2x sensor with InfluxDB support
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

moisture.cpp 2.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  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 "config.h"
  15. #include "moisture.h"
  16. #if defined(MOISTURE_ADC_ESP32)
  17. #include <driver/adc.h>
  18. #define ADC_OVERSAMPLE 20
  19. #define ADC_BITWIDTH 12
  20. #define ADC_BITS ADC_WIDTH_BIT_12
  21. #define ADC_ATTENUATION ADC_ATTEN_DB_11
  22. #define SENSOR_COUNT 6
  23. adc1_channel_t sensor_pin[SENSOR_COUNT] = {
  24. ADC1_CHANNEL_0, ADC1_CHANNEL_3,
  25. ADC1_CHANNEL_6, ADC1_CHANNEL_7,
  26. ADC1_CHANNEL_4, ADC1_CHANNEL_5
  27. };
  28. static int adc_read_oversampled(adc1_channel_t pin) {
  29. uint32_t sample_sum = 0;
  30. for (int i = 0; i < ADC_OVERSAMPLE; i++) {
  31. sample_sum += adc1_get_raw(pin);
  32. }
  33. return sample_sum / ADC_OVERSAMPLE;
  34. }
  35. void moisture_init(void) {
  36. adc1_config_width(ADC_BITS);
  37. for (int i = 0; i < SENSOR_COUNT; i++) {
  38. adc1_config_channel_atten(sensor_pin[i], ADC_ATTENUATION);
  39. }
  40. }
  41. int moisture_count(void) {
  42. return SENSOR_COUNT;
  43. }
  44. int moisture_read(int sensor) {
  45. if ((sensor < 0) || (sensor > SENSOR_COUNT)) {
  46. return -1;
  47. }
  48. return adc_read_oversampled(sensor_pin[sensor]);
  49. }
  50. int moisture_max(void) {
  51. return (1 << ADC_BITWIDTH) - 1;
  52. }
  53. #elif defined(MOISTURE_ADC_ARDUINO)
  54. // Hardware I2C pins A4 and A5 not usable on Arduino Uno Wifi Dev. Ed.
  55. #define SENSOR_COUNT 6
  56. uint8_t sensor_pins[SENSOR_COUNT] = { A0, A1, A1, A2, A3, A3 };
  57. #define OVERSAMPLE_COUNT 3
  58. void moisture_init(void) {
  59. }
  60. int moisture_count(void) {
  61. return SENSOR_COUNT;
  62. }
  63. int moisture_read(int sensor) {
  64. unsigned long val = 0;
  65. for (int i = 0; i < OVERSAMPLE_COUNT; i++) {
  66. val += analogRead(sensor_pins[sensor]);
  67. }
  68. val /= OVERSAMPLE_COUNT;
  69. if (val >= 1010) val = 1023; // avoid noisy data in db
  70. return (int)((val << 2) | 3);
  71. }
  72. int moisture_max(void) {
  73. return 4095;
  74. }
  75. #else
  76. void moisture_init(void) { }
  77. int moisture_count(void) {
  78. return 0;
  79. }
  80. int moisture_read(int sensor) {
  81. return 0;
  82. }
  83. int moisture_max(void) {
  84. return 0;
  85. }
  86. #endif