BusyBox mit mehreren Schalter und Neopixel

Hallo Leute,

Ich baue gerade eine BusyBox (Holzkiste mit vielen Knöpfen und Lichtern für Kinder) und habe vorerst 8 pushbuttons und 8 ws28 LED‘s in einem Streifen.
Die pushbuttons benutze ich mit dem verbautem Pull-up Widerstand des Arduino.
Ich habe alle Komponenten einzeln getestet und einzelne funktioniert auch alles einwandfrei. Nun habe ich alles zusammengeschaltet (s. Schaltplan) und eine Programm dafür geschrieben. Auf dem Arduino Uno funktionierten die Knöpfe sowie LEDs und nach dem Umstieg auf den Nano funktionierte nichts mehr.
Ich vermute ich habe etwas einfaches übersehen, aber sehe jetzt den Wald vor lauter Bäumen nicht mehr.
Ich hoffe einer von euch kann mir helfen.

Gruß.


#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h>
#endif

Adafruit_NeoPixel pixels(8, 2, NEO_GRB + NEO_KHZ800);

const int t             = 1000;
const int buttons       = 8;
unsigned long onTime[8] = {0,0,0,0,0,0,0,0};
int buttonPin[8]        = {3,4,5,6,7,8,9,10};
int bState[8]           = {0,0,0,0,0,0,0,0};
int b                   = 150;
int buttonValue[8]      = {0,0,0,0,0,0,0,0};


void setup() {
  pixels.begin();
  for (int i = 0; i < buttons; i++){
    pinMode(buttonPin[i], INPUT_PULLUP);
    }
}

void loop() {
  for (int j = 0; j < sizeof(buttonValue); j++){
    buttonValue[j] = digitalRead(buttonPin[j]);
    }

  for (int k = 0; k < sizeof(buttonPin); k++){

    if (buttonValue[k] == LOW){
      switch(bState[k]){
        case 0:
             pixels.setPixelColor(k, pixels.Color(b, 0, 0));
             break;
        case 1:
             pixels.setPixelColor(k, pixels.Color(0, b, 0));
             break; 
        case 2:
             pixels.setPixelColor(k, pixels.Color(0, 0, b));
             break; 
        case 3:
             pixels.setPixelColor(k, pixels.Color(b, b, b));
             break; 
        }
        onTime[k] = millis();
        pixels.show();
      }

    if((onTime[k] > 0) && (millis() - onTime[k] > t)){
       pixels.clear();
       pixels.show();
       if (bState[k] < 3){
          bState[k] = bState[k] +1;
        } else {bState[k] = 0; }
       onTime[k] = 0; 
     }
    }

}

EDIT: in der Schaltung sollte die Stromquelle 9v haben. Ich betreibe das Ding mit einer 9v Batterie.

5V auf Vin? Das funktioniert nicht.

Entweder 5V auf 5V, oder mindestens 6,5V auf Vin.

Oh, das sollten 9v sein ^^ ich betreibe das ganze mit einer 9V Batterie.

Da ist die Batterie aber sehr schnell leer. Da reicht die Kapazität der 9Volt Batterie nicht lange.

Der Nano und der UNO sind relativ gleich. Daher schließe ich auf ein Verkabelungsfehler.

Und ich tippe darauf, dass der Spannungsregler schlapp macht.

Hallo
Baue ein paar Serial.println(was mich interressiert) ein.
So kannst du einfachen verfolgen was im Sketch passiert.
Evt. sind bei dieser Teststrategie delay()´s notwendig, damit der Bildschirm nicht vollgemüllt wird.
Viel Erfolg und Spass beim Programmieren in C++.

Stimmt, da kann es große Unterschiede in der Leistung geben von Uno zu Nano

Die Stromquelle ist eher das kleinere Problem. Beim ausprobieren hatte ich die Schaltung an einem 9v Netzteil angeschlossen.

Aber der Spannungsregler auf dem Nano könnte überfordert sein.

Habe ich auch nicht geschrieben. Der Regler wird zu heiß.
Du hattest aber auch Batterie geschrieben.

Wenn der Schaltplan zum Aufbau passt, dann ist das falsch.

Aber es gibt noch ganz andere Baustellen:

Das sollte ein const sein und nur ein byte, denn hier:

haut es Dich mit dem int weg.

Also die LEDs direkt über einen stepdown zur Stromquelle und Erden verbinden?

Ja, das wäre eine Lösung.

Ujujuj was ist denn falsch?

Hier könnte ich ja quick and dirty das sizeof durch eine 8 ersetzen, oder?

Hatte @Plumps in #2 schon.
Wie gesagt, wenn der Schaltplan Dein Aufbau ist.
Um Mißverständnisse auszuschliessen, wäre ein Foto (von oben) vom Aufbau nicht schlecht.

Naja, ich würde quickanddirty die Pins mit const byte an stelle von int initialisieren.
Erschlägt es erstmal.

Mach mal folgendes:
Unter DATEI - VOREINSTELLUNGEN
setze den Haken bei AUSFÜHRLICHE AUSGABE WÄHREND: Kompilierung
Und darunter Compiler-Warnungen auf ALLE.

Dann compilier Deinen Code... Scroll durch das schwarze Fenster...

Ich war mal nett.

#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h>
#endif

Adafruit_NeoPixel pixels(8, 2, NEO_GRB + NEO_KHZ800);

const unsigned int t             = 1000;
const byte buttons       = 8;
unsigned long onTime[8] = {0, 0, 0, 0, 0, 0, 0, 0};
const byte buttonPin[8]        = {3, 4, 5, 6, 7, 8, 9, 10};
byte  bState[8]           = {0, 0, 0, 0, 0, 0, 0, 0};
unsigned int b                   = 150;
bool buttonValue[8]      = {0, 0, 0, 0, 0, 0, 0, 0};


void setup() {
  pixels.begin();
  for (byte i = 0; i < buttons; i++) {
    pinMode(buttonPin[i], INPUT_PULLUP);
  }
}

void loop() {
  for (byte j = 0; j < sizeof(buttonValue); j++) {
    buttonValue[j] = digitalRead(buttonPin[j]);
  }

  for (byte k = 0; k < sizeof(buttonPin); k++) {

    if (buttonValue[k] == LOW) {
      switch (bState[k]) {
        case 0:
          pixels.setPixelColor(k, pixels.Color(b, 0, 0));
          break;
        case 1:
          pixels.setPixelColor(k, pixels.Color(0, b, 0));
          break;
        case 2:
          pixels.setPixelColor(k, pixels.Color(0, 0, b));
          break;
        case 3:
          pixels.setPixelColor(k, pixels.Color(b, b, b));
          break;
      }
      onTime[k] = millis();
      pixels.show();
    }

    if ((onTime[k] > 0) && (millis() - onTime[k] > t)) {
      pixels.clear();
      pixels.show();
      if (bState[k] < 3) {
        bState[k] = bState[k] + 1;
      } else {
        bState[k] = 0;
      }
      onTime[k] = 0;
    }
  }

}

Warnungsfrei, ob es geht???

Danke @my_xy_projekt , das hat das Problem behoben. Die led leuchten nun in voller Pracht sobald die Taster gedrückt sind.

"Das" war jetzt aber nicht die verstärkten Warnungen, sondern die richtigen Schleifengrenzen.

Wer hätte gedacht, dass bei Fehlern in den Schleifen sich der Uno anders verhält als ein Nano. :upside_down_face:

Ungeachtet dessen, solltest du dich auch an die Vorgaben der Datenblätter halten. Ohne das hast du nicht lange Freude an deinem Projekt.