falscher LED-Streifen leuchtet auf

Hallo,

ich habe zur Zeit folgendes Problem. Ich verwende für dieses Projekt einen Arduino MEGA 2560.
Ich besitze zwei Taster, und zwei NeoPixel Streifen.
Wenn ich Taster 1 drücke, sollte dieser für ca. 1 sek. aufleuchten und anschließend schaltet sich Streifen 1 an. Bei Taster 2 und Streifen 2 soll exakt das gleiche passieren.

Doch wenn ich Taster 1 drücke, leuchtet Streifen 2. Wenn ich aber Taster 2 drücke, leuchtet weder Streifen 2 noch Streifen 1.

#include <Adafruit_NeoPixel.h>
const byte  PIN_1 =              3;

const byte  PIN_5 =              11;

const byte PIN_LED_1 =          2;
const byte PIN_LED_2 =          13;



const byte NUMPIXEL =       2;
const byte NUMPIXELS =      14;


unsigned long aktMillis, altMillis;
unsigned int zeit = 1500;
bool zustand = false;
bool aenderung;

Adafruit_NeoPixel strip_1 = Adafruit_NeoPixel(NUMPIXELS, PIN_LED_1, NEO_RGBW + NEO_KHZ800);     //Streifen

Adafruit_NeoPixel strip_2 = Adafruit_NeoPixel(NUMPIXELS, PIN_LED_2, NEO_RGBW + NEO_KHZ800);     //Streifen


const int schalter_1 = 4;
int push_1;
float zeitstempel_1 = 0;
Adafruit_NeoPixel pixel_1 = Adafruit_NeoPixel(NUMPIXEL, PIN_1, NEO_GRB + NEO_KHZ800);

const int schalter_5 = 12;
int push_5;
float zeitstempel_5 = 0;
Adafruit_NeoPixel pixel_5 = Adafruit_NeoPixel(NUMPIXEL, PIN_5, NEO_GRB + NEO_KHZ800);



void setup() {

  Serial.begin(9600);
  strip_1.begin();

  strip_2.begin();

  

  pixel_1.begin();
  pinMode(schalter_1, INPUT_PULLUP);

  pixel_5.begin();
  pinMode(schalter_5, INPUT_PULLUP);

  


}

