Problem: LCD I2C Display und LED Streifen

Hallo Leute,
ich baue aktuell einen Cocktailautomaten. Hierbei verwende ich ein LCD I2C Display (16,2) und einen LED-Streifen (54 LEDs, WS2812B) und noch paar Pumpen und paar Taster. Ich habe das Problem, dass der Arduino Uno in meinem Programm den Led Streifen nicht ansteuert. In einem separaten Programm, wobei ich nur den Led Streifen ansteuere, gibt es keine Probleme. Mir ist dann aufgefallen, wenn ich die Befehle im Setup für das Lcd Display entferne (lcd.init(); lcd.backlight();), wir zumindest der erste Licht-Befehl ausgeführt.
Wisst ihr was das Problem ist?
Danke schon mal im Vorraus.

Der Sketch verwendet 10120 Bytes (31%) des Programmspeicherplatzes. Das Maximum sind 32256 Bytes.

//Licht 
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
 #include <avr/power.h> 
#endif
#define PIN        18 
#define NUMPIXELS 54
Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

//Display
#include <Wire.h> 
#include <LiquidCrystal_I2C.h> 
LiquidCrystal_I2C lcd(0x27, 16, 2);

//Einschenkdauer
int Bechervolumen = 0;
double Duchfluss = 4.5;
double Einschenkdauer = Bechervolumen/Duchfluss;
double EinZehntelDauer= Einschenkdauer/10*1000;

//Pins definieren
int Pumpe1 = 12;
int Pumpe2 = 13;
int Pumpe3 = 14;
int Pumpe4 = 15;
int Pumpe5 = 16;
int Pumpe6 = 17;
int Auswahl1= 11;
int Auswahl2= 2;
int Auswahl3= 3;
int Auswahl4= 4;
int Auswahl5= 5;
int Auswahl6= 6;
int Auswahl7= 7;
int Auswahl8= 8;
int Auswahl9= 9;
int Zufall = 10;

//Variablen
int z = 0;
int einmal = 0;
int TeileAlk = 0;


void setup() {
pixels.begin();


//Pins definieren
pinMode(Pumpe1, OUTPUT);
pinMode(Pumpe2, OUTPUT);
pinMode(Pumpe3, OUTPUT);
pinMode(Pumpe4, OUTPUT);
pinMode(Pumpe5, OUTPUT);
pinMode(Pumpe6, OUTPUT);
pinMode(Auswahl1, INPUT);
pinMode(Auswahl2, INPUT);
pinMode(Auswahl3, INPUT);
pinMode(Auswahl4, INPUT);
pinMode(Auswahl5, INPUT);
pinMode(Auswahl6, INPUT);
pinMode(Auswahl7, INPUT);
pinMode(Auswahl8, INPUT);
pinMode(Auswahl9, INPUT);
pinMode(Zufall, INPUT);

//Display

lcd.init(); 

lcd.backlight(); 

}

void loop() {


//Zustand bei Stand by
for(int x=0; x<54; x++) 
{ 
pixels.setPixelColor(x, pixels.Color(60,50, 0));
pixels.show();
}




lcd.setCursor(0, 0);
lcd.print("Betriebsbereit  "); 
lcd.setCursor(0, 1);
lcd.print("Nr.: ");
lcd.setCursor(5, 1);
lcd.print(z);
lcd.setCursor(10, 1);
lcd.print(Bechervolumen);
lcd.setCursor(14, 1);
lcd.print("ml");

//Einmaliges Abfragen Bechervolumen/Mischungsverhältnis

if(einmal == 0)
{
  AbfrageVolumen();
}

//Taste 9 Volumen/Mischung einstellen
if(digitalRead(Auswahl9)==HIGH)
{
AbfrageVolumen();
}  

//Tastenbelegungen
if(digitalRead(Auswahl1)==HIGH)  
{Variante1();}
delay(50);

if(digitalRead(Auswahl2)==HIGH)  
{Variante2();}
delay(50);

if(digitalRead(Auswahl3)==HIGH)  
{Variante3();}
delay(50);

if(digitalRead(Auswahl4)==HIGH)  
{Variante4();}
delay(50);

if(digitalRead(Auswahl5)==HIGH)  
{Variante5();}
delay(50);

if(digitalRead(Auswahl6)==HIGH)  
{Variante6();}
delay(50);

if(digitalRead(Auswahl7)==HIGH)  
{Variante7();}
delay(50);

if(digitalRead(Auswahl8)==HIGH)  
{Variante8();}
delay(50);

//Zufallsgenerator
  if(digitalRead(Zufall)==HIGH)
  {
    lcd.setCursor(0, 0);
    lcd.print("Eine gute Wahl  "); 
    lcd.setCursor(0, 1);
    lcd.print("der Zufall...   "); 
    delay(2000);
    int zufall = random(1,9);
    switch(zufall)
    {
      case1:
      Variante1();
      break;
      case 2:
      Variante2();
      break;
      case3:
      Variante3();
      break;
      case 4:
      Variante4();
      break;
       case 5:
      Variante5();
      break;
       case 6:
      Variante6();
      break;
       case 7:
      Variante7();
      break;
       case 8:
      Variante8();
      break;
    }}

  delay(50);

AllePumpenAus();

}



void AllePumpenAus()
{
  digitalWrite(Pumpe1,LOW);  
  digitalWrite(Pumpe2,LOW);  
  digitalWrite(Pumpe3,LOW);  
  digitalWrite(Pumpe4,LOW);  
  digitalWrite(Pumpe5,LOW);  
  digitalWrite(Pumpe6,LOW);  
}


void AbfrageVolumen()
{
  for(int i=0; i<NUMPIXELS; i++) 
{ 
pixels.setPixelColor(i, pixels.Color(10, 0, 90));
pixels.show();   
}
  Bechervolumen = 0;
  while(digitalRead(Auswahl9)==LOW)
  {
    lcd.setCursor(0, 0);
    lcd.print("Bechervolumen   "); 
    lcd.setCursor(0, 1);
    lcd.print("einstellen...   "); 
}
lcd.setCursor(0, 0);
    lcd.print("                "); 
    lcd.setCursor(0, 1);
    lcd.print("                "); 
while(digitalRead(Auswahl9)==HIGH)
  {
    Bechervolumen = Bechervolumen+50;
  lcd.setCursor(0, 0);
  lcd.print("Bechervolumen:  "); 
  lcd.setCursor(0, 1);
  lcd.print(Bechervolumen); 
   lcd.setCursor(4, 1);
  lcd.print("ml          "); 
  delay(1500);
  }
  Einschenkdauer = Bechervolumen/Duchfluss;
  EinZehntelDauer= Einschenkdauer/10*1000;

  while(digitalRead(Auswahl9)==LOW)
  {
    lcd.setCursor(0, 0);
    lcd.print("Mischverhaeltnis"); 
    lcd.setCursor(0, 1);
    lcd.print("einstellen...   "); 
}

lcd.setCursor(0, 0);
    lcd.print("                "); 
    lcd.setCursor(0, 1);
    lcd.print("                ");
TeileAlk=0;
while(digitalRead(Auswahl9)==HIGH)
  {
    if(TeileAlk>=5)
  {
    TeileAlk = -1;
  }
    TeileAlk = TeileAlk+1;
  lcd.setCursor(0, 0);
  lcd.print("Teile Alkohol:  "); 
  lcd.setCursor(0, 1);
  lcd.print(TeileAlk); 
   lcd.setCursor(1, 1);
  lcd.print("/10             "); 
  
  delay(1500);
  }
  einmal = 1;
}

void LichtRot()
{
  for(int i=0; i<NUMPIXELS; i++) 
{ 
pixels.setPixelColor(i, pixels.Color(90, 0, 0));
pixels.show();   
}
}


void LichtGruen()
{
  for(int i=0; i<NUMPIXELS; i++) 
{ 
pixels.setPixelColor(i, pixels.Color(90, 0, 0));
pixels.show();   
}
}




void Variante1()
{
LichtRot();
  lcd.setCursor(0, 0);
    lcd.print("Longdrink 1 wird"); 
    lcd.setCursor(0, 1);
    lcd.print("zubereitet...   "); 
    digitalWrite(Pumpe1,HIGH);
    digitalWrite(Pumpe4,HIGH);
    delay(EinZehntelDauer*TeileAlk);
    digitalWrite(Pumpe1,LOW);
    if(TeileAlk==5)
    {}
    else
    {
    delay(EinZehntelDauer*(10-TeileAlk*2));
    }
    digitalWrite(Pumpe4,LOW);
    delay(500);
  LichtGruen();
    lcd.setCursor(0, 0);
    lcd.print("Becher entnehmen"); 
    lcd.setCursor(0, 1);
    lcd.print("Prost!          "); 
    z = z+1;
    delay(4000);
}


