Data Logger - rejestrator temperatury lub napięcia

Data Logger - rejestrator temperatury lub napięcia
Pobierz PDF Download icon
Data Logger jest uniwersalnym bankiem danych zasilanym z baterii. Pozwala na zapisywanie na karcie SD informacji z czujnika temperatury oraz z dwóch napięciowych wejść analogowych. Ma wbudowany układ ładowania baterii za pomocą USB. Dodatkowo, wyposażono go w zegar czasu rzeczywistego. Pełna konfiguracja urządzenia odbywa się za pomocą zmian w pliku konfiguracyjnym zapisanym na karcie SD. Rekomendacje: urządzenie przyda się do monitorowania temperatury lub innych parametrów środowiskowych zamienionych na napięcie (albo samego napięcia w zakresie 0...15 V lub 0...40 V).

Rysunek 1. Schemat ideowy Data Loggera

Schemat ideowy rejestratora pokazano na rysunku 1. Urządzenie jest zasilane za pomocą baterii litowo-jonowej o pojemności 1800 mAh z telefonu komórkowego. Napięcie zasilania płytki rejestratora mieści się w zakresie 3,1...4,2 V. Dla uproszczenia budowy rejestratora i ze względu na charakter zasilania dostarczanego przez akumulator, nie zastosowano stabilizatora scalonego.

Po dołączeniu baterii na stałe jest zasilany tylko układ zegara RTC - U6 (PCF8583T), dzięki czemu nie trzeba po każdym włączeniu urządzenia ustawiać daty i godziny. Pobór prądu przez ten układ jest znikomy i wynosi jedynie 50 mA. Reszta urządzenia jest zasilana za pośrednictwem wyłącznika.

Sercem rejestratora jest mikrokontroler ATmega32A taktowany za pomocą wewnętrznego oscylatora RC o częstotliwości 1 MHz. Do sygnalizowania jego statusu służą dwie diody LED przyłączone do mikrokontrolera. Trzecią diodę dołączono do wyjścia PROG układu scalonej ładowarki akumulatorów LiIon - MCP73831.

Rysunek 2. Nagłówki dodawane w pliku CSV

Służy ona do sygnalizowania stanu ładowania baterii (dioda świeci się podczas ładowania baterii, a po jej naładowaniu gaśnie). Ładowarka jest zasilana za pośrednictwem gniazda mini USB. Rolę czujnika temperatury pełni DS18B20 firmy Maxim-Dallas dołączany do mikrokontrolera poprzez interfejs 1-Wire.

Algorytm działania programu pokazano na rysunku 2.

Listing 1. Konwersja wartości odczytanej z przetwornika na napięcie

Do wejścia przetwornika A/C doprowadzono napięcie zasilające. Gdy jego wartość osiągnie wartość 3,1 V, rejestrator wyłącza się (mikrokontroler jest wprowadzany w tryb Power Down). Ten mechanizm ma na celu ochronę akumulatora zasilającego przed zbyt głębokim rozładowaniem. Jeśli dojdzie do wyłączenia zasilania, to należy po prostu naładować akumulator oraz wyłączyć i włączyć zasilanie za pomocą wyłącznika, co spowoduje restart mikrokontrolera.

Na pinie zasilającym część analogową mikrokontrolera (AVCC) zastosowano filtr LC. Dla poprawienia dokładności pomiarów zastosowano zewnętrze źródło napięcia odniesienia - jego rolę pełni układ U5. Jego napięcie wyjściowe wynosi 2,5 V z dokładnością 1%.

Pomiar napięcia baterii zasilającej odbywa się poprzez dzielnik napięcia z dwóch rezystorów 10 kV/1%, dzięki czemu w skrajnym wypadku (4,2 V) napięcie na wejściu przetwornika nie przekracza 2,5 V, tj. napięcia maksymalnego.

Pozostałe dwa kanały, do których można dołączyć napięcia z zakresu 0...40 V i 0...15 V również dołączone są przez dzielniki, ale o innym stopniu podziału (150 kΩ/10 kΩ oraz 10 kΩ/2 kΩ). Dla kanału pierwszego współczynnik podziału wynosi 15, natomiast dla drugiego 5. Są to liczby całkowite, dzięki czemu łatwo je zaimplementować przy przeliczaniu wartości z przetwornika na rzeczywiste napięcie (listing 1).

