logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Tworzenie zegara Nixie na Arduino Uno z użyciem expanderów PCF8574 i modułu RTC DS1307

kartynal 06 Lut 2021 21:13 891 6
REKLAMA
  • #1 19238490
    kartynal
    Poziom 6  
    Posty: 11
    Witam, mam mały problem...od jakiegoś czasu pracuje nad zegarem nixie i wszystko szło łatwo, aż do momentu pisania kodu.Szukam pomocy w postaci podpowiedzi, gotowych rozwiązań, pomocnych linków. Każda pomoc mile widziana. Kilka szczegółów dotyczących budowy;
    Zegar jest oparty na płytce arduino uno. Ze względu na małą ilość pinów na arduino użyłem dwóch expanderów pcf8574. Na pierwszym expanderze wszystkie 8 pinów zajmują katody wyswietlacza a na drugim expanderze 2 piny stanowią pozostałe kadody i 4 piny anody wyświetlacza, dodam tylko że całość ma być multipleksowania. Do odmierzania czasu używam modułu rtc DS1307. W przyszłości zamierzam dodać kilka przycisków, ale nie wiem czy to jest istotne w tym momencie. W każdym bądź razie prosiłbym o nakierowanie bo stoję w miejscu. Jutro postaram się wrzucić zdjęcia:)
  • REKLAMA
  • #2 19238675
    varaktor
    Poziom 18  
    Posty: 218
    Pomógł: 28
    Ocena: 145
    W obsłudze timera (TIMER0_COMPA_vect) zrób wyświetlanie odpowiedniej cyfry. Wcześniej trzeba zdjąć bity maskujące. Ja w moim zegarze nixie mam rtc ds3231 i tam co sekundę sygnał 1 Hz wyzwala przerwanie w którym zmieniana jest flaga sygnalizująca że należy odczytać akualny czas i uaktualnić wartości wyświetlane na lampach.
  • REKLAMA
  • #3 19238812
    kartynal
    Poziom 6  
    Posty: 11
    mógłbym prosić kawałek kodu odpowiadający za wyświetlenie odpowiedniej cyfry zgodnie z aktualnym czasem i o wyzwalanie przerwań?. Niestety biegły w programowaniu nie jestem
  • REKLAMA
  • #4 19238920
    Konto nie istnieje
    Poziom 1  
  • #5 19239382
    varaktor
    Poziom 18  
    Posty: 218
    Pomógł: 28
    Ocena: 145
    kartynal napisał:
    mógłbym prosić kawałek kodu odpowiadający za wyświetlenie odpowiedniej cyfry zgodnie z aktualnym czasem i o wyzwalanie przerwań?. Niestety biegły w programowaniu nie jestem


    Tylko musiesz się nauczyć co to robi, kopiowanie na pałę bez zrozumienia nic Ci nie da.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #6 19256387
    kartynal
    Poziom 6  
    Posty: 11
    W końcu się udało:)przynajmniej dla mnie....,ale mimo to jestem otwarty na dalszą edycję kodu.Więc tak - wywaliłem jeden expander i wpiąłem
    wszystkie katody w piny D2-D11 na płytce arduino nano, 2 piny w nano zajęły mi przyciski oraz 2 piny(sda i scl) - DS1307 i expander w którym są zamontowane wszystkie anody. Całość później będzie przeniesiona na płytke pcb oraz obudowana.
    Tworzenie zegara Nixie na Arduino Uno z użyciem expanderów PCF8574 i modułu RTC DS1307 Tworzenie zegara Nixie na Arduino Uno z użyciem expanderów PCF8574 i modułu RTC DS1307 Tworzenie zegara Nixie na Arduino Uno z użyciem expanderów PCF8574 i modułu RTC DS1307

    Tworzenie zegara Nixie na Arduino Uno z użyciem expanderów PCF8574 i modułu RTC DS1307


    Później postaram się wrzucić kilka zdjęć z budowy.

    Dodano po 1 [minuty]:

    KOD:

    #include <Arduino.h>
    #include <Wire.h>
    #include <DS1307.h>
    #include <PCF8574.h>


    PCF8574 pcf20(0x20);
    DS1307 clock;
    RTCDateTime dt;

    int j;
    int k;
    int zmienna1 = 0;
    int zmienna2 = 0;
    int mode_counter = 0;
    int godziny = 0;
    int minuty = 0 ;
    int mode = 0;
    int blink = 0;


    bool min = false;
    bool hr = false;
    bool i = true;
    bool y = false;
    bool up;
    bool down;
    bool prog;
    bool first;
    bool second;

    unsigned long zapamietanyCzas = 0;
    unsigned long aktualnyCzas = 0;

    const int q = 14;
    const int w = 15;
    const int e = 17;
    const int nixie_0 = 2;
    const int nixie_1 = 3;
    const int nixie_2 = 4;
    const int nixie_3 = 5;
    const int nixie_4 = 6;
    const int nixie_5 = 7;
    const int nixie_6 = 8;
    const int nixie_7 = 9;
    const int nixie_8 = 10;
    const int nixie_9 = 11;
    const int time_on = 2;



    void setup() {

    Wire.begin();

    pcf20.begin(OUTPUT);

    pinMode(e, INPUT_PULLUP);
    pinMode(nixie_0, OUTPUT);
    pinMode(nixie_1, OUTPUT);
    pinMode(nixie_2, OUTPUT);
    pinMode(nixie_3, OUTPUT);
    pinMode(nixie_4, OUTPUT);
    pinMode(nixie_5, OUTPUT);
    pinMode(nixie_6, OUTPUT);
    pinMode(nixie_7, OUTPUT);
    pinMode(nixie_8, OUTPUT);
    pinMode(nixie_9, OUTPUT);
    pinMode(w, INPUT_PULLUP);
    pinMode(q, INPUT_PULLUP);


    clock.begin();

    }

    void on_number(int row, int nixie){
    pcf20.write(row, HIGH);
    digitalWrite(nixie, HIGH);
    }


    void off_all(){
    pcf20.write(0, LOW);
    pcf20.write(1, LOW);
    pcf20.write(2, LOW);
    pcf20.write(3, LOW);
    digitalWrite(nixie_0, LOW);
    digitalWrite(nixie_1, LOW);
    digitalWrite(nixie_2, LOW);
    digitalWrite(nixie_3, LOW);
    digitalWrite(nixie_4, LOW);
    digitalWrite(nixie_5, LOW);
    digitalWrite(nixie_6, LOW);
    digitalWrite(nixie_7, LOW);
    digitalWrite(nixie_8, LOW);
    digitalWrite(nixie_9, LOW);


    }

    void loop()
    {
    dt = clock.getDateTime();

    if(i == true || y == true)
    {

    clock.setDateTime(2014, 4, 13, godziny, minuty , 00);
    i = false;
    y = false;
    mode = 0;
    }
    if(min==false)
    {

    j = dt.minute/10;
    k = dt.minute%10;
    off_all();
    on_number(3,k+2);
    delay(time_on);

    off_all();
    on_number(2,j+2);
    delay(time_on);
    }
    else{
    if(blink < 8 && first == true){
    off_all();
    delay(time_on);
    blink++;
    }
    else{
    j = minuty/10;
    k = minuty%10;
    off_all();
    on_number(3,k+2);
    delay(time_on);

    off_all();
    on_number(2,j+2);
    delay(time_on);
    if (blink < 16) blink++;
    else blink = 0;
    }
    }

    if(hr ==false)
    {

    j = dt.hour/10;
    k = dt.hour%10;
    off_all();
    on_number(1,k+2);
    delay(time_on);

    off_all();
    on_number(0,j+2);
    delay(time_on);
    }

    else{
    if(blink < 8 && second == true){
    off_all();
    delay(time_on);
    blink++;
    }
    else{
    j = godziny/10;
    k = godziny%10;

    off_all();
    on_number(1,k+2);
    delay(time_on);

    off_all();
    on_number(0,j+2);
    delay(time_on);
    }
    }

    up = digitalRead(q);
    down = digitalRead(w);
    prog = digitalRead(e);

    if(up == 0 && down == 0 && mode == 0)
    {
    mode = 1;

    }

    if(mode==1){
    if (mode_counter < 200){
    mode_counter++;
    }
    else{
    mode_counter=0;
    mode=2;
    }
    min= true;
    hr = false;
    first = true;
    second = false;
    }

    if(mode==2){
    if (mode_counter < 200){
    mode_counter++;
    }
    else{
    mode_counter=0;
    mode=3;
    }
    min = true;
    hr = true;
    first = false;
    second = true;
    }

    if(mode==3){
    min = false;
    hr = false;
    y = true;
    first = false;
    second = false;
    }

    if(up == 0 && mode == 1)
    {
    aktualnyCzas = millis();
    if (aktualnyCzas - zapamietanyCzas >= 200UL) {
    zapamietanyCzas = aktualnyCzas;
    zmienna1++;
    }
    mode_counter = 0;
    if(zmienna1 > 59){ zmienna1 = 0;}
    minuty = zmienna1;
    }

    if(down == 0 && mode == 1)
    {
    aktualnyCzas = millis();
    if (aktualnyCzas - zapamietanyCzas >= 200UL) {
    zapamietanyCzas = aktualnyCzas;
    zmienna1--;
    }
    mode_counter = 0;
    if(zmienna1 < 0){ zmienna1 = 59;}
    minuty = zmienna1;
    }

    if(up == 0 && mode ==2)
    {
    aktualnyCzas = millis();
    if (aktualnyCzas - zapamietanyCzas >= 200UL) {
    zapamietanyCzas = aktualnyCzas;
    zmienna2++;
    }
    mode_counter = 0;
    if(zmienna2 > 24){ zmienna2 = 0;}
    godziny= zmienna2;
    }

    if(down == 0 && mode == 2)
    {

    aktualnyCzas = millis();
    if (aktualnyCzas - zapamietanyCzas >= 200UL) {
    zapamietanyCzas = aktualnyCzas;
    zmienna2--;
    }
    mode_counter = 0;
    if(zmienna2 < 0){ zmienna2 = 24;}
    godziny = zmienna2;
    }

    }
  • #7 21511550
    kartynal
    Poziom 6  
    Posty: 11
    Wrzucam fotki, jak obiecałem! Z samą obudową męczyłem się dobre dwa dni, ale myślę, że warto było. Końcowy efekt wydaje się być całkiem zadowalający.
    Ręcznie wykonany zegar z Nixie, wyświetlający godzinę 16:24.
    Metalowa obudowa z wycięciami, zieloną diodą LED i kablami nałożona na drewnianym blacie.

