Se afișează postările cu eticheta ampermeter. Afișați toate postările
Se afișează postările cu eticheta ampermeter. Afișați toate postările

sâmbătă, 15 martie 2014

Arduino ca multimetru (3)

   La inceputul anului trecut, am scris 2 article despre folosirea lui Arduino ca multimetru de panou: in Arduino ca multimetru am prezentat mai mult calcule, iar in Arduino ca multimetru (2) am pus si experimente, inclusiv sketch-uri..
   Am reluat testele deoarece am primit un mesaj ca apar erori pe ecran...
   In mare modul de conectare al lui Arduino la la un alimentator este prezentat in figura urmatoare:
iar modul de conectare intre module este:
   Modulul are schema:
   Conectarea am lasat-o ca in articolul original, cand am inceput testele cu Arduino, vedeti Arduino si un afisaj LCD clasic (16 caractere si 2 randuri)
   Sketch-ul este cel prezentat in ultimul articol
/*
  LiquidCrystal Library 
  The circuit 
 * LCD RS pin to digital pin 12
 * LCD Enable pin to digital pin 11
 * LCD D4 pin to digital pin 5
 * LCD D5 pin to digital pin 4
 * LCD D6 pin to digital pin 3
 * LCD D7 pin to digital pin 2
 * LCD R/W pin to ground
 * 10K resistor:
 * ends to +5V and ground
 * wiper to LCD VO pin (pin 3)

 Library originally added 18 Apr 2008
 by David A. Mellis
 library modified 5 Jul 2009
 by Limor Fried (http://www.ladyada.net)
 example added 9 Jul 2009
 by Tom Igoe 
 modified 22 Nov 2010
 by Tom Igoe
 This example code is in the public domain.

 http://www.tehnic.go.ro
 http://www.niqro.3x.ro
 http://nicuflorica.blogspot.ro
amper & voltmeter by niq_ro, 02.2013, Craiova, Romania
vers. 1.3 - see http://nicuflorica.blogspot.ro/2013/02/arduino-ca-multimetru-2.html
  */
// include the library code:
#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

int Pintensiune = A3; // divizorul rezistiv pentru tensiune e legat la intrarea A3 
int Pincurent = A5; // rezistenta inseriata este conectata la A5

void setup() {

analogReference(INTERNAL); // punem referinta interna de 1,1V;

  // set up the LCD's number of columns and rows: 
  lcd.begin(16, 2);
  // Print a message to the LCD.
  lcd.print("www.tehnic.go.ro");  
  lcd.setCursor(0, 1);
  lcd.print("creat de niq_ro");
  delay(2500);
  lcd.clear();
  
 lcd.print("indicator panou");  
  lcd.setCursor(0, 1);
  lcd.print("tensiune-curent");
  delay (2500);
  lcd.clear();

 lcd.print(" sketch ver.2.1");  
  lcd.setCursor(0, 1);
  lcd.print("Umax=30V&Imax=5A");
  delay (2500);
  lcd.clear();
  
}

void loop() {
  float sumatens =0;
  float sumacurent = 0;
  
    for (int i=1; i <= 20; i++){
  
  // citire valoare pe intrarea analogica 
  float tensiune = analogRead(Pintensiune); 
  tensiune = 27.27 * 1.1 * tensiune / 1023.0 ;
  sumatens = sumatens + tensiune;
    
  float curent = analogRead(Pincurent); 
  curent = 1.1 / 0.22 * curent / 1023.0 ;
  sumacurent = sumacurent + curent;
  delay (20);
    }
  
  float tensiune = sumatens / 20.0 ;
  float curent = sumacurent /20.0 ;
  
  float putere = tensiune * curent ;
  float rezistenta = tensiune / curent;
  
// partea de afisare
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print(tensiune);
    lcd.print(" V");
    
    lcd.setCursor(9, 0);
    lcd.print(curent);
    lcd.print(" A");

if (curent > 0.01)
{
  // calculeaza, apoi afiseaza puterea si curentul
    lcd.setCursor(0, 1);
    lcd.print(putere);
    lcd.print(" W");
    
    lcd.setCursor(8, 1);
    lcd.print(rezistenta);
    lcd.print(" ");
    lcd.write(0b11110100);;

}
else
{
  // daca curentul e mai mic de 10mA considera ca sursa e in gol
  if (tensiune < 0.1)
{  
  // scurtcircuit   
  lcd.setCursor(1, 1);
  lcd.print("sursa oprita    ");
}
else
  if (tensiune < 0.8)
{  
  // scurtcircuit   
  lcd.setCursor(1, 1);
  lcd.print(" scurtcircuit    ");
}
 else
    // 
    lcd.setCursor(1, 1);
     lcd.print("sursa e in gol   ");
  }  
// se odihneste si el 1,5 secunde
    delay(1500);
}
   Practic, montajul arata asa:
 Am facut si 3 filmulete:
Arduino ca multimetru de panou pentru un alimentator (5)
   In ultimul filmulet apare si un modul voltmetru de panou pe care l-am achizitionat de pe ebay, pentru a vedea cum se comporta si pare ok...

Descriere:
1. domeniul de masura: 0-100V (fir alb sau galben)
2. afisaj LED cu 7 segmente, cifre de 14mm
3. consum propriu redus
4. masuratori la fiecare: 500ms (0,5s)
5. montare usoara pe panou
6. culoare LED-uri: rosie
7.tensiune alimentare: 3..30V (fir rosu la +, fir negru la masa)
8. temperatura de functionare: -10℃..+65 ℃.


18.03.2014 27.04.2021
   Am desenat toata corectat schema:

PS: Daca curentul indicat este mereu zero, verificati cu un aparat de masura pe voltmetru, ca avand borna neagra la GND si cea rosie la A5 tensiunea este pozitiva., daca nu este, inversati bornele de la ramura negativa, astfel incat pe sunt sa fie o tensiune pozitiva fata de GND-ul placii Arduino.


sâmbătă, 16 februarie 2013

Teste cu transformatorul de curent AS-102 (PPAS102)

   Deoarece vreau sa realizez in regim de prototip un wattmetru pentru un consumator casniz (bec, frigider, calculator, circuit electric care este cuplat la o siguranta din casa, etc) folosind un Arduino (vezi articolul Arduino ca wattmetru pentru consumatori casnici) am fost sa cumpar un transformator de curent pentru a face niste experimente si nu am gasit pe stoc la ADELAIDA decat modelul AS-102 sau PPAS102. 


   Fiind in faza de testare am cumparat unul la pretul de 6,00lei  si am costatat (apoi) din fisa tehnica ca e un transformator de curent pentru frecventa inalta (20-200kHz) folosit pentru masurarea curentului la surse in comutatie, de exemplu.
   Raportul de transformare fiind 1:200, ma asteptam sa am pe rezistenta din secundar (recomadata) de 200 ohmi (obtinuta din 2 rezistente inseriate de 100 ohmi) o tensiune de aceeasi valoare cu acel curent prin primar.
   Exemplu: am un bec de 100W care consuma cca.0,44A (I=P/U=100W/230V=0,44A), deci in secundarul transformatorului de curent as avea in circuit un curent de 200 de ori mai mic (0,44A:200=0,0022A=2,2mA), tensiunea pe rezistenta de 200 de ohmi conectata in secundarultransformaotrului ar fi de 200 ori mai mare ca valoarea curentului (0,0022A*200ohmi=0,44V).
   Am folosit un bec de 60W (n.r. nou, made in China) si am masurat tensiunea pe rezistenta de 200 ohmi conectata in secundarul transformatorului de curent obtinand valoarea de 50mV.

    Fiind o valoare care nu mi s-a parut relevanta si nici corecta am inseriat aparul de masura in circuitul becului obtinand o masuratoare de 0,24-0,25A.
    Am inlocuit rezistenta compusa de 200 ohmi cu una de 100 ohmi sa vad ce valoare a tensiunii in secundarul transformatorului de curent obtin si .. tot 50mV a fost, deci a fost "evident" ca raportul de transformare este de 1:5 (corectura in 17.02.2013).
    Pentru a obtine o indicatie mai relevanta am folosit divizorul rezistiv din secundarul transformatorului (masurand tensiunea de pe una din cele 2 rezistente de 100 de ohmi), obtinand o valoare de 10 ori mai mica:

completare, 17.02.2013
   M-am gandit ca acest raport de transformare diferit de ce e in fisa de catalog e din cauza frecventei retelei (50Hz), foarte mica fata de domeniul recomandat (20-20kHz).

  Am luat mai multe modele de becuri, ce am gasit prin casa, sa vad daca se pastreaza raportul de transformare, pastrand si divizorul rezistiv cu raport 1:2:

1) bec economic de 18W:
 

2) bec cu incandescenta de 60W (vehime de cca. 1 an):

