IMG_1228

Spannung Messen und auf I2C LCD ausgeben

Ziel dieses Projektes ist es eine Spannung auf dem Eingang „A0“ zu messen und auf einen LCD Display welches über einen I2C-Bus angesprochen wird auszugeben. Ich habe mir hierbei ein 4 zeiliges Display besorgt.

IMG_1228

Es reichen wir 4 Adern, die mit dem Arduino verbunden werden.

SCL=> A5

SDA=>A4

VCC=> 5V+

GND=> GND

IMG_1229

Die Schwierigkeit liegt im wesentlichen nun die Adresse des angeschlossenen Gerätes herauszufinden, ich habe hierzu einen I2C Scanner genutzt. Den I2C Scanner auf den Arduino übertragen, danach den seriellen Plotter starten und die angezeigte Adresse notieren. Ich habe bei meinem Display einen PCF8574A PortExpander. Da keine Lötbrücke auf dem Board geschlossen war, lautet bei mir die Adresse 0x3F, bei einem PCF8574 wäre es 0x27. Es ist also möglich mehrere Display’s zu betreiben. Sehr gute Erfahrungen habe ich mit der Library von „fmalpartida“ gemacht. Nun muss im Quellcode nur noch Eure I2C Adresse angepasst werden und es sollte funktionieren. Ich habe das Programm so geschrieben, dass alle 2 Sekunden die Spannung an Pin A0 abgefragt und auf dem Display ausgegeben werden. Der Analogeingang hat eine Auflösung von 10Bit, das heißt es gibt 1024 Zustände bei 5V

5V=>1024

2,5V=>512

0V=>0

Somit beträgt die Steigerung um 1Bit 5V/1024=0,004828125V

Um also die Spannung wieder auszugeben müssen wir den Wert den wir mit AnalogRead(PortPin) ausgelesen haben mit diesem Wert Multiplizieren. Da wir hier Kommastellen benötigen, müssen wir die Variable als Float definieren. Sollten wir sie als Integer definieren, würde der Arduino eine „Rundung“ vornehmen. Somit würden nur ganzzahlige Werte auf dem Display ausgegeben.


Quellcode I2C Scanner;

#include <Wire.h>
void setup()
{
Wire.begin();
  Serial.begin(9600);
Serial.println(„\nI2C Scanner“);
}
void loop()
{
byte error, address;
int nDevices;
  Serial.println(„Scanning…“);
  nDevices = 0;
for (address = 1; address < 127; address++ )
{
Wire.beginTransmission(address);
error = Wire.endTransmission();
    if (error == 0)
{
Serial.print(„I2C device found at address 0x“);
if (address < 16)
Serial.print(„0″);
Serial.print(address, HEX);
Serial.println(“  !“);
      nDevices++;
}
else if (error == 4)
{
Serial.print(„Unknow error at address 0x“);
if (address < 16)
Serial.print(„0“);
Serial.println(address, HEX);
}
}
if (nDevices == 0)
Serial.println(„No I2C devices found\n“);
else
Serial.println(„done\n“);
  delay(5000);           // wait 5 seconds for next scan
}

 


Quellcode für das Programm:

#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>
#define I2C_ADDR    0x3F // Hier die Hex-Adresse des Display eingeben
#define BACKLIGHT_PIN     3
#define En_pin  2
#define Rw_pin  1
#define Rs_pin  0
#define D4_pin  4
#define D5_pin  5
#define D6_pin  6
#define D7_pin  7
int n = 1;
int lesewertA0 = 0;
int analogpin0 = 0;
float Spannung;
LiquidCrystal_I2C  lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin);
void setup()
{
lcd.begin (20,4);
lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE);
lcd.setBacklight(HIGH);                       //Hintergrundbeleuchtung des Displays einschalten
lcd.home ();                   // go home
}
void loop()
{
lesewertA0= analogRead(analogpin0);
Spannung=(lesewertA0*0.0048828125);
lcd.setBacklight(HIGH);     // Backlight on
lcd.setCursor(0,0);
lcd.print(„A0=“);
lcd.print(Spannung);
lcd.print(„V“);
delay(2000);
lcd.clear();
}

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert