Zbudowałem zegar ((
) i teraz próbuję go zaprogramować tak żeby działał jak na filmiku. Zaznaczam że niezbyt znam się na programowaniu. Mógłby ktoś znaleźć błędy w tym kodzie lub pomóc w zaprogramowaniu? Chodzi mi żeby różne kolory reprezentowały sekundy minuty i godziny, w formie 3 chodzących kropek.
Zbudowany na Arduino Nano i RTC DS1307, po uruchomieniu świecą się 3 diody, po restarcie dalej świecą te same.
https://pastebin.com/MapwxV0w
- "dane" pobierasz z
theTime
second1 = theTime.second();
minute1 = theTime.minute();
hour1 = theTime.hour();
a aktualizujesz w pętli zmienną now
DateTime now = RTC.now();
- godzin na tarczy jest 12 a nie 6 więc nie możesz tak określać godzin
hour1 = theTime.hour();
trzeba je przemnożyć przez 5
-
delay(1000);
jest za duży - w skrajnych przypadkach możesz mieć przeskok o prawie 2 sekundy albo prawie od razu. Lepiej sprawdzać co np. 250 ms i porównywać czy czas rzeczywiście się zmienił
@abrakadaber: Zegar już działa tylko mam problem że chodząca "wskazówka" sekundy i minuty zostawia za sobą ślad. Masz pomysł jak zrobić z niej "jedną" chodzącą kropkę?
I nie mam pojęcia jak "przemnożyć" te godziny. Poprawiony kod: https://pastebin.com/Vw2mwT60
#include <RTClib.h>
#include <Adafruit_NeoPixel.h>
#include <Wire.h>
#define NEOPIN 3
#define BRIGHTNESS 25
RTC_DS1307 RTC;
Adafruit_NeoPixel strip = Adafruit_NeoPixel(60, NEOPIN, NEO_GRB + NEO_KHZ800);
uint32_t lastTime = 0;
uint8_t second1 = 0;
uint8_t minute1 = 0;
uint8_t hour1 = 0;
void setup() {
//Zegarek
Wire.begin();
RTC.begin();
RTC.adjust(DateTime(__DATE__, __TIME__));
DateTime now = RTC.now();
RTC.adjust(now);
//Wyświetlacz
strip.begin();
strip.setBrightness(BRIGHTNESS);
}
void loop() {
//Zegarek
DateTime now = RTC.now();
if (lastTime != now.unixtime())
{
//skasowanie "starych LEDów
strip.setPixelColor(second1, 0, 0, 0); //nie wiem czy wyłączone to 0 0 0 czy 255 255 255
strip.setPixelColor(minute1, 0, 0, 0);
strip.setPixelColor(hour1 * 5, 0, 0, 0);
//pobranie h, m i s
second1 = now.second();
minute1 = now.minute();
hour1 = now.hour();
//zapalenie "nowych" LEDów
strip.setPixelColor(second1, 255, 0, 0);
strip.setPixelColor(minute1, 0, 255, 0);
strip.setPixelColor(hour1 * 5, 0, 0, 255);
//zaktualizowanie lastTime
lastTime = now.unixtime();
}
delay(250);
}
powinno zadziałać
Niestety po wgraniu tego kodu nic nie wyświetla, nawet dioda TX już nie "mruga".
dioda TX nie mruga bo wywaliłem kod od portu szeregowego. Wgraj, otwórz monitor portu i wklej tutaj wynik po np. 5 sekundach
#include <RTClib.h>
#include <Adafruit_NeoPixel.h>
#include <Wire.h>
#define NEOPIN 3
#define BRIGHTNESS 25
RTC_DS1307 RTC;
Adafruit_NeoPixel strip = Adafruit_NeoPixel(60, NEOPIN, NEO_GRB + NEO_KHZ800);
uint32_t lastTime = 0;
uint8_t second1 = 0;
uint8_t minute1 = 0;
uint8_t hour1 = 0;
void setup() {
Serial.begin(9600);
//Zegarek
Wire.begin();
RTC.begin();
RTC.adjust(DateTime(__DATE__, __TIME__));
DateTime now = RTC.now();
RTC.adjust(now);
//Wyświetlacz
strip.begin();
strip.setBrightness(BRIGHTNESS);
}
void loop() {
//Zegarek
DateTime now = RTC.now();
Serial.print("tick\t");
Serial.print(lastTime);
Serial.print("\t");
Serial.println(now.unixtime());
if (lastTime != now.unixtime())
{
Serial.println("zmiana\t");
//skasowanie "starych LEDów
strip.setPixelColor(second1, 0, 0, 0); //nie wiem czy wyłączone to 0 0 0 czy 255 255 255
strip.setPixelColor(minute1, 0, 0, 0);
strip.setPixelColor(hour1 * 5, 0, 0, 0);
//pobranie h, m i s
second1 = now.second();
minute1 = now.minute();
hour1 = now.hour();
//zapalenie "nowych" LEDów
strip.setPixelColor(second1, 255, 0, 0);
strip.setPixelColor(minute1, 0, 255, 0);
strip.setPixelColor(hour1 * 5, 0, 0, 255);
//zaktualizowanie lastTime
lastTime = now.unixtime();
}
delay(250);
}
Wgrany, zdj w załączniku
no to wszystko działa :). W ferworze walki zabrakło jednej linijki - strip.show();
przed //zaktualizowanie lastTime
BTW rozumiesz w ogóle poszczególne komendy czy robisz to metodą copiegopasta?
Działa, tylko mam wrażenie że jest źle obliczana wskazówka godzin. Bo jak 14*5=70, a diod jest 60 :D Więc muszę jakoś nad tym pomyśleć, i chyba dodam że minutowa to 2 piksele, a godzinowa 3 piksele. Ogólnie rozumiem kod oprócz tych uint_32t itd. Ale się doedukuję. Serdeczne dzięki za pomoc, jest to mój 1. poważny projekt na arduino :)
jeśli godzina jest zwracana od 0 do 23 a nie od 0 do 12 to musisz zrobić tak strip.setPixelColor(hour1 %12 * 5
w obu miejscach. %
to operator modulo (czyli reszta z dzielenia), który dla 0 i 12 da 0 a dla 11 i 23 da 11 (i tak dalej)
@abrakadaber Już kod po w/w poprawkach: pastebin.com/mnV4cWea
Możesz mi jeszcze pomóc w jednej rzeczy? Gdy "wskazówki" na siebie najdą to wyświetla się tylko jeden kolor. Jest jakaś komenda która w takiej sytuacji znajdzie w tym pikselu kolor "pośredni" i go wyświetli?
if (lastTime != now.unixtime())
{
Serial.println("zmiana\t");
//skasowanie "starych LEDów
strip.setPixelColor(second1, 0, 0, 0); //nie wiem czy wyłączone to 0 0 0 czy 255 255 255
strip.setPixelColor(minute1, 0, 0, 0);
strip.setPixelColor(hour1 %12 * 5 - 1, 0, 0, 0);
//pobranie h, m i s
second1 = now.second();
minute1 = now.minute();
hour1 = now.hour();
//sprawdzenie czy taka sama minuta godzina i sekunda
if (second1 == minute1 == (hour1 %12 * 5))
{
strip.setPixelColor(second1 - 1, 0, 0, 127);
strip.setPixelColor(second1, 255, 255, 255);
strip.setPixelColor(second1 + 1, 0, 127, 127);
}
//taka sama sekunda i minuta, godzina różna
else if (second1 == minute1)
{
strip.setPixelColor(minute1, 255, 255, 0);
strip.setPixelColor(minute1 + 1, 0, 127, 0);
strip.setPixelColor(hour1 %12 * 5 - 1, 0, 0, 255);
strip.setPixelColor(hour1 %12 * 5, 0, 0, 255);
strip.setPixelColor(hour1 %12 * 5 + 1, 0, 0, 255);
}
//taka sama sekunda i godzina, minuta różna
else if (second1 == hour1 %12 * 5)
{
strip.setPixelColor(minute1, 0, 255, 0);
strip.setPixelColor(minute1 + 1, 0, 127, 0);
strip.setPixelColor(hour1 %12 * 5 - 1, 0, 0, 127);
strip.setPixelColor(hour1 %12 * 5, 255, 0, 255);
strip.setPixelColor(hour1 %12 * 5 + 1, 0, 0, 127);
}
//taka sama minuta i godzina, różna sekunda
else if (minute1 == hour1 %12 * 5)
{
strip.setPixelColor(second1, 255, 0, 0);
strip.setPixelColor(hour1 %12 * 5 - 1, 0, 0, 127);
strip.setPixelColor(hour1 %12 * 5, 0, 255, 255);
strip.setPixelColor(hour1 %12 * 5 + 1, 0, 127, 127);
}
else
{
//godzina minuta i sekunda różne
strip.setPixelColor(second1, 255, 0, 0);
strip.setPixelColor(minute1, 0, 255, 0);
strip.setPixelColor(minute1 + 1, 0, 255, 0);
strip.setPixelColor(hour1 %12 * 5 - 1, 0, 0, 255);
strip.setPixelColor(hour1 %12 * 5, 0, 0, 255);
strip.setPixelColor(hour1 %12 * 5 + 1, 0, 0, 255);
}
strip.show();
//zaktualizowanie lastTime
lastTime = now.unixtime();
}
@abrakadaber Tak wygląda kod po kilku estetycznych zmianach z mojej strony. Zegar ma już chyba tylko jedną wadę, gdy jest godzina 12/0/24 to godzina jest źle wyświetlana. W kodzie jest <hour1 %12 * 5>, a piksele to kolejno 59,0,1 więc wyświetla tylko na 0 i 1. Próbowałem dodać kolejnego else if (hour1 == 24) i tam cały warunek ale dalej wyświetlał źle. Możesz mi jeszcze w tym pomóc?
#include <RTClib.h>
#include <Adafruit_NeoPixel.h>
#include <Wire.h>
#define NEOPIN 3
#define BRIGHTNESS 100
RTC_DS1307 RTC;
Adafruit_NeoPixel strip = Adafruit_NeoPixel(60, NEOPIN, NEO_GRB + NEO_KHZ800);
uint32_t lastTime = 0;
uint8_t second1 = 0;
uint8_t minute1 = 0;
uint8_t hour1 = 0;
void setup() {
Serial.begin(9600);
//Zegarek
Wire.begin();
RTC.begin();
//RTC.adjust(DateTime(__DATE__, __TIME__));
DateTime now = RTC.now();
RTC.adjust(now);
//Wyświetlacz
strip.begin();
strip.setBrightness(BRIGHTNESS);
}
void loop() {
//Zegarek
DateTime now = RTC.now();
Serial.print("tick\t");
Serial.print(lastTime);
Serial.print("\t");
Serial.println(now.unixtime());
if (lastTime != now.unixtime())
{
Serial.println("zmiana\t");
//skasowanie "starych LEDów
strip.setPixelColor(second1, 0, 0, 0); //nie wiem czy wyłączone to 0 0 0 czy 255 255 255
strip.setPixelColor(minute1, 0, 0, 0);
strip.setPixelColor(hour1 %12 * 5 - 1, 0, 0, 0);
strip.setPixelColor(hour1 %12 * 5, 0, 0, 0);
strip.setPixelColor(hour1 %12 * 5 + 1, 0, 0, 0);
//pobranie h, m i s
second1 = now.second();
minute1 = now.minute();
hour1 = now.hour();
//sprawdzenie czy taka sama minuta godzina i sekunda
if (second1 == minute1 == (hour1 %12 * 5))
{
strip.setPixelColor(hour1 - 1, 0, 0, 127);
strip.setPixelColor(hour1, 255, 255, 255);
strip.setPixelColor(hour1 + 1, 0, 0, 127);
}
//taka sama sekunda i minuta, godzina różna
else if (second1 == minute1)
{
strip.setPixelColor(minute1, 255, 0, 255);
strip.setPixelColor(minute1 + 1, 0, 255, 0);
strip.setPixelColor(hour1 %12 * 5 - 1, 0, 0, 127);
strip.setPixelColor(hour1 %12 * 5, 0, 0, 255);
strip.setPixelColor(hour1 %12 * 5 + 1, 0, 0, 127);
}
else if (second1 == minute1 + 1)
{
strip.setPixelColor(minute1, 0, 255, 0);
strip.setPixelColor(minute1 + 1, 127, 0, 127);
strip.setPixelColor(hour1 %12 * 5 - 1, 0, 0, 127);
strip.setPixelColor(hour1 %12 * 5, 0, 0, 255);
strip.setPixelColor(hour1 %12 * 5 + 1, 0, 0, 127);
}
//taka sama sekunda i godzina, minuta różna
else if (second1 == hour1 %12 * 5 - 1)
{
strip.setPixelColor(minute1, 0, 255, 0);
strip.setPixelColor(minute1 + 1, 0, 255, 0);
strip.setPixelColor(hour1 %12 * 5 - 1, 127, 0, 127);
strip.setPixelColor(hour1 %12 * 5, 0, 0, 255);
strip.setPixelColor(hour1 %12 * 5 + 1, 0, 0, 127);
}
else if (second1 == hour1 %12 * 5)
{
strip.setPixelColor(minute1, 0, 255, 0);
strip.setPixelColor(minute1 + 1, 0, 255, 0);
strip.setPixelColor(hour1 %12 * 5 - 1, 0, 0, 127);
strip.setPixelColor(hour1 %12 * 5, 255, 0, 255);
strip.setPixelColor(hour1 %12 * 5 + 1, 0, 0, 127);
}
else if (second1 == hour1 %12 * 5 + 1)
{
strip.setPixelColor(minute1, 0, 255, 0);
strip.setPixelColor(minute1 + 1, 0, 255, 0);
strip.setPixelColor(hour1 %12 * 5 - 1, 0, 0, 127);
strip.setPixelColor(hour1 %12 * 5, 0, 0, 255);
strip.setPixelColor(hour1 %12 * 5 + 1, 127, 0, 127);
}
//taka sama minuta i godzina, różna sekunda
else if (minute1 + 1 == hour1 %12 * 5 - 1)
{
strip.setPixelColor(second1, 255, 0, 0);
strip.setPixelColor(hour1 %12 * 5 - 1, 0, 0, 127);
strip.setPixelColor(hour1 %12 * 5, 0, 255, 0);
strip.setPixelColor(hour1 %12 * 5 + 1, 0, 0, 127);
}
else if (minute1 + 1 == hour1 %12 * 5)
{
strip.setPixelColor(second1, 255, 0, 0);
strip.setPixelColor(hour1 %12 * 5 - 1, 0, 0, 127);
strip.setPixelColor(hour1 %12 * 5, 0, 255, 0);
strip.setPixelColor(hour1 %12 * 5 + 1, 0, 0, 127);
}
else if (minute1 + 1 == hour1 %12 * 5 + 1)
{
strip.setPixelColor(second1, 255, 0, 0);
strip.setPixelColor(hour1 %12 * 5 - 1, 0, 0, 127);
strip.setPixelColor(hour1 %12 * 5, 0, 255, 0);
strip.setPixelColor(hour1 %12 * 5 + 1, 0, 0, 127);
}
else
{
//godzina minuta i sekunda różne
strip.setPixelColor(second1, 127, 0, 0);
strip.setPixelColor(minute1, 0, 255, 0);
strip.setPixelColor(minute1 + 1, 0, 255, 0);
strip.setPixelColor(hour1 %12 * 5 - 1, 0, 0, 127);
strip.setPixelColor(hour1 %12 * 5, 0, 0, 255);
strip.setPixelColor(hour1 %12 * 5 + 1, 0, 0, 127);
}
strip.setPixelColor(0, 255, 255, 255);
strip.setPixelColor(30, 255, 255, 255);
strip.setPixelColor(45, 255, 255, 255);
strip.setPixelColor(15, 255, 255, 255);
strip.show();
//zaktualizowanie lastTime
lastTime = now.unixtime();
}
delay(250);
}
inaczej to zrób - jak masz taki fragment kodu
strip.setPixelColor(hour1 - 1, 0, 0, 127);
strip.setPixelColor(hour1, 255, 255, 255);
strip.setPixelColor(hour1 + 1, 0, 0, 127);
to zamień go na taki
if (hour1 == 0)
strip.setPixelColor(23, 0, 0, 127)
else
strip.setPixelColor(hour1 - 1, 0, 0, 127);
strip.setPixelColor(hour1, 255, 255, 255);
strip.setPixelColor(hour1 + 1, 0, 0, 127);
i tak kilka razy
Przydałaby się jeszcze jedna zmienna, bo w kółko powielane jest poniższe wyrażenie:
hour1 % 12 * 5
Poza tym, hour1
to nienajlepsza nazwa zmiennej – reszta z prefiksem 1
też.
Poprawiłem tak jak mówiliście tylko teraz nic się już nie wyświetla :/ Pewnie gdzieś zrobiłem błąd, dopiero zaczynam przygodę z programowaniem.
#include <RTClib.h>
#include <Adafruit_NeoPixel.h>
#include <Wire.h>
#define NEOPIN 3
#define BRIGHTNESS 100
RTC_DS1307 RTC;
Adafruit_NeoPixel strip = Adafruit_NeoPixel(60, NEOPIN, NEO_GRB + NEO_KHZ800);
uint32_t lastTime = 0;
uint8_t secondka = 0;
uint8_t minutka = 0;
uint8_t hourek = 0;
void setup() {
Serial.begin(9600);
//Zegarek
Wire.begin();
RTC.begin();
//RTC.adjust(DateTime(__DATE__, __TIME__));
DateTime now = RTC.now();
RTC.adjust(now);
//Wyświetlacz
strip.begin();
strip.setBrightness(BRIGHTNESS);
}
void loop() {
//Zegarek
DateTime now = RTC.now();
Serial.print("tick\t");
Serial.print(lastTime);
Serial.print("\t");
Serial.println(now.unixtime());
if (lastTime != now.unixtime())
{
Serial.println("zmiana\t");
//skasowanie "starych LEDów
strip.setPixelColor(secondka, 0, 0, 0); //nie wiem czy wyłączone to 0 0 0 czy 255 255 255
strip.setPixelColor(minutka, 0, 0, 0);
if (hourek == 0)
{
strip.setPixelColor(59, 0, 0, 0);
strip.setPixelColor(0, 0, 0, 0);
strip.setPixelColor(1, 0, 0, 0);
strip.setPixelColor(secondka, 0, 0, 127);
strip.setPixelColor(minutka, 0, 255, 0);
strip.setPixelColor(minutka + 1, 0, 255, 0);
}
else
{
strip.setPixelColor(hourek %12 *5 - 1, 0, 0, 0);
strip.setPixelColor(hourek %12 *5, 0, 0, 0);
strip.setPixelColor(hourek %12 *5 + 1, 0, 0, 0);
}
//pobranie h, m i s
secondka = now.second();
minutka = now.minute();
hourek = now.hour();
char godzinka = hourek %12 *5;
//sprawdzenie czy taka sama minuta godzina i sekunda
if (secondka == minutka == godzinka)
{
if (hourek == 0)
{
strip.setPixelColor(59, 127, 0, 0);
strip.setPixelColor(0, 255, 0, 0);
strip.setPixelColor(1, 127, 0, 0);
strip.setPixelColor(secondka, 0, 0, 127);
strip.setPixelColor(minutka, 0, 255, 0);
strip.setPixelColor(minutka + 1, 0, 255, 0);
}
else
{
strip.setPixelColor(godzinka - 1, 127, 0, 0);
strip.setPixelColor(godzinka, 255, 255, 255);
strip.setPixelColor(godzinka + 1, 127, 0, 0);
}
}
//taka sama sekunda i minuta, godzina różna
else if (secondka == minutka)
{
strip.setPixelColor(minutka, 255, 0, 255);
strip.setPixelColor(minutka + 1, 0, 255, 0);
if (hourek == 0)
{
strip.setPixelColor(59, 127, 0, 0);
strip.setPixelColor(0, 255, 0, 0);
strip.setPixelColor(1, 127, 0, 0);
strip.setPixelColor(secondka, 0, 0, 127);
strip.setPixelColor(minutka, 0, 255, 0);
strip.setPixelColor(minutka + 1, 0, 255, 0);
}
else
{
strip.setPixelColor(godzinka - 1, 127, 0, 0);
strip.setPixelColor(godzinka, 255, 0, 0);
strip.setPixelColor(godzinka + 1, 127, 0, 0);
}
}
else if (secondka == minutka + 1)
{
strip.setPixelColor(minutka, 0, 255, 0);
strip.setPixelColor(minutka + 1, 127, 0, 127);
if (hourek == 0)
{
strip.setPixelColor(59, 127, 0, 0);
strip.setPixelColor(0, 255, 0, 0);
strip.setPixelColor(1, 127, 0, 0);
strip.setPixelColor(secondka, 0, 0, 127);
strip.setPixelColor(minutka, 0, 255, 0);
strip.setPixelColor(minutka + 1, 0, 255, 0);
}
else
{
strip.setPixelColor(godzinka - 1, 127, 0, 0);
strip.setPixelColor(godzinka, 255, 0, 0);
strip.setPixelColor(godzinka + 1, 127, 0, 0);
}
}
//taka sama sekunda i godzina, minuta różna
else if (secondka == godzinka - 1)
{
strip.setPixelColor(minutka, 0, 255, 0);
strip.setPixelColor(minutka + 1, 0, 255, 0);
if (hourek == 0)
{
strip.setPixelColor(59, 127, 0, 0);
strip.setPixelColor(0, 255, 0, 0);
strip.setPixelColor(1, 127, 0, 0);
strip.setPixelColor(secondka, 0, 0, 127);
strip.setPixelColor(minutka, 0, 255, 0);
strip.setPixelColor(minutka + 1, 0, 255, 0);
}
else
{
strip.setPixelColor(godzinka - 1, 127, 0, 127);
strip.setPixelColor(godzinka, 255, 0, 0);
strip.setPixelColor(godzinka + 1, 127, 0, 0);
}
}
else if (secondka == godzinka)
{
strip.setPixelColor(minutka, 0, 255, 0);
strip.setPixelColor(minutka + 1, 0, 255, 0);
if (hourek == 0)
{
strip.setPixelColor(59, 127, 0, 0);
strip.setPixelColor(0, 255, 0, 255);
strip.setPixelColor(1, 127, 0, 0);
strip.setPixelColor(secondka, 0, 0, 127);
strip.setPixelColor(minutka, 0, 255, 0);
strip.setPixelColor(minutka + 1, 0, 255, 0);
}
else
{
strip.setPixelColor(godzinka - 1, 127, 0, 0);
strip.setPixelColor(godzinka, 255, 0, 255);
strip.setPixelColor(godzinka + 1, 127, 0, 0);
}
}
else if (secondka == godzinka + 1)
{
strip.setPixelColor(minutka, 0, 255, 0);
strip.setPixelColor(minutka + 1, 0, 255, 0);
if (hourek == 0)
{
strip.setPixelColor(59, 127, 0, 0);
strip.setPixelColor(0, 255, 0, 0);
strip.setPixelColor(1, 127, 0, 0);
strip.setPixelColor(secondka, 0, 0, 127);
strip.setPixelColor(minutka, 0, 255, 0);
strip.setPixelColor(minutka + 1, 0, 255, 0);
}
else
{
strip.setPixelColor(godzinka - 1, 127, 0, 0);
strip.setPixelColor(godzinka, 255, 0, 0);
strip.setPixelColor(godzinka + 1, 127, 0, 127);
}
}
//taka sama minuta i godzina, różna sekunda
else if (minutka + 1 == godzinka - 1)
{
strip.setPixelColor(secondka, 0, 0, 127);
if (hourek == 0)
{
strip.setPixelColor(59, 127, 0, 0);
strip.setPixelColor(0, 255, 0, 0);
strip.setPixelColor(1, 127, 0, 0);
strip.setPixelColor(secondka, 0, 0, 127);
strip.setPixelColor(minutka, 0, 255, 0);
strip.setPixelColor(minutka + 1, 0, 255, 0);
}
else
{
strip.setPixelColor(godzinka - 1, 127, 0, 0);
strip.setPixelColor(godzinka, 0, 255, 0);
strip.setPixelColor(godzinka + 1, 127, 0, 0);
}
}
else if (minutka + 1 == godzinka)
{
strip.setPixelColor(secondka, 0, 0, 127);
if (hourek == 0)
{
strip.setPixelColor(59, 127, 0, 0);
strip.setPixelColor(0, 255, 0, 127);
strip.setPixelColor(1, 127, 0, 0);
strip.setPixelColor(secondka, 0, 0, 127);
strip.setPixelColor(minutka, 0, 255, 0);
strip.setPixelColor(minutka + 1, 0, 255, 0);
}
else
{
strip.setPixelColor(godzinka - 1, 127, 0, 0);
strip.setPixelColor(godzinka, 0, 255, 0);
strip.setPixelColor(godzinka + 1, 127, 0, 0);
}
}
else if (minutka + 1 == godzinka + 1)
{
strip.setPixelColor(secondka, 0, 0, 127);
if (hourek == 0)
{
strip.setPixelColor(59, 127, 0, 0);
strip.setPixelColor(0, 255, 0, 0);
strip.setPixelColor(1, 127, 0, 0);
strip.setPixelColor(secondka, 0, 0, 127);
strip.setPixelColor(minutka, 0, 255, 0);
strip.setPixelColor(minutka + 1, 0, 255, 0);
}
else
{
strip.setPixelColor(godzinka - 1, 127, 0, 0);
strip.setPixelColor(godzinka, 0, 255, 0);
strip.setPixelColor(godzinka + 1, 127, 0, 0);
}
}
else
{
//godzina minuta i sekunda różne
strip.setPixelColor(secondka, 0, 0, 127);
strip.setPixelColor(minutka, 0, 255, 0);
strip.setPixelColor(minutka + 1, 0, 255, 0);
if (hourek == 0)
{
strip.setPixelColor(59, 127, 0, 0);
strip.setPixelColor(0, 255, 0, 0);
strip.setPixelColor(1, 127, 0, 0);
strip.setPixelColor(secondka, 0, 0, 127);
strip.setPixelColor(minutka, 0, 255, 0);
strip.setPixelColor(minutka + 1, 0, 255, 0);
}
else
{
strip.setPixelColor(godzinka - 1, 127, 0, 0);
strip.setPixelColor(godzinka, 255, 0, 0);
strip.setPixelColor(godzinka + 1, 127, 0, 0);
}
strip.setPixelColor(0, 100, 100, 100);
strip.setPixelColor(30, 100, 100, 100);
strip.setPixelColor(45, 100, 100, 100);
strip.setPixelColor(15, 100, 100, 100);
strip.show();
//zaktualizowanie lastTime
lastTime = now.unixtime();
}
delay(250);
}
}
TEORETYCZNIE powinno zadziałać tak :)
#include <RTClib.h>
#include <Adafruit_NeoPixel.h>
#include <Wire.h>
#define NEOPIN 3
#define BRIGHTNESS 100
RTC_DS1307 RTC;
Adafruit_NeoPixel strip = Adafruit_NeoPixel(60, NEOPIN, NEO_GRB + NEO_KHZ800);
uint32_t lastTime = 0;
uint8_t sekunda = 0;
uint8_t minuta = 0;
uint8_t godzina = 0;
void setup() {
Serial.begin(9600);
//Zegarek
Wire.begin();
RTC.begin();
//RTC.adjust(DateTime(__DATE__, __TIME__));
DateTime now = RTC.now();
RTC.adjust(now);
//Wyświetlacz
strip.begin();
strip.setBrightness(BRIGHTNESS);
}
void loop() {
//Zegarek
DateTime now = RTC.now();
Serial.print("tick\t");
Serial.print(lastTime);
Serial.print("\t");
Serial.println(now.unixtime());
if (lastTime != now.unixtime())
{
Serial.println("zmiana\t");
//skasowanie "starych LEDów
strip.setPixelColor(sekunda, 0, 0, 0);
strip.setPixelColor(minuta, 0, 0, 0);
strip.setPixelColor(godzina - 1, 0, 0, 0);
strip.setPixelColor(godzina, 0, 0, 0);
strip.setPixelColor(godzina + 1, 0, 0, 0);
//pobranie h, m i s
sekunda = now.second();
minuta = now.minute();
godzina = now.hour() % 12 * 5;
//sekundy
strip.setPixelColor(sekunda, 0xff0000);
//minuty
uint32_t pixelKolor = strip.getPixelColor(minuta);
strip.setPixelColor(minuta, pixelKolor | 0x00ff00);
pixelKolor = strip.getPixelColor(minuta + 1);
strip.setPixelColor(minuta + 1, pixelKolor | 0x00ff00);
//godzina
pixelKolor = strip.getPixelColor(godzina - 1);
strip.setPixelColor(godzina - 1, pixelKolor | 0x00007f);
pixelKolor = strip.getPixelColor(godzina);
strip.setPixelColor(godzina, pixelKolor | 0x0000ff);
pixelKolor = strip.getPixelColor(godzina + 1);
strip.setPixelColor(godzina + 1, pixelKolor | 0x00007f);
strip.show();
//zaktualizowanie lastTime
lastTime = now.unixtime();
}
delay(250);
}
te ify nie podobały mi się od początku ale nie chciało mi się szukać czy da się odczytać "kolor" piksela. Okazuje się, że biblioteka ma taką metodę. Dla uproszczenia sobie życia zmieniłem podawanie kolorów z osobnych R G B na jedno RGB, tzn. zamiast strip.setPixelColor(x, R, G, B)
jest strip.setPixelColor(x, RGB)
. Zapis 0x00ff00
to zapis szesnastkowy i oznacza tyle, że bajt R = 0x00 bajt G = 0xff a bajt B = 0x00. 0xff szesnastkowo równa się 255 dziesiętnie (możesz sprawdzić kalkulatorem windowsowym po przełączeniu się w tryb programisty).
Działa to tak, że najpierw ustalamy kolor piksela dla sekund (przed tym wszystkie są wyłączone więc nie trzeba sprawdzać czy któryś ma inny kolor). Następnie przed ustaleniem koloru piksela minut najpierw odczytujemy kolor piksela, który chcemy zmienić i robimy na nim logiczne OR z kolorem minut. Dla godzin jest analogicznie.
Jak działa OR - jeśli mamy dwie wartości - 0xff0000
i 0x00ff00
to 0xff0000 | 0x00ff00 = 0xffff00
(|
to operator logiczny OR)
@abrakadaber: Wyskakuje błąd (załącznik), próbowałem jakoś to poprzestawiać ale dalej to samo
@abrakadaber: Powiem szczerze rozumiem ten kod ale go nie umiem. Więc proszę cię o pomoc w kilku estetycznych zmianach bo oczywiście zegar działa :)
1.Gdy wyświetlana jest godzina 12 to znowu świecą piksele 0 i 1, a piksel 59 nie świeci.
2.Chciałbym żeby w sytuacji gdzie zachodzi minuta na godzinę wyglądało to tak: niebieski zielony niebieski, i tak aż cała minuta nie "przejdzie" godziny.
3. Ostatnia już prośba żeby przechodząca sekunda zawsze dawała taki sam kolor na minutach i sekundach czyli 255, 0, 255.
pierwsze i trzecie. Natomiast drugiego nie rozumiem - najlepiej narysuj coś takiego :P
i jeszcze pięć kolejnych kroków :)
#include <RTClib.h>
#include <Adafruit_NeoPixel.h>
#include <Wire.h>
#define NEOPIN 3
#define BRIGHTNESS 100
RTC_DS1307 RTC;
Adafruit_NeoPixel strip = Adafruit_NeoPixel(60, NEOPIN, NEO_GRB + NEO_KHZ800);
uint32_t lastTime = 0;
uint8_t sekunda = 0;
uint8_t minuta = 0;
uint8_t godzina = 0;
void setup() {
Serial.begin(9600);
//Zegarek
Wire.begin();
RTC.begin();
//RTC.adjust(DateTime(__DATE__, __TIME__));
DateTime now = RTC.now();
RTC.adjust(now);
//Wyświetlacz
strip.begin();
strip.setBrightness(BRIGHTNESS);
}
void loop() {
//Zegarek
DateTime now = RTC.now();
Serial.print("tick\t");
Serial.print(lastTime);
Serial.print("\t");
Serial.println(now.unixtime());
if (lastTime != now.unixtime())
{
Serial.println("zmiana\t");
//skasowanie "starych LEDów
strip.setPixelColor(sekunda, 0, 0, 0);
strip.setPixelColor(minuta, 0, 0, 0);
strip.setPixelColor(godzina - 1, 0, 0, 0);
strip.setPixelColor(godzina, 0, 0, 0);
strip.setPixelColor(godzina + 1, 0, 0, 0);
//pobranie h, m i s
sekunda = now.second();
minuta = now.minute();
godzina = now.hour() % 12 * 5;
//minuty
uint32_t pixelKolor = strip.getPixelColor(minuta);
strip.setPixelColor(minuta, pixelKolor | 0x00ff00);
pixelKolor = strip.getPixelColor(minuta + 1);
strip.setPixelColor(minuta + 1, pixelKolor | 0x00ff00);
//godzina
if (godzina == 0)
{
pixelKolor = strip.getPixelColor(59);
strip.setPixelColor(59, pixelKolor | 0x00007f);
}
else
{
pixelKolor = strip.getPixelColor(godzina - 1);
strip.setPixelColor(godzina - 1, pixelKolor | 0x00007f);
}
pixelKolor = strip.getPixelColor(godzina);
strip.setPixelColor(godzina, pixelKolor | 0x0000ff);
pixelKolor = strip.getPixelColor(godzina + 1);
strip.setPixelColor(godzina + 1, pixelKolor | 0x00007f);
//sekundy
pixelKolor = strip.getPixelColor(sekunda);
if (pixelKolor != 0x000000) //jeśli coś się świeci tam gdzie ma być sekunda to 255 0 255
strip.setPixelColor(sekunda, 0xff00ff)
else //a jak nie to 255 0 0
strip.setPixelColor(sekunda, 0xff0000);
strip.show();
//zaktualizowanie lastTime
lastTime = now.unixtime();
}
delay(250);
}
@abrakadaber: po lewej masz sytuacje a po prawej ich wynik (załącznik) i jakbyś mógł zrobić 2-wskazówkową minutę.
I gdy sekunda przechodzi przez takie połączenie (niebieski zielony niebieski) też będzie zmieniać kolor na 255, 0, 255?
czyli we wszystkich czterech przypadkach ma być taki sam efekt?
@abrakadaber: Tak i żeby w trakcie gdy on wystąpi sekunda przechodząc przez niego dawała taki sam kolor 255, 0, 255