void loop() {


  //Taster 1
  {
    push_1 = digitalRead(schalter_1); //
    Serial.println(push_1);

    if (push_1 == 1) //Verarbeitung: Wenn der taster gedrückt ist (Das Spannungssignal ist hoch)
    { //Programmabschnitt des IF-Befehls öffnen.
      pixel_1.setPixelColor(0, pixel_1.Color(0, 255, 0)); //dann soll die LED leuchten
      pixel_1.show();
      zeitstempel_1 = millis();
    }
    else if (millis() - zeitstempel_1 > 900) {

      pixel_1.setPixelColor(0, pixel_1.Color(0, 0, 0)); //...soll die LED aus sein.
      pixel_1.show();
    }

  }

 
    
    aktMillis = millis();
    if (digitalRead(schalter_1) == LOW) {
      if ((aktMillis - altMillis >= zeit) && aenderung) {
        aenderung = false;
        zustand = !zustand;
        strip_1.setPixelColor(0, strip_1.Color(0, 255, 0));
        strip_1.setPixelColor(1, strip_1.Color(0, 255, 0));
        strip_1.setPixelColor(2, strip_1.Color(0, 255, 0));
        strip_1.setPixelColor(3, strip_1.Color(0, 255, 0));
        strip_1.setPixelColor(4, strip_1.Color(0, 255, 0));
        strip_1.setPixelColor(5, strip_1.Color(0, 255, 0));
        strip_1.setPixelColor(6, strip_1.Color(0, 255, 0));
        strip_1.setPixelColor(7, strip_1.Color(0, 255, 0));
        strip_1.setPixelColor(8, strip_1.Color(0, 255, 0));
        strip_1.setPixelColor(9, strip_1.Color(0, 255, 0));
        strip_1.setPixelColor(10, strip_1.Color(0, 255, 0));
        strip_1.setPixelColor(11, strip_1.Color(0, 255, 0));
        strip_1.setPixelColor(12, strip_1.Color(0, 255, 0));
        strip_1.setPixelColor(13, strip_1.Color(0, 255, 0));
        strip_1.show();



      }
    } else {
      aenderung = true;
      altMillis = aktMillis;
    }
  

  //Taster 5
  {
    push_5 = digitalRead(schalter_5); //
    Serial.println(push_5);

    if (push_5 == 1)
    {
      pixel_5.setPixelColor(0, pixel_5.Color(0, 255, 0)); //dann soll die LED leuchten
      pixel_5.show();
      zeitstempel_5 = millis();
    }
    else if (millis() - zeitstempel_5 > 900) {

      pixel_5.setPixelColor(0, pixel_5.Color(0, 0, 0));
      pixel_5.show();
    }
  
    aktMillis = millis();
    if (digitalRead(schalter_5) == LOW) {
      if ((aktMillis - altMillis >= zeit) && aenderung) {
        aenderung = false;
        zustand = !zustand;
        strip_2.setPixelColor(0, strip_2.Color(0, 255, 0));
        strip_2.setPixelColor(1, strip_2.Color(0, 255, 0));
        strip_2.setPixelColor(2, strip_2.Color(0, 255, 0));
        strip_2.setPixelColor(3, strip_2.Color(0, 255, 0));
        strip_2.setPixelColor(4, strip_2.Color(0, 255, 0));
        strip_2.setPixelColor(5, strip_2.Color(0, 255, 0));
        strip_2.setPixelColor(6, strip_2.Color(0, 255, 0));
        strip_2.setPixelColor(7, strip_2.Color(0, 255, 0));
        strip_2.setPixelColor(8, strip_2.Color(0, 255, 0));
        strip_2.setPixelColor(9, strip_2.Color(0, 255, 0));
        strip_2.setPixelColor(10, strip_2.Color(0, 255, 0));
        strip_2.setPixelColor(11, strip_2.Color(0, 255, 0));
        strip_2.setPixelColor(12, strip_2.Color(0, 255, 0));
        strip_2.setPixelColor(13, strip_2.Color(0, 255, 0));
        strip_2.show();
      }
    }
  }
}

Wenn ich jedoch die Werte von PIN_LED_1 und PIN_LED_2 vertausche dann leuchtet beim Betätigen des Taster 1 auch Streifen 1 aber beim Betätigen von Taster 2 leuchtet der Streifen 2 nicht.

Ich verwende für dieses Projekt einen Arduino MEGA 2560.

Habt ihr eine Ahnung woran das liegen könnte?

Liebe Grüße
Tower

Wenn Du INPUT_PULLUP benutzt, muss Dein Taster nach GND schalten und ist damit LOW, wenn er gedrückt ist.

Gruß Tommy

Danke erst einmal für die schnelle Antwort.

Ich habe jetzt nur INPUT benutzt, wenn es das war was du mir damit sagen wolltest? Aber es ist immer noch das gleiche Problem.

Wie sind Deine Taster geschaltet?

Gruß Tommy

TomTower:
Ich habe jetzt nur INPUT benutzt, wenn es das war was du mir damit sagen wolltest?

Nein. INPUT_PULLUP ist schon korrekt. Aber der Taster muss dann gegen GND verdrahtet und entsprechend abgefragt werden

https://iwer.info/article/Elektrotechnik/Pullup-Pulldown-Widerstand/index.html

Wie sind Deine Taster geschaltet?

Wie auf dem Bild zu sehen habe ich die Schalter so aufgebaut. Habe jetzt andere Steckplätze vom Arduino genommen da ich den MEGA nicht in Fritzing gefunden habe.

OK, Du hast Pulldownwiderstände und die Taster schalten gegen 5V.

Dann probiere doch erst mal die Taster aus:

const byte tasterPin1 = 2;
const byte tasterPin2 = 4;

boolean tastertStatus1, tasterStatus2;

void setup() {
  pinMode(tasterPin1,INPUT);
  pinMode(tasterPin2,INPUT);
  Serial.begin(9600);
  Serial.println("Start");
}

void loop() {
  tasterStatus1 = digitalRead(tasterPin1);
  tasterStatus2 = digitalRead(tasterPin2);
  Seriel.print("Taster 1: ");
  Serial.print(tasterStatus1);
  Seriel.print(" Taster 2: ");
  Serial.println(tasterStatus2); 
}

