cosa metto come sensore volt e ampere?

ciao a tutti, ho un alimentatore 0 30 volt 0 6 A che volevo mettere come indicazione un lcd.
visto gli ce il 712 e il partitore di tensione con 2 resistenze sono molto instabili, volevo mettere qualcosa di
un po' piu ' preciso ma senza spender troppo ...cosa posso metttere?

@pippero, per me non si capisce quello che chiedi. Spiegati meglio, per favore.

Vuole fare con Arduino un voltamperometro da mettere nell'alimentatore stabilizzato.

si, ed grazie dell vostra attenzione, intendevo chiedere su che modulo usare che sia abbastanza preciso

il partitore di tensione con 2 resistenze sono molto instabili

perché un partitore resistivo é molto instabile?
Ciao Uwe

i valori mi sballano sia in volt che ampere ecco il listato ed logicamente lento

#include <ACS712.h>
//inclusione della libreria
ACS712 sensor(ACS712_30A, A0);
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <OneWire.h>
#include <DallasTemperature.h>

#define ONE_WIRE_BUS 2 // Il terminale data del sensore è connesso
#define FAN 5 //IRF520 MOS Driver SUL PIN 5
#define over 4
#define rele 12
#define fermo 3
OneWire oneWire(ONE_WIRE_BUS); //Imposta la comunicazione oneWire per comunicare
DallasTemperature sensors(&oneWire); // Passaggio oneWire reference alla Dallas Temperature.
LiquidCrystal_I2C lcd(0x27, 16, 2); // set the LCD address to 0x27 for a 16 chars and 2 line display

// definizione dei pin
int ACS712 = A1;
int partitore = A0;
int ValPinBatt;
float Vpin_perc;
float Vbatt;
float calc_res;
int  val = 0;


//definizione valori integer e float per calcolo valori corrente e tensione

float temp = 0;
int sensorValue = 0; 
int outputValue = 0;
float vout = 0.0;
float amps = 0.0; 
float vref = 4.98; 
int valV = 0;
float volts = 0.0;
float R1 = 93300.0;   // !! Valore della resistenza R1 !!
float R2 = 9980.0;    // !! Valore della resistenza R2 !!
float corr = 0.50;    // Valore di correzione lettura tensione

int fanSpeed;  //VARIABILE VELOCITà VENTOLA
int fanpwm;  //VARIABILE pwm
int fanSpeedPercent; //VARIABILE % VELOCITà VENTOLA




void setup() {
  
  lcd.init();                      // initialize the lcd
  lcd.backlight();
  sensors.requestTemperatures(); // Invia il comando di lettura delle temperatura
  sensors.begin();    // Start up the library
  pinMode(over, INPUT);
  pinMode(rele, OUTPUT);
  pinMode(fermo,OUTPUT);
  calc_res = (R1 + R2) / R2;
 sensor.calibrate();


  // Test LCD

  lcd.print("Test LCD OK") ; // messaggio di test
  delay(500); // pausa di 2 secondi

  lcd.clear(); // cancellazione display
  delay(10); // pausa per effettuazione operazione
}

