Go Down

Topic: I2C LCD Display macht faxen (Read 6478 times) previous topic - next topic

sschultewolter

1. Zeile wird jede Sekunde die Zeit akualisiert.
2. Zeile wird der aktuelle Schritt i angezeigt.

Ich bekomme in undefenierbaren Zeitständen Probleme mit dem Display. Es kann direkt zu Beginn sein, oder aber erst nach einigen Schritten.
Dann ist das Display nicht mehr lesbar. Undefenierbare Zeichen mit einem Teil meiner gewünschten Zeichen. Die Zeichen flackern dann auch noch Teils.

Display ist über I2C (A5 = SCL, A4 = SDA, GND = Arduino GND, Vcc = Arduino 5V) angeschlossen. Das RTC Glied ist parallel dazu aufgelegt. Ansonsten befindet sich nichts auf der Platine.

Code: [Select]
//Uhrzeit
#include <DS1307RTC.h>
#include <Time.h>

//I2C
#include <Wire.h>

//LCD Display
#include <LCD.h>
#include <LiquidCrystal_I2C.h>
#define I2C_ADDR    0x27
#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
LiquidCrystal_I2C
lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin);

const int buttonPin = 2;
int buttonStatus = 0;
const int buzzerPin = 3; //Starwars
const int pumpePin = 4;
int pumpeStatus = 0;
int neblerStatus = 0;
const int neblerPin = 7;


Code: [Select]
void setup() {
  Serial.begin(9600);
  pinMode(buttonPin, INPUT);
  digitalWrite(buttonPin, HIGH);
  pinMode(pumpePin, OUTPUT);
  pinMode(neblerPin, OUTPUT);
  pinMode(buzzerPin, OUTPUT);

  // LCD Display
  lcd.begin (16,2);
  lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE);
  lcd.setBacklight(HIGH);
  lcd.home ();
}


Code: [Select]
void loop() {
  lcd.setCursor(0,0);
  timestamp();
  lcd.setCursor(0,1);
  menu();
}


Code: [Select]
void menu() {
  unsigned long aktuelleZeit = millis();
  static unsigned long vorherigeZeit;
  static int i;

  int wartezeit[] = {
    /*  0 */    5000,
    /*  1 */    2000,   
    /*  2 */    2000,
    /*  3 */    2000,
    /*  4 */    2000,
    /*  5 */    2000,
    /*  6 */    2000,
    /*  7 */    2000,
    /*  8 */    2000,
    /*  9 */    2000,
  };

  char* meldetext[] = {
    /*  0 */    "                ",
    /*  1 */    "Schritt 1       ",
    /*  2 */    "Schritt 2       ",
    /*  3 */    "Schritt 3       ",
    /*  4 */    "Schritt 4       ",
    /*  5 */    "Schritt 5       ",
    /*  6 */    "Schritt 6       ",
    /*  7 */    "Schritt 7       ",
    /*  8 */    "Schritt 8       ",
    /*  9 */    "Schritt 9       ",
  };

  if(aktuelleZeit - vorherigeZeit > wartezeit[i]) {
    vorherigeZeit = aktuelleZeit;
    i++;
    if(i > 9) i = 0;
    lcd.print(meldetext[i]);
  }

  if(i > 0) digitalWrite(pumpePin, HIGH);
  else digitalWrite(pumpePin, LOW);

  switch(i) {
  case 1:
    digitalWrite(neblerPin, HIGH);
    //starwars
    break;

  case 2:
    digitalWrite(neblerPin, LOW);
    break;

  case 3:
    digitalWrite(neblerPin, HIGH);
    break;

  case 4:
    digitalWrite(neblerPin, HIGH);
    break;

  case 5:
    digitalWrite(neblerPin, LOW);
    break;

  case 6:
    digitalWrite(neblerPin, HIGH);
    break;

  case 7:
    digitalWrite(neblerPin, LOW);
    break;

  case 8:
    digitalWrite(neblerPin, HIGH);
    break;

  case 9:
    digitalWrite(neblerPin, LOW);
    break;

  default:
    digitalWrite(pumpePin, LOW);
    digitalWrite(neblerPin, LOW);
  }
}

void timestamp() {
  unsigned long aktuelleZeit = millis();
  static unsigned long vorherigeZeit;
  int wartezeit = 1000;

  if(aktuelleZeit - vorherigeZeit > wartezeit) {
    vorherigeZeit = aktuelleZeit; 
    tmElements_t tm;
    RTC.read(tm);
    print2digits(tm.Day);
    lcd.print('.');
    print2digits(tm.Month);
    lcd.print(".  ");
    print2digits(tm.Hour);
    lcd.print(':');
    print2digits(tm.Minute);
    lcd.print(':');
    print2digits(tm.Second);
  }
}

