傳感器硬件: HTU31DF , BH1750 光照度傳感器,ADP5092 太陽能微能量採集模塊
ADC : Nordic nRF52840 12位 ADC 單端採集
軟件環境: Android Java
// 電池電壓計算
// 單端電壓檢測電阻分壓阻值爲: 1500,180歐姆,ADC 轉換公式:ADC值 = (Vp-Vn)*GAIN/REFERENCE * 2^(RESOLUTION-m), GAIN=1,REFERENCE=0.6,RESOLUTION=12,m=0,Vn=0V,Vp=檢測電阻端實際電壓值
int valueOfVoltageADC = 0;
float measurement_offset = 0.06f;
float voltageOfBattery = 0.0f;
valueOfVoltageADC = ((data_of_measurement[8] & 0x000000FF) << 8) + (data_of_measurement[9] & 0x000000FF);
valueOfVoltageADC &= 0x0000FFFF;
voltageOfBattery = (float) (((float) valueOfVoltageADC / 1.0 / 4096.0 * 0.6 - 0.0) * (1500.0 + 180.0) / 180.0 - measurement_offset);
// 計算 HTU21DF SENSOR 的溫度測量值
int iTempValue = 0;
iTempValue = ( (data_of_measurement[10] & 0x000000FF) << 8 ) + (data_of_measurement[11] & 0x000000FF);
iTempValue &= 0x0000FFFC;
float fTempValue = 0.0f;
fTempValue = (float)((float) iTempValue / 65536.0); //2^16 = 65536
fTempValue = (float) (-46.85 + (175.72 * fTempValue));
// 計算 HTU21DF SENSOR 的溼度測量值
int iRHValue = 0;
iRHValue = ( (data_of_measurement[12] & 0x000000FF) << 8 ) + (data_of_measurement[13] & 0x000000FF);
iRHValue &= 0x0000FFFC;
float fRHValue = 0.0f;
fRHValue = (float)((float)iRHValue / 65536.0); //2^16 = 65536
fRHValue = (float)(-6.0 + (125.0 * fRHValue));
if (fRHValue < 0.0f) fRHValue = 0.0f;
if (fRHValue > 100.0f) fRHValue = 100.0f;
// BH1750 光照度值
int iIlluValue = 0;
iIlluValue = ( (data_of_measurement[14] & 0x000000FF) << 8 ) + (data_of_measurement[15] & 0x000000FF);
iIlluValue &= 0x0000FFFC;
注意:
JAVA int 數據類型爲 4 字節有符號數, 故 byte[] 數據操作前,先用 & 0x000000FF 進行處理,以避免單字節 byte[] 在運算時,被系統轉換爲有符號數,而導致錯誤!