♦ Thuật toán
Nút mạng thực hiện việc cảm nhận, số hóa và truyền tín hiệu nhiệt độđã số hóa đến nút gốc. Theo cấu trúc phần cứng của CC1010, để tiết kiệm nguồn nuôi, sau mỗi lần phát tín hiệu, ta sẽ đặt nút mạng vào trạng thái Hibernate (ngủ đông). Sau đó lại cho tiếp tục phát. Chu trình hoạt động của nút mạng theo một vòng lặp như sau:
- Phát tín hiệu số hoá của nhiệt độ lấy từ chân AD1.
- Đợi một khoảng thời gian ngẫu nhiên từ 0 đến 250* 8ms (trong lúc này tiến hành ngủđông cho nút mạng).
Hình 4.3: Thuật toán cho nút truyền trường hợp single hop
♦ Chương trình
Sử dụng thư viện hàm nhà sản xuất cung cấp, để có thể đọc và truyền thông tin nhiệt độ ta sử dụng các hàm và đoạn chương trình như sau:
- Đưa lối ra IC LM 61 tới chân AD1, ta dùng khai báo: // ADC setup halConfigADC(ADC_MODE_SINGLE | ADC_REFERENCE_INTERNAL_1_25, CC1010EB_CLKFREQ, 0); ADC_SELECT_INPUT(ADC_INPUT_AD1); ADC_POWER(TRUE); - Địa chỉ được định: #define TBC_MY_SPP_ADDRESS 1 nodeIDs[0] = TBC_MY_SPP_ADDRESS; - Hàm truyền nhiệt được viết như sau:
void tbcTransmit (void) { word xdata temp;
// Khoi dong ADC
ADC_SAMPLE_SINGLE();
temp = ADC_GET_SAMPLE_10BIT(); // Cap nhat bang
txDataBuffer[TBC_TEMP_OFFSET] = (temp >> 8) & 0xFF; txDataBuffer[TBC_TEMP_OFFSET + 1] = temp & 0xFF; nodeTemps[0] = temp;
nodeLastT[0] = (int) sppGetTime(); // Truyen thong tin
sppSend(&TXI);
do { /*nothing*/ } while (sppStatus() != SPP_IDLE_MODE); } // tbcTransmit
- Hàm đợi ngẫu nhiên:
// doi 1 khoang ngau nhien (0 to 255*8=2040) void tbcWaitRandom (void) {
byte xdata time; byte xdata n; time = rand();
for (n = 0; n < waitMultiplier; n++) { halWait (time, CC1010EB_CLKFREQ); }
} // tbcWaitRandom
- Đoạn lặp trong chương trình thể hiện thuật toán: while (TRUE) {
tbcTransmit(); tbcWaitRandom(); }