esp32:capacity_measure
Differences
This shows you the differences between two versions of the page.
| Next revision | Previous revision | ||
| esp32:capacity_measure [2025/09/21 17:20] – created aistis | esp32:capacity_measure [2025/09/21 17:22] (current) – aistis | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | measure capacity for | + | measure capacity for wires in order to detect water level. how mutch wires are submerged in water |
| {{: | {{: | ||
| < | < | ||
| - | sss | + | |
| + | |||
| + | #define CAP_PIN | ||
| + | #define DRIVE_PIN | ||
| + | #define FAST_PIN | ||
| + | #define R_OHMS | ||
| + | |||
| + | const int THRESH_ADC | ||
| + | const int ADC_LOW_FAST | ||
| + | const int ADC_HIGH_FAST | ||
| + | const unsigned long TIMEOUT_US | ||
| + | const unsigned long TIMEOUT_FAST_US= 20000UL; | ||
| + | |||
| + | const int N_SAMPLES = 100; | ||
| + | |||
| + | void setup() { | ||
| + | Serial.begin(115200); | ||
| + | analogSetAttenuation(ADC_11db); | ||
| + | pinMode(DRIVE_PIN, | ||
| + | pinMode(FAST_PIN, | ||
| + | } | ||
| + | |||
| + | // Greitas iškrovimas iki beveik 0 V, be fiksuoto delay | ||
| + | bool fast_discharge_until() { | ||
| + | pinMode(FAST_PIN, | ||
| + | digitalWrite(FAST_PIN, | ||
| + | unsigned long t0 = micros(); | ||
| + | int v; | ||
| + | do { | ||
| + | v = analogRead(CAP_PIN); | ||
| + | if (micros() - t0 > TIMEOUT_FAST_US) { // saugiklis | ||
| + | pinMode(FAST_PIN, | ||
| + | return false; | ||
| + | } | ||
| + | } while (v > ADC_LOW_FAST); | ||
| + | pinMode(FAST_PIN, | ||
| + | return true; | ||
| + | } | ||
| + | |||
| + | // Greitas pakrovimas iki beveik Vcc, be fiksuoto delay | ||
| + | bool fast_charge_until() { | ||
| + | pinMode(FAST_PIN, | ||
| + | digitalWrite(FAST_PIN, | ||
| + | unsigned long t0 = micros(); | ||
| + | int v; | ||
| + | do { | ||
| + | v = analogRead(CAP_PIN); | ||
| + | if (micros() - t0 > TIMEOUT_FAST_US) { | ||
| + | pinMode(FAST_PIN, | ||
| + | return false; | ||
| + | } | ||
| + | } while (v < ADC_HIGH_FAST); | ||
| + | pinMode(FAST_PIN, | ||
| + | return true; | ||
| + | } | ||
| + | |||
| + | unsigned long measure_rise_us() { | ||
| + | if (!fast_discharge_until()) return 0; // 0 V startas | ||
| + | pinMode(DRIVE_PIN, | ||
| + | unsigned long t0 = micros(); | ||
| + | while (analogRead(CAP_PIN) < THRESH_ADC) { | ||
| + | if (micros() - t0 > TIMEOUT_US) { pinMode(DRIVE_PIN, | ||
| + | } | ||
| + | unsigned long dt = micros() - t0; | ||
| + | pinMode(DRIVE_PIN, | ||
| + | return dt; | ||
| + | } | ||
| + | |||
| + | unsigned long measure_fall_us() { | ||
| + | if (!fast_charge_until()) return 0; // Vcc startas | ||
| + | pinMode(DRIVE_PIN, | ||
| + | unsigned long t0 = micros(); | ||
| + | while (analogRead(CAP_PIN) > THRESH_ADC) { | ||
| + | if (micros() - t0 > TIMEOUT_US) { pinMode(DRIVE_PIN, | ||
| + | } | ||
| + | unsigned long dt = micros() - t0; | ||
| + | pinMode(DRIVE_PIN, | ||
| + | return dt; | ||
| + | } | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | void loop() { | ||
| + | // Pastovūs koeficientai (k = Vth/Vcc) | ||
| + | const double k = 2000.0/ | ||
| + | const double a_up = -log(1.0 - k); // ≈ 0.673 (kilimas) | ||
| + | const double a_dn = -log(k); | ||
| + | |||
| + | // Vidurkinimas per N_SAMPLES | ||
| + | double sum_tr = 0, sum_tf = 0, sum_C = 0; | ||
| + | int ok = 0; | ||
| + | |||
| + | for (int i = 0; i < N_SAMPLES; i++) { | ||
| + | unsigned long tr = measure_rise_us(); | ||
| + | unsigned long tf = measure_fall_us(); | ||
| + | |||
| + | if (tr == 0 || tf == 0) { | ||
| + | // praleidžiam timeout' | ||
| + | continue; | ||
| + | } | ||
| + | |||
| + | double C_up_F = (tr * 1e-6) / (R_OHMS * a_up); | ||
| + | double C_dn_F = (tf * 1e-6) / (R_OHMS * a_dn); | ||
| + | double C_pF = (C_up_F + C_dn_F) * 0.5 * 1e12; | ||
| + | |||
| + | sum_tr += tr; | ||
| + | sum_tf += tf; | ||
| + | sum_C += C_pF; | ||
| + | ok++; | ||
| + | } | ||
| + | |||
| + | pinMode(12, INPUT); | ||
| + | analogSetAttenuation(ADC_11db); | ||
| + | pinMode(14, OUTPUT); | ||
| + | delay(10); | ||
| + | double battery_voltage = analogRead(12)/ | ||
| + | pinMode(14, INPUT); | ||
| + | |||
| + | if (ok > 0) { | ||
| + | double avg_tr = sum_tr / ok; | ||
| + | double avg_tf = sum_tf / ok; | ||
| + | double avg_CpF = sum_C / ok; | ||
| + | |||
| + | // CSV: tr_us, | ||
| + | Serial.printf(" | ||
| + | } else { | ||
| + | Serial.println(" | ||
| + | } | ||
| + | |||
| + | // | ||
| + | } | ||
| </ | </ | ||
esp32/capacity_measure.1758464447.txt.gz · Last modified: by aistis