void loop() {
  /*Calcolo la temperatura  =============================================*/
  sensors.requestTemperatures(); // Send the command to get tem
  temp = (sensors.getTempCByIndex(0));
  float TEMP = sensors.getTempCByIndex(0);  //VARIABILE FLOTTANTE PER LETTURA TEMPERATURA

for(int i=0;i<100;i++)
  {
  amps =amps+( 0.074 * analogRead(ACS712) - 37.85);
  if (amps < 0.10) amps = 0.0;
 
 
 }
 amps =amps/100;

 
  for(int i=0;i<2000;i++)
  {
 
  valV = analogRead(partitore); //Lettura del valore fornito dal partitore   
  vout = (valV*vref)/512;    //Conversione del valore in di 
  volts = (vout / (R2/(R1+R2)))*corr;  //Calcolo valore letto
delay(1);
 }
  volts = volts+volts /2000;

  val = digitalRead(over);
  if (TEMP < 27) { //SE TEMP è < 23.8 °C LA VENTOLA è FERMA
    analogWrite(FAN, 0);  // comando pin off
    fanSpeed = 0;
  analogWrite(fermo , LOW);
  }
  
  if ((TEMP >= 27.5) && (TEMP <= 50)) {   // setta temp min/max
    fanSpeed = map(TEMP, 27.5, 50, 100, 255);
    fanpwm = map(TEMP, 27.5, 50, 70, 255);
    fanSpeedPercent = (TEMP - 27.5) * 99 / (50 - 27.5); // Solo per essere sicuri di non avere valori incongruenti
    fanSpeedPercent = constrain(fanSpeedPercent, 0, 99);
    analogWrite(FAN, fanpwm);
   } 
    if (TEMP > 50) {
      analogWrite(FAN, 255);
    analogWrite(fermo , HIGH);
    }
  
  lcd.setCursor(0, 0); // setta il cursore sulla prima linea display
  lcd.print("V "); // scrive la parola VOLTS:
  lcd.print(volts , 1);  // riporta il valore calcolato dei volts
  lcd.setCursor(8, 0);

  lcd.setCursor(0, 1); //setta il cursore sulla prima linea display
  lcd.print("A "); //scrivi la parola AMPS:
  lcd.print(amps, 1);    // riporta il valore calcolato degli ampere

  if (fanSpeedPercent > 9) lcd.print(" ");
  lcd.setCursor(7, 1);
  if (fanSpeedPercent < 10) lcd.print(" ");
  lcd. print(fanSpeedPercent);
  lcd.setCursor(9, 1);
  lcd.print ("%");
  lcd.setCursor(8, 0);
  lcd.print (temp,1);
  lcd.print(char(223));


  if (val == HIGH) {
    lcd.setCursor(10, 1); //setta il cursore sulla prima linea display
    lcd.print("     "); //scrivi la parola AMPS:
  }
  else {

    
    
    lcd.setCursor(10, 1); //setta il cursore sulla prima linea disp
    lcd.print("LIMIT");
   

  }
  if (volts > 12) {
    digitalWrite(rele, HIGH); // comando pin off
    lcd.setCursor(15, 0); //setta il cursore sulla prima linea disp
    lcd.print("H");
  }
  if (volts < 12) {
    digitalWrite(rele, LOW); {
      lcd.setCursor(15, 0); //setta il cursore sulla prima linea disp
      lcd.print("L");

    }
  }
}

Che non funziona non vuole significare che la causa sia l' elettronica. Ognitanto la causa é anche uno sbaglio nella programmazione.

Adesso non so che valori hai preso per fare il partitore.
Se ha un valore troppo grande la conversione A/D é sbagliata perche il condensatore Sample & Hold interno al ATmega non si carica al valore finale.

Soluzioni:

  • Fare il partitore di valori abbastanza bassi in modo che abbia una restenza sostitutiva di ca 10kOhm.
  • Mettere un condensatore in paralello all'entrata
  • Fare piú letture e prendere solo l'ultima.
  • Mettere tra partitore e entrata un amplificatore operazionale - vedi inseguitore di tensione

Cioa Uwe

Fai sempre così:
analogRead(IN); valore=analogRead(IN);

mettero un inseguitore, 100k (circa ) e 10 (circa ) sono troppi per un alimentatore da 0 a 30 volt?
ah dimenticavohi messo anche uno zener da 5,1 volt tra l'input di arduino e gnd..per sicurezza,

pippero1979:
mettero un inseguitore, 100k (circa ) e 10 (circa ) sono troppi per un alimentatore da 0 a 30 volt?
ah dimenticavohi messo anche uno zener da 5,1 volt tra l'input di arduino e gnd..per sicurezza,

Cosa sono quei valori di resistenze?
Uno Zener incomincia a condurre prima dei 5,1V. Per questo la tensione analogica non potrá andare fino a 5V, neanche 4,5V.

Ciao Uwe

sono i valori effettivi misurati col tester in ohm, lo zener l ho messo tra A0 e gnd per proteggere il pin di arduino, ho sbagliato a metterlo?

pippero1979:
sono i valori effettivi misurati col tester in ohm, lo zener l ho messo tra A0 e gnd per proteggere il pin di arduino, ho sbagliato a metterlo?

Hai 2 resistenze, una da 100kOhm e l' altra da 10 Ohm?

Non sbagli ma limiti un po la tensione che puoi misurare. Meglio sarebbe mettere un diodo skottky dal entrata analogica al pin 5V (il catodo verso i 5V). C'é già diodo interno ma uno esterno puó essere dimensionato piú grande (come corrente massima ammessa).
Ciao Uwe

pippero1979:
ciao a tutti, ho un alimentatore 0 30 volt 0 6 A che volevo mettere come indicazione un lcd.
visto gli ce il 712 e il partitore di tensione con 2 resistenze sono molto instabili, volevo mettere qualcosa di
un po' piu ' preciso ma senza spender troppo ...cosa posso metttere?

se hai la uno devi mettere un partitore che a volt massimi da quasi 5 volt.
personalmente metterei un trim multi giri da 100k e 2 resistenze da 10k circa collego il centrale del trim all'arduino (dopo la taratura ovviamente) le resistenze una al piu e l'altra al meno e poi al trim,
+/resistore/trim/resistore/- poi metto l'alimentatore a volt massimi e giro il trim fino ad ottenere 5 volt esatti sul centrale misurati con un buon tester,
le resistenze sono una precauzione per evitare il cortocircuito se il trim viene girato completamente da un "lato"

Non so se si puo’ dire su questo forum, comunque tieni conto che ci sono anche delle soluzioni “precotte” come questa.

Marco

no le resistenze sono da 100k e 10 k, ho provato anche una da 68k ma la misura non resta stabile,
ora provo con un lm358 mettendo un inseguitore , e un piccolo condensatore all ingresso tipo da 10nF
ridurre le resistenze ,mettendo una da 60kcirca(vedo cosa ho)e 10 k...
poi vi informo

su v in collego il partitore, e su v out metto il pin A0
corretto?

pippero1979:
no le resistenze sono da 100k e 10 k, ho provato anche una da 68k ma la misura non resta stabile,
ora provo con un lm358 mettendo un inseguitore , e un piccolo condensatore all ingresso tipo da 10nF
ridurre le resistenze ,mettendo una da 60kcirca(vedo cosa ho)e 10 k...
poi vi informo
https://www.electroyou.it/fidocad/cache/354a9cf16761086dcf9b8d29a2390527a817189a_3.png
su v in collego il partitore, e su v out metto il pin A0
corretto?

non star li a trovare soluzioni "insolite" se l'analogRead è "ballerina" un motivo ci sarà,
qualche errore madornale c'è, o un chip/qualcosa che disturba :confused:

pippero1979:
no le resistenze sono da 100k e 10 k, ho provato anche una da 68k ma la misura non resta stabile,
ora provo con un lm358 mettendo un inseguitore , e un piccolo condensatore all ingresso tipo da 10nF
ridurre le resistenze ,mettendo una da 60kcirca(vedo cosa ho)e 10 k...
poi vi informo
https://www.electroyou.it/fidocad/cache/354a9cf16761086dcf9b8d29a2390527a817189a_3.png
su v in collego il partitore, e su v out metto il pin A0
corretto?

Non devi fare tutte le soluzioni ma solo una.
Quel partitore con un operazionale va bene. l'operazionale scelto no perché non puó dare piú di ca 3,5V in uscita (con 5V di alimentazione) devi usare un operazionale RAIL to RAIL oppure dimensionare il paritore in modo che la tensione in uscita resta sotto questa soglia. Ha senso usare i 3,3V come riferimento der ADC.
Anche fare il partitore con resistenze piú piccole va bene. (resistenza delle 2 resistenze in serie sotto i 10kOhm)
Condensatore: Non é praticabile se la tensione varia velocemente, ma dopo l'operazionale non ha senso ne da problemi.

Ciao Uwe

elrospo:
non star li a trovare soluzioni "insolite" se l'analogRead è "ballerina" un motivo ci sarà,
qualche errore madornale c'è, o un chip/qualcosa che disturba :confused:

Sí, il motivo c'é: Il partitore ha una resistenza troppo alta. Leggendo una volta la tensione e dopo la corrente la lettura della tensione é influenzata dalla misura della corrente.

Ciao uwe

Sulimarco:
Non so se si puo’ dire su questo forum, comunque tieni conto che ci sono anche delle soluzioni “precotte” come questa.

Marco

Certe soluzioni commerciali sono una soluzione per il requisito dato. Sopratutto se fanno quello che serve, costano poco e non si deve investire tempo nella realizzazione.

Ciao Uwe

ok , a questo punto mi potete suggerire se ce per fare un volt\amperometro che funzioni bene, quelli che ho trovato sono tutti come l ho trovato io...