Miernik na HD44780 i Attiny13

howtoProjekt powstał z czystej ciekawości… co można zrobić na Attiny13? Otóż można, i to dużo. W tym przypadku ten malec zmierzy nam napięcie, prąd, temperaturę, przeliczy, a wyniki w przystępny sposób pokaże na wyświetlaczu alfanumerycznym (typu HD44780). Jak by tego było mało, program został napisany w bascomie. Pomimo nietypowych rozwiązań, układ może z powodzeniem służyć jako tytułowy miernik do zasilacza w miejscach gdzie nie jest wymagana duża dokładność. Wymiary płytki to tylko 35mm x 16mm

Zakres pomiaru napięcia to 0-99V z rodzielczością 0.1V, zrealizowany na dzielniku R/R. Zakres pomiaru prądu to 0-9.99A z z rodzielczością 10mA, zrealizowany na boczniku R 0.1 ohm. Napięcie odniesienia to wewnętrzne napięcie referencyjne 1.1V, przy prądzie 10A spadek napięcia wynosi aż 1V, ale w zamian mamy w miarę wysoką rozdzielczość w całym zakresie i brak potrzeby stosowania wzmacniacza operacyjnego (i tworzenia mu ujemnego napięcia zasilającego). Zakres pomiaru temperatury 0-99*C z rozdzielczością 0.1*C – sam pomiar zrealizowany na analogowym czujniku LM35. Oczywiście dzielnik R/R napięcia jak i bocznik pomiaru prądu należy dobrać tak aby nie przekroczyć napięcia referencyjnego 1.1V, a tym bardziej dopuszczalnego napięcia portu 5V.

Ustalanie zakresu pomiaru i klibracja:
Przede wszystkim dobrze jest wiedzieć w jakim zakresie napięcia miernik ma pracować, będzie dokładniejszy w mniejszym (potrzebnym) zakresie, a mniej dokładny w wiekszym (którego przecież nie wykorzystamy). Aby to ustawić należy obliczyć dzielnik napięcia. Przykładowo dla uzyskania pomiaru do 10V, dzielnik powinien wynosić 1/10 (mnożymy x 10 ponieważ napięcie wejściowe będzie 10 razy większe od referencyjnego 1V), dla 30V będzie to 1/30 itp. W takim przypadku rezystor R.DZIEL będzie wynosił 3Kohm, ale doliczając 2K5ohm potencjometr do kalibracji powinniśmy użyć rezystora ok 1K8ohm aby mieć pełną regulację. Następnie należy dostosować program do danego zakresu (przykładowo 30V). Nasze 30V mnożymy przez 640, a wynik dzielimy przez 1023. Uzyskaną liczbę w przybliżeniu wpisujemy na początku programu do stałej const napiecie a program kompilujemy (standardowo jest to zakres 100V, R.DZIEL wynosi wtedy 8K2ohm). Pomiar prądu również możemy dostosować w podobny sposób, dać inny dzielnik, inny zakres i przeliczyć, ale nie będę już tego opisywał. Nie ma analogowej kalibracji temperatury bo wydała mi się ona całkowicie zbędna. Temperaturę dobrałem doświadczalnie w programie, odpowiada za to stała const temp. Rezystor 1K pomiędzy GND a wyjściem czujnika ustawia jego prąd, można go zmniejszyć nawet do 100ohm ale należy liczyć się z tym że czujnik zacznie się grzać i wprowadzać błąd.

Wady:
Tak prosty układ ma oczywiście swoje wady. Pierwszy rezystor dzielnika jest stały i powinien wynosić 100ohm. Tutaj wyjaśnie problem używania tych samych pinów do obsługi LCD i pomiaru ADC… Linie LCD w stanie wejścia wymagają ok. 80uA prądu aby je ściągnąć całkowicie do GND, decydują o tym wewnętrzne pullupy. Rezystor dzielnika 100ohm nie ściągnie oczywiście tej linii tak jak trzeba, pozostawiając około 7mV względem GND – i jak nie trudno się domyśleć przetwornik taką wartość odczyta (ok. 7/1023). Ponieważ zastosowanie rezystora o jeszcze większym oporze nie wchodziło w grę – z powodu zbyt dużego obciążenia portu podczas wysyłania danych do LCD – najprostszym sposobem okazało się zwykłe odejmowanie tych 7mV w programie (stała const pullup). I tutaj dochodzimy do sedna, wyniki pomiarów nie będą idealnie liniowe, szczególnie w zakresie 0-5V kiedy wyświetlacz wprowadza błąd pomiarowy. Drugi problem to pomiar prądu, bez wzmacniacza operacyjnego nie można się pokusić o odpowiednią regulację – prąd możemy regulować tylko „w dół”, czyli to co odłoży nam się na boczniku możemy ściągnąć jeszcze do GND potencjometrem 10K – i tutaj uwaga, wpływ na regulację prądu ma znowu pullup wyświetlacza więc należałoby trochę tutaj poeksperymentować przez wlutowaniem elementów, być może będzie trzeba dać potencjometr o szerszym zakresie, lub jeśli napięcie odkładające się na boczniku będzie za małe, podnieść nieco wartość stałej const prąd w programie. Tak, jest jeszcze trzeci problem – miernik pobiera tylko jedna próbkę i od razu ją wyświetla przez co wynik potrafi „pływać” w zależności od tego na co w danej chwili przetwornik trafił. Przy idealnie stabilizowanym napięciu tego efektu nie ujrzymy. ZAŁĄCZNIK ZAKTUALIZOWANY – program tiny13lcd_9_64-sample wykonuje 64 próbki dla każdego pomiaru i wyświetla średnią. Dodatkowo wyświetlane wartości nie przekroczą 999 i wyświetlanie się nie rozjedzie.

howto

Co i jak:
Do punktu V+ na płytce dołączamy napięcie które chcemy mierzyć, do punktu GND dołączamy wejście masy zasilacza, a do punktu V- dołączamy wyjście masy (pomiar odbywa się na masie). Między punkty GND a V- dołączamy bocznik. Zasilanie dla układu pobierane jest z punktu V+ poprzez stabilizator typu 7805. Na płytce jest miejsce na stabilizator w obudowie TO252, ale z powodzeniem można użyć stabilizatora 78L05 w obudowie TO92 (układ wraz z podświetleniem LCD pobiera około 35mA). To stabilizator decyduje o tym jakie maksymalne napięcie możemy podać do punktu V+, dla zwykłego 7805 będzie to do 35V, dla 78L05 będzie na pewno mniejsze, nie więcej jak 30V. Aby mierzyć większe napięcia, układ należy zasilić oddzielnie – po stronie druku należy przerwać ścieżkę pod potencjometrem regulacji napięcia a zasilanie podać do punktu ZAS. Układ współpracuje z wyświetlaczem o organizacji 16*1 pól ze sterownikiem HD44780 lub kompatybilnym, do demonstracji zastosowałem wyświetlacz 16*2. Płytka jest dostosowana tak aby można było ją podlutować pod wyświetlacz, w prezentacji do połączenia użyłem taśmy ATA bo nie miałem wyświetlacza bez pinów.

Fusebity:
Należy ustawić pin reset jako zwykły pin (włączyć fusebit RSTDISBL) – UWAGA! – przed wykonaniem tej czynności upewnij się 10 razy że odpowiednio zaprogramowałeś procesor i wszystko dobrze ustawiłeś, bo po wyłączeniu resetu nie będziesz miał już dostępu do procesora zwykłym programatorem! Program zoptymalizowałem najlepiej jak mogłem, w chwili obecnej zajmuje 1020 bajtów. Źródła jak zawsze są u mnie dostępne, jeśli ktoś zechciałby napisać ten program w C to proszę bardzo :) W programie zaremowane wartości są do testów na Atmega8.

POBIERZ – pliki projektu eagle 5.4.0, schemat i płytka w PDF, PNG, wsad HEX, BIN, źródło BAS.
.
.

5.00 avg. rating (97% score) - 2 votes

