Wątek przeniesiony 2018-11-08 11:55 z C/C++ przez Marooned.

Led rgb ring clock (arduino)

0

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

0
  1. "dane" pobierasz z theTime
second1 = theTime.second();
minute1 = theTime.minute();
hour1 = theTime.hour();

a aktualizujesz w pętli zmienną now

DateTime now = RTC.now();
  1. 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

  1. 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ł
0

@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

0
#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ć

0

Niestety po wgraniu tego kodu nic nie wyświetla, nawet dioda TX już nie "mruga".

0

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);
}
0

Wgrany, zdj w załączniku

0

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?

0

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 :)

0

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)

0

@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?

0
  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();
  }
0

@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);
}
0

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

0

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ż.

0

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);
}
}

  
0

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)

0

@abrakadaber: Wyskakuje błąd (załącznik), próbowałem jakoś to poprzestawiać ale dalej to samo

0

@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.

0

pierwsze i trzecie. Natomiast drugiego nie rozumiem - najlepiej narysuj coś takiego :P
aaa.png
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);
}
0

@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?

0

czyli we wszystkich czterech przypadkach ma być taki sam efekt?

0

@abrakadaber: Tak i żeby w trakcie gdy on wystąpi sekunda przechodząc przez niego dawała taki sam kolor 255, 0, 255

1 użytkowników online, w tym zalogowanych: 0, gości: 1