Podsumowanie tematu

✨ Dyskusja dotyczy budowy zegara Nixie opartego na płytce Arduino Uno (oraz Arduino Nano w późniejszym etapie) z wykorzystaniem ekspanderów portów PCF8574 do sterowania katodami i anodami wyświetlaczy oraz modułu RTC DS1307 do odmierzania czasu. Ze względu na ograniczoną liczbę pinów Arduino zastosowano dwa ekspandery PCF8574 – jeden do katod, drugi do anod i pozostałych katod, z planowanym multipleksowaniem wyświetlacza. Wskazano potrzebę obsługi przerwań timerowych do wyświetlania cyfr oraz synchronizacji z modułem RTC. Zaproponowano przykładowe fragmenty kodu i linki do projektów z podobnym zastosowaniem, w tym wykorzystanie RTC DS3231 jako alternatywy. Autor podzielił się własnym kodem i zdjęciami z realizacji, gdzie zmodyfikował układ, eliminując jeden ekspander i podłączając katody bezpośrednio do pinów Arduino Nano, a anody do ekspandera PCF8574. Wskazano na konieczność zrozumienia działania kodu, a nie tylko kopiowania. Ostatecznie autor pokazał zdjęcia gotowego projektu wraz z obudową, podkreślając satysfakcję z efektu końcowego.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA