Publicidad

sábado, 17 de junio de 2017

Voltímetro y Amperímetro con LCD Nokia 5110



En el anterior tutorial vimos como hacer un doble voltímetro y amperímetro para una fuente de laboratorio. 

Como recordaréis, la fuente disponía de una tensión positiva y otra negativa, lo que nos obligaba al uso de amplificadores operacionales para adaptar la señal y poder medirla con Arduino.

Para mostrar las tensiones y corrientes empleamos un LCD monocromo de 16 caracteres x 2 filas de texto, que se quedaba un poco justo para mostrar toda la información.

Pues bien, en el siguiente proyecto vamos a simplificar el circuito de medida del voltímetro y vamos a sustituir el LCD de 16x2 caracteres por un display gráfico Nokia 5110.

En una primera parte vamos a hacer el voltímetro y en un segundo circuito añadiremos el amperímetro.




1. Voltímetro con Arduino y LCD Nokia 5110


Esquema

El voltímetro aquí descrito únicamente lo vamos a usar para medir tensiones positivas.

Solo necesitamos un atenuador de señal a la entrada del pin A0 del Arduino. Si no sabes qué es un atenuador de señal y para qué sirve, por favor echa un vistazo al Proyecto 28.2 antes de continuar.





El funcionamiento del sketch es muy sencillo. Simplemente conectamos el pin A0 al divisor de tensión formado por las resistencias R1 y R2. Debido al valor escogido para R1 y R2, el divisor de tensión funciona como un atenuador x6 de la tensión que queremos medir, y como la máxima tensión en los pines del Arduino es de 5V, significa que la máxima tensión que podemos medir es de 30V. Todo esto, está explicado con más detalle en el Proyecto 28.2.

Bien, al tener una atenuación x6, la variación entre 0 y 5V en el pin A0 corresponde con una tensión entre 0 y 30V en la fuente de alimentación.

En la variable RawVCC almacenamos el valor de analogRead(A0). Con la función map(RawVCC, 0, 1023, 0, 3000); convertimos los 0-1023 valores posibles de RawVCC en 0-3000, que se corresponden con la variación entre 0 y 30V de la fuente. Luego sólo hay que dividir entre 100 para obtener el valor real de tensión en la fuente de alimentación.


Sketch


/*********************************************************************
This is an example sketch for our Monochrome Nokia 5110 LCD Displays

  Pick one up today in the adafruit shop!
  ------> http://www.adafruit.com/products/338

These displays use SPI to communicate, 4 or 5 pins are required to
interface

Adafruit invests time and resources providing this open source code,
please support Adafruit and open-source hardware by purchasing
products from Adafruit!

Written by Limor Fried/Ladyada  for Adafruit Industries.
BSD license, check license.txt for more information
All text above, and the splash screen must be included in any redistribution
*********************************************************************/

// Easy Voltmeter with Arduino & Nokia 5110 LCD Display 
// https://sites.google.com/site/angmuz/

#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>

// Software SPI (slower updates, more flexible pin options):
// pin 7 - Serial clock out (SCLK)
// pin 6 - Serial data out (DIN)
// pin 5 - Data/Command select (D/C)
// pin 4 - LCD chip select (CS)
// pin 3 - LCD reset (RST)
Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 3);


int RawVCC = 0;
float VCC = 0;
float auxVCC = 0;


void setup()   {
  
  // Iniciamos comunicacion serie 
  Serial.begin(9600);
  
  // Iniciamos comunicacion con la pantalla
  display.begin();
  
  // Establecemos el contraste
  display.setContrast(50);

  // Mostramos la pantalla de inicio durante 2 segundos
  //display.display(); 
  delay(2000);
  display.clearDisplay();   
}



void loop()
{
  
  RawVCC = analogRead(A0);
  auxVCC = map(RawVCC, 0, 1023, 0, 3000);
  VCC = (auxVCC / 100.0);
  
  // text display tests
  display.clearDisplay();
  display.setTextSize(2);
  display.setCursor(0,0);
  display.print("V=");
  display.println(VCC,1);
   
  display.setTextSize(1);
  display.setCursor(0,20);
  display.println("Arduino");
  display.print("Easy Voltmeter");
  display.println("sites@angmuz");
  display.display();
  delay(100);  
  
}




2. Voltímetro y Amperímetro con Arduino y LCD Nokia 5110


Esquema

Al igual que en el Proyecto 28.2, para medir la corriente vamos a usar un sensor ACS712. Se conecta como en el esquema, se alimenta entre +5V y GND y la salida la llevamos al pin A3. Si quieres saber más detalles de este módulo haz clic en enlace anterior.





Partiendo del código del voltímetro, añadimos las líneas correspondientes al amperímetro, como en el tutorial 28.2. 
También la parte correspondiente al cálculo del offset, ya estos módulos tienen un error apreciable. Así conseguimos afinar bastante la medida.


Sketch

// Voltímetro y Amperímetro con Nokia 5110 LCD Display
// https://sites.google.com/site/angmuz/

/*********************************************************************
This is an example sketch for our Monochrome Nokia 5110 LCD Displays

  Pick one up today in the adafruit shop!
  ------> http://www.adafruit.com/products/338

These displays use SPI to communicate, 4 or 5 pins are required to
interface

Adafruit invests time and resources providing this open source code,
please support Adafruit and open-source hardware by purchasing
products from Adafruit!

Written by Limor Fried/Ladyada  for Adafruit Industries.
BSD license, check license.txt for more information
All text above, and the splash screen must be included in any redistribution
*********************************************************************/

#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>

// Software SPI (slower updates, more flexible pin options):
// pin 7 - Serial clock out (SCLK)
// pin 6 - Serial data out (DIN)
// pin 5 - Data/Command select (D/C)
// pin 4 - LCD chip select (CS)
// pin 3 - LCD reset (RST)
Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 3);

// Variables para el voltímetro
int RawVCC = 0;
float VCC = 0;
float auxVCC = 0;

//Variables para el amperímetro
float ICC = 0;
float offset1 = 0;

boolean ofst = 0;

void setup()   {
  
  
  // Iniciamos comunicacion serie 
  Serial.begin(9600);
  
  // Iniciamos comunicacion con la pantalla
  display.begin();
  
  // Establecemos el contraste
  display.setContrast(50);

  // Mostramos la pantalla de inicio durante 2 segundos
  //display.display(); 
  delay(2000);
  display.clearDisplay();   
}

// Función para calcular el offset de la corriente ICC
float offset1Adj()
{
  
  display.clearDisplay();
  display.setTextSize(1);
  display.setCursor(0,0);
  display.println("Calculando");
  display.println("offset");
  display.println("No conectar");
  display.println("ninguna carga");
  display.println("Por favor");
  display.println("espere...");
  display.display();
  delay(2000);  // to allow time for stabilizing offset
  for(int i = 0; i < 1000; i++) {
  offset1 = offset1 + (.0264 * analogRead(A3) -13.51);
  delay(2);
  }
  
  digitalWrite(2, LOW);
  ofst = 1;
  return offset1;
}

void loop()
{
  if (ofst == 0) 
    {
    offset1 = offset1Adj();
    }
    
  float average1 = 0;
  for(int i = 0; i < 1000; i++) {
  average1 = average1 + (.0264 * analogRead(A3) -13.51);
  delay(1);
  }
  
  RawVCC = analogRead(A0);
  auxVCC = map(RawVCC, 0, 1023, 0, 3000);
  VCC = (auxVCC / 100.0);
  
  ICC = (average1 - offset1) ; // offset adjust
   
  // text display tests
  display.clearDisplay();
  display.setTextSize(1);
  display.setCursor(0,0);
  display.print("VCC=");
  display.print(VCC,1);
  display.println("V");
  display.print("ICC=");
  display.print(ICC,0);
  display.println("mA");
  display.print("offset=");
  display.println(offset1,0);
  display.println("");
  display.print("Volt-Amp Meter");
  display.println("sites@angmuz");
  display.display();
  delay(100); 
  
}

No hay comentarios.:

Publicar un comentario

Publicidad