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.


27 de comentarii:

  1. Am refacut monatjul dupa varianta de mai sus si functioneaza. Va multumesc pentru ajutor. O seara frumoasa

    RăspundețiȘtergere
    Răspunsuri
    1. Ma bucur ca s-a rezolvat.. cu ocazia asta am depistat si eu eroarea.. asa ca multumesc si eu

      Ștergere
  2. Răspunsuri
    1. e raportul de transformare al divizorului rezistiv pe care l-am reglat eu... vezi articolul de la ( http://nicuflorica.blogspot.ro/2013/02/arduino-ca-multimetru-2.html ).. in mare e valoarea tensiunii maxime masurate impartita la tensiunea maxim masurata (30V am ales eu), in cazul de fata 1,1V (ca e folosita referinta interna)...

      Ștergere
  3. Ma ajutaţi şi pe mine va rog? Pot face ca datele sa fie afişare pe un monitor de PC?. Şi dacă se poate sa ma ajutaţi cu un cod sau ceva indrunari as fi foarte recunoscator.

    RăspundețiȘtergere
    Răspunsuri
    1. azi iti pot spune ca folosesti comanda Serial.print in loc de lcd.print... cauta pe net ca e multa informatie cu afisarea pe ecranul de monitorizare seriala...

      Ștergere
    2. iti pui aici sketch-ul cu afisarea informatiilor pe ecranul de monitorizare seriala al calculatorului:

      /*
      http://nicuflorica.blogspot.ro/2014/03/arduino-ca-multimetru-3.html

      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
      */

      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;
      Serial.begin(9600);

      // Print a message
      Serial.println("http://www.tehnic.go.ro & http://nicuflorica.blogspot.ro creat de niq_ro");
      delay(2000);
      Serial.println("********************");
      Serial.println("indicator panou tensiune-curent");
      delay (2000);
      Serial.println("********************");
      Serial.println(" sketch ver.2.1");
      Serial.println("Umax=30V&Imax=5A");
      delay (2000);
      }

      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
      Serial.println("********************");
      Serial.print(tensiune);
      Serial.println(" V");
      Serial.print(curent);
      Serial.println(" A");

      if (curent > 0.01)
      {
      // calculeaza, apoi afiseaza puterea si curentul
      Serial.print(putere);
      Serial.println(" W");
      Serial.print(rezistenta);
      Serial.println(" ohms");

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

      Ștergere
  4. Am realizat si eu acest montaj insa pe partea te curent imi citeste numai valori de 0. Daca masor caderea de tensiune pe sunt, variaza in functie de consum insa arduino afiseaza doar 0. Suntul l-am pastrat de 0.1 Ohmi. Este suntul pe care il folosesc deja si pentru partea de protectie si limitare curent al sursei.

    RăspundețiȘtergere
    Răspunsuri
    1. suntul este montat ca in schema pe ramura negativa? verifica cu atentie ce ai tu si ce am pus eu in articol...

      Ștergere
    2. Da, suntul este pus pe ramura negativa intre GND IN si GND OUT al sursei. Pin A5 de la arduino este conectat la GND IN inainte de sunt.

      Ștergere
  5. pune schema, poza.. ceva e gresit la tine...

    RăspundețiȘtergere
  6. Asta este schema https://s12.postimg.org/yy7bzhxgd/Capture.png. Ce este marcat cu albastru sunt suntul si intrarile arduino.

    RăspundețiȘtergere
    Răspunsuri
    1. da, e ok schema... daca alimentezi separat Arduino e cam dubios... pune fir direct de la AREF la A5 si vezi daca arata maximul, adica 5A... daca nu, muta pe A4, de exemplu si schimba si in sketch..

      Ștergere
  7. Buna seara, puteti sa-mi dati o adresa de e-mail pentru o discutie privata?

    RăspundețiȘtergere
    Răspunsuri
    1. nu prea imi place sa dau o adresa care e pusa pe blog... in coltul de jos din dreapta apre ceva cu "despre mine".. in fine, nicu.florica arond gmail.com

      Ștergere
  8. ar fi misto daca sar implementa si o protectie la scurt cu un releu sau mosfet care sa decupleze isirea

    RăspundețiȘtergere
  9. acum doar anunta ca e scurt... crezi ca e greu de pus si ce zici tu? dar trebuie sa testezi si tu, si o sa vezi ca e simplu de implementat.. doar sa incerc..

    RăspundețiȘtergere
  10. nu ma pricep absolut deloc la programare am un arduino nano cred ca ESTE OK

    RăspundețiȘtergere
    Răspunsuri
    1. http://www.instructables.com/id/Short-circuit-protection-for-almost-any-power-supp/ am gasit me net schema acesta ai realiza cumva stiti daca functioneaza?.multumesc

      Ștergere
    2. o sa ma uit cand am timp, dar cred ca nu ai inteles ce am raspuns anterior... cum e facut programul Arduino acum pe ecran apare text cand e scurtcircuit, deci detecteaza asta, doar ar mai trebui un led, daca chiar se doreste...

      Ștergere
  11. da am observat ca scrie pe lcd dar trebuie facut sa actioneze si fizic asupra esiri din sursa

    RăspundețiȘtergere
    Răspunsuri
    1. da, nu e greu de facut... o sa fac si asta, ca vad ca e ceruta, nu numai de tine ;)

      Ștergere
  12. Hi i uploaded i2c script with liqliq crystal library and now my arduino is not accepting any nne code it gives me error. Can you help me out?? Thanks in advance

    RăspundețiȘtergere
    Răspunsuri
    1. see good library at https://github.com/fdebrabander/Arduino-LiquidCrystal-I2C-library

      Ștergere
  13. In this schematic LCD is in paralel mode not i2c.. I not understand what you want to do... I usual use this libraries: https://github.com/tehniq3/used_library

    RăspundețiȘtergere
  14. Hi I want to ask that wiwi library did you use in last picture ? 8,9,10,11,12,13

    RăspundețiȘtergere
    Răspunsuri
    1. it is use default library from Arduino IDE... I thing is usefull to study little bit Arduino before ask stupid question....

      Ștergere