void Variante2()
{
  LichtRot();
  lcd.setCursor(0, 0);
    lcd.print("Longdrink 2 wird"); 
    lcd.setCursor(0, 1);
    lcd.print("zubereitet...   "); 
    digitalWrite(Pumpe1,HIGH);
    digitalWrite(Pumpe5,HIGH);
    delay(EinZehntelDauer*TeileAlk);
    digitalWrite(Pumpe1,LOW);
    if(TeileAlk==5)
    {}
    else
    {
    delay(EinZehntelDauer*(10-TeileAlk*2));
    }
    digitalWrite(Pumpe5,LOW);
    delay(500);
  LichtGruen();
    lcd.setCursor(0, 0);
    lcd.print("Becher entnehmen"); 
    lcd.setCursor(0, 1);
    lcd.print("Prost!          "); 
    z = z+1;
    delay(4000);
}


void Variante3()
{
  LichtRot();
  lcd.setCursor(0, 0);
    lcd.print("Longdrink 3 wird"); 
    lcd.setCursor(0, 1);
    lcd.print("zubereitet...   "); 
    digitalWrite(Pumpe1,HIGH);
    digitalWrite(Pumpe6,HIGH);
    delay(EinZehntelDauer*TeileAlk);
    digitalWrite(Pumpe1,LOW);
    if(TeileAlk==5)
    {}
    else
    {
    delay(EinZehntelDauer*(10-TeileAlk*2));
    }
    digitalWrite(Pumpe6,LOW);
    delay(500);
     LichtGruen();
    lcd.setCursor(0, 0);
    lcd.print("Becher entnehmen"); 
    lcd.setCursor(0, 1);
    lcd.print("Prost!          "); 
    z = z+1;
    delay(4000);
}


void Variante4()
{
  LichtRot();
  lcd.setCursor(0, 0);
    lcd.print("Longdrink 4 wird"); 
    lcd.setCursor(0, 1);
    lcd.print("zubereitet...   "); 
    digitalWrite(Pumpe2,HIGH);
    digitalWrite(Pumpe4,HIGH);
    delay(EinZehntelDauer*TeileAlk);
    digitalWrite(Pumpe2,LOW);
    if(TeileAlk==5)
    {}
    else
    {
    delay(EinZehntelDauer*(10-TeileAlk*2));
    }
    digitalWrite(Pumpe4,LOW);
    delay(500);
     LichtGruen();
    lcd.setCursor(0, 0);
    lcd.print("Becher entnehmen"); 
    lcd.setCursor(0, 1);
    lcd.print("Prost!          "); 
    z = z+1;
    delay(4000);
}


void Variante5()
{
  LichtRot();
  lcd.setCursor(0, 0);
    lcd.print("Longdrink 5 wird"); 
    lcd.setCursor(0, 1);
    lcd.print("zubereitet...   "); 
    digitalWrite(Pumpe2,HIGH);
    digitalWrite(Pumpe5,HIGH);
    delay(EinZehntelDauer*TeileAlk);
    digitalWrite(Pumpe2,LOW);
    if(TeileAlk==5)
    {}
    else
    {
    delay(EinZehntelDauer*(10-TeileAlk*2));
    }
    digitalWrite(Pumpe5,LOW);
    delay(500);
  LichtGruen();
    lcd.setCursor(0, 0);
    lcd.print("Becher entnehmen"); 
    lcd.setCursor(0, 1);
    lcd.print("Prost!          "); 
    z = z+1;
    delay(4000);
}


void Variante6()
{
  LichtRot();
  lcd.setCursor(0, 0);
    lcd.print("Longdrink 6 wird"); 
    lcd.setCursor(0, 1);
    lcd.print("zubereitet...   "); 
    digitalWrite(Pumpe2,HIGH);
    digitalWrite(Pumpe6,HIGH);
    delay(EinZehntelDauer*TeileAlk);
    digitalWrite(Pumpe2,LOW);
    if(TeileAlk==5)
    {}
    else
    {
    delay(EinZehntelDauer*(10-TeileAlk*2));
    }
    digitalWrite(Pumpe6,LOW);
    delay(500);
     LichtGruen();
    lcd.setCursor(0, 0);
    lcd.print("Becher entnehmen"); 
    lcd.setCursor(0, 1);
    lcd.print("Prost!          "); 
    z = z+1;
    delay(4000);
}



