Sensore Ampere ACS712 in AC

ciao a tutti, ho un piccolo problema su un progetto.
ho un modulo acs712 da 20A, di quelli con gia i condensatori e le resistenze
devo semplicemente rilevare quando una pompa dell’acqua (a membrana) è in funzione.
la pompa lavora in 220V AC e consuma circa 50W (0,227A) , lo so che sarebbe stato meglio prenderne uno da 5A…
il problema sorge quando rilevo la corrente, mi da valori molto altalenanti e perciò non saprei come dire ad arduino che la pompa è in funzione.

questo è un estratto delle misurazioni in mA

24  <-- qui la pompa è spenta
34
26
10
21
19
3
25
15
42
62
37
17
43
13
22
53
25
15
37
17
13
12
27
10
12
37
27
25
54
10
12
145 <-- da qui la pompa è accesa 
533
111
27
20
674
169
48
34
31
608
136
42
33
598
139
42
23
54
710
161
52
35
462
176
40
32
21
703
165
47
19
390
181
46
14
17
761
182
61
22
322
246  <-- da qui è spenta la pompa
54
35
27
25
15
18
13
37
32

questa è la mia formula di conversione:
amper = (((4.88758 * analogRead(A1)) - 2500) * 10);

ho letto che per la corrente in AC bisogna utilizzare un modo particolare di calcolo con rms, ma non saprei proprio come !
premetto che ho gia provato a calcolare la media su 10 o 100 letture ma il risultato non cambia poi piu di tanto.

Mattia

Controlla le distanze di isolamento tra le piste, molte volte quei sensori pronti sono fatti così male che captano tanti di quei disturbi.....Ti sarebbe necessario un oscilloscopio per controllare il segnale in uscita, te ne renderesti conto immediatamente qual'è il problema

Se misuri una corrente alternanta a 50Hz avrai delle letture alternanti.

Visto che non hai valori negativi fai la media su un certo numero di misure e controlla se é maggiore di un certo limite.

Ciao Uwe

Ho gia provato a fare la media ma non funziona assolutamente... Come faccio per captare solo i picchi piu alti e se questi picchi si ripetono a breve distanza lo "percepisco" come un segnale? No purtroppo non ho un'oscilloscopio...

come hai fatto la media? si dai lo sketch? Ciao Uwe

questa è la parte di codice incriminata…

//lettura e degug amperometro per pompa acqua
  amper = (((4.88758 * analogRead(pinAmper)) - 2495) * 10);
  // debug per amperometro
  // Serial.print(amper);
  // Serial.print("-mA /lungo/ letto: ");
  // Serial.println(analogRead(pinAmper));
  //ciclo fisso di lettura amperometro in attesa del segnale per continuare il ciclo
  while (statoPOMP == 0) {
    digitalWrite(ledSTATO,HIGH);
    for (int i = 0; i <= 9; i++) {  // esegue la media di 10 letture senza delay
      amper = (((4.88758 * analogRead(pinAmper)) - 2495) * 10);
      amper = constrain(amper, 0, 20000);
      amperMEDIA = amperMEDIA + amper;
    }
    amperMEDIA = amperMEDIA / 10;
    // debug per amperometro
     Serial.println(amperMEDIA);
    // Serial.print("-mA /lungo/ letto: ");
    // Serial.println(analogRead(pinAmper));

    if (amperMEDIA > pompON) { //se la media è maggiore del valore (pompON=200) per un tempo
      tempoPOMPon++; //pari a 400 ms (delay 1ms) pone la variabile "statoPOMP" 
    }                          //in stato 1 (ovvero pompa in funzione)
    else {
      tempoPOMPon = 0;
    }
    if (tempoPOMPon > 400) {
      tempoPOMPon = 0;
      statoPOMP = 1;// permette di uscire dal loop while e continuare il ciclo
    }
    else {
      statoPOMP = 0;
    }
    delay(1);
  }

io vorrei far diventare “statoPOMP” =1 quando la pompa dell’acqua è in funzione
ma ho degli output della media come quello postato nel mio primo post e praticamente il counter tempoPOMPon non arriverà mai a 400…
ho letto in giro che bisogna utulizzare una formula diversa, che utilizza le radici quadrate per ottenere un valore rms “stabile” ma non ci ho capito nulla…
ciao mattia

Devi campionare per 1 o 2 periodi cioè per 20/40ms alla massima velocità possibile.

Sottrai al campione ADC (0-1023) ottenuto l’offset (512) ed elevalo al quadrato.

Il risultato va in una variabile long Somma.

Alla fine del ciclo esegui la radice quadrata della Somma diviso per il numero di campioni.

Il risultato puoi convertirlo in corrente (float) ed è la corrente RMS (Root Mean Square).

Quanti campioni devo prendere? Devo fare un'array? Poi tolgo ad ogni valore 512? Poi li elevo tutt singolarmente al quadrato, Poi sommo tutti i valori es "10" e li divido per 10?

Il numero di campioni non lo decidi tu, ma è la velocità massima di acquisizione Arduino (circa 9000 campioni secondo) ridotta per i calcoli da fare.

L'array non è indispensabile, in quanto ti bastano un centinaio di campioni.

Ad ogni lettura, incrementi la variabile N numero campioni, sottrai 512, elevi al quadrato il risultato e lo sommi nella variabile Somma.

Alla fine del periodo (20ms) (o dei periodi 40ms, 60ms, ecc.), esegui la radice quadrata della Somma diviso per N.