• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Modyfikacja programu
#1
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
 
Odpowiedź
#2
Trzeba zmodyfikować funkcje refreshTimer(), oraz displaySegments().
Jeśli masz problem z kodem lub sprzętem, zadaj pytanie na forum. Nie odpowiadam na PW, jeśli nie dotyczą one spraw forum lub innych tematów prywatnych.

[Obrazek: SsIndaG.jpg]
 
Odpowiedź
#3
(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.
 
Odpowiedź
#4
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ę...
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#5
(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
 
Odpowiedź
#6
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
 
Odpowiedź
#7
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;
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#8
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.
 
Odpowiedź
#9
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...
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości