■■ お天気センサー 「PIC 16F877・16F628」■■

リアルタイム温度・湿度・気圧計・通信機能(RS232C)概要

複合にセンサーを使て’お天気センサー’を作ってみました。センサーは温度・湿度・気圧・時計・無線通信機能(RS232C)があります。 温度・湿度・気圧のデーターを収集してお天気予報も可能になるかも知れません。
温度・湿度データーを使って、目的値以上になるとONー>OFF又はOFF->ONにする制御機能も付けました。この機能で自家菜園の自動水まき とか自動洗濯物取り込み装置への応用も可能になるかも!!
最後のページにVBで作った音頭・湿度をグラフ化表示する参考ソフトも掲示しておきます。
今回使用したセンサーはデーターの取得方法がそれぞれ違いますので主要部分のプログラミング方法を書いておきます。
16F628を使った温度・湿度・通信機能のミニタイプもダウンロード出来ます。
制作した装置の機能と表路方法を下記に書いておきます。
  • 気温を測定 00.0℃
  • 湿度を測定 00.0%RH
  • 気圧を測定 0000hpa
  • 時計の表示 00:00:00
  • 年月日の表示 2000/00/00
  • 圧力センサー出力電圧表示。0000mA
  • 曜日の表示 SUN,MON,TUE,WED,THU,FRI,SAT
  • 気温・湿度の比較検出 (設定より大きい)ONー>OFF、OFFー>ON(I/O出力)
  • 無線を使ったデーター通信機能(RS232C通信:2400、8、無し、1)

■■お天気センサー■■

全体と圧力基板
制作をしたお天気センサーの全体と圧力基板部です。圧力センサーはA/D変換したデーターを計算により 気圧(大気圧)に変換していますが少し誤差が大きいです。最終的に気象庁の天気図の値にあわせました。
  • 測定範囲 温度 0-50℃(+-2℃)
  • 測定範囲 湿度 20-90%RH(+-5%)
  • 圧力センサー、15PSI(5kΩ出力)15PSI=約1034ha(ヘクトパスカル)
  • 最大許容加圧:30PSI(約2068hPa)
  • 時計モジュール、アラーム機能、タイマー機能、周波数出力機能
  • 送信モジュール、ASK/OOK、動作周波数:315MHz、通信距離:50-120米
  • 受信モジュール高感度:-107dBm、・通信距離:300-500米(目安)
  • 無線通信:2400、8、無し、1

■■デジタル温度湿度センサー「DHT11」■■

DHT11概要
DHT11は湿度・温度測定、通信機能を搭載した温度湿度センサーです。また、出力校正済み で無調整で使用することが可能です。センサーの構成は温度測定にはNTCサーミスタ、湿度測定に 高分子膜湿度センサーを使用しています。
  • 測定範囲 温度 0-50℃(+-2℃)
  • 測定範囲 湿度 20-90%RH(+-5%)
  • 相対湿度及び湿度出力
  • 校正済みデジタル出力
  • 少ない部品校正・長距離伝送
  • 低消費電力
  • >
  • 4端子(VDD,DATA,NC,GND)
  • 上位機種DH21と交換

■■気圧センサーMPS-2407-015AD■■

