Analog Wert am I2C Display ausgeben

Hallo Leute!
Ich bin gerade dabei ein kleines Projekt mit dem Arduino Uno umzusetzen. Dazu möchte ich einen Analogwert über ein LCD Display ausgeben, welches über die Ports 20 & 21 (I2C) mit dem Board verbunden ist.

In der Theorie funktioniert auch alles super… also wenn ich den Wert über die serielle Schnittstelle an den PC sende, zeigt mir dieser werte zwischen 2 und 1017 an. Wenn ich diesen Wert jedoch am LCD ausgebe, dann fuktioniert dies nur im oberen Bereich. Sobald man unter einen gewissen Wert kommt, gibt das LCD Artefakte aus oder schaltet sich gar komplett aus.

Wie ist das möglich?

Ich danke für eure Hilfe
Mit freundlichen Grüßen
Bernd

Hier noch der verwendete Code:

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x3F,20,4);

void varCleaning(int xOffset, int yOffset, int Length);

const int Potentiometer = A5;  //Potentiometer
int val = 0;

void setup()
{
  lcd.init();
  lcd.backlight();
}


void loop()
{
  lcd.setCursor(0,1);
  lcd.print("Analog: ");
  val = analogRead(Potentiometer);
  lcd.print(val);
  delay(100);
  varCleaning(8, 1, 4);
}


void varCleaning(int xOffset, int yOffset, int Length)
{
  int iClean = 0;
  lcd.setCursor(xOffset, yOffset);
  for(iClean=0; iClean<Length; iClean++)
  {
    lcd.print(" ");
  }
  lcd.setCursor(xOffset, yOffset);
}

berndn:
Wie ist das möglich?

Was hängt außer dem LCD und dem Poti noch als Schaltung am Arduino?
Ist GND vom LCD und GND vom Arduino miteinander verbunden?
Wie genau hast Du das Poti geschaltet?

Außerdem finde ich Deinen Code etwas merkwürdig. Probiere mal:

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x3F,20,4);

const int Potentiometer = A5;  //Potentiometer
int val = 0;

void setup()
{
  lcd.init();
  lcd.backlight();
  lcd.print("Analog:");
}

void loop()
{
  lcd.setCursor(8,1);
  val = analogRead(Potentiometer);
  if (val<1000) lcd.print(' ');
  if (val<100)  lcd.print(' ');
  if (val<10)   lcd.print(' ');
  lcd.print(val);
  delay(100);
}

Sobald man unter einen gewissen Wert kommt, gibt das LCD Artefakte aus oder schaltet sich gar komplett aus.

Sieht so aus, wie wenn Dir die Spannung zusammenbricht. Ich tippe auf zu kleine Widerstände, die bei kleiner Poti-Einstellung einen zu grossen Strom verursachen, worauf dann die Versorgung zusammenbricht. Aber wie jurs bereits ausgeführt hat, müssten wir dazu die von Dir benutzte Schaltung kennen.

Was hängt außer dem LCD und dem Poti noch als Schaltung am Arduino?

Außer dem Poti hängt noch das LCD Display über I2C an Port 20 und 21. Weiters sind noch ein Motorshield, ein paar Taster und 2 LEDs angeschlossen, welche aber in keinem Programm angesprochen werdn. (Möchte es nicht abschließen, da ich die Kontakte über Jumperkabel herausgeführt habe und das ein ziemlicher Aufwand war)

Ist GND vom LCD und GND vom Arduino miteinander verbunden?

Ja. Das LCD wird über die 5V und GND vom Arduino Uno versorgt.

Wie genau hast Du das Poti geschaltet?

Habe das ganze verschalten, wie es im Tutorial erklärt wird. http://arduino.cc/en/Tutorial/ReadAnalogVoltage

Außerdem finde ich Deinen Code etwas merkwürdig. Probiere mal:

Der einzige Unterschied zwischen deinem Code und meinem Code ist, dass deine Werte rechtsbündig sind, während meine linksbündig angeordnet sind.

Sieht so aus, wie wenn Dir die Spannung zusammenbricht.

Ich verwende ein 10k Potentiometer. Habe mir zuerst auch gedacht, dass die Spannung zusammenbricht und das Board deshalb etwas unerwartetes macht. Aber da das ganze über die serielle Schnittstelle zum PC serwohl funktioniert und alle Werte ausgibt, ist das eher ausgeschlossen...

Aber da das ganze über die serielle Schnittstelle zum PC serwohl funktioniert und alle Werte ausgibt, ist das eher ausgeschlossen...

Nein, der ATmega funktioniert auch mit 4V noch wunderbar, ob das auch für Dein Display gilt, weiss ich nicht, da Du keinen Link auf das Produkt zur Verfügung gestellt hast.

Außer dem Poti hängt noch das LCD Display über I2C an Port 20 und 21. Weiters sind noch ein Motorshield, ein paar Taster und 2 LEDs angeschlossen, welche aber in keinem Programm angesprochen werdn.

Nur weil sie im Programm nicht angesprochen werden, heisst das noch nicht, dass sie keinen Strom konsumieren.
Apropos I2C: wie gross sind die Pullups? Sind sie gegen 5V oder gegen 3V3 (hängt vom Display ab).

Nein, der ATmega funktioniert auch mit 4V noch wunderbar, ob das auch für Dein Display gilt, weiss ich nicht, da Du keinen Link auf das Produkt zur Verfügung gestellt hast. Nur weil sie im Programm nicht angesprochen werden, heisst das noch nicht, dass sie keinen Strom konsumieren. Apropos I2C: wie gross sind die Pullups? Sind sie gegen 5V oder gegen 3V3 (hängt vom Display ab).

Habe nun die Spannung gemessen, während ich das Potentiometer verändert habe -> Sie bleibt konstant auf 5V! Ich denke, dass der Punkt mit der zusammenbrechenden Spannungsversorgung somit hinfällig ist.

Zu meinem LCD: Ich verwende das Sainsmart LCD 2004 ([Discontinued] 20x4 IIC/I2C/TWI LCD Module – SainSmart.com). Zu den verbauten Pullups kann ich leider nichts sagen... Da müsste ich mir mal das Datenblatt ansehen. Welche Auswirkungen hätten die Pullups? Das Display funktioniert in jeder anderen Anwendung ohne Probleme!

Kann es möglich sein, dass der Fehler auftritt, weil hier Pin A5 verwendet wird und dieser ebenfalls für I2C zur Verfügung steht?

berndn:
Kann es möglich sein, dass der Fehler auftritt, weil hier Pin A5 verwendet wird und dieser ebenfalls für I2C zur Verfügung steht?

Das ist vermutlich der Fehler. Ich wundere mich, dass du überhaupt Anzeigen bekommen hast.

berndn:
Kann es möglich sein, dass der Fehler auftritt, weil hier Pin A5 verwendet wird und dieser ebenfalls für I2C zur Verfügung steht?

Nicht nur vieleicht sondern sicher!!
Wir hätten das eigentlih schon sofort bei ersten Reply sehen müssen :~ :~ :~

const int Potentiometer = A5;  //Potentiometer

A4 und A5 dürfen nur für den I2C verwendet werden.

Grüße Uwe

uwefed:
Nicht nur vieleicht sondern sicher!!

Auf einem MEGA Board?

Er hat doch implizit angegeben, einen Arduino MEGA zu verwenden:
über ein LCD Display ausgeben, welches über die Ports 20 & 21 (I2C) mit dem Board verbunden ist.

Wenn bei der Boardeinstellung "Arduino MEGA" trotzdem der A5 (SCL auf dem UNO) mit irgendeiner I2C Geschichte angesteuert wird, muss ja wohl die von ihm verwendete I2C-Display Library fehlerhaft sein.

berndn:
Hallo Leute!
Ich bin gerade dabei ein kleines Projekt mit dem Arduino Uno umzusetzen. Dazu möchte ich einen Analogwert über ein LCD Display ausgeben, welches über die Ports 20 & 21 (I2C) mit dem Board verbunden ist.

Jurs, da ist berndn erwas ungenau.
Er schreibt (wie zitiert) Arduino UNO und dann Ports 20 und 21. Da stimmt vieles nicht zusammen.

Also ich prezisiere:
Aruduino UNO: Nicht nur vieleicht, sondern sicher!!
Arduino MEGA2560: Müßte eigentlich funktionieren.

Grüße Uwe

uwefed:
Jurs, da ist berndn erwas ungenau.
Er schreibt (wie zitiert) Arduino UNO und dann Ports 20 und 21. Da stimmt vieles nicht zusammen.

Stimmt, "UNO" im Zusammenhang mit den Ports 20 und 21 für I2C ist nicht nur ungenau, das ist komplett falsch. Da hat er sich schon mit seinem Einführungssatz komplett vergrüßt und total widersprechende Angaben über die Hardware und die Schaltung gemacht.

Ich war aufgrund der 20/21-Portangaben davon ausgegangen, daß er einen MEGA verwendet.

Ok, dass man A4 und A5 nur für I2C verwenden kann, wusste ich nicht... Habe wohl überlesen (hier: Wire - Arduino Reference), dass es sich hierbei um den DUE handelt! Ich verwende ein Arduino UNO R3. Das Display ist über die I2C Schnittstelle (SDA, SCL) beim AREF Pin angeschlossen.

Gibt es keine Möglichkeit die Ports A4 und A5 trotzdem zu verwenden?
Dank für eure Hilfe!

berndn:
Gibt es keine Möglichkeit die Ports A4 und A5 trotzdem zu verwenden?
Dank für eure Hilfe!

Nein, keine Chance.
Beim Arduino UNO sind die Pins A4 und A5 elektrisch mit den Pins SDA, SCL verbunden. Miß mal nach.

Übrigens beim Arduino MEGA sind die Pins 20 und 21 mit den Pins SDA un SCL verbunden. So hat man an den pins SDA und SCL immer die I2C unabhängig vom Board.

Viele Grüße Uwe

Nein, keine Chance.
Beim Arduino UNO sind die Pins A4 und A5 elektrisch mit den Pins SDA, SCL verbunden. Miß mal nach.

Ok danke! Das beudeutet, dass Port A4 und A5 nicht zu verwenden sind, sobald I2C aktiviert wird?

berndn:
Ok danke! Das beudeutet, dass Port A4 und A5 nicht zu verwenden sind, sobald I2C aktiviert wird?

Auf'm (beispielsweise) UNO ja, auf'm (beispielsweise) MEGA nein.
Hängt vom Board ab.

Im übrigen sind die Pins auch nicht "nicht zu verwenden", denn Du verwendest sie ja, wenn Du I2C aktivierst, und zwar für I2C!

Heute scheint mir Jurs ganz genau. :wink: :wink: :wink:

Da wir hier von einem Arduino UNO sprechen: ja Du kannst die Pins A4 und A5 nur für die I2C Schnittstelle und nicht als analoge Eingänge oder Digitale Pins benutzen.

Grüße Uwe

Im übrigen sind die Pins auch nicht "nicht zu verwenden", denn Du verwendest sie ja, wenn Du I2C aktivierst, und zwar für I2C!

Naja... Wenn ich I2C aktiviere, dann verwende ich die SCL und SDA Pins über dem AREF Pin... somit gehen irgendwie doch 2 Analogports verloren...

Danke nochmal für die hilfreichen Antworten!

Ja die 2 Analogpins A4 und A5 gehen verloren. Du kannst aber mit einem Analogmultiplexer die Analogports erweitern.
Grüße Uwe

Hallo,

Jurs schrieb folgenden Code:

void loop()
{
  lcd.setCursor(8,1);
  val = analogRead(Potentiometer);
  if (val<1000) lcd.print(' ');
  if (val<100)  lcd.print(' ');
  if (val<10)   lcd.print(' ');
  lcd.print(val);
  delay(100);

Was machen denn die if-Abfragen für einen Sinn? Wird hier der vorige Wert im Display gelöscht? Aber warum dann abhängig von der Größe? Der Wert val wird ja erst danach noch auf das Display geschrieben, unabhängig vom Wert.

Vielen Dank schon mal für die Aufklärung.

Hi,

das passt so schon alles. Bei einem LCD (Displays allgemein) ist es so, dass ein Zeichen so lange stehen bleibt, bis man es mit einem neuen überschreibt. Wenn man jetzt z.B. eine Temperatur auf's LCD schreibt und diese sinkt, bleiben noch ein paar unnötige Zeichen auf dem Display stehen und die If-Abfragen löschen/ überschrieben diese.

Beispiel:
Am Display steht Folgendes:
T e m p . : 1 0 0 0 ° C (keine If-Abfrage ist wahr)

Nun ändert sich die Temperatur (100 °C):
T e m p . : 1 0 0 ° C (1. If-Abfrage ist wahr)
Ohne die Abfrage würde das jetzt da stehen:
T e m p . : 1 0 0 ° C C

Nun wird es noch kälter... (1 °C):
T e m p . : 1 ° C (alle If-Abfrage sind wahr)
Ohne die Abfrage würde das jetzt da stehen:
T e m p . : 1 ° C 0 ° C (wenn die Temp. davor 1000 °C war)

Deshalb müssen die Leerzeichen bzw. die Positionen in Abhänigkeig von der Größe des Wertes ausgegeben / überschrieben werden. Außerdem sieht die ganze Ausgabe so auf dem Display auch viel schöner aus.

Gruß...