Hallo,
ik heb een klok gemaakt met ws2801 led strip, arduino nano, en een ds1307 rtc clip.
de klok werkt prima, alleen heb ik een knop toegevoegd die je laat kiezen tussen de verschillende uitvoeringen.
regenboog met witte wijzers
wijzers alleen in blauw (seconde), rood (minuten), groen (uren)
volledig wit met rode wijzers.
regenboog die tegen de klok in draait (void rotrainbow() ) met witte wijzers.
die laatste is het probleem.
ik heb een void animatiemode() die de selectie van de uitvoeringen regeld.
die werkt prima zolang ik optie 4 maar uitzet.
je kan door de modes heen zappen tot je bij 4 komt.
enige manier om weer bij klok type 1 te komen is de nano te resetten.
zet ik // voor optie 4 gaat ie naar 5x drukken weer terug naar 1
de code is bij elkaar gekopieerd en geplakt en hier een daar wat aangepast
zodat het werkt. misschien niet de beste manier maar ok doet dit ook nog
niet zo lang.
hoop dat iemand een idee heeft waarom dit niet werkt?
(de settime is hier verwijderd ivm te veel karakters in de post)
hier de code:
#include <FastLED.h>
#include <Wire.h>
#include "RTClib.h"
#define NUM_LEDS 60
const int buttonPin = 2; // the pin that the pushbutton is attached to
const int hourButtonPin = 6;
const int minButtonPin = 7;
int buttonPushCounter = 1; // counter for the number of button presses
int buttonState = 0; // current state of the button
int lastButtonState = 0; // previous state of the button
int hourButtonState;
int minButtonState;
int seconds; //00-59;
int minutes; //00-59;
int hours;//1-12 - 00-23;
int day;//1-7
int date;//01-31
int month;//01-12
int year;//0-99;
CRGB leds[NUM_LEDS];
RTC_DS1307 rtc;
void setup() {
Serial.begin(57600);
pinMode(buttonPin, INPUT);
pinMode(hourButtonPin,INPUT);
pinMode(minButtonPin,INPUT);
hourButtonState = 0;
minButtonState = 0;
#ifdef AVR
Wire.begin();
#else
Wire1.begin(); // Shield I2C pins connect to alt I2C bus on Arduino Due
#endif
rtc.begin();
if (! rtc.isrunning()) {
Serial.println("RTC is NOT running!");
}
FastLED.addLeds<WS2801, RGB>(leds, NUM_LEDS);
}
void loop() {
animationmode();
check_buttons();
}
void animationmode(){
buttonState = digitalRead(buttonPin);
if (buttonState != lastButtonState) {
if (buttonState == HIGH) {
buttonPushCounter++;
Serial.println(buttonPushCounter);
}
else {
}
}
lastButtonState = buttonState;
if (buttonPushCounter == 1) {
rainbow();
}
if (buttonPushCounter == 2){
rgbclock();
}
if (buttonPushCounter == 3) {
ringred();
}
if (buttonPushCounter == 4) { //het probleem kind
rotrainbow(); // na uit zetten (// er voor) werkt het prima
}
if (buttonPushCounter == 5){
buttonPushCounter = 1;
}
}
void rainbow(){
DateTime now = rtc.now();
fill_rainbow( leds, NUM_LEDS, 0, 4.25);
leds[(now.second())%60] = CRGB::White;
leds[(now.minute())%60] = CRGB::White;
if (now.minute()== 0) {
leds[((59)%60)] = CRGB::White;
}
else {
leds[((now.minute()-1)%60)] = CRGB::White;
}
unsigned char hourpos = (now.hour()%12)*5;
if (now.minute() > 47) {
leds[((59+hourpos+4)%60)%60] = CRGB::White;
leds[(hourpos+4)%60] = CRGB::White;
leds[((hourpos+1+4))%60] = CRGB::White;
}
else if (now.minute() > 35) {
leds[((59+hourpos+3)%60)%60] = CRGB::White;
leds[(hourpos+3)%60] = CRGB::White;
leds[((hourpos+1+3))%60] = CRGB::White;
}
else if (now.minute() > 23) {
leds[((59+hourpos+2)%60)%60] = CRGB::White;
leds[(hourpos+2)%60] = CRGB::White;
leds[((hourpos+1+2))%60] = CRGB::White;
}
else if (now.minute() > 11) {
leds[((59+hourpos+1)%60)%60] = CRGB::White;
leds[(hourpos+1)%60] = CRGB::White;
leds[((hourpos+1+1))%60] = CRGB::White;
}
else {
leds[((59+hourpos)%60)%60] = CRGB::White;
leds[(hourpos)%60] = CRGB::White;
leds[((hourpos+1))%60] = CRGB::White;
}
FastLED.show();
delay(50);
}
void rgbclock(){
DateTime now = rtc.now();
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
Serial.print(':');
Serial.print(now.second(), DEC);
Serial.println();
memset(leds, 0, NUM_LEDS * 3);
leds[(now.second())%60] = CRGB::Blue;
leds[(now.minute())%60] = CRGB::Red;
if (now.minute()== 0) {
leds[((59)%60)] = CRGB::Red;
}
else {
leds[((now.minute()-1)%60)] = CRGB::Red;
}
unsigned char hourpos = (now.hour()%12)*5;
if (now.minute() > 47) {
leds[((59+hourpos+4)%60)%60] = CRGB::Green;
leds[(hourpos+4)%60] = CRGB::Green;
leds[((hourpos+1+4))%60] = CRGB::Green;
}
else if (now.minute() > 35) {
leds[((59+hourpos+3)%60)%60] = CRGB::Green;
leds[(hourpos+3)%60] = CRGB::Green;
leds[((hourpos+1+3))%60] = CRGB::Green;
}
else if (now.minute() > 23) {
leds[((59+hourpos+2)%60)%60] = CRGB::Green;
leds[(hourpos+2)%60] = CRGB::Green;
leds[((hourpos+1+2))%60] = CRGB::Green;
}
else if (now.minute() > 11) {
leds[((59+hourpos+1)%60)%60] = CRGB::Green;
leds[(hourpos+1)%60] = CRGB::Green;
leds[((hourpos+1+1))%60] = CRGB::Green;
}
else {
leds[((59+hourpos)%60)%60] = CRGB::Green;
leds[(hourpos)%60] = CRGB::Green;
leds[((hourpos+1))%60] = CRGB::Green;
}
FastLED.show();
}
void ringred() {
DateTime now = rtc.now();
memset(leds, 255, NUM_LEDS * 3);
leds[(now.second())%60] = CRGB::Red;
leds[(now.minute())%60] = CRGB::Red;
if (now.minute()== 0) {
leds[((59)%60)] = CRGB::Red;
}
else {
leds[((now.minute()-1)%60)] = CRGB::Red;
}
unsigned char hourpos = (now.hour()%12)*5;
if (now.minute() > 47) {
leds[((59+hourpos+4)%60)%60] = CRGB::Red;
leds[(hourpos+4)%60] = CRGB::Red;
leds[((hourpos+1+4))%60] = CRGB::Red;
}
else if (now.minute() > 35) {
leds[((59+hourpos+3)%60)%60] = CRGB::Red;
leds[(hourpos+3)%60] = CRGB::Red;
leds[((hourpos+1+3))%60] = CRGB::Red;
}
else if (now.minute() > 23) {
leds[((59+hourpos+2)%60)%60] = CRGB::Red;
leds[(hourpos+2)%60] = CRGB::Red;
leds[((hourpos+1+2))%60] = CRGB::Red;
}
else if (now.minute() > 11) {
leds[((59+hourpos+1)%60)%60] = CRGB::Red;
leds[(hourpos+1)%60] = CRGB::Red;
leds[((hourpos+1+1))%60] = CRGB::Red;
}
else {
leds[((59+hourpos)%60)%60] = CRGB::Red;
leds[(hourpos)%60] = CRGB::Red;
leds[((hourpos+1))%60] = CRGB::Red;
}
FastLED.show();
delay(50);
}
void rotrainbow() { // probleem kind
for (int j=0; j <= 255; j++){
fill_rainbow( leds, NUM_LEDS, (0, j), 4.25);
DateTime now = rtc.now();
leds[(now.second())%60] = CRGB::White;
leds[(now.minute())%60] = CRGB::White;
if (now.minute()== 0) {
leds[((59)%60)] = CRGB::White;
}
else {
leds[((now.minute()-1)%60)] = CRGB::White;
}
unsigned char hourpos = (now.hour()%12)*5;
if (now.minute() > 47) {
leds[((59+hourpos+4)%60)%60] = CRGB::White;
leds[(hourpos+4)%60] = CRGB::White;
leds[((hourpos+1+4))%60] = CRGB::White;
}
else if (now.minute() > 35) {
leds[((59+hourpos+3)%60)%60] = CRGB::White;
leds[(hourpos+3)%60] = CRGB::White;
leds[((hourpos+1+3))%60] = CRGB::White;
}
else if (now.minute() > 23) {
leds[((59+hourpos+2)%60)%60] = CRGB::White;
leds[(hourpos+2)%60] = CRGB::White;
leds[((hourpos+1+2))%60] = CRGB::White;
}
else if (now.minute() > 11) {
leds[((59+hourpos+1)%60)%60] = CRGB::White;
leds[(hourpos+1)%60] = CRGB::White;
leds[((hourpos+1+1))%60] = CRGB::White;
}
else {
leds[((59+hourpos)%60)%60] = CRGB::White;
leds[(hourpos)%60] = CRGB::White;
leds[((hourpos+1))%60] = CRGB::White;
}
delay(200);
FastLED.show();
}
}
