Ÿç„¡ç·šé€šä¿¡
é …ç›® | 内容 |
---|---|
機能 | 1行目:年月日を表示ã—ã¾ã™ã€‚ 2行目:時分秒を 表示ã—ã¾ã™ã€‚ 3行目:温度1を表示ã—ã¾ã™ã€‚(表示器上ã®æ¸©åº¦ã‚’表示ã—ã¾ã™ã€‚以å‰è£½ä½œã—ãŸæ¸©åº¦è¨ˆã¨åŒæ§˜ã§ã™ã€‚) 4行目:温度2を表示ã—ã¾ã™ã€‚(温度センサã‹ã‚‰ã®æ¸©åº¦ã‚’表示ã—ã¾ã™ã€‚) 温度1ã¯ä»¥å‰è£½ä½œã—ãŸæ¸©åº¦è¨ˆã¨åŒæ§˜ï¼‘秒毎ã«æ›´æ–°ã—ã¾ã™ã€‚ 温度2ã¯æ¸©åº¦ã‚»ãƒ³ã‚µã‹ã‚‰ãƒ‡ãƒ¼ã‚¿ãŒããŸã¨ãã«æ›´æ–°ã—ã¾ã™ã€‚ 年月日時分秒ã®èª¿æ•´ãŒã§ãã¾ã™ã€‚(以å‰è£½ä½œã—ãŸæ¸©åº¦è¨ˆã¨åŒæ§˜ã§ã™ã€‚) 表示器ã¨æ¸©åº¦ã‚»ãƒ³ã‚µã¯ï¼¸ï¼¢ï½…ï½…ã§é€šä¿¡ã—ã¾ã™ã€‚(温度センサã‹ã‚‰è¡¨ç¤ºå™¨ã¸ä¸€æ–¹å‘ã®é€šä¿¡ã§ã™ã€‚) 表示器ã¯ã‚³ãƒ¼ãƒ‡ã‚£ãƒãƒ¼ã‚¿ãƒ¼ã«è¨å®šã—ã¾ã™ã€‚ 温度センサã¯ã‚¨ãƒ³ãƒ‰ãƒ‡ãƒã‚¤ã‚¹ã«è¨å®šã—ã¾ã™ã€‚ |
é›»æº | 3.3Vã§å‹•ä½œã•ã›ã¾ã™ã€‚今回ã¯DC3.3Vã®ACアダプタを使用ã—ã¾ã™ã€‚ |
LCD | å½¢å:SC2004CS 表示:2ï¼æ–‡å—X4行 データ:4ビットモードã§ä½¿ç”¨ã—ã¾ã™ã€‚ 3.3V動作用 |
マイコン | ATmega328 |
温度センサ | 温度センサã¯LM61CIZを使用ã—ã¾ã™ã€‚ ADコンãƒãƒ¼ã‚¿ã®åŸºæº–é›»æºã¯ã‚·ãƒ£ãƒ³ãƒˆãƒ¬ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚¿TL451を使用ã—ã¾ã™ã€‚ |
LCD制御 | CHANã•ã‚“ã®EZ-LCDを使用ã—ã¾ã™ã€‚ |
XBee | XB24-Z7CIT-004 |
é …ç›® | 内容 |
---|---|
機能 | 10秒毎ã«æ¸©åº¦è¨ˆæ¸¬ãƒ‡ãƒ¼ã‚¿ã‚’ç„¡ç·šã§é€ä¿¡ã—ã¾ã™ã€‚ é€ä¿¡ã®ã¿ã¨ã—ã¾ã™ã€‚ |
é›»æº | é›»æ± 2本(3V)ã§å‹•ä½œã•ã›ã¾ã™ã€‚ |
温度センサ | 温度センサã¯LM61CIZを使用ã—ã¾ã™ã€‚ |
XBee | XB24-Z7CIT-004 |
å称 | å½¢å | メーカ | 購入先 | æ•°é‡ |
---|---|---|---|---|
LCD | SC2004CS(3.3V用) | 秋月電å | 1 | |
マイコン | ATmega328 | アトメル | 秋月電å | 1 |
抵抗 | 10kΩ 1/4W | 秋月電å | 4 | |
åŠå›ºå®šæŠµæŠ— | 10kΩ | 秋月電å | 1 | |
押ã—ボタンスイッム| 赤色タクトスイッム| 秋月電å | 1 | |
押ã—ボタンスイッム| 黄色タクトスイッム| 秋月電å | 1 | |
押ã—ボタンスイッム| 緑色タクトスイッム| 秋月電å | 1 | |
温度センサ | LM61CIZ | ナショセミ | 秋月電å | 1 |
シャントレギュレータ | TL431ACZ | 秋月電å | 1 | |
XBee | XB24-Z7CIT-004 | スイッãƒã‚µã‚¤ã‚¨ãƒ³ã‚¹ | 1 |
å称 | å½¢å | メーカ | 購入先 | æ•°é‡ |
---|---|---|---|---|
温度センサ | LM61CIZ | ナショセミ | 秋月電å | 1 |
XBee | XB24-Z7CIT-004 | スイッãƒã‚µã‚¤ã‚¨ãƒ³ã‚¹ | 1 |
è¨å®šé …ç›® | è¨å®šå€¤ (16進) |
内容 | |
---|---|---|---|
FUNCTION SET | ZIGBEE COORDINATOR API | ||
Networking | PAN ID | 10 | 温度センサã®PAN IDã¨ä¸€è‡´ã—ã¦ã„ã‚Œã°ä»»æ„ã§å¯ã€‚ ãŸã ã—'0'以外ã¨ã—ã¾ã™ã€‚ |
è¨å®šé …ç›® | è¨å®šå€¤ (16進) |
内容 | |
---|---|---|---|
FUNCTION SET | ZIGBEE END DEVICE AT | ||
Networking | PAN ID | 10 | 表示器ã®PAN IDã¨ä¸€è‡´ã—ã¦ã„ã‚Œã°ä»»æ„ã§å¯ã€‚ ãŸã ã—'0'以外ã¨ã—ã¾ã™ã€‚ |
Sleep Mode | SM-Sleep Mode | サイクリック スリープ | |
ST-Time before Sleep | 7D0 | 2秒間起ãã¦ã„ã¾ã™ã€‚(動作ä¸ï¼‰ | |
SP-Cyclic Sleep Period | 20 | 320ms毎ã«å—信確èªã‚’ã™ã‚‹ã€‚ | |
SN-Number of Cyclic to power don IO | 19 | 320ms毎ã«25回å—信確èªã—ã¾ã™ã€‚ 従ã£ã¦ã‚¹ãƒªãƒ¼ãƒ—時間ã¯25回 X 320ms = 8秒ã§ã™ã€‚ ãã®å¾Œã€2秒間起ãã¦ã„ã¾ã™ã€‚ |
|
I/O Settings | D1-AD1/DIO1 Configuration | 2 | 2:ADCã€DI01端åã‚’ADC入力ã«ã™ã‚‹ã€‚ |
PR-Pull-up Resistor Enable | 1FF7 | AD1ã®ãƒ—ルアップをç¦æ¢ã—ã¾ã™ã€‚ | |
I/O Sampling | IR-IO Sampling Rate | 7D1 | 2001msã«è¨å®šã€1回ADサンプリングを行ã„ã¾ã™ã€‚ ( ST / IR + 1 )回サンプリングを行ã„ã¾ã™ã€‚ |
フレーム・フィールド | コード(16進) | ãƒã‚¤ãƒˆæ•° | 備考 |
---|---|---|---|
開始コード | 7E | 1 | |
データ長 | 0014 | 2 | コマンドIDã‹ã‚‰ãƒã‚§ãƒƒã‚¯ã‚µãƒ ç›´å‰ã¾ã§ã®ãƒã‚¤ãƒˆæ•° |
コマンドID | 92 | 1 | データãŒå—ä¿¡ |
64ビットアドレス | 0013A200407798BB | 8 | é€ä¿¡å…ƒã®ã‚¢ãƒ‰ãƒ¬ã‚¹ |
16ビットアドレス | 3FFE | 2 | é€ä¿¡å…ƒã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã€‚é€ä¿¡å…ƒãŒã‚³ãƒ¼ãƒ‡ã‚£ãƒãƒ¼ã‚¿ã®ã¨ãã¯ã‚ªãƒ¼ãƒ«'0'。 |
å—信オプション | 41 | 1 | |
サンプル数 | 01 | 1 | |
デジタルãƒãƒ£ãƒ³ãƒãƒ« | 0001 | 2 | デジタルãƒãƒ£ãƒ³ãƒãƒ«ã®ä½¿ç”¨ãƒ“ット。ビット0を使用ã—ã¦ã„ã‚‹(DIO0)。 |
アナãƒã‚°ãƒãƒ£ãƒ³ãƒãƒ« | 02 | 1 | アナãƒã‚°ãƒãƒ£ãƒ³ãƒãƒ«ä½¿ç”¨ãƒ“ット。ビット1を使用ã—ã¦ã„ã‚‹(AD1)。 |
デジタルãƒãƒ£ãƒ³ãƒãƒ«ãƒ‡ãƒ¼ã‚¿ | 0001 | 2 | デジタルãƒãƒ£ãƒ³ãƒãƒ«ã®ãƒ‡ãƒ¼ã‚¿ã€‚ビット0ãŒ1 |
アナãƒã‚°ãƒãƒ£ãƒ³ãƒãƒ«ãƒ‡ãƒ¼ã‚¿ | 02E8 | 2 | アナãƒã‚°ãƒãƒ£ãƒ³ãƒãƒ«ã®ãƒ‡ãƒ¼ã‚¿ã€‚ãƒãƒ£ãƒ³ãƒãƒ«æ•°ã«å¿œã˜ã¦ãƒ‡ãƒ¼ã‚¿ãŒç¶šã。 AD1ã®ãƒ‡ãƒ¼ã‚¿ãŒ02E8。 |
ãƒã‚§ãƒƒã‚¯ã‚µãƒ | 41 | 1 |
/* * Temp.c * * Created: 2012/07/16 * Author: YoshioNakamura * 温度計測çµæžœã‚’ç„¡ç·šã§é€ã‚Šè¡¨ç¤ºã™ã‚‹ã€‚ * LCDã®åˆ¶å¾¡ã¯ChaNã•ã‚“ã® "EZ-LCD - Generic control module for HD44780" LCDCを使用 * XBeeã¯ã€ŒCQ出版超ãŠæ‰‹è»½ç„¡ç·šãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«XBeeã€ã‹ã‚‰å¼•ç”¨ */ # define F_CPU 1000000UL #include <avr/io.h> #include <avr/interrupt.h> #include <avr/sleep.h> #include "hd44780.h" #include <util/delay.h> // 時計 #define RED 0x20 // 赤スイッム#define YELLOW 0x10 // 黄スイッム#define GREEN 0x08 // 緑スイッム#define MODE (RED | YELLOW) // 時計変更モード #define SWON (RED | YELLOW | GREEN) // å…¨ã¦ã®ã‚¹ã‚¤ãƒƒãƒãŒON // 温度計 #define LM61_ON PORTC |= 1 << PORTC2 // LM61é›»æºON #define LM61_OFF PORTC &= ~(1 << PORTC2) // LM61é›»æºOFF #define ADC_ON ADCSRA |= (1 << ADEN) // adcè¨±å¯ #define ADC_OFF ADCSRA &= ~(1 << ADEN) // adcåœæ¢ #define ADC_START ADCSRA |= 1 << ADSC // adcスタート #define V_REF 2480 // レファレンス電圧 // 通信 #define RXBUF_SIZE 30 // å—信データ数 #define XBEE_REF 1200 // XBeeã®æ¸©åº¦ãƒ‡ãƒ¼ã‚¿ã®ãƒ¬ãƒ•ã‚¡ãƒ¬ãƒ³ã‚¹é›»åœ§ void InitHard(void); // ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢åˆæœŸåŒ– void InitTime(void); // 時間åˆæœŸåŒ– void CalcDate(uint8_t, uint8_t); // 時計演算 0:åŠ ç®—ã€1:減算 void BlinkDisp(uint8_t, uint8_t); // 指定ä½ç½®ãƒ–リンクã™ã‚‹ã€‚ã€0:通常ã€1:å‰æ¡ã®æ–‡å—を表示 void DateDisp(uint8_t, uint8_t, uint8_t); // æŒ‡å®šå ´æ‰€ã®æ–‡å—ã‚’æ›´æ–°ã™ã‚‹ã€‚ void UpdateTime(void); // 時計更新 void DoADC(void); // ADCを動作ã•ã›è¡¨ç¤ºã•ã›ã‚‹ã€‚  1秒毎 uint16_t ReadADCCel(void); // ADCã‹ã‚‰ãƒ‡ãƒ¼ã‚¿ã‚’èªã¿å‡ºã™ã€‚デジタルフィルタ付 void AdcDisp( uint16_t); // ADC値を変æ›ã—表示 void XBeeTempDisp(void); // XBeeã®æ¸©åº¦ãƒ‡ãƒ¼ã‚¿ã‚’変æ›ã—ã¦è¡¨ç¤ºã™ã‚‹ã€‚ uint8_t g_u8BlinkFlg = 0; // 0:点ç¯ã€1:æ¶ˆç¯ volatile uint8_t g_u8IntTimeFlg; // 時計割り込ã¿ãƒ•ãƒ©ã‚° uint8_t g_u8CalenderBuf[6]; // 時計データä¿å˜ã€ãƒ‡ãƒ¼ã‚¿ã¯BCDã§ä¿å˜ã€‚上ä½4bit:10ã®ä½ã€ä¸‹ä½4bit:1ã®ä½ union switch_states // スイッãƒçŠ¶æ…‹ãƒ•ãƒ©ã‚° { uint8_t BYTE; struct { uint8_t mode :1; // 時計変更モード uint8_t mode_keep :1; // 時計変更モード確定 uint8_t red :1; // 赤スイッãƒON uint8_t red_keep :1; // 赤スイッãƒON->OFF uint8_t yellow :1; // 黄スイッãƒON uint8_t yellow_keep :1; // 黄スイッãƒON->OFF uint8_t green :1; // 緑スイッãƒON uint8_t green_keep :1; // 緑スイッãƒON->OFF }BIT; }; union switch_states g_uSwitchState; uint8_t g_u8CalenderArray[2][12] = {{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, // カレンダ通常年 { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}}; // カレンダé–å¹´ uint8_t g_u8LcdStr[] = {0xb5, 0xdd, 0xc4, 0xde, '1', ':', '-', '-', '-', '-', '.', '-', 0xdf, 'C'}; // LCDè¡¨ç¤ºãƒ‡ãƒ¼ã‚¿æ ¼ç´ãƒãƒƒãƒ•ã‚¡ // 通信 uint8_t g_u8Count; // å—信データ数 uint8_t g_u8RxBuff[RXBUF_SIZE]; // å—信データä¿å˜ãƒãƒƒãƒ•ã‚¡ union int_flg { uint8_t BYTE; struct { uint8_t :6; // 余り uint8_t time :1; // 時計割込 uint8_t rx7E :1; // å—信割込0x7eå—ä¿¡ã§ON }BIT; }; union int_flg g_uIntFlg; int main(void) { uint8_t u8PortcState; uint8_t u8LcdLocate; // 変更ä½ç½®è¨˜æ†¶ 0:yy, 1:mm, 2:dd, 3:hhh, 4:mmm, 5:sss uint8_t u8LocateChange = 0; // 表示ä½ç½®å¤‰æ›´ãƒ•ãƒ©ã‚° 0:変更ä½ç½®ç§»å‹•ãªã—ã€1:移動ã‚ã‚Š InitHard(); // ãƒãƒ¼ãƒˆã€LCDåˆæœŸåŒ– g_u8IntTimeFlg = 0; // 250ms毎ã«ã‚«ã‚¦ãƒ³ãƒˆ InitTime(); // 時計åˆæœŸåŒ–ãŠã‚ˆã³åˆæœŸå€¤è¡¨ç¤º sei(); // 割り込ã¿è¨±å¯ while(1) { sleep_enable(); //sleepè¨±å¯ sleep_cpu(); //sleepä¸ sleep_disable(); // sleepç¦æ¢ // 通信 if ( (g_uIntFlg.BIT.rx7E == 1) && (g_u8Count > 23)) { if ( g_u8Count == 24) // å—信完了データå–å¾— { g_uIntFlg.BIT.rx7E = 0; XBeeTempDisp(); } else // データエラー { g_uIntFlg.BIT.rx7E = 0; g_u8Count = 0; } } // 時計更新 if ( g_uIntFlg.BIT.time == 1) { g_uIntFlg.BIT.time = 0; g_u8IntTimeFlg++; if (g_u8IntTimeFlg > 3) // ä¸€ç§’çµŒéŽ { UpdateTime(); // 時計更新 g_u8IntTimeFlg = 0; DoADC(); // 1秒毎ã«ADCを動作ã•ã›æ¸©åº¦ã‚’LCDã«è¡¨ç¤ºã™ã‚‹ã€‚ } // 時計調整 u8PortcState = ~PINC & SWON; if (g_uSwitchState.BIT.mode_keep == 0) // æ™‚è¨ˆå¤‰æ›´ãƒ¢ãƒ¼ãƒ‰ç¢ºèª { if ( (u8PortcState == MODE)) // 赤ã¨é»„色ã®ã‚¹ã‚¤ãƒƒãƒã‚’åŒæ™‚on。 { g_uSwitchState.BIT.mode = 1; } else if ( (u8PortcState == 0) && (g_uSwitchState.BIT.mode == 1)) // 赤ã¨é»„スイッãƒãŒoff->on->offã§æ™‚計変更モードã«ç§»è¡Œ { g_uSwitchState.BIT.mode_keep = 1; u8LcdLocate = 0; BlinkDisp(u8LcdLocate, 0); // å¹´ã®ä½ç½®ãƒ–リンク表示 } } else if (g_uSwitchState.BIT.mode_keep) // 時計変更モードã€ã‚¹ã‚¤ãƒƒãƒã¯èµ¤->黄->ç·‘ã®é †ã§å„ªå…ˆé †ä½ãŒä½Žããªã‚‹ã€‚ { // 赤ã¨ç·‘ãŒæŠ¼ã•ã‚Œã å ´åˆã¯èµ¤ãŒå„ªå…ˆã•ã‚Œã‚‹ã€‚ u8LocateChange = 0; //表示ä½ç½®å¤‰æ›´ãƒ•ãƒ©ã‚°ã‚¯ãƒªã‚¢ if (u8PortcState == RED) // 赤ãŒon { g_uSwitchState.BYTE = 0; g_uSwitchState.BIT.mode_keep = 1; g_uSwitchState.BIT.red = 1; } else if (u8PortcState == YELLOW) // 黄ãŒon { g_uSwitchState.BYTE = 0; g_uSwitchState.BIT.mode_keep = 1; g_uSwitchState.BIT.yellow = 1; } else if (u8PortcState == GREEN) // ç·‘ãŒon { g_uSwitchState.BYTE = 0; g_uSwitchState.BIT.mode_keep = 1; g_uSwitchState.BIT.green = 1; } else if ( u8PortcState == 0) // スイッãƒãŒå…¨éƒ¨offã€ã‚¹ã‚¤ãƒƒãƒãŒoff->on->offã§å„動作をã™ã‚‹ã€‚ { if (g_uSwitchState.BIT.red == 1) // 赤ãŒonã ã£ãŸ { g_uSwitchState.BIT.red = 0; u8LcdLocate++; u8LocateChange = 1; } if (g_uSwitchState.BIT.yellow == 1) // 黄ãŒonã ã£ãŸ { g_uSwitchState.BIT.yellow = 0; CalcDate( u8LcdLocate, 0); } if (g_uSwitchState.BIT.green == 1) // ç·‘ãŒonã ã£ãŸ { g_uSwitchState.BIT.green = 0; CalcDate(u8LcdLocate, 1); } } BlinkDisp(u8LcdLocate, u8LocateChange); // ブリンクã€ã‚«ãƒ¬ãƒ³ãƒ€æ›´æ–° } } } // while loop } void InitHard(void) { uint8_t i; // portåˆæœŸåŒ– DDRB = 0xff; // portb7:0=出力 PORTB = 0; DDRC = 0x06; // portc2:1=出力 PORTC = 0; DDRD = 0xfe; // portd7:1=出力 PORTD = 0; // LCDåˆæœŸåŒ– lcd_init(); // 温度1åˆæœŸå€¤ lcd_locate( 2, 0); g_u8LcdStr[4] = '1'; for ( i = 0; i < 14; i++) { lcd_putc(g_u8LcdStr[i]); } // 温度2åˆæœŸå€¤ lcd_locate( 3, 0); g_u8LcdStr[4] = '2'; for ( i = 0; i < 14; i++) { lcd_putc(g_u8LcdStr[i]); } // 16bitタイマè¨å®š // CTC動作ã€1/8分周 周期ã¯ï¼’5ï¼ï½ï½“ OCR1A = 31686; // 31249 è¨å®šå€¤ TCCR1A = (1 << COM1A0); TCCR1B = 0x0a; // スタート TIMSK1 = 1 << OCIE1A; // ctc割り込ã¿è¨±å¯ // ADC ADMUX = 0; // Vref = 外部レファレンス ADCSRA = (1 << ADPS1) | (1 << ADPS0); // adcクãƒãƒƒã‚¯ = 125kHz DIDR0 = (1 << ADC0D); // adc0デジタル入力ãƒãƒƒãƒ•ã‚¡ç¦æ¢ //UART è¨å®š // baurate 9600 // data 8 // parity non // stop bit 1 UCSR0A = 1 << U2X0; UCSR0C = (1 << UCSZ01) | (1 << UCSZ00); UBRR0L = 12; UCSR0B = (1 << RXCIE0) | (1 << RXEN0); // スリープモードã¯ã‚¢ã‚¤ãƒ‰ãƒ«ã«è¨å®š set_sleep_mode(SLEEP_MODE_IDLE); } void InitTime(void) { g_u8CalenderBuf[0] = 0x12; g_u8CalenderBuf[1] = 6; g_u8CalenderBuf[2] = 1; g_u8CalenderBuf[3] = 0; g_u8CalenderBuf[4] = 0; g_u8CalenderBuf[5] = 0; lcd_locate( 0, 0); // 1行目:年月日表示 lcd_putc((g_u8CalenderBuf[0] >> 4) + 0x30); // å¹´ lcd_putc((g_u8CalenderBuf[0] & 0x0f) + 0x30); lcd_putc('/'); lcd_putc((g_u8CalenderBuf[1] >> 4) + 0x30); // 月 lcd_putc((g_u8CalenderBuf[1] & 0x0f) + 0x30); lcd_putc('/'); lcd_putc((g_u8CalenderBuf[2] >> 4) + 0x30); // 分 lcd_putc((g_u8CalenderBuf[2] & 0x0f) + 0x30); lcd_locate( 1, 0); // 2行目:時分秒表示 lcd_putc((g_u8CalenderBuf[3] >> 4) + 0x30); // 時 lcd_putc((g_u8CalenderBuf[3] & 0x0f) + 0x30); lcd_putc(':'); lcd_putc((g_u8CalenderBuf[4] >> 4) + 0x30); // 分 lcd_putc((g_u8CalenderBuf[4] & 0x0f) + 0x30); lcd_putc(':'); lcd_putc((g_u8CalenderBuf[5] >> 4) + 0x30); // 秒 lcd_putc((g_u8CalenderBuf[5] & 0x0f) + 0x30); } void DoADC(void) // ADCを動作ã•ã›è¡¨ç¤ºã•ã›ã‚‹ã€‚1秒毎 { uint16_t result; LM61_ON; // 温度センサ電æºON ADC_ON; // ADCイãƒãƒ¼ãƒ–ル DELAY_US(6000); // wait 60ms レファレンス電圧ã€LM61ã€ADC安定待㡠ADC_START; // ADC動作開始 result = ReadADCCel(); // ADCã‹ã‚‰ãƒ‡ãƒ¼ã‚¿ã‚’èªã¿å‡ºã™ã€‚デジタルフィルタ付 ADC_OFF; // ADCç¦æ¢ LM61_OFF; // 温度センサ電æºOFF AdcDisp(result); // LCDã«ãƒ‡ãƒ¼ã‚¿ã‚’表示 } uint16_t ReadADCCel(void) // 指定ã•ã‚ŒãŸãƒãƒ£ãƒ³ãƒãƒ«ã®ADCã‹ã‚‰ãƒ‡ãƒ¼ã‚¿ã‚’èªã¿å‡ºã™ã€‚ { static uint16_t adc_data1, adc_data2, adc_data3; while((ADCSRA & (1 << ADSC))); adc_data3 = adc_data2; adc_data2 = adc_data1; adc_data1 = ADCW; return ((adc_data3 + adc_data2 + adc_data2 + adc_data1) / 4); } void AdcDisp( uint16_t result) // ADC値を変æ›ã—表示 { int16_t i; long sum; sum = ((long)result * V_REF/ 1024) - 600; // sumã®æ£å¸¸ç¯„囲ãƒã‚§ãƒƒã‚¯ g_u8LcdStr[4] = '1'; if ( (sum > 1800) || ( sum < -400)) { for ( i = 6; i < 10; i++) { g_u8LcdStr[i] = '-'; } g_u8LcdStr[11] = '-'; } else { if ( sum < 0) { sum *= -1; g_u8LcdStr[6] = '-'; } else { g_u8LcdStr[6] = 0x20; } g_u8LcdStr[7] = 0x20; g_u8LcdStr[8] = 0x20; g_u8LcdStr[9] = 0x30; g_u8LcdStr[11] = 0x30; // binary -> BCDã‚ãƒ£ãƒ©ã‚¯ã‚¿å¤‰æ› for ( i = 11; i > 5; i--) { g_u8LcdStr[i] = (sum % 10) + 0x30; sum /= 10; if ( i == 11) { i--; } if ( sum <= 0) { break; } } } // LCDã«è¡¨ç¤º lcd_locate( 2, 0); for ( i = 0; i < 14; i++) { lcd_putc(g_u8LcdStr[i]); } } void XBeeTempDisp(void) // XBeeã®æ¸©åº¦ãƒ‡ãƒ¼ã‚¿ã‚’変æ›ã—ã¦è¡¨ç¤ºã™ã‚‹ã€‚ { uint8_t cnt; int16_t i; long sum; g_u8LcdStr[4] = '2'; sum =(g_u8RxBuff[22] << 8) | g_u8RxBuff[23]; sum = (sum * XBEE_REF/ 1024) - 600; if ( (sum > 1800) || ( sum < -400)) { for ( i = 6; i < 10; i++) { g_u8LcdStr[i] = '-'; } g_u8LcdStr[11] = '-'; } else { if ( sum < 0) { sum *= -1; g_u8LcdStr[6] = '-'; } else { g_u8LcdStr[6] = 0x20; } g_u8LcdStr[7] = 0x20; g_u8LcdStr[8] = 0x20; g_u8LcdStr[9] = 0x30; g_u8LcdStr[11] = 0x30; // binary -> BCDã‚ãƒ£ãƒ©ã‚¯ã‚¿å¤‰æ› for ( i = 11; i > 5; i--) { g_u8LcdStr[i] = (sum % 10) + 0x30; sum /= 10; if ( i == 11) { i--; } if ( sum <= 0) { break; } } } // LCDã«è¡¨ç¤º lcd_locate( 3, 0); for ( i = 0; i < 14; i++) { lcd_putc(g_u8LcdStr[i]); } } void BlinkDisp(uint8_t dat, uint8_t flg) //指定ä½ç½®ã‹ã‚‰ï¼’æ–‡å—分ブリンクã™ã‚‹ã€‚ { uint8_t raw, col; switch( dat) { case 0: // å¹´ lcd_locate(0, 0); break; case 1: // 月 lcd_locate(0, 3); raw = 0; col = 0; break; case 2: // æ—¥ lcd_locate(0, 6); raw = 0; col = 3; break; case 3: // 時 lcd_locate(1, 0); raw = 0; col = 6; break; case 4: // 分 lcd_locate(1, 3); raw = 1; col = 0; break; case 5: // 秒 lcd_locate(1, 6); raw = 1; col = 3; break; default: // 時計修æ£ãƒ¢ãƒ¼ãƒ‰çµ‚了 g_uSwitchState.BYTE = 0; lcd_locate(1, 6); lcd_putc((g_u8CalenderBuf[5] >> 4) + 0x30); lcd_putc((g_u8CalenderBuf[5] & 0x0f) + 0x30); return; break; } if ( g_u8BlinkFlg == 0) { // æ¶ˆç¯ g_u8BlinkFlg = 1; lcd_putc(' '); lcd_putc(' '); } else { // ç‚¹ç¯ g_u8BlinkFlg = 0; lcd_putc((g_u8CalenderBuf[dat] >> 4) + 0x30); lcd_putc((g_u8CalenderBuf[dat] & 0x0f) + 0x30); } if (flg == 1) { lcd_locate(raw, col); lcd_putc((g_u8CalenderBuf[dat - 1] >> 4) + 0x30); lcd_putc((g_u8CalenderBuf[dat - 1] & 0x0f) + 0x30); } } void CalcDate(uint8_t dat, uint8_t flg) { int sum, day; switch ( dat) { case 0: // å¹´ sum = (g_u8CalenderBuf[dat] >> 4) * 10 + (g_u8CalenderBuf[dat] & 0x0f); switch(flg) { case 0: // åŠ ç®— if ( ++sum > 99) { sum = 0; } break; default: // 減算 if ( --sum < 0 ) { sum = 99; } break; } g_u8CalenderBuf[dat] =((sum / 10) << 4) | (sum % 10); break; case 1: // 月 sum = (g_u8CalenderBuf[dat] >> 4) * 10 + (g_u8CalenderBuf[dat] & 0x0f); switch(flg) { case 0: // åŠ ç®— if ( ++sum > 12) { sum = 1; } break; default: // 減算 if ( --sum < 1 ) { sum = 12; } break; } g_u8CalenderBuf[dat] =((sum / 10) << 4) | (sum % 10); break; case 2: // æ—¥ sum = (g_u8CalenderBuf[1] >> 4) * 10 + (g_u8CalenderBuf[1] & 0x0f); // 月を抽出 if ((((g_u8CalenderBuf[0] >> 4) * 10 + (g_u8CalenderBuf[0] & 0x0f)) % 4) == 0) // ã†ã‚‹ã†å¹´ãªã‚‰ { day = g_u8CalenderArray[1][sum - 1]; } else { day = g_u8CalenderArray[0][sum -1]; } sum = (g_u8CalenderBuf[dat] >> 4) * 10 + (g_u8CalenderBuf[dat] & 0x0f); switch(flg) { case 0: // åŠ ç®— if ( ++sum > day) { sum = 1; } break; default: // 減算 if ( --sum < 1 ) { sum = day; } break; } g_u8CalenderBuf[dat] =((sum / 10) << 4) | (sum % 10); break; case 3: // 時 sum = (g_u8CalenderBuf[dat] >> 4) * 10 + (g_u8CalenderBuf[dat] & 0x0f); switch(flg) { case 0: // åŠ ç®— if ( ++sum > 23) { sum = 1; } break; default: // 減算 if ( --sum < 1 ) { sum = 23; } break; } g_u8CalenderBuf[dat] =((sum / 10) << 4) | (sum % 10); break; default: // 分ã€ç§’ sum = (g_u8CalenderBuf[dat] >> 4) * 10 + (g_u8CalenderBuf[dat] & 0x0f); switch(flg) { case 0: // åŠ ç®— if ( ++sum >59) { sum = 0; } break; default: // 減算 if ( --sum < 1 ) { sum = 59; } break; } g_u8CalenderBuf[dat] =((sum / 10) << 4) | (sum % 10); break; } } void UpdateTime(void) // 時計 { uint8_t sum, day, flg = 0; // 秒 sum = (g_u8CalenderBuf[5] >> 4) * 10 + (g_u8CalenderBuf[5] & 0x0f); if ( ++sum > 59) { g_u8CalenderBuf[5] = 0; flg = 1; DateDisp(1, 6, g_u8CalenderBuf[5]); } else { g_u8CalenderBuf[5] =((sum / 10) << 4) | (sum % 10); DateDisp(1, 6, g_u8CalenderBuf[5]); return; } // 分 if ( flg == 1) { flg = 0; sum = (g_u8CalenderBuf[4] >> 4) * 10 + (g_u8CalenderBuf[4] & 0x0f); if( ++sum > 59) { g_u8CalenderBuf[4] = 0; flg = 1; DateDisp(1, 3, g_u8CalenderBuf[4]); } else { g_u8CalenderBuf[4] =((sum / 10) << 4) | (sum % 10); DateDisp(1, 3, g_u8CalenderBuf[4]); } } // 時 if ( flg == 1) { flg = 0; sum = (g_u8CalenderBuf[3] >> 4) * 10 + (g_u8CalenderBuf[3] & 0x0f); if( ++sum > 23) { g_u8CalenderBuf[3] = 0; flg = 1; DateDisp(1, 0, g_u8CalenderBuf[3]); } else { g_u8CalenderBuf[3] =((sum / 10) << 4) | (sum % 10); DateDisp(1, 0, g_u8CalenderBuf[3]); } } // æ—¥ if ( flg == 1) { flg = 0; sum = (g_u8CalenderBuf[1] >> 4) * 10 + (g_u8CalenderBuf[1] & 0x0f); // 月を抽出 if ((((g_u8CalenderBuf[0] >> 4) * 10 + (g_u8CalenderBuf[0] & 0x0f)) % 4) == 0) // ã†ã‚‹ã†å¹´ãªã‚‰ { day = g_u8CalenderArray[1][sum - 1]; } else { day = g_u8CalenderArray[0][sum -1]; } sum = (g_u8CalenderBuf[2] >> 4) * 10 + (g_u8CalenderBuf[2] & 0x0f); if( ++sum > day) { g_u8CalenderBuf[2] = 1; DateDisp(0, 6, g_u8CalenderBuf[2]); flg = 1; } else { g_u8CalenderBuf[2] =((sum / 10) << 4) | (sum % 10); DateDisp(0, 6, g_u8CalenderBuf[2]); } } // 月 if ( flg == 1) { flg = 0; sum = (g_u8CalenderBuf[1] >> 4) * 10 + (g_u8CalenderBuf[1] & 0x0f); if( ++sum > 12) { g_u8CalenderBuf[1] = 1; DateDisp(0, 3, g_u8CalenderBuf[1]); flg = 1; } else { g_u8CalenderBuf[1] =((sum / 10) << 4) | (sum % 10); DateDisp(0, 3, g_u8CalenderBuf[1]); } } // å¹´ if ( flg == 1) { flg = 0; sum = (g_u8CalenderBuf[0] >> 4) * 10 + (g_u8CalenderBuf[0] & 0x0f); if( ++sum > 99) { g_u8CalenderBuf[0] = 0; DateDisp(0, 0, g_u8CalenderBuf[0]); flg = 1; } else { g_u8CalenderBuf[0] =((sum / 10) << 4) | (sum % 10); DateDisp(0, 0, g_u8CalenderBuf[0]); } } } void DateDisp(uint8_t raw, uint8_t col, uint8_t dat) // æŒ‡å®šå ´æ‰€ã®æ–‡å—ã‚’æ›´æ–°ã™ã‚‹ã€‚ { lcd_locate(raw, col); lcd_putc((dat >> 4) + 0x30); lcd_putc((dat & 0x0f) + 0x30); } SIGNAL(TIMER1_COMPA_vect) // 0.25秒ã”ã¨ã«å‰²è¾¼ç™ºç”Ÿ { g_uIntFlg.BIT.time = 1; } SIGNAL(USART_RX_vect) // å—信割込ã€ãƒ‡ãƒ¼ã‚¿å—信完了ã¯ãƒ¡ã‚¤ãƒ³ãƒ«ãƒ¼ãƒ—ã§g_u8Count= 24ã§åˆ¤æ–ã™ã‚‹ã€‚ { if ( UDR0 == 0x7e) // 0x7eã§å—信開始 { g_uIntFlg.BIT.rx7E = 1; g_u8Count = 0; } if ( g_uIntFlg.BIT.rx7E == 1) // UDR0ã‹ã‚‰å—ä¿¡ãƒãƒƒãƒ•ã‚¡ã«ã‚³ãƒ”ー { g_u8RxBuff[g_u8Count++] = UDR0; } }