I2C LCD Display macht faxen

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);

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 :slight_smile:

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

Grüße

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.

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

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

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)

Welches Bild passt denn nu?

Grüße,
Jürgen

Das einzige, was hier noch zu finden ist :wink: Hab den alten Link entfernt

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.

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

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

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

[..]

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);
}

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

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?

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

sschultewolter:
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:

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:

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.

Ist der I2C Bus am Ende terminiert?

Micky

Hab Display nun an erster Stelle, da er die Pins durchleitet und danach Display.

War wohl anfangs das Glück mit mir, dass es klappte. @Uwe, ich hab nicht den ganzen Sketch reingeladen, da es hauptsächlich nach änderungen in diesem Teil ging. Der org. Sketch erstreckt sich auf einige 100 Zeilen.

Edit: Umstecken brachte keinen Erfolgt, werde mal eben sehen, was ich für die Terminierung brauche.

@Uwe, ich hab nicht den ganzen Sketch reingeladen, da es hauptsächlich nach änderungen in diesem Teil ging. Der org. Sketch erstreckt sich auf einige 100 Zeilen.

Das Problem steckt 99,9% nicht in dem Teil, das Du uns gibst, da Du ansonsten den Fehler bereits gefunden hättest.
Probleme mit Indexoverflow von Arrays oder falsche Anwendung von Pointern bzw RAMoverflow ergeben sehr oft Fehler abseits der Anwendung der Arrays bzw Pointer.

Mir ist es mal passiert indem ich in ein Array außerhalb des gültigen Index etwas gespeichert habe (int array[10]; array[10]=1;) eine For-schleife nicht mehr endete. Ein Serial.print an eine bestimmten Stelle beseitigte den Fehler. Wo ist denn dann der Fehler? In der For-Schleife oder im Serial.print?

Glaub uns, wenn wir nach dem gesamten Sketch fragen, dann hat es seinen Grund und wenn Du uns nicht glaubst, wieso willst Du dann Hilfe von uns?

Grüße Uwe

Da haste ihn :wink:

#include <DS1307RTC.h> // RTC
#include <Time.h>
#include <Wire.h> // I2C
#include <ShiftPWM.h> // RGB Shift Register

// 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);

// RGB Shift Register
const int ShiftPWM_latchPin=8;
const bool ShiftPWM_invertOutputs = false;
const bool ShiftPWM_balanceLoad = false;
unsigned char maxHelligkeit = 255;
unsigned char pwmFrequenz = 75;
unsigned int numRegister = 3;
unsigned int numAusgaenge = numRegister*8;
unsigned int numRgbLeds = numRegister*8/3;
unsigned long startZeit = 0;

// Digitale Eingänge
const int buttonPin = 2; // Manuelle Umschaltung
const int buzzerPin = 3; // Piezzo
const int pumpePin = 4;
const int wasserPin = 5; // Schwimmer Wasserstand
const int neblerPin = 7;
const int alarmPin = 10;
static int temperatur = 0; // debug
static int wasserstand = 0; // debug

unsigned long aktuelleZeit;  

char* meldetext[] = 
{
  /*  0 */  "AUS             ",
  /*  1 */  "Fade1           ",
  /*  2 */  "Fade1+          ",
  /*  3 */  "Fade1++         ",
  /*  4 */  "Fade2           ",
  /*  5 */  "Fade2+          ",
  /*  6 */  "Fade2++         ",
  /*  7 */  "FadeAlle        ",
  /*  8 */  "FadeAlle+       ",
  /*  9 */  "FadeAlle++      ",
  /* 10 */  "FadeFlash       ",
  /* 11 */  "FadeFlash+      ",
  /* 12 */  "FadeFlash++     ",
  /*  13 */  "Regenbogen1    ",
  /* 14 */  "Regenbogen1+    ",
  /* 15 */  "Regenbogen1++   ",
  /* 16 */  "Regenbogen2     ",
  /* 17 */  "Regenbogen2+    ",
  /* 18 */  "Regenbogen2++   ",
};