3) bec cu incandescenta de 75W (vechime 2-3 ani)
4) bec cu halogen de 70W (aprox. 2 luni):

   Se constata ca pentru sarcini rezistive si frecventa de 50Hz, raportul de transformare ramane 1:5 (respectiv 1:10 cu divizorul rezistiv de 1:2), cel gasit si ieri, dar pentru becul economic care lucreaza la o frecventa mare si, posibil, cu sinusoida deformata) si aparatul de masura digital DT2905A pus ca ampermetru de curent alternativ si ca milivoltmetru de tensiune alternativa sa citeasca tensiunea de pe divizorul rezistiv care este conectat in secundarul transformatorului de curent.
   Din calcule curentul ar fi trebuit sa fie de I=P/U=18W/230V=0,078A=78mA, ampermetrul a aratat 0,05A=50mA, iar trasnformatorul de curent cu divizor 16mA.. daca va uitati cu atentie in poza cu masuratoare acestui bec pana si Mada la 2 ani si 10 luni isi pune mainile in cap :-).
   Concluzie e ca acest model de transformator de curent (AS-102 sau PPAS102) nu il pot folosi pentru masuratori generale.. trebuie un model gen AC1020.
   Am facut si un centralizator cu valorile calculate (functie de puterea inscriptionata si tensiunea de alimentare), curenti masurati direct cu aparatul de masura si masurati cu transformatorul de curent AS-102:



joi, 14 februarie 2013

Arduino ca wattmetru pentru consumatori casnici

    Putem afla puterea instantanee consumata a unui consumator casnic sau consumul instantaneu al echipamentelor din casa sau de pe un circuit electric prin folosirea unui transformator de curent (sau a unui senzor dedicat gen ACS713, ACS713, ACS756) si a unui transformator coborator, pentru a izola placa de dezvoltare (si implicit calculatorul daca e legat prin USB pentru a programa sketch-ul).

   In desenul de mai sus apar si niste module, acestea fiind niste module de conversie tensiune alternativa in tensiune continua, in cazul de fata "redresoare monoalternanta fara prag", deoarece microcontrolerul nu accepta tensiuni negative pe intrarile analogice utilizate pentru masurare (nici pe cele digitale).
   Desi se gasesc pe internet si in cartile de specialitate scheme mai simple sau mai complexe, eu m-am oprit la una publicata in revista Tehnium nr. 11 din 1988, in articolul "Multimetru" scris de dl. Milian Oros.


   Am redesenat in Cadsoft EAGLE schema pentru a realiza o varianta de cablaj, obtinand:




desenat de niq_ro

   Modulul (modulele) necesita alimentare simetrica stabilizata de +/-5V, aceasta putand apoi alimenta si placa de dezvoltare sau montajul cu microcontroler.

   Revenind la schema, am considerat ca pot folosi transformatoare de curent (mai) ieftine. Cautand pe net am depistat produsele firmei indiene TALEMA si m-am oprit la transformatorul de curent AC-1020 care costa 3,22 lei la TME ajungand la 9,50lei la ADELAIDA.

   Schema tipica de conectare este:
iar caracteristica este:

   Montarea transformatorului consta in trecerea cablului de alimentare al consumatorului sau a circuitului prin "gaura" din transformator si montarea unei rezistente de 100 ohmi la pinii 1-2 (extremitati) si masurarea tensiunii pe aceasta rezistenta. Din fisa de catalog se observa pentru acest transformator de curent se poate folosi pentru un curent nominal de 20A, iar cel maxim admis e de 60A, arhisuficient pentru ce am eu nevoie. Pentru curenti mai mici de 1A sunt sanse sa nu fie liniara dependenta, dar asta se poate verifica, prin masurarea tensiunii pe rezistenta si compararea cu indicatia unui ampermetru de curent alternativ pus in circuitul urmarit.
    La un circuit electric tensiunea alternativa de la iesirea transformatorului de curent poate depasi 1,1V (vreau sa folosesc refenta interna a microcontrolerului), am pus si acolo un divizor rezistiv (semireglabil multitura):






- va urma -

duminică, 10 februarie 2013

Arduino ca multimetru (2)

    In prima parte am facut doar o prezentare si niste calcule de dimensionare, acum ma inceput sa fac niste experimente.
    Primele experimente le-am facut cu partea de ampermetru, folosind o rezistenta de 0,22 ohmi si 2-3W, pe care am gasit-o prin cutiile mele cu piese... valoare e mai mare decat cea indicata anterior, dar tinand cont ca fac doar experimente urmarind si revazand articolul de la http://electronics-diy.com/70v_pic_voltmeter_amperemeter.php unde folosita o rezistente de 0,47 ohmi, cea folosita de mine, pana la 2,5-3A e acceptabila (maxim 0.66V pe ea la 3A).
    Am folosit sursa de tensiune cu LM317 si 2 tranzistori, pe care am prezentat-o in articolul de la http://www.arduinotehniq.com/old/LM317/LM317.htm si 2 aparate de masura, unul pentru a masura curentul consumat de un ventilator (cooler) de sursa de calculator, altul pentru a masura caderea de tensiune pe rezistenta inseriata in circuit.


    Am facut 5 masuratori, la diverse tensiuni, rezultandu-mi urmatoarele valori:




    Am centralizat datele, facand si niste calcule:
    Daca pot considera considera ca aparatele de masura au eroare mica (etalon), rezulta ca rezistenta de 0,22 ohmi este mai mare cu 2,2% decat valoarea standard, ceea ce acceptabil avand in vedere ca tipul acesta de rezistenta poate avea toleranta din fabricatie de +10%.
    Multimetrul folosit ca voltmetru pe domeniul de 200mV este EDISON model DM383 (despre care nu am gasit prea multe informatii legate de eroare de masurare, dar pot miza pe sub 1% fiind vorba de tensiune continua), dupa cum apare la http://www.cromwell.co.uk/EDI5162900K

iar cel folosit ca ampermetru pe domeniul de 200mA este un "John Doe" model DT2905A (eroare de masura pe acest demeniu de 1,5%), dupa cum este prezentat la http://oldradio.tesla.hu/szetszedtem/016multimeter-dt9205a/multimeter.htm.

    Am realizat pe o bucatica de cablaj de test montajul adaptor si am reglat din semireglabil sa am raportul de tensiune corect (30:1,1=27,27:1) si am conectat firele la intrarile analogice (tensiunea se masoara la AN3, respectiv "curentul" la AN5) si la masa (GND), folosindu-ma de "interfetele macanice" de le-am utilizat si la termometru si pentru afisajul LCD.
   Schema folosita este:


    Am conectat placuta si la alimentator si la cooler, masurand tensiunea si cu un aparat digital, apoi am pus si pe celalalt in circuit, mutand pe al "mic" pe tensiune, iar celalalt pe curent:
    Am realizat un mic filmulet:
 
iar sketch-ul folosit a fost:

/*
  LiquidCrystal Library 

  The circuit for LCD 
 * LCD RS pin to digital pin 12
 * LCD Enable pin to digital pin 11
 * LCD D4 pin to digital pin 5
 * LCD D5 pin to digital pin 4
 * LCD D6 pin to digital pin 3
 * LCD D7 pin to digital pin 2
 * LCD R/W pin to ground
 * 10K resistor:
 * ends to +5V and ground
 * wiper to LCD VO pin (pin 3)

 Library originally added 18 Apr 2008
 by David A. Mellis
 library modified 5 Jul 2009
 by Limor Fried (http://www.ladyada.net)
 example added 9 Jul 2009
 by Tom Igoe 
 modified 22 Nov 2010
 by Tom Igoe
 This example code is in the public domain.

  */

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

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

int Pintensiune = A3; // divizorul rezistiv pentru tensiune e legat la intrarea A3 
int Pincurent = A5; // rezistenta inseriata este conectata la A5


void setup() {

analogReference(INTERNAL); // punem referinta interna de 1,1V;

  // set up the LCD's number of columns and rows: 
  lcd.begin(16, 2);
  // Print a message to the LCD.
  lcd.print("www.tehnic.go.ro");  
  lcd.setCursor(0, 1);
  lcd.print("creat de niq_ro");
  delay (2500);
  lcd.clear();
  
 lcd.print("indicator panou");  
  lcd.setCursor(0, 1);
  lcd.print("tensiune-curent");
  delay (2500);
  lcd.clear();

 lcd.print("Umax = 30V");  
  lcd.setCursor(0, 1);
  lcd.print("Imax = 5A");
  delay (1500);
  lcd.clear();
  
}

