Go Down

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

-Micky

Ist der I2C Bus am Ende terminiert?


Micky

sschultewolter

#16
Aug 10, 2013, 04:38 pm Last Edit: Aug 10, 2013, 05:04 pm by sschultewolter Reason: 1
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.
Orginal Atmel AVRISP mkII zu verkaufen. Anfrage per PN ;)

uwefed

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

sschultewolter

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);
}
Orginal Atmel AVRISP mkII zu verkaufen. Anfrage per PN ;)

TERWI

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
To young to die - never to old for rock'n roll

sschultewolter

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.
Orginal Atmel AVRISP mkII zu verkaufen. Anfrage per PN ;)

uwefed

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

sschultewolter

#22
Aug 11, 2013, 11:40 pm Last Edit: Aug 11, 2013, 11:48 pm by sschultewolter Reason: 1
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.
Orginal Atmel AVRISP mkII zu verkaufen. Anfrage per PN ;)

Go Up