成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

OpenHarmony設備開發(六)-紅外溫度傳感器

系統 OpenHarmony
紅外溫度傳感器應用廣泛,在疫情期間可做體溫測量,在汽車上可做空調控制、防霧應用,在家庭中可做家電溫度控制等等。

??想了解更多關于開源的內容,請訪問:??

??51CTO 開源基礎軟件社區??

??https://ost.51cto.com??

前言

最近的一個項目需要用到紅外溫度傳感器,便想著能不能在Hi3861上開發這個外設,經過摸索了一陣子,終于把紅外溫度傳感器簡單的開起來了,后面還會追加對傳感器的使用。

本次使用開發板:HiSpark_WiFi_IoT。

紅外溫度傳感器

介紹

紅外溫度傳感器應用廣泛,在疫情期間可做體溫測量,在汽車上可做空調控制、防霧應用,在家庭中可做家電溫度控制等等。

MLX90614是一款紅外非接觸溫度計(下文多以gy906簡稱)。TO-39金屬封裝里同時集成了紅外感應熱電堆探測器芯片和信號處理專用集成芯片。用以阻礙可見光和近紅外光輻射的光學濾波器(可傳播長波)集成在封裝內提供對環境和日光的免疫。需注意的是封裝內部的溫差會影響溫度計測量的精度,需要盡量將傳感器和環境隔離。

#打卡不停更#【FFH】OpenHarmony設備開發(六)-紅外溫度傳感器-開源基礎軟件社區

協議

查閱文檔時,發現這個紅外溫度傳感器是使用SMBus通信協議或者PWM(默認SMBus輸出格式),其中SMBus協議需要IO口設置為開漏輸出,在Hi3861的IO口模式選擇中并未發現有開漏輸出選項,因此暫時不選擇SMBus協議。

#打卡不停更#【FFH】OpenHarmony設備開發(六)-紅外溫度傳感器-開源基礎軟件社區

通過摸索了一大陣子得知,SMbus 規格是由 I2C 簡化而來。兩條信號線為 SMBCLK 和 SMBDATA. 這和 I2C 上的 Clock(SCL) 和 Data(SDA) 是一樣的。SMBus的讀取數據格式與I2C協議大差不差,差別只在于電平認定。

#打卡不停更#【FFH】OpenHarmony設備開發(六)-紅外溫度傳感器-開源基礎軟件社區

兩者協議的電平認定雖有不同,但也有部分交集。

I2C協議中有兩者電平認定:相對認定和絕對認定,其中的相對認定是依據Vdd的電壓來決定,高電平為0.7 Vdd,低電平低于0.3 Vdd即可。

再看一看紅外溫度傳感器上的SMBus協議(如下圖),高電平需要高于Vdd-0.1,和I2C協議符合。而低電平最大只能0.6V,這里就只能希望Hi3861的I2C能將低電平拉得到0.6V以下了。但巧合了,經過驗證Hi3861可以使用!

#打卡不停更#【FFH】OpenHarmony設備開發(六)-紅外溫度傳感器-開源基礎軟件社區

準備

本次使用到的是MLX90614BCC版本,該型號的供電是3V,注意不要不要插到5V的供電。!

#打卡不停更#【FFH】OpenHarmony設備開發(六)-紅外溫度傳感器-開源基礎軟件社區

接線:

VIN->3V3,GND->GND,SLK->SLK,SDA->SDA。

#打卡不停更#【FFH】OpenHarmony設備開發(六)-紅外溫度傳感器-開源基礎軟件社區

既然已經使用到了I2C,那么便需要知道該設備的地址,查閱了挺久的,發現了該設置的默認地址為0X00或者是0XB4,其中0x00是單個I2C設備連接時默認都能訪問到。并且可以修改EEPROM,對其進行修改I2C地址。如果不小心修改了地址,又忘記了地址,便可以把傳感器單獨插上去,讀0X0E的數值便可以得到設備的地址。

#打卡不停更#【FFH】OpenHarmony設備開發(六)-紅外溫度傳感器-開源基礎軟件社區

傳感器將溫度數據存在RAM里面的Tojb1,而ram里面Tobj1的地址為0x07,則得知讀取溫度的指令則為0x07,向該設備發送0x07,便可讀取到溫度數據。

#打卡不停更#【FFH】OpenHarmony設備開發(六)-紅外溫度傳感器-開源基礎軟件社區

#打卡不停更#【FFH】OpenHarmony設備開發(六)-紅外溫度傳感器-開源基礎軟件社區

代碼編寫

IO口初始化

老步驟,第一步先IO口初始化。