void Variante7()
{
  LichtRot();
  lcd.setCursor(0, 0);
    lcd.print("Longdrink 7 wird"); 
    lcd.setCursor(0, 1);
    lcd.print("zubereitet...   "); 
    digitalWrite(Pumpe3,HIGH);
    digitalWrite(Pumpe4,HIGH);
    delay(EinZehntelDauer*TeileAlk);
    digitalWrite(Pumpe3,LOW);
    if(TeileAlk==5)
    {}
    else
    {
    delay(EinZehntelDauer*(10-TeileAlk*2));
    }
    digitalWrite(Pumpe4,LOW);
    delay(500);
     LichtGruen();
    lcd.setCursor(0, 0);
    lcd.print("Becher entnehmen"); 
    lcd.setCursor(0, 1);
    lcd.print("Prost!          "); 
    z = z+1;
    delay(4000);
}


void Variante8()
{
  LichtRot();
  lcd.setCursor(0, 0);
    lcd.print("Longdrink 8 wird"); 
    lcd.setCursor(0, 1);
    lcd.print("zubereitet...   "); 
    digitalWrite(Pumpe3,HIGH);
    digitalWrite(Pumpe5,HIGH);
    delay(EinZehntelDauer*TeileAlk);
    digitalWrite(Pumpe3,LOW);
    if(TeileAlk==5)
    {}
    else
    {
    delay(EinZehntelDauer*(10-TeileAlk*2));
    }
    digitalWrite(Pumpe5,LOW);
    delay(500);
     LichtGruen();
    lcd.setCursor(0, 0);
    lcd.print("Becher entnehmen"); 
    lcd.setCursor(0, 1);
    lcd.print("Prost!          "); 
    z = z+1;
    delay(4000);
}

Dann such dir mal für deinen Stripe einen anderen Pin.
Der Pin 18 ist der A4 und wird für I2C SDA verwendet. Hier ist auch dein Display dran.
Auch den Pin 19 (SCL) kannst du nicht für andere Dinge verwenden.

Das kann nicht funktionieren.

Da fehlt der 2. Teil dazu.

Gruß Tommy

Ok danke,
ich versuche es gleich und berichte dann nochmal. Aber kann ich den Pin18 für das Abfragen eines Tasters verwenden?

Die I2C Schnittstelle liegt beim Atmega328, wie er auf dem UNO drauf ist auf den Pins A4 und A5, auch wenn da 2 Pins sind die SDA und SCL heißen. Diese sind vorhanden um die I2C schnittstelle an allen Arduino-Modellen mit dieser Pindisposition I2C an den gleichen Pins liegt. Ansonsten müßte man am UNO, MEGA und LEONARDO an verschiedenen Pins die Schnittstelle anschließen.

Grüße Uwe

Diese Frage hatte ich dir doch schon vorab in Post #2 beantwortet.
Wenn du I2C an den Pins verwendest, geht es nur für I2C.
Aber du kannst an I2C eine Port-Erweiterung anschließen.
Dazu gibt es zum Beispiel den PCF8574, der dir 8 zusätzliche Pins (Eingang oder Ausgang) liefert.

Nichts anderes habe ich doch auch geschrieben.

Ok vielen Dank für die Antworten, da wäre ich nie drauf gekommen.

Das steht aber alles in den Datenblättern bzw. Beschreibungen.
Diese sollte man sich immer vor der Benutzung durchlesen.

Auch ich habe nichts anderes gegenteiliges geschrieben.

Ich habe nur Deine richtige Info etwas aufgepeppt.

Es ist nicht logisch und für Anfänger nachvollziebar bzw zu wissen daß beim UNO die Pins SDA und SCL mit A4 und A5 verbunden sind.

Grüße Uwe

Ok, sorry dann habe ich das nur falsch verstanden. :joy:

man könnte auch die 10 Taster als Matrix verkabeln, dann kommt man mit 7 Leitungen aus, dmit würden 3 Pins des Aruionos frei, oder die Taster mitels 3 Widerstandsketten an drei Analogeingänge anschliessen. dann benötigt man nur 3 Pins für alle 10 Taster. benötigt zwar ne kleine Funktion zur Auswertung der Taster, klappt aber wunderbar. Mache ich öfters mit den Analogeingängen, (bis 5 Taster /Eingang) besonders wenn ich in einem Projekt nur nen ATtiny einsetze und deshalb nicht so viele Pins zur Verfügung habe.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.