42 komentarze

  1. Dodaj jeszcze do tego Watomierz :)

  2. Z watomierzem nie ma problemu, daj mi kilka wolnych bajtów w pamięci i dopiszę ci wyświetlanie W :)

  3. Bardzo ładny projekt. Mam nadzieję że na tym się nie skończy:)
    Strona bardzo pomocna w wielu sytuacjach.

  4. Paczkę uaktualniłem, jest program który robi 64 próbki i pokazuje średnią.

    Chciałem dorobić do tego Watomierz tak jak Mariusz wykombinował – lecz pomimo wielu prób nie byłem w stanie zmieścić do kodu mnożenia – na pewno nie w bascomie. Próbowałem nawet nie używać bascomowych gotowców ale innych rozwiązań, zwykłego mnożenia na liczbach binarnych, próbowałem algorytmu bootha, ale kod tylko się komplikował. Więc z wyświetlaniem Watt sobie darowałem – kod był za duży o jakieś 100 bajtów – jeśli ktoś ma jakieś wskazówki co można zoptymalizować – chętnie wysłucham. Obecnie kod zajmuje jakieś 91% pamięci.

  5. Ladna konstrukcja , a da sie to zaadaptowac i jak to podlaczyc w prostowanik akumulatorow olowiowych :) bylo by lelegancko widziec jakie napiecie jaki prad ladowania i jaka teperature w przyblizeniu ma akumulator :)

    • Podłącz normalnie, wg opisu, powinno dobrze działać. Chociaż nie wiem jak się zachowa miernik bo chyba mówimy o prostowniku jedno połówkowym?

  6. I realized theVolt/Amp with HD44780 and ATTINY13, I correct the pin4 joining it to the ground.
    I programmed the attiny13 with your firmware, but nothing to do. Tere are something to know for the fuses configuration?. Nice and interesting mini voltamperometer, I hope to be able to use it correctly, without problems. Thanks in advance.
    P.S.
    If is possible contact me to my personal E-Mail.

    Best regards from miomao
    Maurizio Mazzotti

    • Did you read description?

      Fusebits: enable fusebit RSTDISBL – ATTENTION, make sure you are properly programmed tiny, because after setting that fuse you lose access to the tiny with typical ISP programmer.

  7. Witam,
    Mam pytanie. Czy możecie tak przerobić program aby na jednym wyświetlaczu np. 2×16 pokazywane było napięcie i natężenie z dwóch osobnych modułów?

    • Attiny13 ma 4 wejścia przetwornika, więc aby mierzyć 2x napięcie i 2x prąd, musiałbyś pozbyć się pomiaru temperatury.

      Po drugie, obydwa moduły musiałyby być połączone masami.

      Niestety nie mam czasu na zabawę z programem, ale poproś na forum elektrody to może przerobią :)

  8. Hi

    You can tell me the value of that 2 power resistors, and maybe a schematic how to connect this to my power supply. In the video the attiny have the TINY13LCD_9_.HEX or the TINY13LCD_9_64-SAMPLE.HEX ?

    Thanks and keep up the good work

  9. Witam!
    Fajny projekt i ciekawe rozwiązanie wykorzystywania portu.
    Nawet nie wiedziałem że to można tak zrobić. Dopiero zaczynam
    zabawę z uP i Pana układ poszedł na pierwszy ogień
    Wykonałem układ i bez podłączonych elementów (tylko wyświetlacz i rezystory
    kontrastu ) wyświetla 98,5V 9.85A 98,5
    Czy to jest prawidłowe?
    Pozdrawiam!

    • Program odejmuje prąd który pobierają linie LCD, twój wyświetlacz mniej obciąża linie więc odejmowana jest zbyt duża wartość. Można zmienić to w programie, na początku jest Const Pullup = 6 – zmniejsz wartość tak aby uzyskać 0 na wyświetlaczu :)

  10. Witam.
    Mam z tym problem. Wykonałem to i wyświetlało cały czas 50V ale mniejsza o to.
    Złożyłem „Attiny fusebit doctor (HVSP) – napraw fuski” z twojej strony i ponownie zaprogramowałem attiny ( z zmianą Const Pullup) i jak to zrobiłem włączam układ i zero reakcji.
    Na wyświetlaczu nic się nie wyświetla (attiny potem programowałem jeszcze kilka razy z oryginalną wartością Const Pullup ale bez skutku). Połączenie sprawdzałem i wszystko ok (wcześniej działało). Co może być tego przyczyną?

    • Jakieś zwarcia, uszkodzenia. Albo nie przestawiłeś spowrotem pinu reset w tryb i/o.

  11. Od razu po tym znalazłem przyczynę ale zapomniałem napisać. Pin reset przestawiałem ale podczas próby ręcznego odblokowania przez moją pomyłkę podłączyłem 12V na PB3 (pin2) i on uległ uszkodzeniu. Tego attiny użyję do czegoś innego a kupię nowego i sprawdzę.

  12. dlaczego jak podłącze wyświetlacz i LM’a to nie odświeża się wyświetlacz tylko żeby kolejny odczyt nastąpił to trzeba wyłączyć układ i włączyc ponownie

    • Czy Pb.5 został przestawiony w tryb zwykłego pinu?

      Czy program był modyfikowany?

      Czy rezystory są takie jak na schemacie?

      Innych powodów nie ma, program powinien wykonywać się „w kółko”.

  13. port reset ustawiłem na zwykły
    nie modyfikowałem programu – wgrałem ten poprawiony
    rezystorki takie jak kazałeś

    • No to naprawdę dziwne bo program jest tak cholernie prosty że nawet nie ma gdzie się zawiesić…

      Próbowałeś wgrywać ten poprzedni program? A może to wina wyświetlacza lub zasilania? A może program sam kompilowałeś?

  14. Witam.
    Jestem początkujący w dziedzinie programowania i wykonywania układów z użyciem mikroprocesorów. Udało mi się jednak poprawnie zmontować i uruchomić ten miernik (a także Attiny fusebit doctor). W mierniku zastosowałem wyświetlacz 16*2. Ponieważ w górnej linii nie można wyświetlić znaku temperatury (*) próbowałem przenieść wyświetlanie temperatury (ze znakiem) do drugiej linii (dolnego wiersza). Niestety, moje umiejętności są jeszcze niewystarczające – udało mi się uzyskać pożądany efekt tylko w symulacji (Bascom-AVR).
    Gdybyś znalazł chwilę na modyfikację programu i zamieszczenie go (najlepiej wraz z plikiem HEX) – byłbym wdzięczny.
    Pozdrawiam.

  15. I realized theVolt/Amp with HD44780 and ATTINY13. I use a one-line display on the chip Samsung KS0066U – compatible with HD44780. I programmed the attiny13 with your firmware, but nothing to do. Tell me please how do I properly install fuses configuration. Or maybe the display on a chip KS0066U not fit? If is possible contact me to my personal E-Mail.
    Thank you.

  16. Witam.
    Użyj formatu: 16 znaków x 1 linii. W tym przypadku, na wyświetlaczu jest tylko pierwsze 8 znaków. W miejsce pozostałych 8 znaków – nic. Proszę mi powiedzieć, co poprawić w kodzie, aby rozwiązać problem. Dziękuję.

    • Być może te wyświetlacz posiada organizację 2*8 znaków, ale ma wszystkie w jednej linii. W kodzie musisz wstawić polecenia lowerline i upperline aby wybrać w której linii wyświetlać dane. Choć nie wiem czy takie polecenia się zmieszczą, nie wiem też jak byś chciał podzielić środkowy wynik (prąd) na pół, no trzeba by jakoś to sprytnie przerobić, ale jak mówię nie ma już tam miejsca na takie rzeczy :(

  17. Witam.
    Tak, rzeczywiście, mój ekran: 16 znaków x 1 Linii ma organizację 2 * 8 znaków. Więc na wyświetlaczu: 16 znaków x 2 Linii, 9-ty symbol jest DD RAM Address – 08, 10 th charakter – 09, 11-tego znaku – 0A ……… 16 znaków – 0F. My Display: 16 znaków x 1 Linii, 9-ty symbol jest DD RAM Adres – 40, 10-th charakter – 41, 11-th charakter – 42 ……… 16 znaków – 47. Jestem nowicjuszem w programowaniu, ale myślę, że cały problem jest. Być może, jeśli to naprawić w swoim programie. Proszę mi powiedzieć, gdzie i co do ustalenia, oczywiście, jeśli masz taką możliwość. Dziękuję.

  18. Witam.
    Rozumiem, że pomiaru stresu odbywa się poprzez PAD5 (V-IN). Pomiar prądu – równolegle do przecieku. Jeśli PAD5 wejścia (V-IN) nie będzie łączyć (wisi w powietrzu), wskaźnik danych (V – od 0,00 do 01,6 V, prąd – od 0,00 do 0,19A). Liczby te zmieniają się bardzo szybko, w granicach, które mam. Powiedz mi, poprawnie, czy to jest. Jeśli PAD5 wejścia (V-IN) nie będzie łączyć, nie powinny być na napięcie czytania ekranu (U) i prądu (A) – zero? Powiedz mi, co zrobiłem źle? Dziękuję.

  19. Mam pytanko, wgrałem w attiny13a program bazowy z wyświetlaczem 16×2 i mam problem. Mianowicie po podpięciu +V na zasilanie układu a V- na masę układ wskazuje dziwnie.
    Mam 00.8V 0.05.0V 0. ..Nie podpiąłem LM35 czy jest wymagany? A zamiast bocznika zworka ( nie posiadam chwilowo takiego rezystora). Czy domyśla się Pan w czym problem? Zamiast A pokazuje mi volty.

  20. Hello,
    I have simulated in Proteus and there was nothing on display, though the ports microcontrolorer shows activity. Which inputs of the display is connected to the ports PB2, PB4, PB3, PB5 ? (7, 8, 9,10 or 11,12,13,14)
    All the best!

  21. Witaj – świetny projekcik – ja teraz z pytaniem – nie interesuje mnie aż tak duża rozdzielczość – dodatkowo napięcie będzie w okolicy 40V DC. Teraz pytanie – czy da się łatwo zmienić zakres do przynajmniej 30A? Najchętniej 50A. Dzięki za wskazówki.

  22. Cieszę się z autorem! Przepraszam za słabą polskim. Dobry design. I można poprosić autora do nieco zmienić projekt. Usuń pomiar i wyświetlanie wskazań temperatury na wyświetlaczu 8 * 2. Jeszcze raz dziękuję za projekt. Regards Andrew!

  23. Co zmienić elektrycznie , jak nie chcemy pomiaru temperatury ?
    Tak myślę że : PB5 -> 1K -> GND . ???
    Czy program nie będzie się wieszał ?

    • Możesz ściągnąć wejście pomiarowe do masy ale wyświetlacz i tak będzie wyświetlał to co zmierzy z tego wejścia.

  24. The software „tiny13lcd_9_64-sample.bas” appears to have a bug. It will work (by accident) if the LCD is a single line (i.e. 1×16) display. With other displays, the output overwrites both (all) lines and does not display the data correctly. (The other version works fine)

    The problem is in the main Do-Loop. The command „Upperline” is only sent once to the display. Every other time this line of code is executed, the ATtiny13 pins are set as inputs. That means this command never goes to the LCD again.

    Easy fix:

    Change the first line after the Do command from simply ‚Upperline’ to

    Ddrb=&B111111
    Upperline
    Ddrb=&B010011

    This sets the pins as outputs ready for the Upperline command and restores them as inputs for the subsequent steps, and best of all, it will still fit (just) in the ATtiny13.

    Thanks, manekinen, for the great work. Despite this little bug, the idea is great, and with this fix, it’s working nicely on my 2×16 LCD.

  25. Cześć!
    Bardzo podoba mi się Twoja strona. Jest rzeczowa i prosta, a jednocześnie masa na niej informacji! Oby tak dalej.

    Co do samego miernika. Tak się składa, że właśnie sobie konstruuję zasilacz warsztatowy i zaprojektowałem bardzo podobne rozwiązanie. Mierzę napięcie za pomocą dzielnika i przetwornika ADC w Atmega8.

    Chciałbym tylko zaproponować, żeby zamiast używać rezystorów 100 i 10k, użyć jak największych. Np 100k i 10M. Dlaczego? Prąd przez nie płynący będzie znacznie znacznie mniejszy, a napięcie przecież się nie zmieni. Mniej wpłynie to na układ.

    Ja nie stosowałem potencjometrów. Dałem stosunek 1/10 (takie miałem oporniki – powinien być 1/9 bo Uwy z dzielnika to Uwe * r1/(r1+ r2)). Skalibrowałem to programowo. Zmierzyłem najniższą wartość z przetwornika i przypisałem jej wartość napięcia jaką pokazywał w danej chwili miernik i adekwatnie dla najwyższej. Co pomiędzy po prostu się samo wylicza :)

    Pozdrawiam!!!
    Tomek

  26. Dlaczego w wersji z 64 próbkami nei ma już stałych:
    const napiecie
    const prad

    ??

  27. Witam , złożyłem sobie ten fajny układzik , niestety mam problem z kalibracją pomiaru prądu , gdy potencjometrem ustawie by wyswietlacz pokazywał 0.00A to są przekłamania podczas pomiaru , gdy wyreguluje układ powiedzmy przy 2A to po odłączeniu amperomierz wskazuje 0.05A bez obciążenia.Do tego przy pomiarze prądu odczyt skacze w zakresie 0,01-0,08A . Gdzie szukać problemu ?? Pozdrawiam serdecznie

  28. Gratuluje projektu, jest po prostu super.

    Jest prawie idealny jak dla mnie :)
    Czy dało by się tak przerobić układ aby został tylko pomiar prądu i napięcia? 0-5V i 0-2A Bez temperatury, bez LCD, ale żeby wynik wysłać do Raspberry po RS232?

    • Trzeba przerobić program aby wypychał dane po uart, bardzo proste, ale niestety nie mogę pomóc.

  29. Już (prawie) sobie poradziłem.
    Bardzo dziękuje za opublikowanie tak ciekawego projektu ;)
    Pozdrawiam.

  30. Witam, szukam jakiegoś układu mierzącego w miarę dokładnie prąd w zakresie od 0-10A i komunikującego się z procesorem o IIC, lub jakiś protokół obsługiwany przez uC. Widzieliście kiedyś takie cudo?

    Pozdrawiam

  31. Witam czy mogę prosić o podanie jak ustawić bity w formie hex lub grafiki z burn-o-mat.
    Dzięki

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

Proszę pozostawić te dwa pola tak jak są: