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

Jak zmieniać dwie (kilka) wartości sekwencyjnie w Arduino

PiotrPitucha 07 Sie 2017 19:06 1374 13
  • #1 16629937
    PiotrPitucha
    Poziom 34  
    Posty: 2658
    Pomógł: 201
    Ocena: 423
    Witam
    Mam mały wyświetlacz na którym chciałem wyświetlić kilka wartości.
    Niestety jest tylko dwie linijki po 8 miejsc i wyniki się nie mieszczą, scroll zabiera zbyt wiele miejsca i muszę go z natury odrzucić.
    Pomysł był taki by w pierwszej linijce wyświetlać główny pomiar, natomiast w drugiej co kilka sekund sekwencyjnie wyświetlać pozostałe pomiary.
    Kiedyś w C miałem taki problem i stworzyłem małą tablicę w której były akurat liczby i w każdym przejściu jakiejś pętli realizowane było

    succ(..) ,

    gdzie po ostatnim elemencie wracało się do pierwszego ( sorry jeśli coś przekręciłem w składni, ale to było 30 lat temu :) ).
    W moim programie regularnie wywołuję pomiary co sekundę i szukam pomysłu na zgrabne sekwencyjne wybieranie po kolei dla przykładu cyfr 1, 2, 3, 4 .
    Oczywiście wiem że mogę zrobić nieśmiertelne if i kilka następnych komend, ale może macie pomysł jak to zrobić inaczej.
    Piotr
  • #2 16630045
    dedito
    Poziom 39  
    Posty: 4770
    Pomógł: 527
    Ocena: 593
    Nieśmiertelna funkcja Millis ubrana w nieśmiertelne IF'y :)
    Millis zwraca czas działania programu (w ms) od uruchomienia, nie wstrzymuje działania programu jak to robi funkcja delay.
  • #3 16630136
    PiotrPitucha
    Poziom 34  
    Posty: 2658
    Pomógł: 201
    Ocena: 423
    Witam
    Nie w tym problem, szukam zgrabnej metody wyświetlenia prądu, napięcia, temperatury w jednej lini co kilka sekund a nie samego odmierzania czasu.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Chodzi o zgrabne uzyskanie "flag" od 1 do n

    Pozdrawiam
  • #4 16630147
    dedito
    Poziom 39  
    Posty: 4770
    Pomógł: 527
    Ocena: 593
    Ale dzięki znajomości upływu czasu możesz wyświetlać właśnie cokolwiek co kilka sekund :)
  • #5 16630155
    Konto nie istnieje
    Poziom 1  
  • #6 16630550
    PiotrPitucha
    Poziom 34  
    Posty: 2658
    Pomógł: 201
    Ocena: 423
    Witam
    Przypominam:
    - po pierwsze mam Arduino i chcę programować w tym co Arduino udostępnia
    - po drugie nie interesuje mnie czas, zupełnie wszystko mi jedno czy mierzę co 0,5s , 0,7s , czy też co 1,3s !
    Mierzę prąd, napięcie, temperaturę i wyświetlam PWM.

    Pierwsza linijka PWM=93%
    Druga linijka T=120 F
    Druga opcjonalnie I=30 A
    Druga opcjonalnie U=7 V

    Czyli mamy :
    PWM=93%
    T=120 F

    PWM=93%
    I=30 A

    PWM=93%
    U=7 V


    i tak w kółko co jakiś czas.
    Interesuje mnie mechanizm który wybierze mi drugą linijkę i nie mam pomysłu jak to zrobić by:
    - było oszczędne na zużycie pamięci;
    - by program wynikowy był krótki;
    - wiem że są inne Arduino ale ja mam to z małą pamięcią :).
    Pamięć mam na granicy i obszar na program też, kilkadziesiąt procent pamięci zajmuje biblioteka wyświetlacza OLED.
    Czy w Arduino można zrobić wstawkę w czystym C ?, jeśli tak to jak?
    Wtedy mój problem rozwiążę jedną deklaracją i jednym przypisaniem.
    Pozdrawiam
  • #7 16630697
    Slawek K.
    Poziom 35  
    Posty: 3015
    Pomógł: 259
    Ocena: 1299
    Nie mozesz użyć pętli for ?

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Pozdr
  • #8 16630715
    JacekCz
    Poziom 42  
    Posty: 8670
    Pomógł: 760
    Ocena: 1460
    PiotrPitucha napisał:
    Witam
    Przypominam:
    - po pierwsze mam Arduino i chcę programować w tym co Arduino udostępnia


    Problemem większości projektów nawet Arduino nie jest "to co system udostepnia", tylko stojący z drugiej strony ekranu / łącza serial / konsoli

    PiotrPitucha napisał:

    Oczywiście wiem że mogę zrobić nieśmiertelne if i kilka następnych komend, ale może macie pomysł jak to zrobić inaczej.
    Piotr


    Wiesz, można użyć jakiś wzorców projektowych "bezifowych", ale myślę że nie o to pytasz.


    PiotrPitucha napisał:

    Czy w Arduino można zrobić wstawkę w czystym C ?, jeśli tak to jak?
    Wtedy mój problem rozwiążę jedną deklaracją i jednym przypisaniem.


    To powiedz jaka ta jedna deklaracja i jedno przypisanie "ratuje" wszystko, a ja Ci powiem jak w Arduino napisać wstawkę w C.

    rs6000 napisał:
    Nie mozesz użyć pętli for ?


    Mysle że nie może. Jeszcze nie i długo.
  • #9 16630787
    PiotrPitucha
    Poziom 34  
    Posty: 2658
    Pomógł: 201
    Ocena: 423
    Witam
    RS6000 do pętli FOR muszę dodać jeszcze kilka instrukcji, aby się to wykonywało w nieskończoność. Kompiluje się to dość efektywnie, będę musiał zoptymalizować resztę i może się zmieszczę, dzięki.

    JarekCz , chcesz pomóc czy tylko bawisz się w złośliwe uwagi?
    JarekCz napisał:
    Cytat:
    Mysle że nie może. Jeszcze nie i długo.


    Jestem sprzętowcem i z tym sobie bardzo dobrze radzę, jak z konieczności programuję to czasami pytam.
    JarekCz napisał:
    Cytat:
    To powiedz jaka ta jedna deklaracja i jedno przypisanie "ratuje" wszystko, a ja Ci powiem jak w Arduino napisać wstawkę w C.

    A bardzo proszę jak wiesz,
    int tabelka[3];
    // akurat mam 3 zmieniane linie
    n=succ tabelka[];

    druga wersja wstawka assemblera,
    RCR B,1
    // rotacja w prawo ( lub w lewo ) z przeniesieniem
    W moim starym C ( Keil ) na procesory 8051 succ kompilowało się bardzo efektywnie, podejrzewam, że o niebo efektywniej niż pętla FOR.
    Co do drugiej wersji to w AVR RCR wykonuje się w jednym kroku procesora i nie zżera pamięci, prościej nie można.
    Pozdrawiam
  • #10 16630839
    JacekCz
    Poziom 42  
    Posty: 8670
    Pomógł: 760
    Ocena: 1460
    PiotrPitucha napisał:

    Cytat:
    To powiedz jaka ta jedna deklaracja i jedno przypisanie "ratuje" wszystko, a ja Ci powiem jak w Arduino napisać wstawkę w C.

    A bardzo proszę jak wiesz,
    int tabelka[3];
    // akurat mam 3 zmieniane linie
    n=succ tabelka[];

    druga wersja wstawka assemblera,
    RCR B,1
    // rotacja w prawo ( lub w lewo ) z przeniesieniem
    W moim starym C ( Keil ) na procesory 8051 succ kompilowało się bardzo efektywnie, podejrzewam, że o niebo efektywniej niż pętla FOR.
    Co do drugiej wersji to w AVR RCR wykonuje się w jednym kroku procesora i nie zżera pamięci, prościej nie można.
    Pozdrawiam


    1. Nie ma potrzeby asemblera, kompilacja C/C++ jest naprawdę wydajna. Optymalizujesz gdzie nie trzeba. Domniemanie o braku wydajności pętli for MSZ nie ma sensu. Łączenie z językiem wysokiego poziomu (Arduino) tym bardziej powinno hamować użycie wstawek asemblerowych. (jak wstawką obsłużyć arduino String???)

    Hipotetycznie szukasz jakiś oszczędności na złym 'for()' ale masz wiele większe straty w swoim stylu.

    2. z wątku przebija, że alternatywne dane są formatowane (???) bo są to różne dane. Z tego wynika że tablica int[] nie ma sensu, nadal będą if'y to formatujące. @Marek_Skalski ci sugeruje sensowe opcje: w tablicy sformatowane dane lub funkcja formatująca

    Funkcja formatująca ma niskie zużycie RAM (ale może nieco spowalniać), sformatowane wersje nieco RAM, ale formatowac tzreba tylko po zmianie danych z pomiaru.

    PiotrPitucha napisał:

    Jestem sprzętowcem i z tym sobie bardzo dobrze radzę, jak z konieczności programuję to czasami pytam.


    Forum jest do pomocy. Ale jest SZTUCZNE JEST chcenie pomocy i bujanie w jakiś abstrakcjach. Jest pełny kod, można coś doradzić, inaczej to wróżenie z fusów. Nie jest wstyde na jakims etapie czegos nie umieć, ale sposób z korzystania pomocy na forach programistycznych jest jasny.

    EDIT: na przykład powinieneś zająć "jakieś" stanowisko co do rady Marka (oraz innych), tak/ nie /nie rozumiem itd... Inaczej to bicie piany w kółko. TYM BARDZIEJ jako czujący się niepewnie

    Na marginesie, intuicja mi mówi że przegląd kodu na forum by wskazał oszczędności RAM sto razy większe niż mityczna pętla for()

    3. Język arduino jest mutacją języka C++, a ten jest nadzbiorem języka C. Nie ma "wstawek C" bo się takie fragmenty po prostu pisze (jak Kargul mówił: byle mądrze). Aha, to co przywołujesz to NIE JEST wstawka C.
  • #11 16630873
    grko
    Poziom 33  
    Posty: 1386
    Pomógł: 247
    Ocena: 141
    JacekCz napisał:

    3. Język arduino jest mutacją języka C++, a ten jest nadzbiorem języka C.


    Cały czas na tym forum ludzie błędnie powołują się na język mityczny język programowania arduino. Nie istnieje coś takiego jak język arduino, więc nie jest on żadną mutacją C++. Arduino to IDE gdzie pisze się po prostu w C++ (z pewnymi ograniczeniami). Kolejną nieprawdą jest to, że niby C++ jest nadzbiorem C. Nie jest tak, ponieważ wiele konstrukcji z C po prostu nie jest poprawnych w C++:

    https://en.wikipedia.org/wiki/Compatibility_of_C_and_C++
  • #12 16630887
    JacekCz
    Poziom 42  
    Posty: 8670
    Pomógł: 760
    Ocena: 1460
    grko napisał:
    JacekCz napisał:

    3. Język arduino jest mutacją języka C++, a ten jest nadzbiorem języka C.


    Cały czas na tym forum ludzie błędnie powołują się na język mityczny język programowania arduino. Nie istnieje coś takiego jak język arduino, więc nie jest on żadną mutacją C++. Arduino to IDE gdzie pisze się po prostu w C++ (z pewnymi ograniczeniami).


    Wiesz co ... masz w teorii rację (a ja powieniem napisac w cudzysłowie "język arduino", błąd redakcyjny) , języki, rdzeń tak.
    Ale zestaw: formalny język + bilioteka standardowa czyli "język użytkowy" to w praktyce co innego. Dla mnie każda "system programowania na bazie C++" który zastępuje standardowe klasy swoimi to (w praktyce) niezależna mutacja. Zatrudnianie programistów mających w CV "znajomośc C++" to pokazuje.
    W realnym życiu, tak sobie pomyślałem, nawet mniej groźne są ograniczenia, jak rozszerzenia.

    Aha, wrócę "język arduino" jest jeszcze jeden argument: wzięty surs arduino nie jest kompilowalny w C++ (przez preprocesor)

    grko napisał:
    ... Kolejną nieprawdą jest to, że niby C++ jest nadzbiorem C. Nie jest tak, ponieważ wiele konstrukcji z C po prostu nie jest poprawnych w C++:

    https://en.wikipedia.org/wiki/Compatibility_of_C_and_C++

    wiem, ale nie o tym wątek.
  • #13 16630914
    PiotrPitucha
    Poziom 34  
    Posty: 2658
    Pomógł: 201
    Ocena: 423
    Witam
    Zamykam temat bo zaczęły się dyskusje okołotematyczne bez sensu.
    JacekCz napisał:
    Cytat:
    To powiedz jaka ta jedna deklaracja i jedno przypisanie "ratuje" wszystko, a ja Ci powiem jak w Arduino napisać wstawkę w C.

    Podałem jedną instrukcję C która załatwia mój problem i jedną assemblerową która też to rozwiązuje i cisza....
    JacekCz bardzo lubię Marka Skalskiego, wielokrotnie korzystałem z jego rad, ale gdybym wiedział coś więcej na temat
    Cytat:
    /struktura/lista ze wskaźnikami na funkcje wyświetlające
    to bym nie musiał pytać.
    Chyba spróbuję przenieść program na pogardzanego Bascoma, tam przynajmniej wstawki w assemblerze robi się bajecznie prosto.
    Pozdrawiam
  • #14 16630926
    dondu
    VIP Zasłużony dla elektroda
    Posty: 13906
    Pomógł: 1292
    Ocena: 809
    PiotrPitucha napisał:
    Chyba spróbuję przenieść program na pogardzanego Bascoma, tam przynajmniej wstawki w assemblerze robi się bajecznie prosto.

    Uwstecznianie się na maksa :) a to wina tego, że z ograniczającego Ciebie Bascom, przeniosłeś się na równie ograniczające Arduino.

    ... zamiast w końcu zacząć programować tylko w C, skoro już liznąłeś Arduino.

Podsumowanie tematu

✨ Użytkownik poszukuje efektywnej metody wyświetlania kilku wartości na małym wyświetlaczu OLED w Arduino, który ma ograniczoną przestrzeń. Chce, aby w pierwszej linii wyświetlał główny pomiar, a w drugiej sekwencyjnie inne pomiary (np. prąd, napięcie, temperatura) co kilka sekund. W dyskusji zaproponowano różne podejścia, w tym użycie pętli for do iteracji przez tablicę wartości oraz dynamiczne rejestrowanie wskaźników na funkcje wyświetlające. Użytkownik podkreśla, że zależy mu na oszczędności pamięci i prostocie kodu, a także rozważa użycie assemblera dla optymalizacji. W końcu wyraża frustrację z powodu braku konkretnych rozwiązań i rozważa powrót do programowania w Bascomie.
Wygenerowane przez model językowy.
REKLAMA