W pętli głównej mikrokontroler odczytuje reprezentację napięcia z przetwornika, natomiast jej zamiana na napięcie odbywa się przed zapisem na karcie SD.

Listing 2. Procedura odczytu pliku konfiguracyjnego

Do rejestrowania danych zastosowano kartę SD. Do obsługi programowej wykorzystano bibliotekę FATFs dostępną na stronie internetowej http://elm-chan.org/. Wszystkie informacje są zapisywane w pliku DATA.CSV. Dzięki zachowaniu formatu CSV plik można otworzyć np. za pomocą arkusza kalkulacyjnego i w prosty sposób dokonać ich interpretacji.

W związku z tym, że w urządzeniu nie zostały zastosowane żadne elementy interfejsu użytkownika umożliwiające jego skonfigurowanie, odbywa się ono za pomocą pliku zapisywanego na karcie SD. W ten sposób można ustawić: datę, godzinę, częstotliwość wykonywania pomiarów, wykorzystywane kanały pomiarowe.

Aby dokonać konfiguracji, należy na karcie SD utworzyć plik config.txt. Jego odczyt jest wykonywany tylko raz, przy włączeniu urządzenia. Na listingu 2 przedstawiono procedurę odczytu pliku konfiguracyjnego. Rozpoczyna się ona od sprawdzenia, czy włożono kartę SD do gniazda. Jeśli tak (warunek CD_ON jest spełniony), to rozpoczyna się inicjalizacja karty. Następnie polecenie f_open otwiera plik config.txt, jeśli ten istnieje.

Gdy wszystkie warunki zostaną spełnione, parametr f_err_code zwraca wartość FR_OK. Jeżeli ten warunek nie zostanie spełniony, czyli użytkownik nie wgra pliku konfiguracyjnego na kartę, program pobierze dane konfiguracyjne z pamięci EEPROM. Jeśli jednak taki plik istnieje, zaczyna się odczyt danych. Polecenie f_lseek ustawia kursor odczytu na samym początku pliku.

Listing 3. Struktura zmiennej z konfiguracją

Polecenie f_gets do zmiennej znakowej rok odczytuje całą linię, aż do znaków CR+LF, czyli dwa bajty danych (np: 14 oznaczający rok 2014) oraz bajt końca linii. Następnie polecenie f_lseek przesuwa kursor o dwa bajty, na kolejną linię, w której podano miesiąc. W ten sam sposób odczytywane są parametry: dzień, godzina, minuta, częstotliwość zapisu (s1) oraz wybrane kanały (s2). Następnie plik jest zamykany.

W związku z faktem, że wykorzystane dane mają być m.in. przesłane do układu RTC, muszą zostać przekonwertowane na liczbę. Do tego celu wykorzystano funkcję atoi() zawartą w bibliotece stdlib.h. Wszystkie dane są konwertowane na typ uint8_t. Informacje, takie jak: rok, częstotliwość zapisu, wybrane kanały są zapisywane w pamięci EEPROM.

Rysunek 3. Schemat montażowy Data Loggera

Aby łatwo zapamiętać te dane w pamięci EEPROM, zdefiniowano strukturę pokazaną na listingu 3. Ta sama struktura służy do utworzenia zmiennej w pamięci RAM, dzięki czemu można po prostu skopiować konfigurację z EEPROM do RAM.

Po konwersji zmiennych odbywa się sprawdzenie, czy użytkownik wprowadził poprawne dane. Jeśli nie, program samodzielnie ustawia wartości domyślne. Kolejnym krokiem jest zapisanie danych w pamięci EEPROM oraz przesłanie nastaw do zegara RTC. Następnie w instrukcji switch odbywa się ustawienie częstotliwości zapisu danych na kartę SD.

W zależności od wprowadzonej wartości zmiennej ram_ dane.s1_d jest ustawiana wartość zmiennej f_zapisu, która to jest porównywana ze zmienną flaga_licznik. Ta zmienna jest zwiększana co 1 sekundę przez procedurę obsługi przerwania zewnętrznego INT1. Źródłem przerwania jest wyjście INT układu zegara RTC.

