#include #include "driver/pcnt.h" #include #define SENSOR_TANK_SDA GPIO_NUM_16 /**< GPIO 16 - echo feedback of water sensor */ #define SENSOR_TANK_SCL GPIO_NUM_17 /**< GPIO 17 - trigger for water sensor */ #define OUTPUT_SENSOR 14 #define SENSOR_PLANT 17 VL53L0X tankSensor; void initializeTanksensor() { Wire.begin(SENSOR_TANK_SDA, SENSOR_TANK_SCL, 100000UL /* 100kHz */); tankSensor.setBus(&Wire); delay(100); tankSensor.setTimeout(500); long start = millis(); bool distanceReady = false; while (start + 500 > millis()) { if (tankSensor.init()) { distanceReady = true; break; } else { delay(20); } } if (distanceReady) { Serial.println("Sensor init done"); tankSensor.setSignalRateLimit(0.1); // increase laser pulse periods (defaults are 14 and 10 PCLKs) tankSensor.setVcselPulsePeriod(VL53L0X::VcselPeriodPreRange, 18); tankSensor.setVcselPulsePeriod(VL53L0X::VcselPeriodFinalRange, 14); tankSensor.setMeasurementTimingBudget(200000); tankSensor.startContinuous(); } else { Serial.println("Sensor init failed"); } } void setup() { Serial.begin(115200); pinMode(OUTPUT_SENSOR, OUTPUT); digitalWrite(OUTPUT_SENSOR, HIGH); Serial.println("Nodemcu ESP32 Start done"); initializeTanksensor(); } void loop() { delay(500); if (!tankSensor.timeoutOccurred()) { uint16_t distance = tankSensor.readRangeSingleMillimeters(); if (distance > 8000) { Serial.println("Reset due invalid distance: 8 meter"); Wire.end(); delay(1000); initializeTanksensor(); } else { Serial.print("Distance"); Serial.println(distance); } } else { Serial.println("Timeout"); tankSensor.stopContinuous(); Wire.end(); delay(100); initializeTanksensor(); } }