■■ プログラミングとデーター読み取り ■■
- お天気センサーに使うセンサーはそれぞれデーターの取得方法が違います。
[1] ■デジタル温度湿度センサーは一本線によるシリアル通信方法
[2] ■気圧センサーMPS-2407-015ADはアナログA/D変換方法
[3] ■リアルタイムクロック(RTC)モジュールはI2C通信方法
[4] ■315MHz送信・受信モジュールはRS232C通信方法
◎私が使用した各センサーの通信方法を下記に書いておきます。
プログラムはFDE PIC C Compiler. V14.00Aで制作しています。
- 1)デジタル温度湿度センサー・DHT11
- 温度・湿度センサーは専用の通信方法でデーターを送り出しています。
データーフォーマットは8BitMSB構成で整数で’温度’+'湿度'+'パリテー'の
シリアル信号でPCに送られてきます。
読み取った8Bitデーターをアスキーに変換して表示します。
プログラムは時間のタイミングでクロックを読み取りますのでCPUクロックを変えたときには、各プログラムのウエイト
タイミングの変更が必要です。(現在のCPUクロック=20MHz)
関数呼び出しのエラー処理はしていません。
温度湿度センサーのプログラムの主要部分を下記に抜粋しておきます。
static bit RA0bit @ PORTBIT( PORTD, 4 ); //DHC11 Data PIN=RA0
static bit TR0bit @ PORTBIT( TRISD, 4 ); //TRIS A0コントロール(IN=1/OUT=0)
//-----------------------------
// センサー初期設定
//-- --
// | |
// ------------------------
// <--------10mS----------><20-40uS>
//-----------------------------
void StartSignal(void)
{
TR0bit = 0; //ポート出力設定
RA0bit = 0;
Wait(25); //25mSポートLow出力
RA0bit = 1;
WaitUs10(4); //20uSポートHi出力
TR0bit = 1; //ポート入力設定
}
//-----------------------------
// センサーより読み出し信号タイミング待ち
// -- --------------
// | | |<-- !=0 | |<-- !=1
// -------------- -----
// <--80uS---> <--80uS--->
//-----------------------------
unsigned char CheckResponse()
{
WaitUs10(0);
if (RA0bit) return 0; //ポート点検、センサー接続確認
while (!RA0bit);
WaitUs10(0); // if ra0bit == 0 chak 80uS
if (!RA0bit) return 0; // if ra0bit != 0 Err
else {
while (RA0bit); // if ra0bit == 0 chak 80uS
WaitUs10(0);
if (RA0bit) return 0; // if ra0bit != 0 Err
else {
return 1;
}
}
}
//-----------------------------
//データーの読み出し'Hi' 'Low'
//
// -- ---- -- ------------
// | | | | | |
// --------- -- --------- ---
// <-50uS--><26-28uS> <--50uS--> <--70uS--->
//-----------------------------
unsigned char ReadByte()
{
unsigned char num=0;
TR0bit = 1; //入力設定
for (i=0; i<8; i++){ //8回ループ
while(!RA0bit); // wait for 50us
WaitUs10(4); // wait 20MHz=32.2uS
if (RA0bit){ //Hi or Low 読み込み,左回転する、繰り返し
num | = 1 <<(7-i);
while(RA0bit); // if ra0bit != 0 finish
}
}
return num;
}
- 2)圧力センサー(MPS-2407-015AD)
- 圧力センサーをオペアンプで増幅してA/D変換して気圧データーにします。
センサーは15PSI(5KΩ出力)タイプを使います。ここから出てくる信号は1気圧時
に170mA前後の電流が出てきます。オペアンプを使い10倍増幅をしてPIC CPU
のA/DポートI/Oを使い読み取ります。ただしA/D変換はリファレンス値2.5Vで動作しています。
関数呼び出しのエラー処理はしていません。
圧力センサーのプログラムの主要部分を下記に抜粋しておきます。
#define ADC_START ADCON0 | = ( 1 << GO ) // AD On
#define TST_ADC_NOT_DONE ( ADCON0& ( 1 << GO ) ) // AD Off
//--------------------------------
// A/D Conversion Set(0-7) RA0,RA1,RA2,RA3,RA4,RB6,RB7(AN0:6)
//--------------------------------
int A_D(unsigned char select_no)
{
WORD adval;
unsigned char Data[7]={0x0,0x8,0x10,0x18,0x20,0x28,0x30};
ADCON0 = 0x81+Data[select_no]; //入力ポート設定
Wait(10);
ADC_START; //変換スタート
do{
}while((ADCON0 & 0x4) == 0x4); //変換データー読み取り検出
adval = (WORD)ADRESH << 8;
adval = adval | ADRESL; //データーを16Bitに変換
TST_ADC_NOT_DONE; //変換終了
return adval;
}
- 3)リアルタイムクロック(RTC)モジュール
- セイコーのリアルタイムクロックIC(RTC-8564NB)を使ったクロックモジュールです
I2Cインターフェース(2線式)でPICやH8などと通信可能です。
簡単に正確な時刻を得られます。時間を計時するアプリケーションに最適、
IC内に高精度クリスタルが内蔵されています。
読み取ったデーターをアスキーに変換して表示します。
INT(割り込み)用のLED付。ここのプログラムではINT(割り込み)を使用していません。
このプログラムWiz-Cの内部関数を使っています。
リアルタイムクロックICのプログラムの主要部分を下記に抜粋しておきます。
const BYTE PICIO = &PORTC; //I2ポート設定
const BYTE _SCL = 4; //I2C I/O SCL
const BYTE _SDA = 5; //I2C I/O SDA
//-------------------------------------------------------------------------
// CPU to 8564IC Data Writ 10Byt con1,con2,min,sec,hou,day,week,mon/cen,yen,Mi/Ala,Ho/Ala/Dy/Ala
//-------------------------------------------------------------------------
void IC8564_Write(void)
{
unsigned char address;
I2CData[0] = 0; //cont 1 Test,0,Stop,0,Test,0,0,0
I2CData[1] = 0x13; //cont 2 0,X,0,TI/TP=1,AF,TF,AIE=1,TIE=1
QuickStop(); //generate stop stata on bus
IIWrite(0xA2,IISTART|IIACK); // C individual treatment address to
R/W?8564 Note address
IIWrite(0,IIACK); // Note top address
//CPU to 8564IC Data Writ 10Byt con1,con2,min,sec,hou,day,week,mon/cen,yen,Mi/Ala,Ho/Ala/Dy/Ala
for (address = 0;address < 9; address++){
IIWrite(I2CData[address],IIACK);
Wait(20);
}
}
//-------------------------------------------------------------------------
// CPU to 8564 Data Read 7Byt min,sec,hou,day,week,mon/cen,yen
//-------------------------------------------------------------------------
void IC8564_read(void)
{
unsigned char address;
QuickStop();
IIWrite(0xA2,IISTART|IIACK);
IIWrite(2,IIACK);
//CPU to 8564IC Read code Addres 1Byt Set
PORTC |= (1<<_SCL);
IIWrite(0xA3,IISTART|IIACK);
//CPU to 8564 Data Read 7Byt min,sec,hou,day,week,mon/cen,yen
for (address = 2; address < 9; address++){
TRISC |= (1<<_SDA);
I2CData[address] = IIRead(IIACK);
Wait(10);
}
}
- 4)315MHz送信モジュール
- データー通信はRS232C・無線通信の両方が使用できます。
PIC ICのUSART機能を使い通信をします。
読み取ったデーターをアスキーに変換して送信します。
ボーレート:2400、8、無し、1で設定してあります。
RS232Cのプログラムの送信部分を下記に抜粋しておきます。
#define below 0x81 //RS232c Speed(2400bps)
//PIE1=( 1 << RCIE ); 割り込み受信時
//INTCON=(1 << GIE ) | ( 1 << PEIE );
// RS232C = 2400bps 設定
SPBRG = below; //(Hi-Speed)
TXSTA = 0x24;
//---------------
RCSTA = 0x90;
//---------------
//---------------------------------------------------
// Communication string data out
//---------------------------------------------------
void TX232S(const char * s)
{
char *q;
q = s;
while(*s){
while(( TXSTA & ( 1 << TRMT ) )==0);
Wait(1);
TXREG = * s;
s=++q;
};
TXREG=0x0d;
}
//-----------------------------------------------------
// Communication Single data out
//-----------------------------------------------------
void TX232C(unsigned char dummy)
{
while((TXSTA & ( 1 << TRMT ) )==0);
Wait(1);
TXREG=dummy;
}
- プログラム・ダウンロード
-- PIC 16F877 --
ソースファイル・本体(TXT)ここ
ソースファイル・本体+LCD制御(Wiz-C)ここ
HEXファイルここ
回路図・キー操作(Excel 2000)ここ
[16F877コンフィグ]
FOSC = HS
WDTH = Disable
PWRTE = Enable
BODEN = Enable
LVP = RB3=I/O
CPD = Not_Protect
WRT = Enable
DEBUG = Disable
CP = Not_Protect
-- PIC 16F628 --(温度・湿度・RS232C機能「時計・気圧機能無し」)
ソースファイル・本体(TXT)ここ
ソースファイル(Wiz-C)ここ
HEXファイルここ
[16F628コンフィグ]
FOSC = HS
WDTH = Disable
PWRTE = Disable
MCLER = MCLRpin
BODEN = Enable
LVP = RB4:GPIO
CPD = Not_Protect
CP = Not_Protect
回路図・LCD制御は共通です。
本体プログラム内には色々なプログラムがコメントアウトして他のプログラムが入っています.
|
|