Hallo zusammen,
dies ist mein erster Beitrag. Kurz zu meiner Person: Ich mache ab und an für mich selbst kleine Projekte. Leider bringe ich keinerlei Erfahrung in der Elektronik udgl. mit. Den Code habe ich mit Hilfe von Beispielen der IDE und der Hilfe von ChatGPT zusammengebastelt.
Projekt: LED Belechtung für einen Klemmbausteinschaukasten.
Aufbau:
Board: AZ-ATmega328
-Stromversorgung: 5V 2A
Led: ws2812b
Display: OLED 0,93Zoll 128x64 (SSD1306)
Knöpfe: Taster
Arduino IDE 2.3.6
Lib:
- Adafruit SSD1306 2.5.15 + dazugehörigem
- Adafruit NeoPixel 1.15.1
Schaltplan (bitte verzeiht, hoffentlich ist es entzifferbar)
Zum eigentlichen Thema:
Wenn das Board Strom erhält (USB-C) soll das Display eine Begrüßung zeigen.
Dann möchte ich die Beleuchtung beim Drücken von Button I (Pin2) einschalten, bei erneutem Drücken ausschalten. Beim Einschalten als Lauflicht von 0-150, beim Ausschalten alle gleichzeitig.
Am Display soll "Status: EIN" oder "Status: AUS" stehen, je nach Drücken von Button I.
Wenn das Lauflicht durchgelaufen ist und alle Led leuchten, soll beim Drücken von Button II (Pin3) die Farbe gewechselt werden (6 Farben).
=>>>> Bis hier hin funktioniert was ich erwartet habe.
#include <Adafruit_NeoPixel.h>
#include <Adafruit_SSD1306.h>
#include <wire.h>
#ifdef _AVR_
#include <avr/power.h>
#endif
const int LED_PIN = 6; // Datenpin für den LED Streifen
const int NUM_LEDS = 151; // Anzahl verwendeter LEDs
const int POWER_BUTTON_PIN = 2; // Einschalten, Ausschalten -Taster
const int COLOR_BUTTON_PIN = 3; // Farbwechsel (6Farben) - Taster
Adafruit_NeoPixel strip(NUM_LEDS, LED_PIN, NEO_GRB + NEO_KHZ800);
Adafruit_SSD1306 display = Adafruit_SSD1306(128, 64, &Wire);
bool powerOn = false;
bool lauflichtAktiv = false;
int lauflichtPosition = 0;
unsigned long letzteAktion = 0;
unsigned long letzteFarbAktion = 0;
int farbe = 0;
void setup() {
strip.begin();
strip.show();
pinMode(POWER_BUTTON_PIN, INPUT_PULLUP);
pinMode(COLOR_BUTTON_PIN, INPUT_PULLUP);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.display();
delay(100);
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(5, 12);
display.println("HALLO LUKAS!");
display.display();
}
void loop() {
if (digitalRead(POWER_BUTTON_PIN) == LOW && millis() - letzteAktion > 200) {
letzteAktion = millis();
powerOn = !powerOn;
if (powerOn) {
lauflichtAktiv = true;
lauflichtPosition = 0;
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("Status: EIN");
display.display();
} else {
lauflichtAktiv = false;
strip.clear();
strip.show();
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("Status: AUS");
display.display();
}
}
if (digitalRead(COLOR_BUTTON_PIN) == LOW && millis() - letzteFarbAktion > 200 && !lauflichtAktiv) {
letzteFarbAktion = millis();
farbe = (farbe + 1) % 6;
lauflichtAktiv = true;
lauflichtPosition = 0;
}
if (powerOn && lauflichtAktiv) {
switch (farbe) {
case 0:
strip.setPixelColor(lauflichtPosition, strip.Color(255, 0, 0)); // Rot
break;
case 1:
strip.setPixelColor(lauflichtPosition, strip.Color(0, 255, 0)); // Grün
break;
case 2:
strip.setPixelColor(lauflichtPosition, strip.Color(0, 255, 255)); // Cyan
break;
case 3:
strip.setPixelColor(lauflichtPosition, strip.Color(255, 0, 255)); // Magenta
break;
case 4:
strip.setPixelColor(lauflichtPosition, strip.Color(255, 255, 0)); // Gelb
break;
case 5:
strip.setPixelColor(lauflichtPosition, strip.Color(255, 255, 255)); // Weiß
break;
}
strip.show();
lauflichtPosition++;
if (lauflichtPosition >= NUM_LEDS) {
lauflichtAktiv = false;
}
delay(50);
}
}
Zum Problem:
Ich möchte nun die Button IV(Pin7) und V(pin8) in den Code integrieren. Wenn ich den Code erweitere und Kompiliere, wird alles als Ok angezeigt. Das Hochladen aufs Board klappt.
Nach dem Hochladen ist das Display aber schwarz und die Buttons reagieren nicht mehr.
Ich habe versucht mittels Debug herauszufinden was schieflauft, jedoch stehe ich hier an.
Der Code bricht einfach vorm Schreiben aufs Display ab.
#include <Adafruit_NeoPixel.h>
#include <avr/power.h>
#include <Adafruit_SSD1306.h>
#ifdef __AVR__
#include <Wire.h>
#endif
const int LED_PIN = 6;
const int NUM_LEDS = 151;
const int POWER_BUTTON_PIN = 2;
const int COLOR_BUTTON_PIN = 3;
const int BRIGHTNESS_BUTTON_PIN_PLUS = 7; // Helligkeit rauf - Taster
const int BRIGHTNESS_BUTTON_PIN_MINUS = 8; // Helligkeit runter - Taster
Adafruit_NeoPixel strip(NUM_LEDS, LED_PIN, NEO_GRB + NEO_KHZ800);
int brightness = 128;
int maxBrightness = 255;
Adafruit_SSD1306 display = Adafruit_SSD1306(128, 64, &Wire);
bool powerOn = false;
bool lauflichtAktiv = false;
int lauflichtPosition = 0;
unsigned long letzteAktion = 0;
unsigned long letzteFarbAktion = 0;
unsigned long letzteHelligkeitsAktion = 0;
int farbe = 0;
void changeBrightness(int delta) {
brightness += delta;
if (brightness > 128) {
brightness = 128;
} else if (brightness < 5) {
brightness = 5;
}
strip.setBrightness(brightness);
strip.show();
}
void setup() {
Serial.begin(9600);
Serial.println("Setup läuft");
strip.begin();
strip.show();
strip.setBrightness(brightness);
pinMode(POWER_BUTTON_PIN, INPUT_PULLUP);
pinMode(COLOR_BUTTON_PIN, INPUT_PULLUP);
pinMode(BRIGHTNESS_BUTTON_PIN_PLUS, INPUT_PULLUP);
pinMode(BRIGHTNESS_BUTTON_PIN_MINUS, INPUT_PULLUP);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
Serial.println("Display initialisiert");
display.display();
Serial.println("Display display aufgerufen");
delay(100);
display.clearDisplay();
delay(100);
Serial.println("Display clearDisplay aufgerufen");
delay(100);
Serial.println("Display wird konfiguriert...");
display.setTextSize(1);
delay(100);
Serial.println("Textgröße gesetzt");
display.setTextColor(SSD1306_WHITE);
Serial.println("Textfarbe gesetzt");
// bis hier läuft der Code mit Debug Ausgabe, dann kommt nichts mehr.
// Die Delays habe ich nachträglich eingebaut, da beim Debuggen mitten
// in der Ausgabe abgebrochen wurde - bei "Display clearDisplay aufgerufen"
// kam nur mehr "Disp". Nach den Delays kam das programm bis "Textgröße gesetzt".
// Weiter kam ich nicht, auch mit mehr Delay nicht.
delay(100);
display.setCursor(5, 12);
delay(100);
display.println("Status: HALLO LUKAS!");
delay(100);
Serial.println("Text auf Display geschrieben");
display.display();
Serial.println("Display display erneut aufgerufen");
}
void loop() {
Serial.println("Loop läuft");
if (digitalRead(POWER_BUTTON_PIN) == LOW && millis() - letzteAktion > 200) {
letzteAktion = millis();
powerOn = !powerOn;
if (powerOn) {
lauflichtAktiv = true;
lauflichtPosition = 0;
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("Status: EIN");
display.display();
} else {
lauflichtAktiv = false;
strip.clear();
strip.show();
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("Status: AUS");
display.display();
}
}
if (digitalRead(COLOR_BUTTON_PIN) == LOW && millis() - letzteFarbAktion > 200 && !lauflichtAktiv) {
letzteFarbAktion = millis();
farbe = (farbe + 1) % 6;
lauflichtAktiv = true;
lauflichtPosition = 0;
}
if (digitalRead(BRIGHTNESS_BUTTON_PIN_PLUS) == LOW && millis() - letzteHelligkeitsAktion > 200) {
Serial.println("Helligkeitsbutton + gedrückt");
letzteHelligkeitsAktion = millis();
brightness += 20;
if (brightness > 100) {
brightness = 100;
}
strip.setBrightness(map(brightness, 0, 100, 0, 255));
}
if (digitalRead(BRIGHTNESS_BUTTON_PIN_MINUS) == LOW && millis() - letzteHelligkeitsAktion > 200) {
letzteHelligkeitsAktion = millis();
brightness -= 20;
if (brightness < 5) {
brightness = 5;
}
strip.setBrightness(map(brightness, 0, 100, 0, 255));
}
if (powerOn && lauflichtAktiv) {
switch (farbe) {
case 0:
strip.setPixelColor(lauflichtPosition, strip.Color(255, 0, 0)); // Rot
break;
case 1:
strip.setPixelColor(lauflichtPosition, strip.Color(0, 255, 0)); // Grün
break;
case 2:
strip.setPixelColor(lauflichtPosition, strip.Color(0, 255, 255)); // Cyan
break;
case 3:
strip.setPixelColor(lauflichtPosition, strip.Color(255, 0, 255)); // Magenta
break;
case 4:
strip.setPixelColor(lauflichtPosition, strip.Color(255, 255, 0)); // Gelb
break;
case 5:
strip.setPixelColor(lauflichtPosition, strip.Color(255, 255, 255)); // Weiß
break;
}
strip.show();
lauflichtPosition++;
if (lauflichtPosition >= NUM_LEDS) {
lauflichtAktiv = false;
}
delay(50);
}
}
Ich verstehe leider nicht, was ich falsch gemacht habe. ChatGPT meint auch, dass er keinen Fehler entdecken kann...
Bitte um Unterstützung, vielen Dank.
