Sensore ZMPT101B.

Salve ,sto cercando di usare questo sensore nel mio progetto, sono riuscito a trovare uno sketch che più o meno funziona ,il problema che mi funziona solo in un ciclo while() .
link del sensore [ZMPT101B | Best Small Size AC Voltage Sensor]

[code]
#include <Filters.h> //Easy library to do the calculations
float testFrequency = 50;                     // test signal frequency (Hz)
float windowLength = 40.0 / testFrequency;   // how long to average the signal, for statistist
int Sensor = 0; //Sensor analog input, here it's A0
float intercept = -0.04; // to be adjusted based on calibration testing
float slope = 0.0405; // to be adjusted based on calibration testing
float current_Volts; // Voltage
unsigned long printPeriod = 1000; //Refresh rate
unsigned long previousMillis = 0;
void setup() {
  Serial.begin(115200);    // start the serial port
}
void loop() {
  RunningStatistics inputStats;
  inputStats.setWindowSecs( windowLength );
  while ( true ) {
   Sensor = analogRead(A5);
  inputStats.input(Sensor);  // log to Stats function
  if ((unsigned long)(millis() - previousMillis) >= printPeriod) {
    previousMillis = millis();   // update time every second
    Serial.print( "\n" );
    current_Volts = intercept + slope * inputStats.sigma(); //Calibartions for offset and amplitude
    current_Volts = current_Volts * (40.3231);             //Further calibrations for the amplitude
    if (current_Volts < 70.00) {
      current_Volts = 0;
    }
    Serial.print( "\tVoltage: " );
    Serial.print( current_Volts ); //Calculation and Value display is done the rest is if you're using an OLED display
  }

  }
}

[/code]

Scusa, ma perché non usi una libreria per quel modulo? Tipo QUESTA, dove c'è anche un esempio che puoi usare, o un esempio come QUESTO, senza stare a fare cose strane con sketch presi chissà dove?

docdoc:
Scusa, ma perché non usi una libreria per quel modulo? Tipo QUESTA, dove c'è anche un esempio che puoi usare, o un esempio come QUESTO, senza stare a fare cose strane con sketch presi chissà dove?

Ciao,avevo già provato questa libreria funziona ma i valori sono bassi oscillano tra 4 v a 18 volt quelli
visualizzati sulla seriale.

Così com’è scritto alla fine i due comandi

RunningStatistics inputStats;
inputStats.setWindowSecs( windowLength );

vengono eseguiti una sola volta, quindi tanto vale metterli dentro alla setup()

Poi, ti ricordo che un programma Arduino è comunque C/C++ e di nascosto il core aggiunge più o meno questo:

void main()
{ setup();     // eseguito una volta sola
  while( 1 )   // ciclo infinito 1=true
  { loop();    // eseguito all'infinito
  }
}

Quindi la loop() è già dentro ad un ciclo while infinito
Levando quelle due righe da eseguire 1 volta sola… togli quel while(true) ed hai lo stesso programma

void setup() 
{ Serial.begin(115200);    // start the serial port
  RunningStatistics inputStats;
  inputStats.setWindowSecs( windowLength );
}
void loop()   // dentro a ciclo infinito
{ 
  if ( millis() - previousMillis >= printPeriod ) 
  { previousMillis = millis();                              // update time every second
    Sensor = analogRead(A5);                                // spostate dentro if
    inputStats.input(Sensor);                               // log to Stats function
    Serial.print( "\n" );
    current_Volts = intercept + slope * inputStats.sigma(); // Calibartions for offset and amplitude
    current_Volts = current_Volts * 40.3231;                // Further calibrations for the amplitude
    if (current_Volts < 70.00) current_Volts = 0;
    Serial.print( "\tVoltage: " );
    Serial.print( current_Volts );                          // Calculation and Value display is done the rest is if you're using an OLED display
  }
}

Mi chiedo poi perchè continui a leggere il sensore su A5 se poi devi stampare solo ogni secondo
Metti anche la lettura (le due righe) dentro all'if del millis()
Arduino è veloce, non è detto che riesca a campionare in analogico il dato sul pin A5. L'ADC ha bisogno di un certo tempo (piccolo ma non 0) tra una lettura e l'altra

Ciao,ora sto provando con una libreria molto più comprensibile ma sempre con risultati sconfortanti. :frowning:

[code]
#include "ZMPT101B.h"
ZMPT101B voltageSensor(A0);
void setup()
{
  Serial.begin(9600);
  Serial.println("Calibrating");
  delay(100);
  voltageSensor.calibrate();
  Serial.println("Done!");
  delay(1000 );
}
void loop()
{
  float U = voltageSensor.getVoltageAC();
  Serial.println(String("U = ") + U + " V"); 
  delay(100);
}

[/code]
Risultati seriale senza ingressi.
U = 4.30 V
U = 4.50 V
U = 4.27 V
U = 4.04 V

con 220 v CA.
U = 15.95 V
U = 17.70 V
U = 17.66 V
U = 17.76 V

Ma scusa la domanda, tu hai controllato il trimmer? Intendo questo:

Perché leggo nelle specifiche del modulo che quello è il potenziometro di taratura. Se lo ruoti cosa vedi come misura?

PS: stai mettendo due tag "code" nel tuo codice, modifica i tuoi post e lascia un solo "code" di apertura prima del codice ed un solo "/code" di chiusura dopo il codice.

docdoc:
Ma scusa la domanda, tu hai controllato il trimmer? Intendo questo:

Perché leggo nelle specifiche del modulo che quello è il potenziometro di taratura. Se lo ruoti cosa vedi come misura?

PS: stai mettendo due tag "code" nel tuo codice, modifica i tuoi post e lascia un solo "code" di apertura prima del codice ed un solo "/code" di chiusura dopo il codice.

Si ho fatto delle misurazioni,ma da quello che ho capito non fa delle vere variazioni di tensione il trimmer modifica solo l'onda di ....

wingamesyun:
....
con 220 v CA
....

>wingamesyun: ... sei già stato avvertito una volta di NON lavorare sulla tensione di rete (... non hai le conoscenze per farlo in sicurezza) e di NON aprire thread che ne parlino; questo è il secondo ed ultimo avvertimento, il prossimo thread in tal senso verrà direttamente eliminato e a te sarà applicato il BAN.

Guglielmo

Mi sono state chieste spiegazioni in merito alla chiusura di questo thread che, apparentemente, parla solo di software ...

... che il thread parli solo di come scrivere il codice o meno, NON ha alcuna importanza. L'OP sta facendo un progetto utilizzando un sensore "invasivo" (ha due morsetti a cui collegare i fili) e lo sta, per sua stessa ammissione (vd. post #5) utilizzando sulla rete 230V, tagliando quindi fili e mettendo le mani sulla rete elettrica.

Per il punto 15 del REGOLAMENTO, i cui principi sono ben chiariti nel punto 17.1, qualunque thread in cui, in un modo od in un altro, si vanno a mettere direttamente le mani sulla rete elettrica (quindi su linee oltre la "bassissima tensione") non è ammesso e viene chiuso.

Spero sia chiaro quindi il motivo della chiusura e spero di non dover tornare in futuro sull'argomento. Grazie :slight_smile:

Guglielmo