Arduino Polska Forum

Pełna wersja: Modyfikacja programu
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
Witajcie.
Jako mało a nawet bardzo mało doświadczony w Arduino chciałby się spytać fachowców czy jest możliwe zmodyfikowanie programu i dołożenie dwóch wyświetlaczy. Od początku, jestem członkiem klubu rowerowego, w którym czasem urządzamy wyścigi. Jako, że wszystko jest na poziomie amatorskim więc nie ma kasy na takie bajery jak duże zegary led odmierzające czas. To sporo kosztuje. Znalazłem projekt na YT  https://www.youtube.com/watch?v=QDYH36tWzoY. Zrobiłem go i jest fajny. Na krótkie wyścigi wystarczy ale mamy tez takie po 12-16 godzin i tu problem. Zegar liczy do 99 minut potem staje. Można "dołożyć" dwa wyświetlacze, żeby zwiększyć zakres mierzonego czasu? Bedę a właściwie będziemy bardzo wdzięczni za wszelką pomoc.
P.S.
Chciałem dołączyć plik programu ale się nie udało. Link do programu https://github.com/leonvandenbeukel/3D-7...ital-Clock
Trzeba zmodyfikować funkcje refreshTimer(), oraz displaySegments().
(29-03-2021, 10:05)Robson Kerman napisał(a): [ -> ]Trzeba zmodyfikować funkcje refreshTimer(), oraz displaySegments().
Dzięki za podpowiedź. Zmodyfikowałem jak napisałeś i "ożyły" mi dodatkowe segmenty i to tyle sukcesów. Przed modyfikacją wygląda tak
void refreshTimer() {

  if (mode == 0 && blinkDots == 1) {   
    displayDots(3);
  } else if (mode == 4 && timerRunning == 1 && timerValue < 6000) {
    timerValue++;
    int m1 = (timerValue / 60) / 10 ;
    int m2 = (timerValue / 60) % 10 ;
    int s1 = (timerValue % 60) / 10;
    int s2 = (timerValue % 60) % 10;
 
    displaySegments(0, s2);
    displaySegments(7, s1);
    displaySegments(16, m2);   
    displaySegments(23, m1);
    displayDots(0); 
    FastLED.show();
Po zmianie :
void refreshTimer() {

  if (mode == 0 && blinkDots == 1) {   
    displayDots(3);
  } else if (mode == 4 && timerRunning == 1 && timerValue < 6000) {
    timerValue++;
    int h1 = (timerValue % 60) / 10;
    int h2 = (timerValue % 60) % 10;
    int m1 = (timerValue / 60) / 10 ;
    int m2 = (timerValue / 60) % 10 ;
    int s1 = (timerValue % 60) / 10;
    int s2 = (timerValue % 60) % 10;
 
    displaySegments(0, s2);
    displaySegments(7, s1);
    displaySegments(16, m2);   
    displaySegments(23, m1);
    displaySegments(30, h2);   
    displaySegments(37, h1); 
    displayDots(0); 
    FastLED.show();

Efekt jest taki, że nie odlicza mi godzin tylko dubluje minuty. Coś podpowiecie? Dzięki.
A mi się wydaje że dubluje sekundy bo tak po kodzie widać...

int h1 = (timerValue % 60) / 10;
int h2 = (timerValue % 60) % 10;
int m1 = (timerValue / 60) / 10 ;
int m2 = (timerValue / 60) % 10 ;
int s1 = (timerValue % 60) / 10;
int s2 = (timerValue % 60) % 10;

Tu trzeba zmienić

int h1 =( timerValue / 3600) /10;
int h2 = (timerValue / 3600) % 10;
int m1 = (timerValue / 60) / 10 ;
int m2 = (timerValue / 60) % 10 ;
int s1 = (timerValue % 60) / 10;
int s2 = (timerValue % 60) % 10;

Czy jakoś tak bo z pamięci robię...
(31-03-2021, 23:24)Domino67 napisał(a): [ -> ]
(29-03-2021, 10:05)Robson Kerman napisał(a): [ -> ]Trzeba zmodyfikować funkcje refreshTimer(), oraz displaySegments().
Dzięki za podpowiedź. Zmodyfikowałem jak napisałeś i "ożyły" mi dodatkowe segmenty i to tyle sukcesów. Przed modyfikacją wygląda tak
void refreshTimer() {

  if (mode == 0 && blinkDots == 1) {   
    displayDots(3);
  } else if (mode == 4 && timerRunning == 1 && timerValue < 6000) {
    timerValue++;
    int m1 = (timerValue / 60) / 10 ;
    int m2 = (timerValue / 60) % 10 ;
    int s1 = (timerValue % 60) / 10;
    int s2 = (timerValue % 60) % 10;
 
    displaySegments(0, s2);
    displaySegments(7, s1);
    displaySegments(16, m2);   
    displaySegments(23, m1);
    displayDots(0); 
    FastLED.show();
Po zmianie :
void refreshTimer() {

  if (mode == 0 && blinkDots == 1) {   
    displayDots(3);
  } else if (mode == 4 && timerRunning == 1 && timerValue < 6000) {
    timerValue++;
    int h1 = (timerValue % 60) / 10;
    int h2 = (timerValue % 60) % 10;
    int m1 = (timerValue / 60) / 10 ;
    int m2 = (timerValue / 60) % 10 ;
    int s1 = (timerValue % 60) / 10;
    int s2 = (timerValue % 60) % 10;
 
    displaySegments(0, s2);
    displaySegments(7, s1);
    displaySegments(16, m2);   
    displaySegments(23, m1);
    displaySegments(30, h2);   
    displaySegments(37, h1); 
    displayDots(0); 
    FastLED.show();

Efekt jest taki, że nie odlicza mi godzin tylko dubluje minuty. Coś podpowiecie? Dzięki.
Chyba się poddam do czasu gdy lepiej poznam Arduino. Kombinuję jak koń pod górę i cały czas ten sam efekt. Sekundy się zerują a minuty po odliczeniu 60 minut odliczają dalej do 99 minut. Jedynie zaczęły mi się liczyć godziny. Zmieniłem wartość TimeValue<86400 tak by liczył dobę oraz tak jak radził kolega h1 i h2 3600. Gdy ostatnio na trenażerze wpakowałem się w Alpy cieszyłem się z niewiedzy teraz niewiedza raczej przeszkadza Smile
Chyba się poddam do czasu gdy lepiej poznam Arduino. Kombinuję jak koń pod górę i cały czas ten sam efekt. Sekundy się zerują a minuty po odliczeniu 60 minut odliczają dalej do 99 minut. Jedynie zaczęły mi się liczyć godziny. Zmieniłem wartość TimeValue<86400 tak by liczył dobę oraz tak jak radził kolega h1 i h2 3600. Gdy ostatnio na trenażerze wpakowałem się w Alpy cieszyłem się z niewiedzy teraz niewiedza raczej przeszkadza Smile
Wstaw tak i powinno cykać do 60min, nie dałeś dzielenie reszty z godziny wiec int m1 = (timerValue / 60) / 10 ; zwracało pełne minuty czyli doba ma 1440min

int h1 =( timerValue / 3600) /10;
int h2 = (timerValue / 3600) % 10;
int m1 = ((timerValue %3600)/ 60) / 10 ;
int m2 = ((timerValue %3600)/ 60) % 10 ;
int s1 = (timerValue % 60) / 10;
int s2 = (timerValue % 60) % 10;
Jarewa0606 jesteś Wielki. Zegar ruszył. chodzi od 6 godzin i jest O.K. Zdążę go jeszcze zrobić 17.04 mamy klubowe zawody kolarskie i się przyda. Mam jeszcze pytanie sprzętowe. Zauważyłem, że program pracuje stabilnie jeśli prócz zasilania na VIN podłączę normalnie przez USB. Mam 46 diody adresowalne i zastanawiam się czy nie zasilić ich oddzielnie a tylko DIN podłączyć do Arduino. I zasilić Ardiuino przez USB dla stabilności. Mam jeszcze dwie sztuki arduino nano w zapasie jak coś się stanie z tym przez to doświadczenie. Jeszcze raz dzięki Jarewa0606.
Najlepiej zasilać osobno bo diody przekraczają prąd stabilizatora w ardunio..... Tylko pamiętaj że prąd pierw na diody potem na ardunio nie inna kolejność bo szyna DIN nie może być wyższa od VCC wtedy pali pierwszy kontroler ws...