ArduShop.ro

ArduShop.ro
cod tehnic.go.ro_02 reducere 5%, pentru vizitatorii paginilor mele !

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):