Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

max7219 i ds18b20 - Wyświetlanie temperatury na jednej matrycy 8x8

domin122 25 Wrz 2016 22:06 1899 10
  • #1 25 Wrz 2016 22:06
    domin122
    Poziom 16  

    Witam.
    Czy mógłby ktoś mnie naprowadzić jak zrealizować wyświetlanie temperatury na jednej matrycy 8x8?
    Odczyt temp. wraz z kodem jest opisany na http://akademia.nettigo.pl/ds18b20/
    A kod i opis na przewijany tekst na http://tronixstuff.com/2013/10/11/tutorial-arduino-max7219-led-display-driver-ic/
    Nie wiem za bardzo jak okroić ten kod z przewijanym tekstem żebym spokojnie mógł sobie wstawić odczyt temperatury.
    EDIT. Uzupełniam temat o kod do odczytu temp. oraz kod do max7219 przewijanego tekstu.
    1. Widziałem kody do odczytu temp. i są odczytywane na różny sposób - rożne biblioteki - jaka według Was byłaby najlepsza biblioteka?
    2. Z tym kodem od max7219 potrzebuje najbardziej pomocy. Nie rozumiem dlaczego musi być w pętli głównej cała tablica znaków - nie wiem, może napisać nową funkcję i tam ją wrzucić? Nie wiem jak to ugryźć z tego względu, że nie do końca rozumiem kod. Już myślałem nad takim czymś że składać temp. np. z trzech zmiennych np. 12,5 stopni C -> zmienna a + zmienna b + "," + zmienna c, ale wydaję mi się że to i głupi i ani grama mądry pomysł.

    Tak po za tym na youtube widziałem wyświetlanie godziny i temp. na jednym wyświetlaczu więc jest to realne do zrobienia jak najbardziej.

    0 10
  • #2 26 Wrz 2016 12:35
    BlueDraco
    Specjalista - Mikrokontrolery

    Mogę naprowadzić: zapominasz o kodzie, który widziałeś, a który korzysta z delay() i robisz wszystko od nowa na przerwaniach. Problem w tym, że przerwanie związane z obsługą DS18B20 powinno wywłaszczać przerwanie wyświetlacza, co na ATmega w zasadzie jest niemożliwe. W związku z tym wypada rozejrzeć się za obsługą DSa przy użyciu UARTa, co daje pewne (nieduże) szanse na poskładanie tego zgodnie z regułami sztuki.

    Koledzy od ATmega zaraz napiszą, że nie mam racji, że przerwania mogą się wywłaszczać i że obsługa DSa nie kłóci się z obsługą wyświetlacza, czkawka wyświetlacza będzie prawie niewidoczna, a błędy odczytu DSa rzadkie. ;)

    0
  • #4 26 Wrz 2016 18:19
    BlueDraco
    Specjalista - Mikrokontrolery

    7219 odświeża sam, a kto steruje przewijaniem zawartości?

    0
  • #5 26 Wrz 2016 19:12
    tmf
    Moderator Mikrokontrolery Projektowanie

    BlueDraco napisał:
    Mogę naprowadzić: zapominasz o kodzie, który widziałeś, a który korzysta z delay() i robisz wszystko od nowa na przerwaniach. Problem w tym, że przerwanie związane z obsługą DS18B20 powinno wywłaszczać przerwanie wyświetlacza, co na ATmega w zasadzie jest niemożliwe. W związku z tym wypada rozejrzeć się za obsługą DSa przy użyciu UARTa, co daje pewne (nieduże) szanse na poskładanie tego zgodnie z regułami sztuki.


    Nie będę dyskutował na temat wywłaszczania przerwań - w tak prostej aplikacji można to zrobić bez żadnych konsekwencji, może będzie to raziło oczy purystów... Natomiast kompletnie nie rozumiem dlaczego uważasz, że wykorzystanie UART do realizacji 1-wire daje tylko nieduże szanse na poskładanie tego zgodnie z regułami? Jeśli ktoś wykorzystując UART nie napisze tej aplikacji jak należy, to tak samo nie zrobi tego prawidłowo mając x-poziomowy system przerwań i super-hiper MCU.

    0
  • #6 26 Wrz 2016 19:32
    domin122
    Poziom 16  

    Za bardzo nie rozumiem koncepcji Moderatora - ale chodzi Panu o to aby temp. była wysyłana do np. komputera w przerwaniach np. w celach diagnostycznych w razie awarii czujnika? Czyli powiedzmy padł czujnik - to podłączamy komputer i dajemy np. w terminalu wcześniej ustalone polecenie odebrania informacji o temp. co by być pewnym że to wina uszkodzonego czujnika, a nie np. uszkodzonego mikrokontrolera.

    0
  • #7 26 Wrz 2016 22:14
    tmf
    Moderator Mikrokontrolery Projektowanie

    Nie, chodzi o to, że w każdym rozsądnym rozwiązaniu implementacji 1-wire nie stosuje się delay i manglowania pinem IO, lecz sprzęt. Na AVR najprościej do tego celu wykorzystać UART, który wygeneruje impulsy o odpowiednich zależnościach czasowych. Dzięki temu nie trzeba na czas wysyłania/odbierania bitu przez 1-wire blokować przerwań, co z kolei pozytywnie wpłynie na wyświetlanie czegość na matrycy LED. Tak czy siak, sugestia kol. @BlueDraco żebś zapomniał o podanym kodzie i napisał to jak należy jest dobra. Przykład implementacji 1-wire w oparciu o UART masz w darmowych przykładach do książki "Język C dla..." - link w stopce. Tam też znajdziesz przykład sterowania matrycy LED przez AVR. Jeśli się upierasz na Arduino, to przynajmniej będziesz musiał napisać porządnie klasę obsługi 1-wire, inaczej nie spodziewaj się dobrych efektów wizualnych.

    0
  • #9 27 Wrz 2016 12:18
    BlueDraco
    Specjalista - Mikrokontrolery

    A nie mówiłem... ;)

    0
  • #10 03 Paź 2016 18:21
    ditomek
    Poziom 20  

    @domin122
    Stwórz w pamięci obszar danych reprezentujący to co chcesz wyświetlić na pojedynczym wyświetlaczu. Nie wiem ile informacji chcesz wyświetlić, powiedzmy ze około 5 znaków szerokich na 5 kropek. myślę że około 30 bajtów powinno wystarczyć.

    Do tej przestrzeni wpisz swój wynik pomiaru używając wcześniej zdefiniowanego generatora znaków.
    Do DS'a wyślij rozkaz pomiaru temperatury.
    W trakcie czasu potrzebnego DSowi na pomiar przesuń wynik po wyświetlaczu.
    odczytaj temperaturę,
    wypełnij wynikiem tablice
    wyślij rozkaz pomiaru temperatury,
    przesuń wynik po wyświetlaczu.
    itd

    To prosty sposób na uzyskanie zadowalającego wyniku. pozwala na zrozumienie tego co chcesz zrobić.
    I oczywiście nie jedyny sposób na realizację tego zadania...

    0
  • #11 07 Paź 2016 21:08
    domin122
    Poziom 16  

    Znalazłem projekt piotrva https://www.elektroda.pl/rtvforum/viewtopic.php?p=9929737
    EDIT.
    Czy idzie z wykorzystaniem biblioteki zrobić tak żeby znaki na matrycy 8x8 nie były przesuwane tylko stały w jednym miejscu i zmieniały się w miejscu tak jak np. na wyświetlaczach segmentowych? Proszę o podpowiedź jakiej instrukcji użyć. W tej chwili operowałem na bibliotece MaxMatrix.
    EDIT.
    Chcę obrócić wyświetlanie. W kodzie mam m.shiftLeft. W bibliotece są np. shiftUp ale nie wiem jak je zastosować - próbowałem podmienić, ale się nic nie dzieje - dlaczego?

    0
  Szukaj w 5mln produktów