/******************************************************************************* * PIC16F1938_湿度・気圧計 * * 温湿度センサ:HDC1000(温度表示部はコメントアウトし大気圧表示とした) * 大気圧センサ:LPS25H * * 参考サイト:きむ茶工房さん(ライブラリを借用させてもらいました。) * * MPLAB X(v2.15) * MPLAB(R) XC8 C Compiler Version 1.32 * * 2016.10.30 N.Ishii *******************************************************************************/ #include #include #include "skI2Clib.h" // I2C通信用ライブラリ #include "skI2CLCDlib.h" // I2CのLCDモニター用 #include "skHDC.h" // HDC1000用関数ライブラリ #include "skLPS25H.h" // LPS25H用関数ライブラリ // 5x7ドットの気圧単位キャラクタです、1で表示 0で消去 char hp[7] = { 0b01000, 0b01110, 0b01010, 0b00111, 0b00101, 0b00111, 0b00100, } ; #define _XTAL_FREQ 8000000 // 使用するPIC等により動作周波数値を設定する #define HDC1000_ADRS 0x40 // HDC1000のI2Cアドレス #define LPS25H_ADRS 0x5D // LPS25HのI2Cアドレス(SDO/SAO is HIGH) // コンフィギュレーション1の設定 #pragma config FOSC = INTOSC // 内部クロックを使用する(INTIO) #pragma config WDTE = OFF // ウオッチドッグタイマー無し(OFF) #pragma config PWRTE = ON // 電源ONから64ms後にプログラムを開始する(ON) //#pragma config MCLRE = OFF // 外部リセット信号は使用せずにデジタル入力(RE3)ピンとする(OFF) #pragma config MCLRE = ON // ピンはMCLR(外部リセットピン)として機能する(ON) 161021 N.Ishii #pragma config CP = OFF // プログラムメモリーを保護しない(OFF) #pragma config CPD = OFF // データメモリーを保護しない(OFF) #pragma config BOREN = ON // 電源電圧降下常時監視機能ON(ON) #pragma config CLKOUTEN = OFF // CLKOUTピンをRA6ピンで使用する(OFF) #pragma config IESO = OFF // 外部・内部クロックの切替えでの起動はなし(OFF) #pragma config FCMEN = OFF // 外部クロック監視しない(OFF) // コンフィギュレーション2の設定 #pragma config WRT = OFF // Flashメモリーを保護しない(OFF) #pragma config VCAPEN = OFF // 低電圧レギュレータ用のキャパシタは使用しない(OFF) #pragma config PLLEN = OFF // 動作クロックを32MHz(4xPLL)では動作させない(OFF) #pragma config STVREN = ON // スタックがオーバフローやアンダーフローしたらリセットをする(ON) #pragma config BORV = HI // 電源電圧降下常時監視電圧(2.5V)設定(HI) #pragma config LVP = OFF // 低電圧プログラミング機能使用しない(OFF) /******************************************************************************* * 割り込みの処理 * *******************************************************************************/ void interrupt InterFunction( void ) { // I2C関連の割り込み処理 InterI2C() ; } /******************************************************************************* * メインの処理 * *******************************************************************************/ void main() { int ans1,ans2 ; char buf[12] ; OSCCON = 0b01110010 ; // 内部クロックは8MHzとする ANSELA = 0b00000000 ; // AN0-AN4は使用しない全てデジタルI/Oとする ANSELB = 0b00000000 ; // AN8-AN13は使用しない全てデジタルI/Oとする TRISA = 0b00000000 ; // ピン(RA)は全て出力に割当てる(0:出力 1:入力) TRISB = 0b00000000 ; // ピン(RB)は全て出力に割当てる TRISC = 0b00011000 ; // RC3/4(I2C)は入力ピン、他は全て出力に割当てる PORTA = 0b00000000 ; // RA出力ピンの初期化(全てLOWにする) PORTB = 0b00000000 ; // RB出力ピンの初期化(全てLOWにする) PORTC = 0b00000000 ; // RC出力ピンの初期化(全てLOWにする) // InitI2C_Master(1) ; // I2Cの初期化処理(I2C速度400KHz) InitI2C_Master(0) ; // I2Cの初期化処理(I2C速度100KHz) // I2C接続小型LCDモジュールの初期化処理 // ICON OFF,コントラスト(0-63),VDD=3.3Vで使う,LCDは8文字列 LCD_Init(LCD_NOT_ICON,32,LCD_VDD3V,8) ; LCD_CreateChar(1,hp) ; // 1番にオリジナルキャラクタを登録する LCD_SetCursor(0,0) ; // DDRAMに戻す __delay_ms(3000) ; // 3秒後に開始 /// 両センサの初期化を行う ans1 = HDC_Init(HDC1000_ID,HDC1000_ADRS) ; // 湿度センサーの初期化を行う ans2 = PressureInit(LPS25H,LPS25H_ADRS) ; // 大気圧センサーの初期化を行う if ((ans1 == 0) && (ans2 == 0)) { LCD_Puts("Init OK") ; __delay_ms(1000) ; // データレートが1Hzなので1秒後から開始する } else { LCD_Puts("Init NG") ; while(1) ; // プログラム終了 } while(1) { /// 湿度センサーから湿度・温度値を読出し、液晶表示する ans1 = HDC_Read() ; if (ans1 == 0) { sprintf((char *)buf,"%.2f ",Humi) ; buf[6] = 0x25 ; // % LCD_SetCursor(0,0) ; LCD_Puts(buf) ; // 湿度(%)の表示 /* sprintf((char *)buf,"%.2f ",Temp) ; buf[6] = 0xF2 ; // ゜ buf[7] = 0x63 ; // c LCD_SetCursor(0,1) ; LCD_Puts(buf) ; // 温度(℃)の表示 */ } /// 気圧センサーから、気圧値を読出し、液晶表示する。 ans2 = PressureRead() ; // 結果は、Press(フロート型)に格納されている if (ans2 == 0) { sprintf((char *)buf,"%.2f ",Press) ; LCD_SetCursor(0,1) ; LCD_Puts(buf) ; // 大気圧(hPa)の表示 LCD_SetCursor(7,1) ; LCD_Putc(0x01) ; // 1番に登録した単位キャラ"hp"を表示する } __delay_ms(1000) ; } }