Damit kannst Du erst mal sehen, ob Deine Taster funktionieren.
Evtl. musst Du sie dann noch entprellen.

Gruß Tommy

Dann probiere doch erst mal die Taster aus:

const byte tasterPin1 = 2;

const byte tasterPin2 = 4;

boolean tastertStatus1, tasterStatus2;

void setup() {
 pinMode(tasterPin1,INPUT);
 pinMode(tasterPin2,INPUT);
 Serial.begin(9600);
 Serial.println("Start");
}

void loop() {
 tasterStatus1 = digitalRead(tasterPin1);
 tasterStatus2 = digitalRead(tasterPin2);
 Seriel.print("Taster 1: ");
 Serial.print(tasterStatus1);
 Seriel.print(" Taster 2: ");
 Serial.println(tasterStatus2);
}




Damit kannst Du erst mal sehen, ob Deine Taster funktionieren.
Evtl. musst Du sie dann noch entprellen.

Gruß Tommy

Vielen Dank für den Code, aber die Taster funktionieren einwandfrei.

OK, Du hast Pulldownwiderstände und die Taster schalten gegen 5V.

Dann wäre aber der "Befehl" INPUT_PULLUP fehlerhaft oder nicht? Denn dann müssten diese gegen GND schalten?


Auf der Verkabelung fehlt die Masse. Hast Du sie nur auf der Zeichnung vergessen oder auch auf der Schaltung?
Grüße Uwe

Auf der Verkabelung fehlt die Masse. Hast Du sie nur auf der Zeichnung vergessen oder auch auf der Schaltung?

Stimmt, habe ich nur auf der Zeichnung vergessen.

und zwei NeoPixel Streifen.

Und, warum erzeugst du dann 4 Instanzen?

Warum reicht dir nicht eine?

Ich halte nichts davon, Variablen auf diese Art durchzunummerieren.
Wie schnell man sich damit selber verwirren kann, sieht man gut in deinem Programm.
Für mich, habe ich das als unlesbar eingestuft!

Und, warum erzeugst du dann 4 Instanzen?

Warum reicht dir nicht eine?

ich denke das liegt daran, dass ich noch ein ziemlicher Anfänger auf dem Gebiet bin und es so für mich am "einfachsten" war.

Was wäre denn eine andere Lösung?

Du kannst alle LED, gleichen Types, miteinander verketten.
Das gerade ist ja der Trick daran.

Du kannst alle LED, gleichen Types, miteinander verketten.
Das gerade ist ja der Trick daran.

Ja das ist mir schon klar, doch der Code, welchen ich gepostet habe ist nur ein Teil eines größeren Projektes. Deswegen war es mir nach meinem Wissensstand aufgrund des fehlenden "Raumes" nicht möglich alle LED's zu verbinden.

Was soll fehlender Raum im Zusammenhang mit Kenntnissen bedeuten?

Gruß Tommy

Hatte mich etwas ungünstig ausgedrückt. Ich habe nun schon alle Bauteile, bis auf die Verkabelung am Arduino verlötet. Zum Ende des Projektes hin ist mir aufgefallen, das ich es so hätte machen können, wie es combie gesagt hat doch dann hätte ich mein Projekt von Grund auf anders aufbauen müssen. Jetzt fehlt mir der nötige Raum um Änderungen vorzunehmen.

Aber die Erklärung hilft mir nicht wirklich weiter. Gibt es denn noch einen anderen Weg, mit den bestehenden Mitteln alles zum Laufen zu bekommen?

VG

Hi

Wo habe ich was nicht verstanden?
Du hast 4 NeoPixel-Stripes in zwei Längen.
Was hindert Dich daran, diesen 4 Stripes bzw. Deren LEDs Farben zuzuweisen?
Da Du 4 Instanzen erzeugt hast, musst Du auch mit allen 4 Stripes separat schwätzen und die Daten alle abschicken (4x).

Hättest Du die ganzen Pixel ‘am Stück’ gelassen, hättest Du eine Instanz und könntest darin die benötigten LEDs ‘umfärben’, wie’s Dir beliebt.
Und hier reicht 1x abschicken, da alle LED am Stück sind.

MfG