Ostatnie upały powodują, że mam coraz więcej niekoniecznie mądrych pomysłów. Jednym z nich jest higrometr + termometr zasilany bateryjnie, który chciałbym przedstawić oraz, niejako przy okazji, zadać kilka pytań pomocniczych.
Znaleziony w szufladzie DHT11 służy jako czujnik temperatury oraz wilgotności względnej, zaś dane odczytywane są przez mikrokontroler PIC16F716 w obudowie DIP18. Prezentacja danych realizowana jest wyświetlaczem CBS084A00-TJN. Początkowo chciałem użyć ATtiny2313, ale gdzieś się schowała, a podczas poszukiwań wpadł mi w ręce PIC. Mały, zgrabny i z wylutu (wydaje mi się, że wytargałem go z jakiegoś uszkodzonego chińskiego ekspresu firmy Zelmer). Projektu nie przeniosłem jeszcze na płytkę docelową, ale układ cały czas pracuje na płycie testowej o wdzięcznej nazwie ZEPIC. Przygotowałem już projekt płytki oraz oczywiście schemat ideowy. Tak się prezentuje schemat:
Oraz płytka:
Jak widać projekt jest banalnie prosty. Mikrokontroler taktowany jest zewnętrznym kwarcem o bazowej częstotliwości 12MHz. Początkowo miał być 4MHz, ale okazało się, że obróbka pomiaru szerokości impulsu nie mieściła się w reżimie czasowym ustalonym przez producenta DHT11. Nieużywane piny są zwarte do GND, by uchronić się przed stanami nieustalonymi na nich, a w efekcie zwiększonym poborem prądu.
Ogólna zasada pracy jest nieprzyzwoicie prosta. Po włączeniu zasilania układu, mikrokontroler dokonuje inicjalizacji wyświetlacza, warstwy sprzętowej odpowiedzialnej za odbiór danych z czujnika DHT11, a następnie idzie spać. Po ok. 2.3 sekundy układ jest budzony wbudowanym licznikiem "watchdog". Następuje odczyt danych, a potem ich prezentacja na wyświetlaczu. Następną operacją jest ponowne wprowadzenie mikrokontrolera w stan uśpienia. Czas pracy wynosi 0.025s, a czas snu 2.128s. Na potrzeby pomiarów wprowadziłem do układu dodatkowy pin, na którym wystawiany jest stan wysoki tuż po przebudzeniu, a przed drzemką stan zmieniany jest z powrotem na stan niski.
Zasilanie układu jest dowolne, ale pod warunkiem, że jego napięcie będzie wynosiło nieco ponad 3V. Początkowo celowałem w dwie bateryjki AA lub AAA, ale po zmianie kwarcu z 4MHz na 12MHz należy nieco podnieść napięcie (zgodnie z dokumentacją mikrokontrolera). Póki co mam jakieś trzy akumulatorki NiMH o łącznym napięciu 3.6V, więc się tym nie przejmuję. Po zakupie koszyka na dwie bateryjki AA lub AAA wykonam testy działania na napięciu 3V.
Program napisałem oczywiście w języku C, a pętla główna jest mało ciekawa, bo niemal pusta. Wygląda ona mniej więcej tak:
Kod: Zaznacz cały
/* Uncomment the following line to measure mcu wake up time on RB0 pin. */
//#define APP_DEBUG
/* Function shows data collected by DHT11 sensor. */
void ShowData(DHT_DataType *data);
/* DHT11's data container. */
DHT_DataType dht;
int main(void)
{
#ifdef APP_DEBUG
/* Debug pin configuration. */
TRISB &= ~_TRISB_TRISB0_MASK;
#endif /* APP_DEBUG */
/* LCD initilization. */
CBS084A00_Init();
/* Display "*C". */
CBS084A00_SetDigitValue(2, 11);/* Degree sign. */
CBS084A00_SetDigitValue(1, 12);/* 'C' letter. */
/* Display "rH". */
CBS084A00_SetIcons(CBS084A00_Icons_H1, CBS084A00_State_Enabled);
CBS084A00_SetIcons(CBS084A00_Icons_R, CBS084A00_State_Enabled);
/* DHT11 initialization. */
DHT_Init();
/* Enable global & peripheral interrupts. */
INTCON = _INTCON_GIE_MASK | _INTCON_PEIE_MASK;
while(true)
{
/* Clear watchdog. */
CLRWDT(); /* <--- good practice. */
/* Sweet dreams... */
SLEEP();
#ifdef APP_DEBUG
PORTB |= _PORTB_RB0_MASK;
#endif /* APP_DEBUG */
/* Collect data from DHT11 sensor. */
DHT_GetData(&dht);
/* Prepare & show collected data. */
ShowData(&dht);
#ifdef APP_DEBUG
PORTB &= ~_PORTB_RB0_MASK;
#endif /* APP_DEBUG */
}
}
No i jeszcze efekt działania całego układu:
A teraz pytania:
1. Czy do układu mam jeszcze dołożyć jakąś filtrację?
2. Macie jakieś sprawdzone metody obliczania zapotrzebowania układu na energię, czy do każdego projektu trzeba podchodzić indywidualnie?
3. Lepiej nieużywane piny zwierać na zewnątrz do GND lub VCC, czy raczej w programie ustalać kierunek wyjściowy pinów oraz wymuszać na nich stan? Producent mikrokontrolera wspomina jedynie, by ustalić stan, ale nie określa konkretnej metody.
Może macie jakieś sugestie, wskazówki... Chętnie je "przyjmę na klatę".