Errore quando accendo il display

Salve a tutti sono nuovo del forum quindi se ho sbagliato qualcosa correggetemi pure; avrei bisogno del vostro aiuto per un problema al quale non riesco a trovare soluzione: sto creando uno sketch che con il sensore di corrente ASC712 misura la corrente di un'impianto domestico a 220V e lo mostra sul display LCD che si accende quando premo un pulsante; il problema sorge quando accendo il display perchè la misurazione non è più precisa perchè oscilla tra valori anche molto distanti a differenza di quando il display è spento. Probabilmente è la libreria <Filters.h> che crea problemi, ma non saprei non ne capisco molto. Vi allego lo sketch sperando che qualcuno mi sappia dare una mano. Grazie.

#include <Filters.h>
#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
float testFrequency = 50;                     // test signal frequency (Hz)
float windowLength = 20.0/testFrequency;     // how long to average the signal, for statistist
int sensorValue = 0;
float intercept = -0.035; // to be adjusted based on calibration testing
float slope = 0.0145; // to be adjusted based on calibration testing
float current_amps; // estimated actual current in amps
float costo = 0 ;
float costo_totale;
int schermo = 6;
int pul = 7;
int val = 0; 
int stato = 0;
long t0 = 0;
long t = 0;
int conteggio;


unsigned long printPeriod = 2000; 
unsigned long previousMillis = 0;



void setup() {
  Serial.begin( 9600 );    // start the serial port
 lcd.begin(16, 2);  
 pinMode(schermo,OUTPUT);
 pinMode(pul, INPUT);
 conteggio = LOW;
}

void loop() {

  RunningStatistics inputStats;                 // create statistics to look at the raw test signal
  inputStats.setWindowSecs( windowLength );
   
  while( true ) {   
    sensorValue = analogRead(A0);  // read the analog in value:
    inputStats.input(sensorValue);  // log to Stats function
        
    if((unsigned long)(millis() - previousMillis) >= printPeriod) {
      previousMillis = millis();   // update time
  

  // display current values to the screen
      Serial.print( "\n" );
      // output sigma or variation values associated with the inputValue itsel
     // Serial.print( "\tsigma: " ); Serial.print( inputStats.sigma() );
      // convert signal sigma value to current in amps
      current_amps = intercept + slope * inputStats.sigma();
      if(current_amps <= 0){
        current_amps = 0;
      }
  
      Serial.print( "amps: " ); Serial.print( current_amps );
      costo = (current_amps*220*0.12)/3600000;
      Serial.print( "\t€: " ); Serial.print( costo ); 
      costo_totale = costo + costo_totale ;
      Serial.print( "\tcosto: " ); Serial.print( costo_totale );
  
    }

    

val = digitalRead(pul);   


 
if((val == HIGH) && (conteggio == LOW)){
  conteggio = HIGH;
  t0 = millis();
   Serial.println("start");
}
if((val == LOW) && (conteggio == HIGH)){
  conteggio = LOW;
  t = millis()-t0;
  Serial.println(t);
}      
if ((t <= 300) && (t != 0) && ((stato == 0) || (stato == 2))){
         stato = 1;
         Serial.println(stato);
         t = 0;}

if ((t <= 300) && (t != 0) && ((stato == 1) || (stato == 2))){
         stato = 0;
         Serial.println(stato);
         t = 0;}

if ((t < 5000) && (t > 1000) && (t != 0)){
         stato = 2;
         Serial.println(stato);
         t = 0;}

if (stato == 1){
       digitalWrite(schermo, HIGH); 
       lcd.setCursor(0, 0);  
       lcd.print("A:");
       lcd.setCursor(2, 0);  
       lcd.print(current_amps);
       lcd.setCursor(8, 0);  
       lcd.print("Cp:");
       lcd.setCursor(11, 0);  
       lcd.print(costo);
       lcd.setCursor(0, 1);  
       lcd.print("Ct:");
       lcd.setCursor(3, 1);  
       lcd.print(costo_totale);}


if (stato == 0){
       digitalWrite(schermo, LOW); 
       lcd.clear(); }

if (stato == 2){
       digitalWrite(schermo, HIGH); 
       lcd.setCursor(0, 0);  
       lcd.print("A:");
       lcd.setCursor(2, 0);  
       lcd.print(current_amps);
       lcd.setCursor(8, 0);  
       lcd.print("Cp:");
       lcd.setCursor(11, 0);  
       lcd.print(costo);
       lcd.setCursor(0, 1);  
       lcd.print("Ct:");
       lcd.setCursor(3, 1);  
       lcd.print(costo_totale);
       costo_totale = 0.0;
       stato = 1;
      }
    }
   }

sensore_corrente_3.ino (3.47 KB)