void loop() {
// citire valoare pe intrarea analogica 
  float tensiune = analogRead(Pintensiune); 
  tensiune = 27.27 * 1.1 * tensiune / 1023.0 ;
  
  float curent = analogRead(Pincurent); 
  curent = 1.1 / 0.22 * curent / 1023.0 ;

// partea de afisare
    lcd.setCursor(0, 0);
    lcd.print("U =");
    lcd.print(tensiune);
    lcd.print(" V");
    
    lcd.setCursor(0, 1);
    lcd.print("I = ");
    lcd.print(curent);
    lcd.print(" A");
   
// se odihneste si el 1,5 secunde
    delay(1500);
// sterge cu buretele tabla :-D
  lcd.clear();
    }

   O a doua varianta de sketch pentru a afisa si puterea consumata si rezistenta echivalenta a consumatorului este:


/*
  LiquidCrystal Library 

  The circuit - 
 * LCD RS pin to digital pin 12
 * LCD Enable pin to digital pin 11
 * LCD D4 pin to digital pin 5
 * LCD D5 pin to digital pin 4
 * LCD D6 pin to digital pin 3
 * LCD D7 pin to digital pin 2
 * LCD R/W pin to ground
 * 10K resistor:
 * ends to +5V and ground
 * wiper to LCD VO pin (pin 3)

 Library originally added 18 Apr 2008
 by David A. Mellis
 library modified 5 Jul 2009
 by Limor Fried (http://www.ladyada.net)
 example added 9 Jul 2009
 by Tom Igoe 
 modified 22 Nov 2010
 by Tom Igoe
 This example code is in the public domain.

 http://www.tehnic.go.ro
 http://www.niqro.3x.ro
 http://nicuflorica.blogspot.ro
  */

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

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

int Pintensiune = A3; // divizorul rezistiv pentru tensiune e legat la intrarea A3 
int Pincurent = A5; // rezistenta inseriata este conectata la A5


void setup() {

analogReference(INTERNAL); // punem referinta interna de 1,1V;

  // set up the LCD's number of columns and rows: 
  lcd.begin(16, 2);
  // Print a message to the LCD.
  lcd.print("www.tehnic.go.ro");  
  lcd.setCursor(0, 1);
  lcd.print("creat de niq_ro");
  delay (2500);
  lcd.clear();
  
 lcd.print("indicator panou");  
  lcd.setCursor(0, 1);
  lcd.print("tensiune-curent");
  delay (2500);
  lcd.clear();

 lcd.print("Umax = 30V");  
  lcd.setCursor(0, 1);
  lcd.print("Imax = 5A");
  delay (1500);
  lcd.clear();
  
}

void loop() {
// citire valoare pe intrarea analogica 
  float tensiune = analogRead(Pintensiune); 
  tensiune = 27.27 * 1.1 * tensiune / 1023.0 ;
  
  float curent = analogRead(Pincurent); 
  curent = 1.1 / 0.22 * curent / 1023.0 ;

  float putere = tensiune * curent ;
  float rezistenta = tensiune / curent;

// partea de afisare
    lcd.setCursor(0, 0);
    lcd.print(tensiune);
    lcd.print(" V");
    
    lcd.setCursor(9, 0);
    lcd.print(curent);
    lcd.print(" A");

    lcd.setCursor(0, 1);
    lcd.print(putere);
    lcd.print(" W");
    
    lcd.setCursor(8, 1);
    lcd.print(rezistenta);
    lcd.print(" ");
    lcd.write(0b11110100);;


// se odihneste si el 1,5 secunde
    delay(1500);
// sterge cu buretele tabla :-D
  lcd.clear();
    }


iar afisajul arata asa:


   Pentru a elimina erorile de citire, vom face o medie a 10 masuratori la 200ms fiecare, apoi vom calcula mediile tensiunii si curentului consumat, sketsh-ul va fi:

/*
  LiquidCrystal Library 

  The circuit 
 * LCD RS pin to digital pin 12
 * LCD Enable pin to digital pin 11
 * LCD D4 pin to digital pin 5
 * LCD D5 pin to digital pin 4
 * LCD D6 pin to digital pin 3
 * LCD D7 pin to digital pin 2
 * LCD R/W pin to ground
 * 10K resistor:
 * ends to +5V and ground
 * wiper to LCD VO pin (pin 3)

 Library originally added 18 Apr 2008
 by David A. Mellis
 library modified 5 Jul 2009
 by Limor Fried (http://www.ladyada.net)
 example added 9 Jul 2009
 by Tom Igoe 
 modified 22 Nov 2010
 by Tom Igoe
 This example code is in the public domain.

  */

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

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

