Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
TermopastyTermopasty
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Duży zegar 7-segmentowy na diodach programowalnych WS2811

kmmepl 06 Dec 2015 14:27 17349 15
  • Duży zegar 7-segmentowy na diodach programowalnych WS2811 Dzisiejszy artykuł opisuje budowę zegara wykonanego na diodach RGB. Projekt wyróżnia się tym, że posiada:

    • duże wymiary cyfr (każda jest wielkości kartki A4)
    • niewielką grubość, co umożliwia zamontowanie go w ramie na obraz
    • zdolność do automatycznego przyciemniania w zależności od światła panującego w pokoju

    Użyte elementy

    Do zbudowania opisywanego urządzenia wykorzystano następujące części:

    Elektronika:

    1. Klon Arduino nano V3.0 (2.9$).
    2. Cyfrowy moduł z fotorezystorem (0.99$).
    3. Zegar czasu rzeczywistego DS3231 AT24C32 (0.99$).
    4. Przetwornica DC-DC Step Down oparta na LM2596 (0.90$).
    5. 4-metrowe paski diod WS2811 30 LED/m (12$).

    Duży zegar 7-segmentowy na diodach programowalnych WS2811 Duży zegar 7-segmentowy na diodach programowalnych WS2811 Duży zegar 7-segmentowy na diodach programowalnych WS2811


    Dodatkowe rzeczy:

    1. Rurki termokurczliwe – 33m (7.99$)
    2. 20 Płytek prototypowych 5 x 7 cm (3$)
    3. 3 Mikroprzełączniki (1$)
    4. Cyna (1$)
    5. Topnik (1$)
    6. Kabel UTP
    7. Tektura
    8. Płytka polistyrenowa (1.50$)

    Duży zegar 7-segmentowy na diodach programowalnych WS2811 Duży zegar 7-segmentowy na diodach programowalnych WS2811 Duży zegar 7-segmentowy na diodach programowalnych WS2811


    Przygotowanie szablonów

    Do zrobienia szablonów posłużono się stroną z gotowymi wzorami cyfr. Następnie dostosowano je do własnych potrzeb, a na końcu wydrukowano i wycięto.

    Duży zegar 7-segmentowy na diodach programowalnych WS2811 Duży zegar 7-segmentowy na diodach programowalnych WS2811


    Wycinanie tektury i pasków ledowych

    Przy użyciu wcześniej wydrukowanych szablonów, przycięto tekturę na wymiar. Potem odlutowano konektory z pasków ledowych i pocięto je na zestawy składające się z 3 diod.

    Duży zegar 7-segmentowy na diodach programowalnych WS2811


    Montaż pasków ledowych

    W celu zamontowania diod, odrysowano ich kontury i upewniono się, że wszystkie będą ułożone w równych odstępach. Zabieg ten bardzo pomógł w polepszeniu ostatecznego wyglądu.

    Duży zegar 7-segmentowy na diodach programowalnych WS2811 Duży zegar 7-segmentowy na diodach programowalnych WS2811


    Lutowanie diod

    W celu zachowania przejrzystości w kablach, zachowano następujące kolory:

    • Niebieski dla masy
    • Zielony do danych
    • Pomarańczowy dla 12V

    Do oddzielenia godzin i minut użyto jednego paska ledowego i zaklejono środkową diodę.

    Duży zegar 7-segmentowy na diodach programowalnych WS2811 Duży zegar 7-segmentowy na diodach programowalnych WS2811

    Połączenie modułów i test

    Wszystkie elementy podłączono jak wskazuje poniższa tabela, niestety schematu nie ma, gdyż autor nie posiada umiejętności rysowania schematów. Po wgraniu testowego kodu (zamieszczonego na końcu tego artykułu) do Arduino i załadowaniu biblioteki o nazwie FASTLED, diody powinny świecić jednym z kolorów, a następnie cyklicznie zmieniać barwę świecenia.

    Duży zegar 7-segmentowy na diodach programowalnych WS2811 Duży zegar 7-segmentowy na diodach programowalnych WS2811

    Programowanie zegara

    Autor samodzielnie napisał program obsługujący wszystkie moduły. Na pochwałę zasługuje fakt, iż zamieszczono w nim wiele komentarzy, co ułatwia zrozumienie kodu. Do zmiany koloru świecenia diod wystarczy zmiana jednej wartości zmiennej w 22 linijce.

    Duży zegar 7-segmentowy na diodach programowalnych WS2811Duży zegar 7-segmentowy na diodach programowalnych WS2811


    Formy polistyrenowe

    Do wykonania form można użyć skalpela, jednak tutaj użyto wycinarki do styropianu. Jest możliwe kupno takiej wycinarki, choć zrobienie jej nie jest bardzo skomplikowane. Autor do wycinania użył zasilacza 12V i struny gitarowej.

    Duży zegar 7-segmentowy na diodach programowalnych WS2811 Duży zegar 7-segmentowy na diodach programowalnych WS2811


    Poniżej znajduje się wideoporadnik, jak wykonać taką wycinarkę.

    Spoiler:


    Końcowe klejenie cyfr i dodanie filtru

    Po wycięciu styropianowych form, przyklejono je do tektury wraz z paskami diodowymi za pomocą taśmy dwustronnej. Do rozproszenia światła wykorzystano kartkę papieru formatu A2 zgiętą na pół. Na końcu całą konstrukcję umieszczono w ramce na obraz.

    Duży zegar 7-segmentowy na diodach programowalnych WS2811 Duży zegar 7-segmentowy na diodach programowalnych WS2811


    Jak widać na powyższym zdjęciu, wielkość tego zegara dorównuje wymiarom obrazu znajdującego się obok. Czy zatem w waszym odczuciu, konstrukcja ta polepsza walory estetyczne pokoju, czy może całe urządzenie za bardzo rzuca się w oczy?

    źródło: http://www.instructables.com/id/Big-auto-dim-room-clock-using-arduino-and-WS2811/?ALLSTEPS

    Cool! Ranking DIY
    Can you write similar article? Send message to me and you will get SD card 64GB.
    About Author
    kmmepl
    Level 12  
    Offline 
    kmmepl wrote 73 posts with rating 310, helped 7 times. Been with us since 2013 year.
  • TermopastyTermopasty
  • #3
    sim_
    Level 18  
    Witam. Coś lepszego z dokładnym opisem na forum Atnel Link . Pozdrawiam Janek
  • TermopastyTermopasty
  • #4
    Freddy
    Level 43  
    sim_ wrote:
    Witam. Coś lepszego z dokładnym opisem na forum Atnel Link . Pozdrawiam Janek
    To jest DIY zagranica, dokładniejsze opisy są pod podanym linkiem.
  • #5
    mick
    Level 15  
    Gdybym wiedział wcześniej, że są takie ledy!

    Zrobiłem zegar i każda cyfra sterowana jest z PCF8574, wyszło tak, że jest mnóstwo przewodów i ogólnie pajęczyna, na razie działa. Jednak zrobienie zegara na takich taśmach to ułamek roboty, którą ja włożyłem :|

    oloelektro wrote:
    mam pytanie jak ten zegar wygląda w świetle dziennym widoczne to jest ?

    Wszystko zależy co masz na myśli przez światło dzienne, bo w mocnym słońcu to nawet sygnalizacja świetlna na skrzyżowaniu jest słabo widoczna.
    Pewnie w pokoju wieczorem trzeba mocno ściemniać, żeby nie raziło.

    Zegar, który zrobiłem z taśmy led (120 czerownych led na metr) wieczorem wystarczy pwm ustawić na ok 15% i jest wystarczająco jasny.


    Gostek pisze, że kupił 4m taśmy na aliexpress za 12 $, ja widzę , że ceny są jednak trochę wyższe ok. 6$ za metr co najmniej.
  • #6
    Malano
    Level 6  
    ten zegar normalnie działa jak zwykły zegar ?"
  • #7
    HD-VIDEO
    Level 40  
    Działa jak normalny zegar a ale z uwagi na typ zastosowanych diod są bardzo duża możliwość (po zmodyfikowaniu kodu) różnego prezentowania czasu; zmiany kolorów, każda cyfra inny kolor, płynięcia kolorów, itd.
  • #8
    TKUCZ
    Level 11  
    witam
    zmontowałem ten zegar ,załadowałem program do Nano . ok led WS2812B działa ,że jest 22:38 a na "zagarze" 20.H0.
    RTC DS1307.??? Może ktoś ruszyć ten zegar.? na ds1307?
  • #10
    TKUCZ
    Level 11  
    Duży zegar 7-segmentowy na diodach programowalnych WS2811
    Jak na załączonym obrazku czas RTC działa poprawnie . Nie mam pojęcia czemu w tym zegarze jest d..pa. OK poprawiłem wyświetlanie cyfr . I od 2 dni męczę by pokazał aktualną godzinę.



    Zmieniłem RTC i wszystko działa ... z PIERWSZEGO
  • #11
    TKUCZ
    Level 11  
    zastanawiam się czy ktoś modernizował projekt oryginalny z dodaniem pomiarów przez bluetooh . Dodanie stacji meteo do zegara ?
  • #12
    TKUCZ
    Level 11  
    witam
    potrzebuję małej pomocy w dopisaniu paru linijek ;) .
    Do sedna zegar z ds18b20 wyświetla temperaturę , problem w tym że w 1 kolorze. potrzebuję wyświetlić temp. ujemną na niebiesko a temp. dodatnią naa czerwoną .
    Code:
    if (i==1){
    
          Serial.print("Digit 4 is : ");
          Serial.print(digit);
          Serial.print(" ");
       cursor = 44;  // 4 digit begins
          for(int k=0; k<=13;k++){
            Serial.print(digits[11][k]);
            if (digits[11][k]== 1){leds[cursor]=ledColor;}
             else if (digits[11][k]==0){leds[cursor]=0x000000;};
             cursor ++;
            };
          Serial.println();
        }
    //////////////////////////// 3 digit control:
        else if (i==2){
          Serial.print("Digit 3 is : ");
          Serial.print(digit);
          Serial.print(" ");
       cursor =30;  // 3 digit begins
          for(int k=0; k<=13;k++){
            Serial.print(digits[10][k]);
            if (digits[10][k]== 1){leds[cursor]=ledColor;}
            else if (digits[10][k]==0){leds[cursor]=0x000000;};
             cursor ++;
            };
          Serial.println();
          }
     //////////////////////////// 2 digit control: 
        else if (i==3){
          int digit = abs(celsius % 10);  // taking only module (only temperature value without minus sign)
          Serial.print("Digit 2 is : ");
          Serial.print(digit);
          Serial.print(" ");
         
       cursor =14;  // 2 digit begins
         
          for(int k=0; k<=13;k++){
            Serial.print(digits[digit][k]);
            if (digits[digit][k]== 1){leds[cursor]=ledColor;}
             else if (digits[digit][k]==0){leds[cursor]=0x000000;};
             cursor ++;
            };
          Serial.println();
          }
     //////////////////////////// 1 digit control:
        else if (i==4){
          int digit = abs(celsius / 10);  // taking only module (only temperature value without minus sign)
          Serial.print("Digit 1 is : ");
          Serial.print(digit);
          Serial.print(" ");
       cursor =0;  // 1 digit begins
           for(int k=0; k<=13;k++){
          //Serial.print(digits[digit][k]);
           
                  if (digits[digit][k]==1){leds[cursor]=ledColor;}
             else if (digits[digit][k]==0){leds[cursor]=0x000000;};
             cursor ++;
            };
          Serial.println();
          }
  • #13
    robarco
    Level 10  
    Było by super z ujemnymi temperaturami.
    Ja starałem sie żeby ktoś wstawił dodatkowo wyświetlanie wilgotności lecz bez powodzenia.

    Pozdrawiam.

    Na marginesie zegar działa OK nawet w słonecznym miejscu.
    Mój ma drukowane obudowy segmentów PLA 180mm wysokości
    i dyfuzor biały plexy glass 1mm
    Do obudowy wykorzystałem ramkę do obrazków z Ikea
    Pozdrowienia...
  • #14
    kamilek2207
    Level 9  
    Witam, mam pytanie czy ktoś robił w podobny sposób matrix led ws2811 z arduino ?
  • #16
    supsak
    Level 10  
    Czesc chlopaki.
    Mam takego zegara jak s projektu v pervym postze.
    Na paskach WS2812 z 3-mi diodami na jeden segment .
    Vsiczko dzala , zegar pokazuje OK.Color zegara czervony, brigdness 25 procent.
    Zegar jest poskladany jak na schematu i podpjente moduly RTC -czasu do arduino-nano, /light senzor nejest podpjenty/.
    vsad do arduinonano

    #include <DS3232RTC.h>
    #include <Time.h>
    #include <Wire.h>
    #include "FastLED.h"
    #define NUM_LEDS 29 // Number of LED controles (remember I have 3 leds / controler
    #define COLOR_ORDER RBG // Define color order for your strip
    #define DATA_PIN 6 // Data pin for led comunication

    CRGB leds[NUM_LEDS]; // Define LEDs strip
    byte digits[10][7] = {{0,1,1,1,1,1,1}, // Digit 0
    {0,1,0,0,0,0,1}, // Digit 1
    {1,1,1,0,1,1,0}, // Digit 2
    {1,1,1,0,0,1,1}, // Digit 3
    {1,1,0,1,0,0,1}, // Digit 4
    {1,0,1,1,0,1,1}, // Digit 5
    {1,0,1,1,1,1,1}, // Digit 6
    {0,1,1,0,0,0,1}, // Digit 7
    {1,1,1,1,1,1,1}, // Digit 8
    {1,1,1,1,0,1,1}}; // Digit 9 | 2D Array for numbers on 7 segment
    bool Dot = true; //Dot state
    bool DST = false; //DST state
    int ledColor = 0x00FF; // Farba v HEX k├│de
    void setup(){
    // Serial.begin(9600);
    // Wire.begin();
    LEDS.addLeds<WS2812B, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS); // Set LED strip type
    LEDS.setBrightness(25); // nastavenie jasu 1-255
    pinMode(2, INPUT_PULLUP); // Define DST adjust button pin
    pinMode(4, INPUT_PULLUP); // Define Minutes adjust button pin
    pinMode(5, INPUT_PULLUP); // Define Hours adjust button pin
    }
    // Get time in a single number, if hours will be a single digit then time will be displayed 155 instead of 0155
    int GetTime(){
    tmElements_t Now;
    RTC.read(Now);
    //time_t Now = RTC.Now();// Getting the current Time and storing it into a DateTime object
    int hour=Now.Hour;
    int minutes=Now.Minute;
    int second =Now.Second;
    if (second % 2==0) {Dot = false;}
    else {Dot = true;};
    return (hour*100+minutes);
    };


    // Convert time to array needet for display
    void TimeToArray(){
    int Now = GetTime(); // Get time
    int cursor = 29;

    // Serial.print("Time is: ");Serial.println(Now);
    if (DST){ // if DST is true then add one hour
    Now+=100;
    // Serial.print("DST is ON, time set to : ");Serial.println(Now);
    };
    if (Dot){leds[14]=ledColor;}
    else {leds[14]=0x000000;
    };
    for(int i=1;i<=4;i++){
    int digit = Now % 10; // get last digit in time
    if (i==1){
    // Serial.print("Digit 4 is : ");Serial.print(digit);Serial.print(" ");
    cursor =22;
    for(int k=0; k<=6;k++){
    // Serial.print(digits[digit][k]);
    if (digits[digit][k]== 1){leds[cursor]=ledColor;}
    else if (digits[digit][k]==0){leds[cursor]=0x000000;};
    cursor ++;
    };
    // Serial.println();
    }
    else if (i==2){
    // Serial.print("Digit 3 is : ");Serial.print(digit);Serial.print(" ");
    cursor -=14;
    for(int k=0; k<=6;k++){
    // Serial.print(digits[digit][k]);
    if (digits[digit][k]== 1){leds[cursor]=ledColor;}
    else if (digits[digit][k]==0){leds[cursor]=0x000000;};
    cursor ++;
    };
    // Serial.println();
    }
    else if (i==3){
    // Serial.print("Digit 2 is : ");Serial.print(digit);Serial.print(" ");
    cursor =7;
    for(int k=0; k<=6;k++){
    // Serial.print(digits[digit][k]);
    if (digits[digit][k]== 1){leds[cursor]=ledColor;}
    else if (digits[digit][k]==0){leds[cursor]=0x000000;};
    cursor ++;
    };
    // Serial.println();
    }
    else if (i==4){
    // Serial.print("Digit1 is : ");Serial.print(digit);Serial.print(" ");
    cursor =0;
    for(int k=0; k<=6;k++){
    // Serial.print(digits[digit][k]);
    if (digits[digit][k]== 1){leds[cursor]=ledColor;}
    else if (digits[digit][k]==0){leds[cursor]=0x000000;};
    cursor ++;
    };
    // Serial.println();
    }
    Now /= 10;
    };
    };
    void DSTcheck(){
    int buttonDST = digitalRead(2);
    // Serial.print("DST is: ");Serial.println(DST);
    if (buttonDST == LOW){
    if (DST){
    DST=false;
    // Serial.print("Switching DST to: ");Serial.println(DST);
    }
    else if (!DST){
    DST=true;
    // Serial.print("Switching DST to: ");Serial.println(DST);
    };
    delay(500);
    };
    }

    void TimeAdjust(){
    int buttonH = digitalRead(5);
    int buttonM = digitalRead(4);
    if (buttonH == LOW || buttonM == LOW){
    delay(500);
    tmElements_t Now;
    RTC.read(Now);
    int hour=Now.Hour;
    int minutes=Now.Minute;
    int second =Now.Second;
    if (buttonH == LOW){
    if (Now.Hour== 23){Now.Hour=0;}
    else {Now.Hour += 1;};
    }else {
    if (Now.Minute== 59){Now.Minute=0;}
    else {Now.Minute += 1;};
    };
    RTC.write(Now);
    }
    }
    void loop() // Main loop
    {
    DSTcheck(); // Check DST
    TimeAdjust(); // Check to se if time is geting modified
    TimeToArray(); // Get leds array with required configuration
    FastLED.show(); // Display leds array
    }


    potrzeboval bym jak do tego podepnucz czujnika temperatury Dallas 18B20/pod kture piny/ i jak dopisacz ze by sze zmenno pokazyvala temperatura i zegar..v intervale
    zegar 30 sekund i 10 sekund pokazyvala temperatura ,potem temperatura migala v intervale 2 sek pokazuje 1 sekundze nepokazuje /5 raz/.
    Potem zeby zegar sze vylonczyl i nicz nepokazoval 1 minute .
    Potem ze by sze vlonczil zasz na 30 sekund zegar...10 sek temoeretura i tak dookola..
    Dzenkuje za pomoc