流程:

  • GPIO口初始化(開發板背后有標注GPIO口:13,14)。
  • IO口復用成I2C。
  • I2C口初始化(從hi_io.h里面的GPIO口管腳功能列舉可得知I2C口)。
#define GPIO_SDA 13
#define GPIO_SCL 14
#define GY906_I2C 0
void gy906_init(void)
{
IoTGpioInit(GPIO_SDA);
IoTGpioInit(GPIO_SCL);
hi_io_set_func(GPIO_SDA, HI_IO_FUNC_GPIO_13_I2C0_SDA);
hi_io_set_func(GPIO_SCL, HI_IO_FUNC_GPIO_14_I2C0_SCL);
hi_i2c_init(GY906_I2C, 400000);
}

主函數及線程

查詢相關文檔,gy906反饋的信息有三個,第一個是低位數據,第二個是高位數據,第三個是校驗位.將高位數據和低位數據拼接,再通過公式計算即可得出溫度數據。

#打卡不停更#【FFH】OpenHarmony設備開發(六)-紅外溫度傳感器-開源基礎軟件社區

流程:

  1. 初始化I2c傳輸數據。
  2. 接收傳感器反饋回來的數據。
  3. 判斷數據的正確性。
  4. 對數據做拼接計算,即可得出溫度數據。
#define GY906_I2C 0
#define GY906_addr 0x00 // 0x00 or 0xB4
//獲取溫度數值
void gy906_get(void)
{
hi_i2c_data gy_data = {0}; //I2C數據結構
uint8_t recv_data[3] = {0}; //接收數據緩存
uint8_t send_data[1] = {0x07}; //讀取溫度的指令
//初始化gy_data
gy_data.send_buf = send_data;
gy_data.send_len = 1;
gy_data.receive_buf = recv_data;
gy_data.receive_len = 3;
//I2C讀寫操作
hi_i2c_writeread(GY906_I2C, (GY906_addr << 1) | 0x01, &gy_data);
//進行校驗位判斷
uint8_t addr[6] = {0, 0, 0, 0x01, 0x07, 0x00};
addr[1] = recv_data[1]; //高位
addr[2] = recv_data[0]; //低位
uint8_t PY_CRC1 = PEC_Calculation(addr);
//如果校驗位正確
if (PY_CRC1 == recv_data[2])
{
printf("temperture correct!\n");
}
//如果校驗位錯誤,返回全部數值
else
{
printf("temperature false!\n");
printf("recv_data:low:%x high:%x CRC:%x\n", recv_data[0], recv_data[1], recv_data[2]);
printf("CRC1:%x\n", PY_CRC1);
}
//打印溫度 T= (DataH:DataL)*0.02-273.15
float temperature_f = (((float)((recv_data[1] << 8) | recv_data[0])) * 2 - 27315) / 100;
printf("temperature:%.2f\n", temperature_f);
}
//主函數
void gy906_demo(void)
{
//IO口初始化
gy906_init();
while (1)
{
gy906_get();
sleep(1);
}
}
//線程創建
void gy_demo(void)
{
osThreadAttr_t attr;

attr.name = "gy_demo";
attr.attr_bits = 0U;
attr.cb_mem = NULL;
attr.cb_size = 0U;
attr.stack_mem = NULL;
attr.stack_size = 10240;
attr.priority = 25;

if (osThreadNew((osThreadFunc_t)gy906_demo, NULL, &attr) == NULL)
{
printf("[gy_demo] Falied to create gy_demo!\n");
}
}

SYS_RUN(gy_demo);

校驗算法

#打卡不停更#【FFH】OpenHarmony設備開發(六)-紅外溫度傳感器-開源基礎軟件社區

算法的代碼如下(部分介紹打在注釋上:

uint8_t PEC_Calculation(uint8_t pec[])
{
uint8_t crc[6]; //存放多項式
uint8_t BitPosition = 47; //存放所有數據最高位,6*8=48 最高位就是47位
uint8_t shift;
uint8_t i;
uint8_t j;
uint8_t temp;
do
{
/*初始化 0x00 00 00 00 01 07*/
crc[5] = 0;
crc[4] = 0;
crc[3] = 0;
crc[2] = 0;
crc[1] = 0x01;
crc[0] = 0x07;
//設置最大位位位置為47,記錄位位置
BitPosition = 47;
/*Set shift position at 0*/
shift = 0;
/*查找pec[5]開始的傳輸消息中的第一個“1”*/
i = 5;
j = 0;
//0x80 -> 1000 0000,一位一位地找第一個"1"
while ((pec[i] & (0x80 >> j)) == 0 && i > 0)
{
//位位置-1
BitPosition--;
if (j < 7)
{
j++;
}
else
{
j = 0x00;
i--;
}
} /*End of while*/
/*記錄位位置*/
shift = BitPosition - 8;
/*校驗操作 */
//循環次數為:shift
while (shift)
{
for (i = 5; i < 0xFF; i--) //i<0xff即是i>0,遍歷crc數組
{
//以下操作即是把一個八位的數據整體向左移一位,最高位移到最低位,例:1001 1000 ->0011 0001
if ((crc[i - 1] & 0x80) && (i > 0))
{
temp = 1;
}
else
{
temp = 0;
}
crc[i] <<= 1; //左移一位
crc[i] += temp;
} /*End of for*/
shift--;
} /*End of while*/

//將已經操作過的位 置0
for (i = 0; i <= 5; i++)
{
pec[i] ^= crc[i];
} /*End of for*/
} while (BitPosition > 8); /*循環操作*/

return pec[0];
}

編譯腳本BUILD.gn

static_library("my_gy906_demo") {
sources = [
"gy906.c",
]
include_dirs = [
"http://utils/native/lite/include",
"http://kernel/liteos_m/components/cmsis/2.0",
"http://base/iot_hardware/peripheral/interfaces/kits",
"http://device/soc/hisilicon/hi3861v100/sdk_liteos/include",
]
}

效果

#打卡不停更#【FFH】OpenHarmony設備開發(六)-紅外溫度傳感器-開源基礎軟件社區

#打卡不停更#【FFH】OpenHarmony設備開發(六)-紅外溫度傳感器-開源基礎軟件社區

 

文章相關附件可以點擊下面的原文鏈接前往下載:

https://ost.51cto.com/resource/2302。

??想了解更多關于開源的內容,請訪問:??

??51CTO 開源基礎軟件社區??

??https://ost.51cto.com??。

責任編輯:jianghua 來源: 51CTO開源基礎軟件社區
相關推薦

2022-09-28 13:48:13

設備開發鴻蒙

2023-03-16 15:18:16

2023-03-20 16:05:49

HDF傳感器驅動開發

2021-01-03 15:37:33

傳感器物聯網大數據

2022-12-07 14:45:16

數據中心溫度傳感器

2023-07-11 18:30:05

智能設備半導體

2021-04-14 14:55:08

智能傳感器物聯網新技術

2020-05-12 20:57:41

物聯網傳感器IOT

2023-08-25 15:39:34

物聯網傳感器

2015-10-20 15:31:23

可穿戴設備物聯網

2013-12-17 11:04:10

iOS開發傳感器

2014-08-11 16:41:05

Android傳感器

2012-02-28 14:43:43

2021-09-14 10:12:10

物聯網傳感器IOT

2015-07-13 09:21:50

風速傳感器物聯網

2020-12-01 12:13:37

物聯網智能傳感器IOT

2022-08-03 11:14:09

物聯網傳感器

2020-08-28 09:55:58

半導體技術系統

2020-06-29 07:18:02

物聯網傳感器IOT

2020-04-20 13:27:20

傳感器可穿戴技術醫療保健
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 影音先锋中文字幕在线观看 | 亚洲精品一区在线观看 | 精品欧美乱码久久久久久1区2区 | 嫩草懂你的影院入口 | 久久久久国产一级毛片高清网站 | 99热在线观看精品 | 欧洲亚洲视频 | 日韩成人影院在线观看 | 国产精品免费观看 | 欧美片网站免费 | 日韩av啪啪网站大全免费观看 | 蜜臀91视频 | 欧美精品一区二区蜜桃 | 成人午夜精品 | h视频在线观看免费 | 国产色网站| 人成精品| 亚洲欧美在线一区 | 亚洲欧美在线一区 | 超碰在线97国产 | 日本一区二区三区在线观看 | 91成人小视频 | 日韩三区 | 国产精品日本一区二区在线播放 | 欧美成人h版在线观看 | 欧美国产在线一区 | 国产成人精品久久二区二区 | 久久99精品久久久久久 | 欧美色综合天天久久综合精品 | 欧美精品久久久久 | 精品久久不卡 | 一区二区三区久久久 | 日本精品裸体写真集在线观看 | 国产精品免费一区二区三区 | 91精品国产综合久久精品图片 | 97超碰人人| 三区在线观看 | 国产精品成人久久久久 | 久久99精品久久久久子伦 | 国产欧美日韩精品一区二区三区 | 久久久久久久久久久久久9999 |