Buongiorno,
essendo il tuo primo post nella sezione Italiana del forum, nel rispetto del nostro regolamento, ti chiedo cortesemente di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione il su citato REGOLAMENTO ... Grazie. :slight_smile:

... poi, in conformità al suddetto regolamento, punto 7, devi editare il tuo post (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More -> Modify che si trova in basso a destra del tuo post) e racchiudere il codice all'interno dei tag CODE (... sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra).

In pratica, tutto il tuo codice dovrà trovarsi racchiuso tra due tag:

[code] _il _tuo_ codice_ [/code]

così da non venire interpretato e non dare adito alla formazione di caratteri indesiderati o cattiva formattazione del testo.

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposito thread e sistemato il codice come da regolamento, nessuno ti potrà rispondere, quindi ti consiglio di fare il tutto al più presto. :wink:

P.P.S: Presa attenzione anche al punto 15 e sottopunti perché con tal sensore sei in violazione del regolamento e credo che il thread non potrà proseguire

ciao e grazie per avermi corretto, ho seguito i punti che mi hai indicato credo correttamente, riguardo al punto 15 probabilmente mi sono espresso male: il sensore lo voglio applicare alla rete casalinga si, ma attraverso un alimentatore a corrente continua (di una stampante 3d), cioè io voglio misurare la corrente dopo l'alimentatore, corrente che sarà a 24v ormai quindi innoqua per l'uomo. Se riterrai in ogni caso la situazione pericolosa fai il tuo dovere capisco perfettamente che con la vita non si scherza.

Credo che avendo chiarito qusto punto "critico" non ci siano più problemi nel proseguire, ma aspettiamo comunque in moderatore che decida in merito alla questione.
Intanto vorrei chiederti il tipo di display e, soprattutto, come lo alimenti, così a naso potrebbe essere un assorbimento troppo elevato del display che ti fa sballare le misure, magari interferisce con i riferimento per le misure analogiche (AREF)

22andrea22:
... il sensore lo voglio applicare alla rete casalinga si, ma attraverso un alimentatore a corrente continua (di una stampante 3d), cioè io voglio misurare la corrente dopo l'alimentatore, corrente che sarà a 24v ormai ...

Mi sa che NON ti sono chiari alcuni concetti ... semplifichiamo ...

... la corrente è un flusso di elettroni che scorre all'interno del cavo quando c'è un carico che assorbe, appunto, corrente, quindi ... NON puoi mettere un alimentatorino collegato alla rete e pensare di misurare la "corrente" che scorre nella rete a monte dell'alimentatore ! Il massimo che puoi fare, con un alimentatore, è misurare se c'è tensione di rete o meno, quindi la presenza della tensione in uscita dal trasformatore.

Con il sensore messo come dici tu, tutt'al più, puoi misurare al corrente che qualcuno assorbe dall'alimentatore (es. se ci colleghi la stampante 3D, misuri quanto questa assorbe a 24V).

Chiarisci quindi BENE quello che vuoi fare perché di misure mettendo le mani sulla tensione di rete qui NON se ne parla, mentre misurare e mettere le mani sui 24V va benissimo. :slight_smile:

Guglielmo

fabpolli:
Credo che avendo chiarito qusto punto "critico" non ci siano più problemi nel proseguire, ma aspettiamo comunque in moderatore che decida in merito alla questione.
Intanto vorrei chiederti il tipo di display e, soprattutto, come lo alimenti, così a naso potrebbe essere un assorbimento troppo elevato del display che ti fa sballare le misure, magari interferisce con i riferimento per le misure analogiche (AREF)

il display è un classico display 16x2 non comandato via spi (mi pare si dica così) praticamente è collegato ad arduino attraverso i vari pin senza utilizzare alcun modulo; e viene alimentato dal pin 6 invece che dal pin 5v in modo da poterlo spegnere.

Ottimo modo per friggere il pin, hai provato a misurare quanta corrente assorbe il tuo display con la retroilluminazione accesa? Normalmente ben oltre il limite consentito dal singolo pin. In ogni caso alimentare qualcosa da un pin digitale è una pratica errata.
Se vuoi pilotar l'accensione del display da un pin devi usare un transistor, Arduino pilota il transisor e questo alimenta o meno il display.

gpb01:
Mi sa che NON ti sono chiari alcuni concetti ... semplifichiamo ...

... la corrente è un flusso di elettroni che scorre all'interno del cavo quando c'è un carico che assorbe, appunto, corrente, quindi ... NON puoi mettere un alimentatorino collegato alla rete e pensare di misurare la "corrente" che scorre nella rete a monte dell'alimentatore ! Il massimo che puoi fare, con un alimentatore, è misurare se c'è tensione di rete o meno, quindi la presenza della tensione in uscita dal trasformatore.