Wykaz elementów

Rezystory: (SMD 0805)
R1: 10 kΩ
R2: 820 Ω
R3: 2 kΩ
R7: 2 kΩ/1%
R4: 470 Ω
R6: 150 kΩ/1%
R5, R8, R12, R13: 10 kΩ/1%
R11: 820 Ω
R10, R14, R15: 100 kΩ

Kondensatory:
C1, C2: 33 µF/16 V (SMD)
C3...C5: 100 nF (SMD 0805)
C6: 10 µF/16 V
C7, C9: 22 pF (SMD 0805)
C8: 10 µ/16V (SMD)

Półprzewodniki:
U1: ATmega32A (SMD)
U2: MCP73831
U4: DS18B20
U5: MCP1525
U6: PCF8583T
LED1: dioda LED SMD, czerwona
LED2: dioda LED SMD, zielona
LED3: dioda LED SMD, niebieska

Inne:
L1: dławik 10 µH
Y1: kwarc 32,768 kHz
X1: gniazdo MINI-USB, SMD
X2: złącze ARK3
U3: złącze karty SD
Przełącznik HSS1260R

Listing 4. Procedura wprowadzania mikrokontrolera w stan głębokiego uśpienia Power Down

Jak wspomniano, na początku pętli głównej programu jest mierzone napięcie zasilania i jest podejmowana decyzja o wyłączeniu urządzenia lub dalszej pracy. Na listingu 4 pokazano procedurę wprowadzania mikrokontrolera w stan głębokiego uśpienia Power Down. Funkcja sd_pwr() wyłącza zasilanie karty SD.

Najpierw linie SPI są ustawiane, a następnie jest wyłączane zasilanie poprzez wyzerowanie pinu PD2 sterującego tranzystorem T1 pełniącego rolę włącznika zasilania karty (zależnie od argumentu funkcji można kartę włączyć - argument 1, lub wyłączyć - argument 0). Następnie funkcja uspienie_low_bat wprowadza procesor w stan uśpienia.

Kolejnym krokiem w pętli głównej jest porównywanie wartości zmiennych flaga_licznik i f_zapisu. Jeśli te zmienne są równe, to rozpoczyna się procedura zapisu danych na karcie SD. Po pierwszym uruchomieniu program tworzy lub otwiera plik DATA.csv, a następnie dodaje w nim nagłówki, co pokazano na rysunku 2. W kolejnych liniach pliku program zapisuje rekordy.

Listing 5. Zapis danych na karcie SD w jednym z trybów pracy

To, jakie dane zostaną zapamiętane zależy od wybranego trybu pracy. Użytkownik ma do wyboru 7 trybów zapisu danych. Na listingu 5 pokazano jeden z nich. Na początku wywołana jest funkcja card_init(), która zapisuje aktualną godzinę oraz inicjalizuję kartę. Tu również zostaje włączona na czas zapisu dioda LED2. Następnie, kolejną zapisywane są:

  • wartość napięcia zasilającego,
  • wartość napięcia na wejściu kanału pierwszego,
  • wartość napięcia na wejściu kanału drugiego
  • temperatura otoczenia.

Na końcu jest zapisywany znak nowej linii.

Krótkie, naprzemienne błyskanie diod LED2 i LED3 oznacza brak możliwości zapisu na karcie.

Konfiguracja urządzenia

Na karcie SD należy utworzyć plik tekstowy o nazwie config.txt i wprowadzić następujące dane:

Linie 1...3 zawierają datę w kolejności: rok, miesiąc, dzień.
Linie 4...5 zawierają godzinę w kolejności: godzina, minuty.
Linia 6 zawiera częstotliwość zapisu.

Np. dla okresu zapisu równego 10 minut, w szóstej linii pliku wpisujemy liczbę „6”. Linia 7 zawiera wybrane kanały pomiarowe.


Montaż i uruchomienie

Fotografia 4. Kabel używany do programowania

Schemat montażowy rejestratora pokazano na rysunku 3. Jego montaż jest typowy i nie wymaga szczegółowego omawiania.

Po zamontowaniu wszystkich komponentów należy sprawdzić czy działa układ ładowania. W tym celu do gniazda USB należy doprowadzić napięcie z interfejsu USB komputera PC lub dołączyć do niego ładowarkę telefonu komórkowego.

