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

Zegar + Termometr Arduino - delay()

07 Paź 2013 20:07 9099 7
  • Poziom 7  
    Witam wszystkich. Zmagam się cały czas z pewnym wyzwaniem jakie sobie postawiłem, mianowicie:

    stworzyć własny termometr pokojowy z wyświetlaniem aktualnego czasu.

    Do tego projektu wykorzystałem Arduino Uno oraz podstawowe elementy zawarte w tzw. Starter Kit + wyświetlacz LCD 2x16.

    Chciałbym zadać pytanie, prosić o skromną pomoc w dwóch kwestiach, ponieważ nigdzie nie doszukałem się odpowiedzi na tego typu pytanie.

    Zanim jednak to, przedstawiam dokładnie z czego skorzystałem przy tworzeniu tego cuda.

    1. Termistor MCP9700A
    2. Rejestr przesuwny 74HC595 (sterowanie LCD)
    3. Wyświetlacz LCD 2x16 HD44780
    Do tego oczywiście przyciski do ustawienia zegara wraz z rezystorami 10kOhm a także potencjometr 10kOhm do ustawiania kontrastu LCD oraz przewody i przełącznik do włączania i wyłączania podświetlenia w wyświetlaczu.

    Tak wygląda to w rzeczywistości:
    Zegar + Termometr Arduino - delay()

    A tutaj jest schemat (obrazek poglądowy) stworzony w programie Fritzing
    Zegar + Termometr Arduino - delay()

    Teraz do sedna. Na czym polega problem:

    1. Temperatura. Generalnie problem polega na tym, że przy włączonym podświetleniu LCD spada napięcie z 5V do 4.98V lub 4.97. Przez to również termistor podaje sfałszowane wyniki, ponieważ wartości obliczane są ze wzoru:

    Spoiler:
    temp = (5.0 * mcp)/1024.0;
    temp = temp - 0.5;
    temp = temp / 0.01;


    zgodnie z parametrami samego czujnika (cały kod programu na dole posta).
    Jak można zauważyć również w całym kodzie programu, próbowałem to jakoś zwalczyć, podstawić zamiast 5.0 (oznaczającego napięcie wejściowe) jakąś wartość zmienną w czasie rzeczywistym poprzez analizę na bieżąco napięcia na płytce stykowej. Niestety działy się cuda. W tym momencie w kodzie jest próba zaradzenia przy tym problemie (myślałem o odejmowaniu od temperatury różnicy, która się pojawiała, ale nie jest ona chyba stała). Generalnie cuda na kiju, a i tak nic z tego. I tutaj pytanie, co można zaradzić? Czy ktoś spotkał się z podobnym problemem lub potrafi wyczytać coś więcej ze specyfikacji tego termistora, co mogłoby mi pomóc?

    2. Zegar a Temperatura. Załóżmy (czysto teoretycznie), że wszystko jest w porządku jeśli chodzi o temperaturę. Wyświetla się normalnie, nie ma problemu z napięciem. Chciałbym, aby nie była wyświetlana co sekundę (tak jak to następuje do tej pory) a co 10-15 sekund, jednak chciałbym również, żeby zegar nadal pracował i wyświetlał wartości co do sekundy co sekundę właśnie a nie co 10-15 minut. Próbowałem różnych sposobów, typu rozdzielenie zegara z termometrem i używanie funkcji delay() dla jednego i drugiego osobno, ale w końcu i tak kończyło się to wyświetlaniem co 10-15 sekund całości. Co można zrobić, aby zegar pracował poprawnie przy jednoczesnym wyświetlaniu temperatury w dłuższych odstępach czasowych?

    3. Zegar i jego praca. To już bardziej moja fanaberia, lekkie ubarwienie projektu. Chciałbym zrobić tak, że po włączeniu całego ustrojstwa czas zaczął od razu płynąć już w momencie nastawiania przy jednoczesnej możliwości nastawiania zegara. Widziałem taki patent gdzieś na YouTubie i mnie to mocno zastanawia, jak można coś takiego wykonać. Jeśli ktoś ma pomysł, gotowy projekt na coś takiego i chciałby się podzielić z mniej doświadczonym programistą, chętnie przyjmę pomoc.

    Tutaj jest cały kod programu w Arduino:

    Kod: cpp
    Zaloguj się, aby zobaczyć kod
  • PCBway

  • Poziom 28  
    Poczytaj tutaj oraz tutaj.
    Tutaj masz jeszcze o RTC PCF8583.

    Raz na zawsze zapomnij o:
    - używaniu delay...
    - używaniu float...
  • PCBway
  • Poziom 7  
    Dzięki za odpowiedź. Zapoznam się z tymi tematami. Rzecz w tym, że nie chciałbym dodawać więcej elementów do tego układu i pozostać przy tych, które posiadam. Rozumiem, dlaczego nie używać delay (można korzystać z timerów i wtedy może się to udać) ale dlaczego nie float?

  • Poziom 28  
    faiint napisał:
    ale dlaczego nie float?
    Bo float to zabójstwo zasobów takiego małego 8-io bitowego mikroklocka. A w 99% przypadków obejdzie się bez float. Przeczytaj ten opis odczytu temperatury z czujnika cyfrowego DS18B20 bez użycia liczb zmiennoprzecinkowych. Bardzo ładnie opisane tam jest inne podejście do interpreacji danych z temometru DS18B20 niż z użyciem floatów.

    Oczywiście sprzęt jaki wzmiankuję w swoich wypowiedziach traktuj jedynie informacyjnie. Ważne jest to, abyś zrozumiał istotę jego obsługi na różne sposoby. :)
  • Poziom 7  
    Witam.
    Gdy chcę wgrać program to wyskakuje mi błąd komplikacji.
    Wiecie może co to może być?
  • Poziom 7  
    Podaj komunikat błędu z konsoli.
  • Poziom 7  
    "lcd" was not declared in this scope
  • Poziom 7  
    Zajrzyj sobie tutaj: Link
    i podmień bibliotekę LiquidCrystal zgodnie z opisem. Powinno rozwiązać problem ;)