void print2digits(int i) {
  if(i >= 0 && i < 10) {
    lcd.print('0');
    lcd.print(i);
  }
  else lcd.print(i);
}
Orginal Atmel AVRISP mkII zu verkaufen. Anfrage per PN ;)

uwefed

Welches Display und welchen I2C Umsetzer verwendest Du?
Ist die Verbindung I2C Unsetzer und LCD-Modul gut?
Grüße Uwe

jurs


Ich bekomme in undefenierbaren Zeitständen Probleme mit dem Display. Es kann direkt zu Beginn sein, oder aber erst nach einigen Schritten.
Dann ist das Display nicht mehr lesbar. Undefenierbare Zeichen mit einem Teil meiner gewünschten Zeichen. D


Länge der Leitungen zwischen Board und Display?
Der Fehler klingt stark nach "zu lange Leitung" (wenn's kein "Wackelkontakt" ist).

Serenifly

Was ist den dass für eine komische Initialisierung:

LiquidCrystal_I2C   lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin);

Wenn das über I2C läuft hast du diese Pins gar nicht. Du sagst doch selbst, dass es nur an SCL und SDA hängt.

Ich weiß es gibt verschiedene Libs (und du hast so wie es aussieht eine andere), aber bei mir geht das so:
LiquidCrystal_I2C lcd(0x27, 20, 4);

Also Adresse und Größe übergeben. Auch wenn du eine andere Lib hast besteht da kein Grund Pins für ein paralleles Interface zu definieren.

michael--g


Was ist den dass für eine komische Initialisierung:
LiquidCrystal_I2C   lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin);


Habe ich auch, bei mir ist es die <LiquidCrystal_I2C.h>.
Bei mir macht das LCD auch Faxen, daher halte ich mich mit den übrigen Vorschlägen zurück und lese gerne mit :-)

Ich würde aber dennoch zuerst die ausreichende Spannungsversorgung überprüfen (Hintergrundbeleuchtung?).

Grüße

sschultewolter

#5
Aug 06, 2013, 07:37 pm Last Edit: Aug 06, 2013, 11:03 pm by sschultewolter Reason: 1
Verdrahtet ist es derzeit nur über das Breadboard. Alles Einzelader.



Um diese Display handelt es sich.
http://www.ebay.de/itm/181174009257?ssPageName=STRK:MEWNX:IT&_trksid=p3984.m1497.l2649

Glaube schon fast, dass dort irgendwo ein Wackelkontakt war, habe es gerade überhaupt nicht.


Hier nochmal der Artikel beim Hersteller:
http://www.sainsmart.com/new-sainsmart-iic-i2c-twi-1602-serial-lcd-module-display-for-arduino-uno-mega-r3.html

Gibt es eine möglichkeit, dort die Helligkeit des Displays zu regeln?

Ich kann mit   lcd.setBacklight(); die Helligkeit AN/Aus schalten. Jedoch geht ein analogWert von 0...255 nicht. 0 = AUS, > 1 = AN. Hat es wer schon einmal mit dem Jumper versucht? Würde für die Helligkeit 1 PWM "opfern", da ich meine komplette Lichtsteuerung andersweitig gelöst hab.
Orginal Atmel AVRISP mkII zu verkaufen. Anfrage per PN ;)

uwefed

#6
Aug 06, 2013, 10:11 pm Last Edit: Aug 06, 2013, 10:12 pm by uwefed Reason: 1
Bitte korrigiere Deine Angaben.
Laut Verdratung steuerst Du das LCD nicht über I2C sondern paralell an und benutzt auch noch die Pins 10, 11 und 13, die vom Ethernetshield, das auf dem Arduino sitzt, verwendet werden. Das LCD auf dem Foto ist weder das von ebay noch das von Saintsmart.

Was Hast Du denn an Hardware?

Mir kommt es fast so vor, wie der Betrunkene, der in der Nacht seinen Schlüssel unter der Straßenlaterne sucht, nicht weil er ihn dort verloren hat sondern weil dort Licht ist.

Grüße Uwe

sschultewolter

Tut mir Leid, habe den Beitrag geändert. Ich hab die falsche Bild-URL eingefügt.  :|

Das Bild war von einem anderen Projekt.

Falls auf dem Bild nicht alles so gut zu erkennen ist.


Arduino Uno R3 + ProtoShield
Tiny RTC (I2C) (Rechts über dem Display)
Sainsmart 16x02 (I2C)
Orginal Atmel AVRISP mkII zu verkaufen. Anfrage per PN ;)

JuergenR

Welches Bild passt denn nu?

Grüße,
Jürgen

sschultewolter

Das einzige, was hier noch zu finden ist ;) Hab den alten Link entfernt
Orginal Atmel AVRISP mkII zu verkaufen. Anfrage per PN ;)

sschultewolter

Guten Morgen,

