Sari la conținut
ELFORUM - Forumul electronistilor

Voltmetru ampermetru digital


ionutz2013

Postări Recomandate

Salutare! Pentru cine vrea o jucarie frumoasa bazata pe arduino, prezint un voltmetru-ampermetru digital facut de mine folosind ca microcontroler o clona de atmega 328p mai exact o clona de arduino nano. Schema, codul si montajul realizat de mine se poate vedea mai jos. Inca nu am testat bine ampermetrul. Iar pentru voltmetru recomand acel potentiometru de 10k sa se foloseasca un potentiometru de precizie, pentru a calibra mai usor voltmetru sa afiseze o tensiune cat mai exacta.

20230411_212329.jpg

20230411_213751.jpg

ARDU_watt_meter_LCD_16X2.ino

Link spre comentariu
  • 5 luni mai târziu...
  • Răspunsuri 12
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • daniels

    5

  • PINTI

    2

  • ionutz2013

    2

  • antonvasileeee

    1

Top autori în acest subiect

Imagini postate

Cu arduino sau cu orice altceva:

// include the library
#include <LiquidCrystal.h>


// initialize the interface pins
LiquidCrystal lcd(2,3,4,5,6,7);
int a,b,c;
long volt,current,power,ah;
// the 8 arrays that form each segment of the custom numbers
unsigned long msec = 0;
float time = 0.0;
int sample = 0;
float totalCharge = 0.0;
float averageAmps = 0.0;
float ampSeconds = 0.0;
long ampHours = 0;

void setup()
{
 
  lcd.begin(16, 2);
Serial.begin(9600);
}


void loop()

{
 for(int i=0;i<200;i++){
c = analogRead(A1);
a = analogRead(A0);
volt=volt+a;
  current=current+c;
 delay(1);
 }
 current=(current/200-514);
  if(current<1)current=0;
  current=current*15;
   volt=volt/30;
   power=(volt*current)/1000;
 //--------------------  
     sample = sample + 1;
  
  msec = millis();
  
  
  
 time = (float) msec / 1000.0;
  
 totalCharge = totalCharge + (current);
  
 averageAmps = totalCharge / sample;
  
 ampSeconds = averageAmps*time;

 ampHours = ampSeconds/3600;

 //--------------
    Serial.print(volt);
      Serial.print("  ");
        Serial.print(current);
Serial.print("  ");
        Serial.print(power);

        Serial.print("  ");
        Serial.print(ampHours);
         Serial.print("  ");
        Serial.println(time);
        
 lcd.setCursor(6,0);
  lcd.print("V");
   b=volt%10;
   lcd.setCursor(5,0);
  lcd.print(b);
   b=(volt/10)%10;
   lcd.setCursor(4,0);
  lcd.print(b);
  lcd.setCursor(3,0);
  lcd.print(".");
   b=(volt/100)%10;
  lcd.setCursor(2,0);
  lcd.print(b);
  b=(volt/1000)%10;
 lcd.setCursor(1,0);
  if(volt>999)lcd.print(b);
 else lcd.print(" ");
  
  lcd.setCursor(14,0);
  lcd.print("A");
  
   b=current%10;
     lcd.setCursor(13,0);
  lcd.print(b);
    b=(current/10)%10;
     lcd.setCursor(12,0);
  lcd.print(b);
   lcd.setCursor(11,0);
  lcd.print(".");
   b=(current/100)%10;
     lcd.setCursor(10,0);
  lcd.print(b);
 

   lcd.setCursor(6,1);
  lcd.print("W");
   b=power%10;
   lcd.setCursor(5,1);
  lcd.print(b);
   b=(power/10)%10;
   lcd.setCursor(3,1);
  lcd.print(b);
  lcd.setCursor(4,1);
  lcd.print(".");
   b=(power/100)%10;
  lcd.setCursor(2,1);
  if(power>99)lcd.print(b);
  else lcd.print(" ");
  b=(power/1000)%10;
  
  lcd.setCursor(1,1);
  if(power>999)lcd.print(b);
  else lcd.print(" ");
//------------
  lcd.setCursor(14,1);
  lcd.print("AH");
  
   b=ampHours%10;
     lcd.setCursor(13,1);
  lcd.print(b);
    b=(ampHours/10)%10;
     lcd.setCursor(12,1);
  lcd.print(b);
   lcd.setCursor(11,1);
  lcd.print(".");
   b=(ampHours/100)%10;
     lcd.setCursor(10,1);
  lcd.print(b);
     b=(ampHours/1000)%10;
     lcd.setCursor(9,1);
  lcd.print(b);
 
  delay(100);
  
}  

 

Link spre comentariu

Am vrut sa fac pentru o sursa de laborator reglabila 0-30v sa afiseze atat tensiunea la iesire cat si curentul cinsumat de duverse device-uri conectate la acea sursa. Cat de masurare crwd ca minimul e undeva la r00 500mA. La un led nu imi indica nimic dar in schimb am testat cu el consumul unui amplificator audio de aprox 3w atat in gol cat si in sarcina. Fara semnal imi arata 0 iar cu semnal maxim indica un consum de vreo 0.5a la o tensiune de 12v. Nu am consumatori de la 500mA in sus sa pot facr mai multe teste. Ce am mai testat a fost jn bec auto de 5w alimentat la 12v iar consumul afisat de acest montaj era aproape la fel cu ampermetru de pe o sursa chinezeasca. +- 01mA. Proiectul cu sursa de laborator nu m-am mai ocupat de el din lipsa de timp. Hexu asa l-am luat nu l-am modificat. 

Editat de ionutz2013
Link spre comentariu