Con il sensore messo come dici tu, tutt'al più, puoi misurare al corrente che qualcuno assorbe dall'alimentatore (es. se ci colleghi la stampante 3D, misuri quanto questa assorbe a 24V).

Chiarisci quindi BENE quello che vuoi fare perché di misure mettendo le mani sulla tensione di rete qui NON se ne parla, mentre misurare e mettere le mani sui 24V va benissimo. :slight_smile:

Guglielmo

si io voglio misurare la tensione a 24v trascurando quelli che sono i consumi dell'alimentatore anche perchè non credo abbia un grande assorbimento.

fabpolli:
Ottimo modo per friggere il pin, hai provato a misurare quanta corrente assorbe il tuo display con la retroilluminazione accesa? Normalmente ben oltre il limite consentito dal singolo pin. In ogni caso alimentare qualcosa da un pin digitale è una pratica errata.
Se vuoi pilotar l'accensione del display da un pin devi usare un transistor, Arduino pilota il transisor e questo alimenta o meno il display.

dici che l'errore delle misurazioni è dato dal troppo assorbimento del pin?

22andrea22:
si io voglio misurare la tensione a 24v trascurando quelli che sono i consumi dell'alimentatore anche perchè non credo abbia un grande assorbimento.

Di nuovo, quanto scrivi NON ha senso ... cosa ha a che vedere la misura di "tensione" dei 24V forniti dall'alimentatore con il suo consumo di "corrente" ? ? ? :o

Spiega BENE che tipo di misure vuoi fare o devo bloccare il thread.

Guglielmo

gpb01:
Di nuovo, quanto scrivi NON ha senso ... cosa ha a che vedere la misura di "tensione" dei 24V forniti dall'alimentatore con il suo consumo di "corrente" ? ? ? :o

Spiega BENE che tipo di misure vuoi fare o devo bloccare il thread.

Guglielmo

si scusami volevo dire che voglio misurare la corrente cioè l'amperaggio che assorbe la stampante escludendo l'alimentatore. Non sono molto ferrato scusami.

Quindi, tu hai una stampante 3D alimentata a 24V e vuoi misurare il suo assorbimento durante il lavoro ... ho capito bene?

Ovviamente NON avrai mai un valore costante, ma un valore che cambia in continuazione in funzione di ciò che la stampante sta facendo (basta che usa uno o due stepper motor in tempi differenti e l'assorbimento cambia).

Conferma che è questo che vuoi fare, grazie.

Guglielmo

gpb01:
Quindi, tu hai una stampante 3D alimentata a 24V e vuoi misurare il suo assorbimento durante il lavoro ... ho capito bene?

Ovviamente NON avrai mai un valore costante, ma un valore che cambia in continuazione in funzione di ciò che la stampante sta facendo (basta che usa uno o due stepper motor in tempi differenti e l'assorbimento cambia).

Conferma che è questo che vuoi fare, grazie.

Guglielmo

si hai capito bene voglio fare proprio quello e si sono consapevole che il consumo non sarà constante, ma varierà soprattutto in funzione dell'accensione della cartuccia dell'hotend e del piano di stampa.

22andrea22:
dici che l'errore delle misurazioni è dato dal troppo assorbimento del pin?

Non so, in ogni caso il limite massimo di assorbimento di un pin è di 40mA valore da cui star lontano, il problema del calcolo errato è l'ultimo dei problemi, se tu assorbi 100/120mA circa è già un mezzo miracolo che tu non abbia bruciato il pin (o tutta la MCU), se poi l'assorbimento è anche più elevato (dipende dallo schermo) rischi di superare il limiti d'assorbimento per gruppo di porte danneggiando l'intera MCU.
Comincia a risolvere questo problema che è reale e pericoloso per la MCU visto che lavori fuori dalle specifiche, poi se non si è risolto affronterai il problema dei valori non coerenti.

fabpolli:
Non so, in ogni caso il limite massimo di assorbimento di un pin è di 40mA valore da cui star lontano, il problema del calcolo errato è l'ultimo dei problemi, se tu assorbi 100/120mA circa è già un mezzo miracolo che tu non abbia bruciato il pin (o tutta la MCU), se poi l'assorbimento è anche più elevato (dipende dallo schermo) rischi di superare il limiti d'assorbimento per gruppo di porte danneggiando l'intera MCU.
Comincia a risolvere questo problema che è reale e pericoloso per la MCU visto che lavori fuori dalle specifiche, poi se non si è risolto affronterai il problema dei valori non coerenti.

ho aggiunto un transistor come mi hai consigliato, ma il problema persiste. Qualche altro suggerimento?