int Pintensiune = A3; // divizorul rezistiv pentru tensiune e legat la intrarea A3 
int Pincurent = A5; // rezistenta inseriata este conectata la A5


void setup() {

analogReference(INTERNAL); // punem referinta interna de 1,1V;

  // set up the LCD's number of columns and rows: 
  lcd.begin(16, 2);
  // Print a message to the LCD.
  lcd.print("www.tehnic.go.ro");  
  lcd.setCursor(0, 1);
  lcd.print("creat de niq_ro");
  delay(2500);
  lcd.clear();
  
 lcd.print("indicator panou");  
  lcd.setCursor(0, 1);
  lcd.print("tensiune-curent");
  delay (2500);
  lcd.clear();

 lcd.print("Umax = 30V");  
  lcd.setCursor(0, 1);
  lcd.print("Imax = 5A");
  delay (1500);
  lcd.clear();
  
}

void loop() {
  float sumatens =0;
  float sumacurent = 0;
  
    for (int i=1; i <= 10; i++){
  
  // citire valoare pe intrarea analogica 
  float tensiune = analogRead(Pintensiune); 
  tensiune = 27.27 * 1.1 * tensiune / 1023.0 ;
  sumatens = sumatens + tensiune;
    
  float curent = analogRead(Pincurent); 
  curent = 1.1 / 0.22 * curent / 1023.0 ;
  sumacurent = sumacurent + curent;
  delay (200);
    }
  
  float tensiune = sumatens / 10.0 ;
  float curent = sumacurent /10.0 ;
  
  float putere = tensiune * curent ;
  float rezistenta = tensiune / curent;
  
// partea de afisare
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print(tensiune);
    lcd.print(" V");
    
    lcd.setCursor(9, 0);
    lcd.print(curent);
    lcd.print(" A");

    lcd.setCursor(0, 1);
    lcd.print(putere);
    lcd.print(" W");
    
    lcd.setCursor(8, 1);
    lcd.print(rezistenta);
    lcd.print(" ");
    lcd.write(0b11110100);;

   
// se odihneste si el 1,5 secunde
    delay(1500);
    }

iar varianta cu 100 de citiri la 20ms cu mediere:

/*
  LiquidCrystal Library 

  The circuit 
 * LCD RS pin to digital pin 12
 * LCD Enable pin to digital pin 11
 * LCD D4 pin to digital pin 5
 * LCD D5 pin to digital pin 4
 * LCD D6 pin to digital pin 3
 * LCD D7 pin to digital pin 2
 * LCD R/W pin to ground
 * 10K resistor:
 * ends to +5V and ground
 * wiper to LCD VO pin (pin 3)

 Library originally added 18 Apr 2008
 by David A. Mellis
 library modified 5 Jul 2009
 by Limor Fried (http://www.ladyada.net)
 example added 9 Jul 2009
 by Tom Igoe 
 modified 22 Nov 2010
 by Tom Igoe
 This example code is in the public domain.

amper & voltmeter by niq_ro, 02.2013, Craiova, Romania
  */

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

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

int Pintensiune = A3; // divizorul rezistiv pentru tensiune e legat la intrarea A3 
int Pincurent = A5; // rezistenta inseriata este conectata la A5


void setup() {

analogReference(INTERNAL); // punem referinta interna de 1,1V;

  // set up the LCD's number of columns and rows: 
  lcd.begin(16, 2);
  // Print a message to the LCD.
  lcd.print("www.tehnic.go.ro");  
  lcd.setCursor(0, 1);
  lcd.print("creat de niq_ro");
  delay(2500);
  lcd.clear();
  
 lcd.print("indicator panou");  
  lcd.setCursor(0, 1);
  lcd.print("tensiune-curent");
  delay (2500);
  lcd.clear();

 lcd.print("Umax = 30V");  
  lcd.setCursor(0, 1);
  lcd.print("Imax = 5A");
  delay (1500);
  lcd.clear();
  
}

void loop() {
  float sumatens =0;
  float sumacurent = 0;
  
    for (int i=1; i <= 100; i++){
  
  // citire valoare pe intrarea analogica 
  float tensiune = analogRead(Pintensiune); 
  tensiune = 27.27 * 1.1 * tensiune / 1023.0 ;
  sumatens = sumatens + tensiune;
    
  float curent = analogRead(Pincurent); 
  curent = 1.1 / 0.22 * curent / 1023.0 ;
  sumacurent = sumacurent + curent;
  delay (20);
    }
  
  float tensiune = sumatens / 100.0 ;
  float curent = sumacurent /100.0 ;
  
  float putere = tensiune * curent ;
  float rezistenta = tensiune / curent;
  
// partea de afisare
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print(tensiune);
    lcd.print(" V");
    
    lcd.setCursor(9, 0);
    lcd.print(curent);
    lcd.print(" A");

    lcd.setCursor(0, 1);
    lcd.print(putere);
    lcd.print(" W");
    
    lcd.setCursor(8, 1);
    lcd.print(rezistenta);
    lcd.print(" ");
    lcd.write(0b11110100);;
   
// se odihneste si el 1,5 secunde
    delay(1500);
    }

Filmuletul cu noua prezentare:



    Deoarece atunci cand sursa este oprita apar mesaje ciudate, care alterneaza, de genul:



m-am gandit ca atunci cand curentul e foarte mic sa afiseze un mesaj ca sursa e in gol.

    Sketch-ul numit versiunea 2 este:

/*
  LiquidCrystal Library 


  The circuit 

 * LCD RS pin to digital pin 12
 * LCD Enable pin to digital pin 11
 * LCD D4 pin to digital pin 5
 * LCD D5 pin to digital pin 4
 * LCD D6 pin to digital pin 3
 * LCD D7 pin to digital pin 2
 * LCD R/W pin to ground
 * 10K resistor:
 * ends to +5V and ground
 * wiper to LCD VO pin (pin 3)


 Library originally added 18 Apr 2008

 by David A. Mellis
 library modified 5 Jul 2009
 by Limor Fried (http://www.ladyada.net)
 example added 9 Jul 2009
 by Tom Igoe 
 modified 22 Nov 2010
 by Tom Igoe
 This example code is in the public domain.



amper & voltmeter by niq_ro, 02.2013, Craiova, Romania
vers. 2 - see http://nicuflorica.blogspot.ro/2013/02/arduino-ca-multimetru-2.html
  */


// include the library code:

#include <LiquidCrystal.h>


// initialize the library with the numbers of the interface pins

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);


int Pintensiune = A3; // divizorul rezistiv pentru tensiune e legat la intrarea A3 

int Pincurent = A5; // rezistenta inseriata este conectata la A5



void setup() {



analogReference(INTERNAL); // punem referinta interna de 1,1V;



  // set up the LCD's number of columns and rows: 

  lcd.begin(16, 2);
  // Print a message to the LCD.
  lcd.print("www.tehnic.go.ro");  
  lcd.setCursor(0, 1);
  lcd.print("creat de niq_ro");
  delay(2500);
  lcd.clear();
  
 lcd.print("indicator panou");  
  lcd.setCursor(0, 1);
  lcd.print("tensiune-curent");
  delay (2500);
  lcd.clear();


 lcd.print(" sketch ver.2");  

  lcd.setCursor(0, 1);
  lcd.print("Umax=30V&Imax=5A");
  delay (2500);
  lcd.clear();
  
}


void loop() {

  float sumatens =0;
  float sumacurent = 0;
  
    for (int i=1; i <= 20; i++){
  
  // citire valoare pe intrarea analogica 
  float tensiune = analogRead(Pintensiune); 
  tensiune = 27.27 * 1.1 * tensiune / 1023.0 ;
  sumatens = sumatens + tensiune;
    
  float curent = analogRead(Pincurent); 
  curent = 1.1 / 0.22 * curent / 1023.0 ;
  sumacurent = sumacurent + curent;
  delay (20);
    }
  
  float tensiune = sumatens / 20.0 ;
  float curent = sumacurent /20.0 ;
  
  float putere = tensiune * curent ;
  float rezistenta = tensiune / curent;
  
// partea de afisare
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print(tensiune);
    lcd.print(" V");
    
    lcd.setCursor(9, 0);
    lcd.print(curent);
    lcd.print(" A");


if (curent > 0.001)

{
  // calculeaza, apoi afiseaza puterea si curentul
    lcd.setCursor(0, 1);
    lcd.print(putere);
    lcd.print(" W");
    
    lcd.setCursor(8, 1);
    lcd.print(rezistenta);
    lcd.print(" ");
    lcd.write(0b11110100);;
}
else
{
  // daca curentul e mai mic de 1mA considera ca sursa e in gol
     lcd.setCursor(1, 1);
     lcd.print("sursa e in gol");
}

// se odihneste si el 1,5 secunde
    delay(1500);
    }

    Am realizat un nou filmulet:

24.02.2013
    Am realizat ca mai situatiile, care s eintalnesc in practica sunt:
- functionare normala:

- sursa oprita:
- scurtcircuit la iesirea din sursa:
- scurtcircuit la iesirea modulului de masura, adica la intrarea in consumator (la scurt-circuit apara rezistenta de masura de 0,22 ohmi)

   Sketch-ul actualizat (versiune 2.1) este:


/*
  LiquidCrystal Library 

  The circuit 
 * LCD RS pin to digital pin 12
 * LCD Enable pin to digital pin 11
 * LCD D4 pin to digital pin 5
 * LCD D5 pin to digital pin 4
 * LCD D6 pin to digital pin 3
 * LCD D7 pin to digital pin 2
 * LCD R/W pin to ground
 * 10K resistor:
 * ends to +5V and ground
 * wiper to LCD VO pin (pin 3)

 Library originally added 18 Apr 2008
 by David A. Mellis
 library modified 5 Jul 2009
 by Limor Fried (http://www.ladyada.net)
 example added 9 Jul 2009
 by Tom Igoe 
 modified 22 Nov 2010
 by Tom Igoe
 This example code is in the public domain.

 http://www.tehnic.go.ro
 http://www.niqro.3x.ro
 http://nicuflorica.blogspot.ro
amper & voltmeter by niq_ro, 02.2013, Craiova, Romania
vers. 1.3 - see http://nicuflorica.blogspot.ro/2013/02/arduino-ca-multimetru-2.html
  */

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

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

int Pintensiune = A3; // divizorul rezistiv pentru tensiune e legat la intrarea A3 
int Pincurent = A5; // rezistenta inseriata este conectata la A5


void setup() {

analogReference(INTERNAL); // punem referinta interna de 1,1V;

  // set up the LCD's number of columns and rows: 
  lcd.begin(16, 2);
  // Print a message to the LCD.
  lcd.print("www.tehnic.go.ro");  
  lcd.setCursor(0, 1);
  lcd.print("creat de niq_ro");
  delay(2500);
  lcd.clear();
  
 lcd.print("indicator panou");  
  lcd.setCursor(0, 1);
  lcd.print("tensiune-curent");
  delay (2500);
  lcd.clear();

 lcd.print(" sketch ver.2.1");  
  lcd.setCursor(0, 1);
  lcd.print("Umax=30V&Imax=5A");
  delay (2500);
  lcd.clear();
  
}

void loop() {
  float sumatens =0;
  float sumacurent = 0;
  
    for (int i=1; i <= 20; i++){
  
  // citire valoare pe intrarea analogica 
  float tensiune = analogRead(Pintensiune); 
  tensiune = 27.27 * 1.1 * tensiune / 1023.0 ;
  sumatens = sumatens + tensiune;
    
  float curent = analogRead(Pincurent); 
  curent = 1.1 / 0.22 * curent / 1023.0 ;
  sumacurent = sumacurent + curent;
  delay (20);
    }
  
  float tensiune = sumatens / 20.0 ;
  float curent = sumacurent /20.0 ;
  
  float putere = tensiune * curent ;
  float rezistenta = tensiune / curent;
  
// partea de afisare
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print(tensiune);
    lcd.print(" V");
    
    lcd.setCursor(9, 0);
    lcd.print(curent);
    lcd.print(" A");

if (curent > 0.01)
{
  // calculeaza, apoi afiseaza puterea si curentul
    lcd.setCursor(0, 1);
    lcd.print(putere);
    lcd.print(" W");
    
    lcd.setCursor(8, 1);
    lcd.print(rezistenta);
    lcd.print(" ");
    lcd.write(0b11110100);;

}
else
{
  // daca curentul e mai mic de 10mA considera ca sursa e in gol
  if (tensiune < 0.1)
{  
  // scurtcircuit   
  lcd.setCursor(1, 1);
  lcd.print("sursa oprita    ");
}
else
  if (tensiune < 0.8)
{  
  // scurtcircuit   
  lcd.setCursor(1, 1);
  lcd.print(" scurtcircuit    ");
}
 else
    // 
    lcd.setCursor(1, 1);
     lcd.print("sursa e in gol   ");
  }  
// se odihneste si el 1,5 secunde
    delay(1500);
    }

   Am realizat si un film cu functionarea (fara partea de introducere) se numeste Arduino as digital multimeter for homemade power supply (4):