@daniels ACS712 sau mai bine zis toata seria ACS sunt senzori de curent cu efect hall izolati galvanic, nu sunt senzori pentru a masura curenti mici sau variatii de curenti mici cu precizie. Le folosesti cand vrei sa obtii izolatie galvanica si nu ai nevoie de precizie prea mare ci doar de o valoare grosolana in rest varianta cu rezistenta de shunt si un amplificator adecvat ( seria INAxxx ) este net superioara.

Link spre comentariu
  • 7 luni mai târziu...

Am facut un multimetru cu INA226 care functioneaza cu softul de mai jos care masoara curenti pana la 0.8A. Cum pot declara u shunt de 0.01ohmi cu care as putea masura curenti pana la 8.19A?

#include <INA226_WE.h>  // http://rcl-radio.ru/wp-content/uploads/2023/03/INA226_WE-master.zip
#include <LiquidCrystal_I2C.h> // // http://forum.rcl-radio.ru/misc.php?action=pan_download&item=45&download=1 
LiquidCrystal_I2C lcd(0x27,16,2);  // Устанавливаем дисплей
INA226_WE ina226 = INA226_WE(0x40);
 
  float shuntVoltage_mV = 0.0;
  float loadVoltage_V = 0.0;
  float busVoltage_V = 0.0;
  float current_mA = 0.0;
  float power_mW = 0.0; 
  float ah;
  unsigned long times;
  unsigned long z;
 
void setup() {
  cli();
  TCCR1A = 0;
  TCCR1B = 0;
  TCNT1 = 0;
  OCR1A = 31249;
  TCCR1B |= (1 << WGM12);
// Prescaler 1024
  TCCR1B |= (1 << CS12) | (1 << CS10);
  TIMSK1 |= (1 << OCIE1A);
  sei();
  Serial.begin(9600);
  Wire.begin();
  ina226.init();
  pinMode(A0,INPUT_PULLUP); 
  ina226.setAverage(AVERAGE_1024);
  // AVERAGE_1_4_16_64_128_256_512_1024 > Количество выборок
  ina226.setConversionTime(CONV_TIME_1100);
  // CONV_TIME_140_204_332_588_1100_2116_4156_8244 - время измерения в мkс
  ina226.setCurrentRange(MA_800);
  // MA_800_400 - предел измерения тока
  // ina226.setCorrectionFactor(0.95); // калибровочный коэффициент измерения тока
  ina226.waitUntilConversionCompleted();
  lcd.init();lcd.backlight();
  lcd.print("   Power unit ");
  lcd.setCursor(0, 1);
  lcd.print(" 0-36V  0-800mA");
  delay(1000);
  lcd.clear();
}
 
void loop() {
  if(digitalRead(A0)==LOW){ah=0;delay(200);}
  ina226.readAndClearFlags();
  shuntVoltage_mV = ina226.getShuntVoltage_mV();
  busVoltage_V = ina226.getBusVoltage_V();
  current_mA = ina226.getCurrent_mA();
  power_mW = ina226.getBusPower();
  loadVoltage_V  = busVoltage_V + (shuntVoltage_mV/1000);
  Serial.print("Ushunt [mV]: "); Serial.println(shuntVoltage_mV); // напряжение шунта
  Serial.print("U [V]: "); Serial.println(busVoltage_V); // напряжение шины
  Serial.print("Un [V]: "); Serial.println(loadVoltage_V); // напряжение нагрузки
  Serial.print("I [mA]: "); Serial.println(current_mA);
  Serial.print("Power [mW]: "); Serial.println(power_mW);
  if(!ina226.overflow){Serial.println("OK");}else{Serial.println("ERROR");}
  Serial.println();
  lcd.setCursor(0, 0);
  lcd.print(loadVoltage_V,2);lcd.print(" ");lcd.setCursor(6, 0);lcd.print("V");
  lcd.setCursor(9, 0);
  if(power_mW/1000<10){lcd.print(power_mW/1000,3);}
  if(power_mW/1000>=10 && power_mW/1000<100){lcd.print(power_mW/1000,2);}
  if(power_mW/1000>=100){lcd.print(power_mW/1000,1);}
  lcd.print(" ");lcd.setCursor(14, 0);lcd.print("W");
  lcd.setCursor(0, 1);
  lcd.print(abs(current_mA/1000),3);lcd.print(" ");lcd.setCursor(6, 1);lcd.print("A");
  lcd.setCursor(9, 1);
  if(ah<10){lcd.print(ah,3);}
  if(ah>=10&&ah<100){lcd.print(ah,2);}
  if(ah>=100&&ah<1000){lcd.print(ah,1);}
  lcd.print(" ");lcd.setCursor(14, 1);
  lcd.print("Ah");
  delay(200); 
  Serial.println(ah,6);
  Serial.print("Time: ");Serial.print(z);Serial.println(" sec");
  Serial.println(ah/z*3600);
}
 
ISR(TIMER1_COMPA_vect){z++;ah = ah + current_mA/1000/3600;}

  Am incercat cu urmatorul cod dar imi apar un sir de erori.

ina.configure(INA226_AVERAGES_1, INA226_BUS_CONV_TIME_1100US, INA226_SHUNT_CONV_TIME_1100US, INA226_MODE_SHUNT_BUS_CONT);
  // Calibrate INA226. Rshunt = 0.01  ohm, Max expected current = 8.19 A
  ina.calibrate(0.01, 8.19);

 

Link spre comentariu

revin cu rezolvarea dupa ce am sapat un pic dupa biblioteca INA226_WE, unde am gasit un exemplu unde definea shuntul

ina226.setResistorRange(0.01,8.0);

 

Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări