ionutz2013 Postat Aprilie 11, 2023 Partajează Postat Aprilie 11, 2023 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. ARDU_watt_meter_LCD_16X2.ino Link spre comentariu
daniels Postat Septembrie 26, 2023 Partajează Postat Septembrie 26, 2023 poti masura curentul printr-un led? Link spre comentariu
antonvasileeee Postat Septembrie 26, 2023 Partajează Postat Septembrie 26, 2023 Pana sa testez intreb: Ce limite de masura are ? Link spre comentariu
PINTI Postat Septembrie 26, 2023 Partajează Postat Septembrie 26, 2023 Cu ce se deschide fisierul de mai sus? Link spre comentariu
modoran Postat Septembrie 26, 2023 Partajează Postat Septembrie 26, 2023 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
daniels Postat Septembrie 26, 2023 Partajează Postat Septembrie 26, 2023 Acum 10 minute, PINTI a spus: Cu ce se deschide fisierul de mai sus? Cu orice editor de text. Link spre comentariu
PINTI Postat Septembrie 26, 2023 Partajează Postat Septembrie 26, 2023 Da, ai dreptate. Multumesc Link spre comentariu
zvonacfirst Postat Septembrie 26, 2023 Partajează Postat Septembrie 26, 2023 @ionutz2013 poti, te rog, sa explici de ce ai ales aceasta solutie? Multumesc. current=(current/200-514); if(current<1)current=0; current=current*15; volt=volt/30; power=(volt*current)/1000 Link spre comentariu
ionutz2013 Postat Septembrie 26, 2023 Autor Partajează Postat Septembrie 26, 2023 (editat) 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 Septembrie 26, 2023 de ionutz2013 Link spre comentariu
Bandi Szasz Postat Septembrie 26, 2023 Partajează Postat Septembrie 26, 2023 @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
daniels Postat Septembrie 26, 2023 Partajează Postat Septembrie 26, 2023 Multumesc pt clarificare! Link spre comentariu
daniels Postat Mai 6, 2024 Partajează Postat Mai 6, 2024 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
daniels Postat Mai 6, 2024 Partajează Postat Mai 6, 2024 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
Postări Recomandate
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 contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum