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
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
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...