ich muss den Thread noch einmal reaktivieren. Zwischenzeitig sah alles ganz gut aus, nun jedoch treten die Fehler wieder auf.
Das Problem, es kommt zu Stillstand des Programmes.

Alle angeschlossenen Komponenten werden extern mit 5V versorg (GND mit Board verbunden).

Habe einmal ein Bild meiner Verkabelung.



Sowie ein Video gemacht.

Youtube

Erst konnte ich den Text nicht sehen der mir dazwischen angezeigt wurde. Habe die Aktualisierungsdauer verringert.





Code: [Select]

void loop()
{    
 aktuelleZeit = millis();
 static int i;

 // LCD Display
 lcd.setCursor(0,0); // Display 1. Zeile
 uhrzeit();

 lcd.setCursor(0,1); // Display 2. Zeile

[..]
Code: [Select]

void uhrzeit()
{
 static unsigned long vorherigeZeit;
 aktuelleZeit = millis();
 int wartezeit = 1000;

 if(aktuelleZeit - vorherigeZeit > wartezeit)
 {
   vorherigeZeit = aktuelleZeit;  
   tmElements_t tm;
   RTC.read(tm);
   print2digits(tm.Day);
   lcd.print('.');
   print2digits(tm.Month);
   lcd.print(".  ");
   print2digits(tm.Hour);
   lcd.print(':');
   print2digits(tm.Minute);
   lcd.print(':');
   print2digits(tm.Second);

   //Starte die Routine von 8:00 - 20:30 jede halbe Stunde
   //RTC.read(tm);
   //    if ((tm.Minute >= 8 && tm.Minute <= 50) && (tm.Second == 0 || tm.Second == 30)) routine = 1;
   //  else routine = 0;
 }
}

void print2digits(int i) {
 if(i >= 0 && i < 10)
 {
   lcd.print('0');
   lcd.print(i);
 }
 else lcd.print(i);
}

Orginal Atmel AVRISP mkII zu verkaufen. Anfrage per PN ;)

uwefed

F()-Makro?
http://forum.arduino.cc/index.php?topic=127552.msg965539#msg965539
Grüße Uwe

sschultewolter

neu.ino: In function 'void loop()':
neu:119: error: initializer fails to determine size of '__c'

      lcd.print(F(meldetext));

Wieso möchte das nicht funktionieren?
Orginal Atmel AVRISP mkII zu verkaufen. Anfrage per PN ;)

uwefed

Wenn ich den Sketch immer nur Häppchenweise bekomme kann ich Dir nicht helfen.

jurs


Habe einmal ein Bild meiner Verkabelung.


Da zeigst Du das Bild einer problematischen Verkabelung Deiner I2C-Bus Geräte.
Der I2C ist ein Bus, an dem die Geräte idealerweise wie an einer Perlenkette angeschlossen werden.
Skizze von zwei Geräten mit Anschluss an einem Bus-System:
Code: [Select]

Bus-Topologie (beste Lösung)
+------------+
|            |    Leitung                     Leitung 
|            |-------------------------O------------------O
|            |                      Gerät1              Gerät2
+------------+

Z.B. am I2C Bus mit "Gerät1= LCD-Display" und "Gerät2= RTC-Uhrenmodul" (oder umgekehrt)

Deine Verkabelung (Bild vom 6.8.) zeigt ist allerdings eine eher ungünstige Verkabelungsvariante:
Code: [Select]

Kombinierte Stummel-Stern-Topologie (ungünstig)
+------------+
|            |    Leitung                Leitung       Gerät1
|            |------------------+------------------------O
|            |                  | 
+------------+                  +------------------------O
                            Breadbord    Leitung       Gerät2


Dein Video zeigt außerdem, dass mit dem Display überhaupt kein Problem auftritt, sondern mit dem Auslesen des RTC-Uhrenmoduls liegt ein Problem vor.

Mein Vorschlag wäre eine geänderte Verkabelung:
Das RTC-Uhrenmodul ist doch offenbar mit einer Reihe Header-Pins versehen.
Diese Header-Pins der RTC könnte man direkt in ein Breadboard stecken

Vorschlag:
1.) Nimm die vorhandene I2C-Busverkabelung zwischen Arduino, Breadboard, Display und RTC weg.
2.) Stecke die Header-Pins der RTC ins Breadboard
3.) Verkabele neu vom Arduino zur RTC auf dem Breadboard
4.) Verkabele neu von den Steckkontakten der RTC im Breadboard zum Display

Dann hast Du eine reine Bus-Topologie:
- einmal Leitungen vom Arduino zur gesteckten RTC auf dem Breadboard
- einmal Leitungen von der RTC auf dem Breadboard zum LCD-Display
Du bist dann die ungünstige Stummel-Stern-Topologie los und das ist für eine fehlerfreie Datenübertragung auf dem Bus dann viel zuträglicher.

Go Up