今回は照度センサです。照度センサでは明るさを取得することができます。取得する明るさの単位は[lx](ルクス)です。今回のシステムでは室内の照度を対象としています。太陽光を測定する場合、フィルタをつけて明るさを抑えるなどの改造が必要です。
以前作成した7セグメントディスプレイシステムにシリアル通信を使用して照度を送り表示します。
回路図およびプログラムに関する各種詳細は、以下の記事を参考にしてください。
1.今回使用するPICについて
今回使用するPICは「PIC12F1822」です。
2.回路
2.1 電子回路図
2.2 電子回路の写真
2.3 回路説明
2.3.1 使用するパーツ一覧
パーツ名 | 説明 | 使用数 |
---|---|---|
PIC12F1822 | PIC本体 | 1 |
照度センサ(S9648-100) | 照度センサ | 1 |
抵抗(1[kΩ]) | 電源電圧により変更すること | 1 |
注:PICと照度センサにはバイパスコンデンサをつけることを推奨します。つける場合、コンデンサ容量は0.1[μF]でいいと思います。無くても問題なく動作はしていますが、安定しているかどうかはわかりません。
2.3.2 PICの配線
PICのピン | 接続 | 補足 |
---|---|---|
VDD | 電源 | 5[V] |
RA0 | シリアル通信(TxD:送信) | 7セグメントディスプレイへデータ転送 |
RA1 | -未使用- | |
RA2 | -未使用- | |
RA3 | -未使用- | |
RA4 | 照度センサ(S9648-100) | |
RA5 | -未使用- | |
VSS | グランド |
2.3.3 照度の計算方法
照度を求める場合、以下の計算を行います。
照度 = 電流 / 照度係数
照度係数 = 0.26[mA]/100[lx]
電流 = 電圧 / 抵抗
2.3.4 取得可能照度
今回は最大999[lx]とします。7セグメントディスプレイが3桁であるためと、室内では3桁で十分なためです。もし999[lx]を超えた場合、999[lx]を表示します。
3.プログラム
プログラムの基本的な部分は以下の記事を参考にしてください。AD変換に関しては温度センサの記事を参考にしてください。
3.1 プログラムの説明
プログラムを見ながら以下の説明を見てください。ソースコードは次の節にあるので、そちらを参照してください。
3.1.1 グローバル変数の宣言
#define _XTAL_FREQ 32000000 #define TX_UART_SIZE 3 #define VOLTAGE_REFERENCE 5000 #define VOLTAGE_RESOLUTION 1024 #define R1_OHM 1000 volatile unsigned char uart_tx_msg[TX_UART_SIZE] = {0}; volatile unsigned char uart_tx_cnt = 0;
定数の宣言およびグローバル変数の宣言。グローバル変数は7セグメントディスプレイへのシリアル通信でのデータ転送用です。
3.1.2 シリアル通信用割り込み処理
void interrupt isr_ctrl( void ) { if( TXIF ) { if( uart_tx_cnt < TX_UART_SIZE ) { TXREG = uart_tx_msg[ uart_tx_cnt ]; uart_tx_cnt++; } else { TXIE = 0; } if( uart_tx_cnt >= TX_UART_SIZE ) { uart_tx_cnt = 0; TXIE = 0; } TXIF = 0; } }
シリアル通信でのデータ転送処理です。
3.1.3 PICの初期設定
unsigned short ad_data; long voltage,current; short work1,work2,work3,work4,illuminance; OSCCON = 0b01110000 ; // 内部クロック8MHz ANSELA = 0b00010000 ; // AN3をアナログにし、他はデジタルI/Oに割当てる TRISA = 0b00011010 ; // RA1,3,4を入力にし、他は出力に割当てる PORTA = 0b00000000 ; // 出力ピンの初期化(全てLOWにする) ADCON1 = 0b10100000 ; // 右寄せ、Fosc/32,VDDをリファレンスにする ADCON0 = 0b00001101 ; // AN3を使用する __delay_us(5); // ch設定後、反映待ち TXSTA = 0x24; // 送信情報設定:非同期モード 8ビット・ノンパリティ RCSTA = 0x90; // 受信情報設定 BAUDCON = 0x08; // 16bit SPBRG = 0x40; // ボーレートを9600(高速モード)に設定 SPBRGH = 0x03; RXDTSEL = 0; TXCKSEL = 0; TXIE = 0; TXIF = 0; PEIE = 1; GIE = 1;
各種初期設定です。周波数、ポート設定、シリアル通信設定などを行っています。
3.1.4 AD変換
// AD 変換 GO_nDONE = 1; // 変換開始 // アナログをデジタルに変換 while( GO_nDONE ) { // wait } ad_data = ADRESH; ad_data = (ad_data << 8) | ADRESL;
AD変換し電圧の取得を行っています。
3.1.5 電圧から照度計算
// mVへ変換 voltage = ((long)VOLTAGE_REFERENCE * (long)ad_data) / VOLTAGE_RESOLUTION; // mVからuAを求める current = (voltage * (long)1000) / (long)R1_OHM; // uAからlxへ変換 illuminance = (short)(current * (long)100 / (long)260);
取得した電圧から照度を求めています。PICは小数点の計算は苦手なので、できる限り整数にしています。
3.1.6 照度を7セグメントディスプレイPICへ送信
if( illuminance < 1000 ) { // 位で分割 work1 = illuminance % 10; illuminance /= 10; work2 = illuminance % 10; illuminance /= 10; work3 = illuminance % 10; illuminance /= 10; work4 = illuminance; // 送信データ構築 uart_tx_msg[0] = 0x00; // 少数点位置の設定 uart_tx_msg[1] = 0x0f & work3; uart_tx_msg[2] = (work2 << 4) | work1; } else { // 送信データ構築 uart_tx_msg[0] = 0x00; // 少数点位置の設定 uart_tx_msg[1] = 0x09; uart_tx_msg[2] = 0x99; } uart_tx_cnt = 0; TXIE = 1; // 送信開始
照度をシリアル通信を使用して7セグメントディスプレイに送信するためのデータを作成しています。
3.2 ソースコード
プログラムの全文を掲載します。
<注意>
ファイル名は必要に応じて変更し利用してください。
本サイトの注意事項を確認してください。
ソースコードや回路図などを使用する場合、上記注意とともに、自己責任でお願いします。
5.動作確認
起動すると7セグメントディスプレイに照度を表示します。
<更新履歴>
日付 | 内容 |
2015年7月26日 | 新規作成 |
2016年10月7日 | フォーマット変更(内容の変更はなし) |