気圧センサーMPS-2407-015AD概要
メーカー METRODYNE MICROSYSTEM CORP. メトロダインマイクロシステム社製の アナログ気圧センサー
  • 使いやすい6ピンDIPパッケージ
  • 高感度です
  • 15PSI(5kΩ出力)15PSI=約1034ha(ヘクトパスカル)
  • 最大許容加圧:30PSI(約2068hPa)
  • 広い温度範囲:-40℃~+85℃
  • 湿度範囲:15%~85%RH
  • 駆動電圧:DC5V(DC2~DC15V)
  • 駆動電流:1mA(0.4mA~3mA)
  • ブリッジ抵抗:5kΩ(4kΩ~6kΩ

■■Real Time Clock Module RTC-8564JE/NB■■

リアルタイムクロック(RTC)モジュール概要
セイコーのリアルタイムクロックIC(RTC-8564NB)を使ったクロックモジュールです。 ★動作電圧:1.8V~5V ★アラーム機能、タイマー機能、周波数出力機能 ★消費電流:330nA(@5V、非アクセス時)
  • I2Cインターフェース(2線式)でPICやH8などと通信可能です。
  • 簡単に正確な時刻を得られます。時間を計時するアプリケーションに最適
  • IC内に高精度クリスタルが内蔵されています。
  • パーツは全て実装済み。8ピンDIPのICとしてお使いになれます
  • INT割り込み用のLED付

■■315MHz送信・受信モジュール■■

微弱電波を使用したデータ伝送モジュール概要
遠隔リモコン、モデム、その他の電子機器のリモートコントロール及びコンピューターのデータ通信のように 一定のデータまたは制御信号を無線伝送方式で送信・受信を出来るようにしてくれる無線機用モジュールです。 周波数帯が異なるため、無線LANや無線インターネットなどのホームネットワークとして使用されている2.4GHz/5.4GHz帯への 干渉の心配がありません。 送信・受信モジュールはマイコンCPUに接続して様々な無線制御システムを構築することができます. エンコーダ/デコーダチップを使用すればプログラミング不要で無線制御システムを作成することができます。
  • 送信■
  • 送信モジュールの完成品、ASK/OOK、動作周波数:315MHz、通信距離:50-120米
  • 動作電流:40mA以下(@12V)、9mA以下(@3V)
  • 最大伝送速度:10Kbps
  • 動作電源:3-12V
  • 外形寸法:16.0×10.5×11.5mm、
  • 受信■
  • 構造が最もシンプルな高感度ASK式315MHz帯無線受信モジュール、電源を入れてすぐ使用できる、AGC内蔵、動作周波数:315MHz。
  • 高感度:-107dBm、・通信距離:300-500米(目安)
  • 動作電源:3.3-5.0VDC・出力信号:CMOSレベル
  • 動作電流:2.5-2.7mA・バンド幅:200KHz
  • 動作温度:-30℃-85℃
  • 外形寸法:30.0x8.5x5.0mm

■■回 路 図■■

■■ プログラミングとデーター読み取り ■■ 

お天気センサーに使うセンサーはそれぞれデーターの取得方法が違います。

[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制御は共通です。

    本体プログラム内には色々なプログラムがコメントアウトして他のプログラムが入っています.


■■無線通信中!!■■

只今通信中
データー通信をハイパーターミナルプログラムで受信中です。
アンテナは送受信ともに10cmぐらいでテスト、それでも10m位はなれても快調にデーターが送られています。

■■気圧計、低気圧を表示■■

気圧計
気象庁の発表するデーターと比較すると誤差はあるようですが、まあまあの値を表示しているようです。
低気圧接近状態を測定している様子。

測定日/2012年4月3日
当日は、春一番が吹いた

■■PCでデーターをグラフ表示■■

温度・湿度のグラフ
温度・湿度のデーターをグラフ表示してみました。まだ制作途中ですので気圧データーはありません。
データー収集も出来ます。

制作・企画

平成24年度 3月編集
温度・湿度・気圧・時計計の製作
企画制作:SAVMASA企画

(制作した結果発生した損害に対しては全て自己責任でお願いします。)

著作権はSAVMASA企画またはその記事の筆者に属します。(著作権について)
当サイトに掲載されている記事や画像などの無断転載を禁止します。

top.gif画像

全表示画面

全体

通信表示232画面C

全体

温度・湿度比較画面

全体

温度湿度データ入力画面

全体

時計・年月日・曜日画面

全体

時間入力画面

全体

時計・年月日書き込み画面

全体

時間入力画面

全体

年月日入力画面

全体