Úvod
Protože jádrem modulu IQRF je procesor PIC16F88 je možné využít jeho AD převodníku k měření analogových veličin. Jednou z nich může být také analogový výstup teploměr MCP9700, který je osazen vedle procesoru. V tomto případě se ovšem nemusíme starat o režii při převodu, protože systém IQRF již obsahuje funkci pro vzorkování a konverzi analogové veličiny z teploměru.
Měření teploty
Jak už bylo uvedeno, pro zjištění hodnoty výstupního napětí teploměru využijeme připravenou funkci systému. Přepočet si ovšem již musíme provést sami, výrobce však na svém webu uvádí příklad, takže jej stačí využít ve vlastní aplikaci:
getTemperature(); teplota.high = ADRESH&0x03; teplota.low8 = ADRESL; teplota *= 75; teplota >>= 8; teplota -= 50;
První řádek provede nastavení převodníku a samotnou konverzi. Další dva přesunou desetibitovou hodnotu z převodníku do proměnné teplota (8 bitů nižšího bajtu + 2 bity s vyššího bajtu)
Více zajímavé jsou další tři řádky. Pokusím se odvodit postup, jakým asi došli lidé z Microriscu k uvedenému vzorci:
- Teploměr MPC7900 má na výstupu napětí úměrné teplotě a to podle vzorce: TA = (VOUT – 0,5V) / 10mV.
- Při napájecím napětí 3V bude vzorec pro výpočet napětí na vstupu převodníku: VIN = 3/1024*ADR
- Pak můžeme dosadit druhou rovnici do první:
- TA = (3/1024*ADR – 0,5) / 10mV
- TA = 300/1024*ADR – 50
- TA = 75/256*ADR – 50
Stejného výsledku bychom dosáhli samozřejmě dosazením do obou původních rovnic, takto je však výpočet rychlejší a jednodušší.
Kompletní zdrojový kód pro bezdrátový přenos hodnoty teploty je uveden zde:
#include "includes/template-basic.h" void APPLICATION() { uns16 teplota; DLEN = 5; while (1) { clrwdt(); getTemperature(); teplota.high8 = ADRESH&0x03; teplota.low8 = ADRESL; teplota *= 75; teplota >>= 8; teplota -= 50; bufferRF[0] = teplota.low8/10; bufferRF[0] += '0'; bufferRF[1] = teplota.low8%10; bufferRF[1] += '0'; bufferRF[2] = 'C'; RFTXpacket(); waitDelay(100); } }
Měření napájecího napětí
Pro měření napájecího napětí již výrobce nepřipravil žádné zjednodušení, ovšem ani tato činnost nevyžaduje mnoho úsilí, musíme však již otevřít katalogový list a nastavit registry procesoru. Těmito registry jsou:
- ANSEL (Nastavení vstupního pinu jako Analogový vstup)
- ADCON0 (Řídící registr 0 pro A/D převodník)
- ADCON1 (Řídící registr 1 pro A/D převodník)
#include "includes/template-basic.h" void APPLICATION() { uns8 pomi; DLEN = 3; while (1) { clrwdt(); ANSEL.1 = 1; ADCON0 = 0b0100.1001; ADCON1 = 0b1000.0000; _OUT2 = 1; waitDelay(1); GO = 1; while(GO); _OUT2 = 0; bufferRF[0] = ADRESH; bufferRF[1] = ADRESL; bufferRF[2] = ' '; RFTXpacket(); waitDelay(100); } }
Dle katalogového listu lze takto měřit úbytek na rezistoru k LED modulu. Klesne-li napájecí napětí pod úroveň zaručující správnou funkci stabilizátoru, klesá postupně i toto napětí.
Bohužel výrobce modulů zřejmě nemyslel na to, že by uživatel chtěl měřit i jiné analogové signály a tak nejsou na konektoru vyvedeny další piny, které by sloužily jako vstup AD převodníku. Snad v některé z dalších verzí.
Komunikujeme
Jako vysílač můžeme použít desku vysílače uvedenou v minulém díle. Jako přijímač si dnes uvedeme jinou destičku s převodníkem MAX232. Zapojení není dle mého názoru nutné podrobně popisovat, protože se jedná o katalogové zapojení převodníku.
Rozpiska součástek pro přijímač:
J1,10 kolíková lámací lišta S1G02 J3 CAN9 zásuvka úhlová C1 Kondenzátor E2M2/100V C2, C5 Kondenzátor keramický 100nF/50V SMD 1206 C6 - C9 Kondenzátor tantalový SMD[A], 1u R1 rezistor SMD 1206, 1k U1 integrovaný stabilizátor LE33CZ U2 Konektor KON-SIM-01 U4 MAX232, SO16
Softwarová část pro přijímač se také již neobejde bez znalosti některých registrů procesoru PIC a to kvůli nastavení UARTU, které není dosud v modulech IQRF podporováno přímo systémem (na rozdíl od SPI (slave) a I2C (slave). Především bude nutné UART nastavit:
void enableUART() { TRISB.2 = 1; // nastaví pin jako vstupní (RX) TRISB.5 = 0; // nastaví pin jako výstupní (TX) SPBRG = 51; // 9600 baud @ 8MHz TXSTA = 0b00100100; // vysílač: 8bit, tx enabled, async uart RCSTA = 0b10010000; // přijímač: enable port, 8bit }
Dále je nutné napsat funkci pro odeslání bajtu:
void TxByteUART(uns8 TxByte) {
TXREG = TxByte;
while (TXIF == 0); // dokud není odvysílán bajt
}
Nyní je již možné vytvořit program, který vše co příjme vzduchem odešle UARTem ven:
#include "includes/template-basic.h" void enableUART(void); void TxByteUART(uns8); #pragma optimize 1 void APPLICATION() { WDTCON = 0b0000.1111; OPTION |= 0b0000.1111; enableUART(); while (1) { clrwdt(); if (RFRXpacket()) { TxByteUART (bufferRF[0]); TxByteUART (bufferRF[1]); TxByteUART (bufferRF[2]); TxByteUART (0x0A); pulseOUT2(); clearBufferINFO(); copyBufferINFO2RF(); } } }
Program samozřejmě poslouží stejně dobře také pro ladění jakékoliv jiné RF komunikace (například ovladač uvedený v minulém díle).
Veškeré podklady a programy jsou ke stažení pod tímto textem. Příště si ukážeme jak na síťovou komunikaci
DOWNLOAD & Odkazy
- IQRF Prafkticky I
- IQRF Prafkticky III
- IQRF Prafkticky IV
- IQRF Prafkticky V
- IQRF moduly v HW Shopu
- Domovská stránka projektu IQRF - http://www.iqrf.com/
- Domovská stránka MICRORISC s.r.o. - http://www.microrisc.com/
- prijimacUART.pdf (12,7 KB)
- Zdrojový kód - teploměr
- Zdrojový kód - napájení
- IQRF_desticky.zip (9.07 KB)
- Inteligentní bezdrátová pojítka? Ano – IQRF
- TEST modulů IQRF - miniaturní vestavná radiová komunikace
... nejenom moduly, ale vse, co je treba k vytvoreni chytrejsich bezdratovych reseni