Rysunek 5. Wyprowadzenia interfejsu karty SD

Jeśli zaświeci się dioda LED1, to bateria ładuje się i układ ładowania działa poprawnie. Następnym krokiem jest zaprogramowanie mikrokontrolera. Jeśli nie dysponujemy podstawką do programowania układów w obudowie TQFP44, należy wykonać kabel do programowania. Jego przykładowy wygląd pokazano na fotografii 4.

Karta SD jest połączona z mikrokontrolerem za pomocą sprzętowego interfejsu SPI. Dzięki temu na złączu karty są wyprowadzone linie do programowania.

Jedyną linią niewykorzystywaną w interfejsie karty SD jest RESET i dlatego na płytce drukowanej utworzono pole nazwie RST. Na rysunku 6 pokazano wyprowadzenia karty SD wykorzystywane do programowania mikrokontrolera.

Rysunek 6. Wykres napięcia zasilania w funkcji czasu

Po zaprogramowaniu mikrokontrolera, po załączeniu zasilania powinna zaświecić się dioda LED2. Jeśli tak się jest, to układ jest gotowy do pracy. Przy pierwszym uruchomieniu należy wgrać na SD plik config.txt, ponieważ EEPROM jest czysty. Bez tych ustawień układ nie zadziała. Aby dokładnie ustawić czas układu PCF8583, należy po zapisaniu pliku na karcie włączyć zasilanie 1 sekundę przed ustawioną godziną i minutą.

Ta procedura jest konsekwencją początkowego opóźnienia przy starcie programu. Dla przykładu, gdy ustawimy godzinę 18:34, włączamy układ o godzinie 18:33:59. Program zaczyna pracę po ok. 4 sekundach od uruchomienia. Sekwencja startowa wygląda następująco: Po przełączeniu przełącznika ON/OFF na sekundę zapali się dioda LED2, następnie zapali się na 3 sekundy dioda LED3. Gdy zgaśnie układ zaczyna rejestrowanie.

Układ w trybie czuwania pobiera prąd o natężeniu ok. 2,5 mA, natomiast w trakcie zapisu ok. 20 mA. Zapis danych na karcie trwa mniej niż 100 ms. Przy pojemności akumulatora wynoszącej 1200 mAh układ pracuje w sposób ciągły przez ok. 3 doby. Przy włączniku ustawionym w pozycji OFF układ pobiera prąd o natężeniu ok. 50 mA. Wtedy działa tylko układ RTC PCF8583.

Po wejściu w tryb Power Down rejestrator pobiera ok 0,7 mA, ponieważ wszystkie rezystory podciągające są podłączone do baterii poprzez włącznik. Na rysunku 6 przedstawiono wykres napięcia zasilania w funkcji czasu w przeciągu 12 godzin, przy włączonym trybie zapisu wszystkich danych co 1 sekundę.

Piotr Rosenbaum
piotr.rosenbaum@gmail.com

Artykuł ukazał się w
Grudzień 2014
DO POBRANIA
Pobierz PDF Download icon
Materiały dodatkowe
Zobacz też
Elektronika Praktyczna Plus lipiec - grudzień 2012

Elektronika Praktyczna Plus

Monograficzne wydania specjalne

Elektronik styczeń 2020

Elektronik

Magazyn elektroniki profesjonalnej

Raspberry Pi 2015

Raspberry Pi

Wykorzystaj wszystkie możliwości wyjątkowego minikomputera

Świat Radio styczeń 2020

Świat Radio

Magazyn użytkowników eteru

APA - Automatyka Podzespoły Aplikacje styczeń 2020

APA - Automatyka Podzespoły Aplikacje

Technika i rynek systemów automatyki

Elektronika Praktyczna styczeń 2020

Elektronika Praktyczna

Międzynarodowy magazyn elektroników konstruktorów

Praktyczny Kurs Elektroniki 2018

Praktyczny Kurs Elektroniki

24 pasjonujące projekty elektroniczne

Elektronika dla Wszystkich styczeń 2020

Elektronika dla Wszystkich

Interesująca elektronika dla pasjonatów