void setup(){
  while(!Serial){
    delay(100); 
  }
  Serial.begin(9600);

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

  pinMode(buttonPin, INPUT);
  pinMode(wasserPin, INPUT);
  pinMode(buzzerPin, OUTPUT);
  pinMode(pumpePin, OUTPUT);
  pinMode(neblerPin, OUTPUT);
  pinMode(alarmPin, OUTPUT);

  // RGB Shift Register
  ShiftPWM.SetAmountOfRegisters(numRegister);
  ShiftPWM.SetPinGrouping(1);
  ShiftPWM.Start(pwmFrequenz,maxHelligkeit);
}

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

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

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

  // Manuell umschalten (Taster)
  static int buttonStatus;
  static int letzterButtonStatus;

  buttonStatus = digitalRead(buttonPin);
  if(buttonStatus != letzterButtonStatus) 
  {
    if(buttonStatus == HIGH) 
    {
      i++;
      lcd.print(meldetext[i]);
      startZeit = millis();
      ShiftPWM.SetAll(0);
    }
    letzterButtonStatus = buttonStatus;
  }

  // Manuell umschalten (Serieller Monitor)
  if(Serial.available())
  {
    i = Serial.parseInt();
    startZeit = millis();
  }

  // Automisch umschalten (RTC)

  // Überwachung Wasserstand & Temperatur  
  //   int wasserstand = digitalRead(wasserPin);
  /*  if(wasserstand == 0 && temperatur == 1)
   {
   lcd.print("Wasserstand MIN ");
   digitalWrite(pumpePin, LOW);
   digitalWrite(neblerPin, LOW);
   digitalWrite(alarmPin, HIGH);
   }
   else if(wasserstand == 1 && temperatur == 0)
   {
   lcd.print("Temperatur MAX  ");
   digitalWrite(pumpePin, LOW);
   digitalWrite(neblerPin, LOW);
   digitalWrite(alarmPin, HIGH);
   }
   else if(wasserstand == 1 && temperatur == 1)
   {
   static unsigned long vorherigeZeit;
   Serial.println(vorherigeZeit);
   // Alle 2s umschalten
   if(aktuelleZeit - vorherigeZeit > 2000 && aktuelleZeit - vorherigeZeit < 4000)
   {
   lcd.print("Wasserstand MIN ");
   digitalWrite(alarmPin, HIGH);
   }
   else if(aktuelleZeit - vorherigeZeit > 4000)
   {
   lcd.print("Temperatur MAX  ");
   vorherigeZeit = aktuelleZeit;
   digitalWrite(alarmPin, LOW);
   }
   digitalWrite(pumpePin, LOW);
   digitalWrite(neblerPin, LOW);
   }
   else 
   {
   digitalWrite(pumpePin, HIGH);
   digitalWrite(neblerPin, HIGH);
   digitalWrite(alarmPin, LOW);
   }
   */

  switch(i) 
  {
  case 0:

    break;

  case 1:
    rgbFade1(500); //(unsigned long) fadeZeit, Std. 500;
    break;

  case 2:
    rgbFade1(200); //(unsigned long) fadeZeit, Std. 500;
    break;

  case 3:
    rgbFade1(50); //(unsigned long) fadeZeit, Std. 500;
    break;

  case 4:
    rgbFade2(500); //(unsigned long) fadeZeit, Std. 500;
    break;

  case 5:
    rgbFade2(200); //(unsigned long) fadeZeit, Std. 500;
    break;

  case 6:
    rgbFade2(100); //(unsigned long) fadeZeit, Std. 500;
    break;

  case 7:
    rgbFadeAlle(5000); //(unsigned long) zyklusZeit, Std. 5000;
    break;

  case 8:
    rgbFadeAlle(2000); //(unsigned long) zyklusZeit, Std. 500;
    break;

  case 9:
    rgbFadeAlle(1000); //(unsigned long) zyklusZeit, Std. 500;
    break;

  case 10:
    rgbFadeFlash(2000); //(unsigned long) fadeZeit, Std. 5000;
    break;

  case 11:
    rgbFadeFlash(500); //(unsigned long) fadeZeit, Std. 5000;
    break;

  case 12:
    rgbFadeFlash(50); //(unsigned long) fadeZeit, Std. 5000;
    break;

  case 13:
    rgbRegenbogen(3000, numRgbLeds); // (unsigned long zyklusZeit, int rainbowWidth), Std. 3000, numRgbLeds)
    break;

  case 14:
    rgbRegenbogen(1000, numRgbLeds);// (unsigned long zyklusZeit, int rainbowWidth), Std. 3000, numRgbLeds)
    break;

  case 15:
    rgbRegenbogen(500, numRgbLeds);// (unsigned long zyklusZeit, int rainbowWidth), Std. 3000, numRgbLeds)
    break;

  case 16:
    rgbRegenbogen(10000, 5 * numRgbLeds);// (unsigned long zyklusZeit, int rainbowWidth), Std. 3000, numRgbLeds)
    break;

  case 17:
    rgbRegenbogen(3000, 5 * numRgbLeds);// (unsigned long zyklusZeit, int rainbowWidth), Std. 3000, numRgbLeds)
    break;

  case 18:
    rgbRegenbogen(1000, 5 * numRgbLeds);// (unsigned long zyklusZeit, int rainbowWidth), Std. 3000, numRgbLeds)
    break;

  default:
    i = 0;
    lcd.clear();
  }
}

// Fade In und Fade Out jeder LED einzeln
void rgbFade1(unsigned long i) 
{
  unsigned long fadeZeit = i;
  unsigned char helligkeit;
  unsigned long loopZeit = numAusgaenge * fadeZeit * 2;
  unsigned long zeit = millis() - startZeit;
  unsigned long timer = zeit % loopZeit;
  unsigned long aktuellerSchritt = timer % (fadeZeit * 2);

  int aktiveLed = timer / (fadeZeit * 2);

  if(aktuellerSchritt <= fadeZeit) helligkeit = aktuellerSchritt * maxHelligkeit / fadeZeit;
  else helligkeit = maxHelligkeit - (aktuellerSchritt - fadeZeit) * maxHelligkeit / fadeZeit;
  ShiftPWM.SetAll(0);
  ShiftPWM.SetOne(aktiveLed, helligkeit);
}

// Fade In und Fade Out jeder LED einzeln
void rgbFade2(unsigned long i) 
{
  unsigned long fadeZeit = i;
  unsigned long loopZeit = numAusgaenge * fadeZeit;
  unsigned long zeit = millis() - startZeit;
  unsigned long timer = zeit % loopZeit;
  unsigned long aktuellerSchritt = timer % fadeZeit;

  int aktiveLed = timer / fadeZeit;
  unsigned char helligkeit = aktuellerSchritt * maxHelligkeit / fadeZeit;

  ShiftPWM.SetAll(0);
  ShiftPWM.SetOne((aktiveLed + 1) % numAusgaenge, helligkeit);
  ShiftPWM.SetOne(aktiveLed, maxHelligkeit - helligkeit);
}

void rgbFadeAlle(unsigned long i) 
{ 
  unsigned long zyklusZeit = i;
  unsigned long zeit = millis() - startZeit;
  unsigned long hue = (360 * zeit / zyklusZeit) % 360;
  ShiftPWM.SetAllHSV(hue, 255, 255); 
}

// Fade In und Fade Out alle LEDs
void rgbFadeFlash(unsigned long i) 
{
  unsigned char helligkeit;
  unsigned long fadeZeit = i;
  unsigned long zeit = millis() - startZeit;
  unsigned long aktuellerSchritt = zeit % (fadeZeit * 2);

  if(aktuellerSchritt <= fadeZeit) helligkeit = aktuellerSchritt * maxHelligkeit / fadeZeit;
  else helligkeit = maxHelligkeit -(aktuellerSchritt - fadeZeit) * maxHelligkeit / fadeZeit;
  ShiftPWM.SetAll(helligkeit);
}

// Regenbogen
void rgbRegenbogen(unsigned long zyklusZeit, int rainbowWidth) 
{
  unsigned long zeit = millis() - startZeit;
  unsigned long colorShift = (360 * zeit / zyklusZeit) % 360;

  for(unsigned int led = 0; led < numRgbLeds; led++) 
  {
    int hue = ((led) * 360 / (rainbowWidth - 1) + colorShift) % 360;
    ShiftPWM.SetHSV(led, hue, 255, 255);
  }
}

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

  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);
}

Problem mit dem gelegentlichen Blackout gelöst ?
Falls nicht, vielleicht hilft das hier gedanklich in einer anderen Richtung weiter:
http://forum.arduino.cc/index.php?topic=182082.msg1349812#msg1349812

Welche Richtung meinst du? Wenn du auf die Spannungsversorgung hinaus willst bzgl. Kondensator zwischen +5V und GND, sieht es schlecht aus. Kann am I2C Display nichts weiteres anschließen/anlöten. Einen Kondensator zwischen +5V und GND habe ich in der Zuleitung drin, da über das Breadboard auch die TLC5916er betrieben werden. Dort habe ich die Spannung bereits mit einem 100µ geglättet.

Kannst Du uns noch die Quelle der Bibliotheken <LCD.h> und <LiquidCrystal_I2C.h> nennen.
Grüße Uwe

~~https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads~~
v1.2.1

Diese ist es nicht gewesen.

Hab gerade noch einmal in meinen Beispiel Sketches geschaut, dort sind andere Sketches inzwischen. Ich denke du spielst auf die defines an. Die müssen scheinbar aus einer älteren Lib übernormmen worden sein.
Mit der vorhanden Lib inkl Beispielsketch macht das Display garnichts ausser ganz schnell blinken.

Ich werde mal nach der aktuellen LCD Lib suchen und dann entsprechend mein Sketch daran anpassen. Bis nachher.