Arduino Forum

International => Deutsch => Topic started by: sschultewolter on Aug 06, 2013, 04:02 pm

Title: I2C LCD Display macht faxen
Post by: sschultewolter on Aug 06, 2013, 04:02 pm
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);
}
Title: Re: I2C LCD Display macht faxen
Post by: uwefed on Aug 06, 2013, 04:19 pm
Welches Display und welchen I2C Umsetzer verwendest Du?
Ist die Verbindung I2C Unsetzer und LCD-Modul gut?
Grüße Uwe
Title: Re: I2C LCD Display macht faxen
Post by: jurs on Aug 06, 2013, 04:21 pm

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).
Title: Re: I2C LCD Display macht faxen
Post by: Serenifly on Aug 06, 2013, 04:25 pm
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.
Title: Re: I2C LCD Display macht faxen
Post by: michael--g on Aug 06, 2013, 06:05 pm

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
Title: Re: I2C LCD Display macht faxen
Post by: sschultewolter on Aug 06, 2013, 07:37 pm
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.
Title: Re: I2C LCD Display macht faxen
Post by: uwefed on Aug 06, 2013, 10:11 pm
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
Title: Re: I2C LCD Display macht faxen
Post by: sschultewolter on Aug 06, 2013, 11:06 pm
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)
Title: Re: I2C LCD Display macht faxen
Post by: JuergenR on Aug 06, 2013, 11:18 pm
Welches Bild passt denn nu?

Grüße,
Jürgen
Title: Re: I2C LCD Display macht faxen
Post by: sschultewolter on Aug 06, 2013, 11:40 pm
Das einzige, was hier noch zu finden ist ;) Hab den alten Link entfernt
Title: Re: I2C LCD Display macht faxen
Post by: sschultewolter on Aug 10, 2013, 06:29 am
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 (http://www.youtube.com/watch?v=g9AhDfP_o_c&feature=youtu.be)

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

Title: Re: I2C LCD Display macht faxen
Post by: uwefed on Aug 10, 2013, 07:30 am
F()-Makro?
http://forum.arduino.cc/index.php?topic=127552.msg965539#msg965539
Grüße Uwe
Title: Re: I2C LCD Display macht faxen
Post by: sschultewolter on Aug 10, 2013, 08:00 am
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?
Title: Re: I2C LCD Display macht faxen
Post by: uwefed on Aug 10, 2013, 08:57 am
Wenn ich den Sketch immer nur Häppchenweise bekomme kann ich Dir nicht helfen.
Title: Re: I2C LCD Display macht faxen
Post by: jurs on Aug 10, 2013, 10:51 am

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.
Title: Re: I2C LCD Display macht faxen
Post by: -Micky on Aug 10, 2013, 11:37 am
Ist der I2C Bus am Ende terminiert?


Micky
Title: Re: I2C LCD Display macht faxen
Post by: sschultewolter on Aug 10, 2013, 04:38 pm
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.
Title: Re: I2C LCD Display macht faxen
Post by: uwefed on Aug 10, 2013, 05:28 pm
Quote
@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
Title: Re: I2C LCD Display macht faxen
Post by: sschultewolter on Aug 11, 2013, 05:39 am
Da haste ihn ;)

Code: [Select]
#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);
}
Title: Re: I2C LCD Display macht faxen
Post by: TERWI on Aug 11, 2013, 02:57 pm
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
Title: Re: I2C LCD Display macht faxen
Post by: sschultewolter on Aug 11, 2013, 07:24 pm
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.
Title: Re: I2C LCD Display macht faxen
Post by: uwefed on Aug 11, 2013, 11:03 pm
Kannst Du uns noch die Quelle der Bibliotheken <LCD.h> und <LiquidCrystal_I2C.h> nennen.
Grüße Uwe
Title: Re: I2C LCD Display macht faxen
Post by: sschultewolter on Aug 11, 2013, 11:40 pm
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.