Hallo,
ich habe ein Problem mit meinem Code. Normalerweise würde ich selber daran Rum basteln bis es funktioniert. Aber das kann leider auch mal ein paar Wochen dauern und so viel Zeit habe ich nicht. Jetzt zum Thema. Ich möchte meiner Freundin zum Geburtstag (Morgen ) eine Selbstgemachte Uhr schenken. Praktisch und technisch funktioniert eigentlich schon das meiste. Ich habe ein Uhrmodul RTC DS1307) und möchte damit 4 große 7 Segment anzeigen (mithilfe der Shift-Display Library und zwei 74HC595) ansteuern. Dazu sollen 60 LEDs mit WS2811 Chip quasi den Sekundenzeiger darstellen. Dazu kann man die Uhr mit einer IR Fernbedienung anschalten und die Zeit korrigieren ( hab erst zu spät gemerkt, das der RTC ziemlicher misst ist). Ich habe aber leider noch ein Problem mit der Software. Scheinbar vertragen sich die Schieberegister nicht mit dem WS2811. Alleine funktionieren beide Problemlos, aber wenn ich Code die beide Bauteile ansteuern zusammen laufen lasse blinken die 7 Segment anzeigen nur noch schwach.
Hier mein Code und bitte nicht gleich Zerfleischen bin nicht gut im Programmieren und "klaue" mehr so zusammen. Auch stehe ich Leider unter Zeitdruck da ich natürlich viel zu Spät angefangen habe zu Basteln
#include <CharacterEncoding.h>
#include <ShiftDisplay.h>
#include <Adafruit_NeoPixel.h>
#include <RTClib.h>
#include <Wire.h>
#include <boarddefs.h>
#include <IRremote.h>
#include <IRremoteInt.h>
#include <ir_Lego_PF_BitStreamEncoder.h>
#define PIXEL_PIN 9 // Digital IO pin connected to the NeoPixels.
#define PIXEL_COUNT 60
// Parameter 1 = number of pixels in strip, neopixel stick has 8
// Parameter 2 = pin number (most are valid)
// Parameter 3 = pixel type flags, add together as needed:
// NEO_RGB Pixels are wired for RGB bitstream
// NEO_GRB Pixels are wired for GRB bitstream, correct for neopixel stick
// NEO_KHZ400 400 KHz bitstream (e.g. FLORA pixels)
// NEO_KHZ800 800 KHz bitstream (e.g. High Density LED strip), correct for neopixel stick
Adafruit_NeoPixel strip = Adafruit_NeoPixel(PIXEL_COUNT, PIXEL_PIN, NEO_GRB + NEO_KHZ800); //Initialisierung der LEDs
//-------------------
ShiftDisplay display(6,4,5,COMMON_CATHODE, 4); // Arduino pin 6 connected to shift register latch, pin 4 to clock and pin 5 to data
// common anode display with 4 digits
//----------------
RTC_DS1307 rtc; //Initialisierung des RTC
int minute_correct=0; //Variable für korrigierte Zeit
int time_display=0; // Korrigierte Zeit in hhmm
int MinuteCorrection=0; //Variable für die Zeit Korrektur
//---------------
int RECV_PIN=3;//Initialisierung des IR Empfängers
IRrecv irrecv(RECV_PIN);
decode_results results;
int LED_MODE=0; //Momentaner LED Mode
int Number_LEDModes=2; // Nummer der LED Modes
int start=0;
int i=0;
unsigned long previousMillis = 0; //Ersatz für Delay im Sekundenzeiger
unsigned long previousMillis2 = 0; // Ersatz für Delay im LOOP
const long interval = 1000; // Interval für den Sekundenzeiger
//--------------
void IRReceiver() // Teil für den IR Empfänger
{
if (irrecv.decode(&results)) {
Serial.println(results.value, HEX);
irrecv.resume(); // Receive the next value
}
if( results.value== 0xFF18E7){ //LED Mode +
if(LED_MODE<Number_LEDModes)
{
LED_MODE++;
Serial.print("LM");
Serial.println(LED_MODE);
}
else
{
LED_MODE=0;
}
results.value = 0x00000000;
}
if( results.value== 0xFF4AB5){ //LED Mode -
if(LED_MODE>=0)
{
LED_MODE=LED_MODE-1;
Serial.print("LM");
Serial.println(LED_MODE);
}
else
{
LED_MODE=Number_LEDModes;
}
results.value = 0x00000000;
}
if( results.value== 0xFF10EF){ //Time Correction +1 Minute
MinuteCorrection--;
Serial.println(MinuteCorrection);
results.value = 0x00000000;
}
if( results.value== 0xFF5AA5){ //Time Correction -1 Minute
MinuteCorrection++;
Serial.println(MinuteCorrection);
results.value = 0x00000000;
}
}
void setup() {
// put your setup code here, to run once:
strip.begin(); //start für die LEDs
strip.show();
pinMode(RECV_PIN, INPUT);
irrecv.enableIRIn(); // Startet den IR Empfänger
Serial.begin(9600);
display.set(1234, ALIGN_LEFT);//Setzt das Display auf die aktuelle Uhrzeit
}
void loop() {
// put your main code here, to run repeatedly:
IRReceiver();
if (LED_MODE==0) //Schaltet zwischen den verschiedenen Modi um
{
off();
start=0;
}
if(LED_MODE==1)
{
if ( start==0) //Einmalig sollen alle LEDs ausgeschaltet werden, dann startet der "Sekundenzeiger"
{
off();
start++;
}
sekunden_LED();
}
if(LED_MODE==2)
{
all_red();
start=0;
}
unsigned long currentMillis2 = millis();
correct_time();
if (currentMillis2 - previousMillis2 >= 1000) { //aktuallisiert alle 10 Sekunden das Display
previousMillis2 = currentMillis2;
display.update();
Serial.println(time_display);
}
}
void sekunden_LED()// Rote LED "Hüpft" Jede Sekunde eins weiter
{
strip.begin();
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
// save the last time you blinked the LED
previousMillis = currentMillis;
Serial.println(time_display);
if ( i<PIXEL_COUNT)
{
strip.setPixelColor(i,strip.Color(0,255,0));
strip.setPixelColor(i-1,strip.Color(0,0,0));
strip.show();
i++;
}
else
{
i=0;
off();
}
}
}
void all_red() //Schalte alle LED rot
{
for(int i=0 ; i<PIXEL_COUNT;i++)
{
strip.setPixelColor(i,strip.Color(0,255,0));
strip.show();
}
}
void off() // Schalte alle LEDs aus
{
for (int i=0; i<PIXEL_COUNT;i++)
{
strip.setPixelColor(i,strip.Color(0,0,0));
strip.show();
}
}
//----------------------------------------------------------------------
void correct_time() //Korrigiert Zeit vom RTC
{
DateTime now = rtc.now();
time_display=(now.hour()*100)+now.minute()+MinuteCorrection;
}
Der RTC ist über i2c Verbunden
Der IR Empfänger hängt an Pin 3
Der LED Strip an PIN 9
Die Schieberegister an Pin 6,4,5
Die Teile für sich funktionieren alle in eigenen Beispielen. Nur Zusammen mögen sie sich nicht. Ich hoffe ihr könnt mir helfen den Geburtstag morgen zu retten. Freue mich über jede Hilfe.