JHM3000體溫感測器驅動

2021-10-05 06:59:55 字數 2589 閱讀 1329

因2020疫情影響,國內突然就冒出來一堆做體溫計的廠商。。。

硬體平台:nrf52832 + jhm3000

jhm3000是個單線通訊的體溫感測器晶元,線性度較好,校準後精度可達0.1度。

主要問題是通訊是單io輸出,晶元上電後,io就會不停地輸出脈衝訊號,需要mcu計算脈寬來解碼資料。

每個取樣週期為:2.8ms間隔 + 6ms資料傳輸

相鄰兩個高脈寬之比決定資料型別,start=3:3, bit0=5:1, bit1=1:5

資料樣本:91,3,3,1,6,1,5,5,1,1,5,5,1,1,5,1,5,6,1,1,5,6,1,1,5,5,2,1,5,5,1,91,3,4,...

每次取樣共1個start+14個bit資料:s+bbbbbbbbbbbbb

解碼資料的時候,需要先找到start資料,然後才開始解析取樣資料。

下面是主要原始碼:

/*

* jhm3000 體溫感測器驅動程式

* 每次取樣2.8ms + 資料傳輸6ms

* 單線io輸出,相鄰兩個高脈寬之比決定資料,start=3:3, bit0=5:1, bit1=1:5

* 資料樣本:61,4,3,1,5,1,6,5,1,1,6,5,1,1,5,1,5,1,5,6,1,1,5,6,1,5,1,1,6,1,5,

* 91,3,3,1,6,1,5,5,1,1,5,5,1,1,5,1,5,6,1,1,5,6,1,1,5,5,2,1,5,5,1,

* 91,3,4,...

* 每次取樣共1個start+14個bit資料:s+bbbbbbbbbbbbb

* 蔣曉崗* 2020.03.06

*/#include #include #include "log.h"

#include "bsp.h"

#include "sdk.h"

//判斷資料型別,錯誤返回0, 成功返回1,s位bit=-1,bit10,bit1返回1

static int decode_one_bit(uint32_t t1, uint32_t t2, int *bit)

if(t1 > t2) }

if(t2 > t1) }

*bit = -1;

return 1;

}//等待管腳電平跳變

static int wait_pin_state(int state, uint32_t timeout)

else

}return 0;

}//計算高電平時長

static int calc_pulse_width(uint32_t *pw)

ret = wait_pin_state(0, 5);

if(!ret)

*pw = diff;

return 1;

}//等待高電平結束

static int wait_for_idle(void)

//等待adc取樣開始

//adc取樣有2.5ms高電平

static int wait_for_adc(void)

if(pw > 30)

}return 0;

}//接收一位資料

static int recv_one_bit(int *bit)

ret = calc_pulse_width(&t2);

if(!ret)

return decode_one_bit(t1, t2, bit);

}//接收取樣起始訊號

static int recv_start_bit(void)

return bit == -1;

}//接收取樣資料

//資料=1位符號+13位資料

static int recv_adc_data(int *data)

if(bit < 0)

if(bit)

}//log("drv_hm3000: raw=%d\r\n", tmp);

*data = tmp >> 2;

return 1;

}//取樣資料

static int sample_data(int *data)

ret = wait_for_adc();

if(!ret)

ret = recv_start_bit();

if(!ret)

ret = recv_adc_data(data);

if(!ret)

return ret;

}#if 0

//除錯資料

static void dump_data(void)

for(i=0; i<64; i++)

log("\r\n");

}#endif

//讀取取樣資料

int drv_hm3000_read(int *data)

//開啟晶元電源

void drv_hm3000_enable(void)

//關閉晶元電源

void drv_hm3000_disable(void)

//初始化驅動

void drv_hm3000_init(void)

粉塵感測器ZPH01驅動

該驅動使用的是串列埠方式,需要將模式腳拉低,封裝最後輸出的是濃度,單位是ug m3。demo是基於和小夥伴一起封裝的stm32f103c8系列微控制器的底層驅動,編寫語言是c 平台是keil5。該感測器是已經封裝過一次的,他會每間隔1秒通過串列埠傳送一次資料。而我要做的便是使使用者更加簡單的獲取到需...

LIS3DETR感測器驅動除錯

目前使用了感測器的兩個功能,乙個是讀取x,y,z軸的原資料,另乙個是設定軸資料的差值,超過差值產生中斷通知 1.讀取x,y,x的原資料,基本可以參考st的參考 實現 inizialize mems sensor set odr turn on device response lis3dh setod...

詳解溫度感測器tmp275驅動

本文介紹ti 德州儀器 的數字溫度感測器tmp275並一步步講解驅動編寫。tmp275典型連線 tmp275中文晶元資料手冊 該器件為i2c通訊,所以假設你已經了解i2c,並且寫出 i2c init 初始化匯流排 i2c start 啟動訊號 i2c stop 停止訊號 i2c respon 應答訊...