中风吃什么药好| 台湾人说什么语言| 2005年是什么生肖| zxj是什么意思| 子宫形态不规则是什么意思| 为什么会痛经| 阴虚吃什么食补最快| 玻色因是什么| 虫合读什么| 什么去疤痕效果最好| jsdun是什么牌子的手表| 7.30是什么星座| 精子什么味| 平仓什么意思| 为什么同房后小腹隐隐作痛| 端游什么意思| 意念是什么意思| 什么的耳朵| 钟爱一生是什么意思| 猜忌是什么意思| 狗不吃饭是什么原因| 硬化是什么意思| 大便漂浮水面说明什么| 脱疽是什么意思| 2月20日是什么星座| 冬字五行属什么| 什么的粉墙| 普陀山求什么最灵| 角加斗读什么| 阴阳失调吃什么中成药| fsh是什么意思| 一唱一和是什么生肖| icu什么意思| 缺钙查什么化验项目| 孕妇梦见水是什么意思| 上火吃什么水果| 什么是心肌缺血| 谋杀是什么意思| 入肉是什么意思| 薛之谦属什么生肖| 前列腺液是什么颜色| 1992年是什么年| 突兀什么| 甲状腺手术后可以吃什么水果| cde是什么意思| 罗勒是什么| 脚气用什么药好| 月经来了一点就没了是什么原因| 帕金森看什么科室| 万人空巷是什么意思| 促甲状腺素低是什么原因| 膀胱炎看什么科| 胎膜早破是什么症状| 冷藏和冷冻有什么区别| 梦见自己相亲是什么征兆| 长痱子是什么原因| 人的五官指什么| 飞行员妻子有什么待遇| 守宫吃什么| 倾城是什么意思| 空腔是什么意思| 湿疹挂什么科| 神经内科主要看什么| 腰痛看什么科| 顶格是什么意思| 不想要孩子用什么办法最好| 三公是什么意思| 女人吃当归有什么好处| 潮热是什么意思| 乙肝145阳性是什么意思| 风水是什么意思| 冬至说什么祝福语| 湿厕纸是干什么用的| 吃榴莲不能吃什么东西| 八哥鸟吃什么饲料最好| 眩晕症是什么原因引起| 软组织密度影什么意思| 舌尖长溃疡是什么原因| 硬水是什么| 胃息肉是什么原因造成的| 瓠子是什么| 熬中药用什么锅最好| 10a是什么意思| 什么是| 李商隐被称为什么| 花漾是什么意思| 属虎和什么属相最配| 四环素片主要治什么病| 肾囊性灶是什么意思| 甲状腺炎有什么症状表现| 无名指长代表什么| 月亮为什么会有圆缺变化| 英姿飒爽是什么意思| 左眼皮跳跳好事要来到是什么歌| 翅膀车标是什么车| 生意兴隆是什么生肖| 肋骨骨折吃什么食物好得快| 灵芝孢子粉是什么| 宠物兔吃什么| BE是什么| 虚汗是什么症状| 重阳节干什么| 建日是什么意思| 欣是什么意思| 芡实是什么| 处女座的幸运数字是什么| 怎么是什么意思| 皮炎用什么药膏最有效| 火龙果和什么不能一起吃| 什么情况下月经推迟| 右眼跳是什么预兆| 收缩压低是什么原因| 血浆蛋白是什么| 贫嘴是什么意思| 七六年属什么| 吃什么促进恶露排干净| 端午节吃什么食物| 孕妇做无创是检查什么| 未见明显胚芽是什么意思| 肉松是什么做的| 突然头晕想吐是什么原因| 容易感冒的人缺什么| 处男是什么意思| 大便不正常是什么原因造成的| 全身检查要挂什么科| 口腔溃疡是什么原因| 吃什么拉什么完全不能消化怎么办| 很会放屁是什么原因| 脑瘤早期什么症状| 口腔溃疡缺什么| 双身什么意思| 口红是什么做的| 粉刺长什么样图片| 梦见大风大雨预示什么| 为什么吹空调会咳嗽| 牛的四个胃分别叫什么| 喜人是什么意思| 济公搓的泥丸叫什么| 眼底出血是什么原因引起的| 肱骨头小囊变什么意思| 晚上喝牛奶有什么好处| 肾精亏虚吃什么中成药| 94年什么生肖| 激素脸是什么样子| 湿吻是什么意思| 佛家思想的核心是什么| 黄金有什么作用| 翻墙软件是什么| 儿童口臭什么原因引起的| 催供香是什么意思| 立加羽念什么| 皑皑是什么意思| 黄瓜和青瓜有什么区别| 吃什么解辣最快方法| 疝气是什么意思| 什么大米好吃| 吃什么有助于骨头恢复| 肠绞痛什么原因引起的| 什么是苏打水| 心跳过缓吃什么药| april什么意思| ab和a型血生的孩子是什么血型| 血压高吃什么药比较好| 骄阳似火是什么意思| 酷盖是什么意思| 1937年是什么年| 煮虾放什么| 9月27日是什么星座| 黄原胶是什么| 人工流产后可以吃什么| cea检查是什么意思| 吃什么拉肚子| 胰腺疼痛吃什么药| 经常失眠是什么原因| 膝盖发热是什么原因| mido手表什么档次| 七月七日是什么日子| 心主什么| 深圳属于什么方向| 六月十一号是什么星座| 强颜欢笑是什么意思| 什么酷暑| 打疫苗挂什么科| bc是什么牌子| 硬结灶是什么意思| 脊柱炎吃什么药| 什么不可| 龋齿是什么样子的图片| 一月十八号是什么星座| 犯六冲是什么意思| 看眼睛挂什么科| 法益是什么意思| 农历3月12日是什么星座| 泌尿系统感染吃什么药| 椰浆和椰汁有什么区别| 太监和宫女对食是什么意思| 房客是什么意思| 爱妃是什么意思| 为什么半夜流鼻血| 唐筛都检查什么| 喉咙痛吃什么水果好| 尿液臭味很重什么原因| 看脊椎挂什么科| 什么的讲| 什么病不能吃空心菜| 睡觉头出汗是什么原因| 翠色什么流| 右眼皮跳是什么预兆男| 12生肖为什么没有猫| 造瘘手术是什么意思| 温州特产是什么| 结核抗体阳性说明什么| 周二右眼皮跳是什么预兆| 火靠念什么| 汤圆和元宵有什么区别| 罪恶感什么意思| 血酮体高代表什么| 宫外孕是什么原因造成的| 自己买什么药可以打胎| 面藕是什么| 吃什么不长肉还能瘦| 脐橙什么意思| 枸杞和什么一起泡水喝最好| 包皮嵌顿是什么| 审时度势是什么意思| 鱼生是什么| 六角恐龙吃什么| 猫字五行属什么| 3月14日是什么日子| 孩子黑眼圈很重是什么原因| 二线用药是什么意思| 人为什么会打呼噜| 鼠妇是什么动物| 跨界歌手是什么意思| 着床出血是什么样的| 支那人是什么意思| 蛇的尾巴有什么作用| 酷暑的反义词是什么| 吃什么食物补铁| dew是什么意思| 分泌物多是什么原因| 地贫有什么症状| bottle是什么意思| 胎脂是什么原因造成的| 听字五行属什么| 鸭肉和什么一起炖好吃| 七上八下是什么生肖| prada什么牌子| 经常放臭屁是什么原因| 吃什么能补气血| s999是什么意思| 丁字是什么意思| 离子水是什么水| 崩盘是什么意思| 三心二意是什么意思| 男性性功能下降是什么原因| 腊月初六是什么星座| 维他命是什么| 桃花什么季节开| 耳鸣和脑鸣有什么区别| 小腿浮肿是什么原因女性| 带下病是什么病| est是什么意思| 为什么犹太人聪明| 百度
这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 ? 论坛首页 ? 企业专区 ? Renesas ? 瑞萨RA0单片机连载之七——面向对象编程之SHT31温度计

共5条 1/1 1 跳转至

瑞萨RA0单片机连载之七——面向对象编程之SHT31温度计

工程师
2025-08-05 09:08:16     打赏
百度 今年是周恩来总理诞辰120周年。

SHT3X是一款优秀的温湿度计。他采用i2c接口,地址为0x44。

他的驱动与原理的讲解非常的丰富,网上也有非多的现成的代码,我这里不做过多的阐述。

本篇的主要特点是在前面OLED驱动的前提下,对sht31进行面向对象的编程方式进行讲解。

【前提】

在OLED驱动之中,我已经初始化了I2C的总线,所以有总线驱动在本篇没有做,如果是使用spi或者其他的方式进行数据展示,那么需要加上对i2c总线进行初始化。

【实现步骤】

1、创建sensor.h,在其中创建结构体

typedef struct SensorDevice {
    char *name;
	  uint8_t        slaveAddr; //从机地址
	  
	  float          Temp;
	  float          Hum;
	  unsigned short read_status;
	  int            (*Init)(void);   /* 硬件初始化 */
	  void            (*Read)(struct SensorDevice *ptDev);  //读取温湿度
} SensorDevice, *PSensorDevice;

2、创建drv_sensor.c

首先实例化

static SensorDevice gSht31Dev = {
                             .name = "SHT31",
	                           .slaveAddr = 0x44,
	                           //.Init = Sht3xDrvGpioInit,
	                           .Temp = 0,
	                           .Hum  = 0,
	                           .read_status = 0,
	                           .Read = sht3x_read,
};

struct SensorDevice *SHT31GetDevice(void)
{
    return &gSht31Dev;
}

接下来编写发送、接收超时函数

static void I2C2WaitTxCplt(void)
{
    uint16_t wTimeOut = 1;
    while(!gI2C2TxCplt && wTimeOut)
    {
        HAL_Delay(1);
        wTimeOut--;
    }
    gI2C2TxCplt = false;
}

static void I2C2WaitRxCplt(void)
{
    uint16_t wTimeOut = 10;
    while(!gI2C2RxCplt && wTimeOut)
    {
        HAL_Delay(1);
        wTimeOut--;
    }
    gI2C2RxCplt = false;
}

为了验证读取的温度与数据是否正确,编写CRC函数如下:

/*
* @name   CRC_8
* @brief  CRC-8校验
* @param  Crc_ptr -> 校验数据首地址
		LEN     -> 校验数据长度
* @retval CRC_Value -> 校验值      
*/
static uint8_t CRC_8(uint8_t *Crc_ptr,uint8_t LEN)
{
	uint8_t CRC_Value = 0xFF;
	uint8_t i = 0,j = 0;

	for(i=0;i<LEN;i++)
	{
		CRC_Value ^= *(Crc_ptr+i);
		for(j=0;j<8;j++)
		{
			if(CRC_Value & 0x80)
				CRC_Value = (CRC_Value << 1) ^ 0x31;
			else
				CRC_Value = (CRC_Value << 1);
		}
	}
	return CRC_Value;
}

在读取温度的函数中首先向sht31发送开始转换命令0x2400,我将他封装在一个数据中,使用R_SAU_I2C_Write进行一次性发送。当然由于总线上有SSD1306操作时他的g_sau_i2c_master_ctrl的从机地址是SSD1306的0x3c所以,需要先配置sht31的地址,他的发送数据转换命令如下:

	g_sau_i2c_master_ctrl.slave = ptDev->slaveAddr;
	err = R_SAU_I2C_Write(&g_sau_i2c_master_ctrl,cmd, 2, true);
	I2C2WaitTxCplt();
	if(FSP_SUCCESS != err )
	{
			ptDev->read_status = 0;
			printf("Error when open i2c1 device!\r\n");
			return ;
	}

由于转换需要一段时间,需要延时。

延时之后,我一次读取6位数据,如果获取数据成功,则进行CRC并进行float转换,转换成功后放到结构体中,并更新状态:整个获取数据的代码如下:

static void sht3x_read(struct SensorDevice *ptDev)
{
	if(NULL == ptDev)  return;
	fsp_err_t err;
	uint32_t temp_uint;
	//写入开始转换的命令
	//0xE000是向SHT30取数据的指令,主机发送该指令后开始读取SHT30的温湿度数据
	uint8_t temp_array[6] = {0};
	uint8_t cmd[] = {
		0x24,0x00
	};
	g_sau_i2c_master_ctrl.slave = ptDev->slaveAddr;
	err = R_SAU_I2C_Write(&g_sau_i2c_master_ctrl,cmd, 2, true);
	I2C2WaitTxCplt();
	if(FSP_SUCCESS != err )
	{
			ptDev->read_status = 0;
			printf("Error when open i2c1 device!\r\n");
			return ;
	}
	HAL_Delay(2);
	
	err = R_SAU_I2C_Read(&g_sau_i2c_master_ctrl, temp_array, 6, true);
	I2C2WaitRxCplt();
	if(FSP_SUCCESS != err )
    {
			  ptDev->read_status = 0;
        printf("Error when open i2c1 device!\r\n");
        return ;
    }
	else
	{
		        //计算温度
        if(CRC_8(temp_array,2) == temp_array[2])                //进行CRC-8校验
        {
            temp_uint = temp_array[0]*256+temp_array[1];        //取出16位的温度值
            ptDev->Temp = ((float)temp_uint)*0.267032-4500;    //根据手册公式计算,为了精度,计算数值先*100
            ptDev->Temp = ptDev->Temp*0.01;             //再除以100,得到正常温度值
        }

        //计算湿度
        if(CRC_8(&temp_array[3],2) == temp_array[5])            //进行CRC-8校验
        {
            temp_uint = temp_array[3]*256+temp_array[4];        //取出16位的湿度值
            ptDev->Hum = ((float)temp_uint)*0.152590;           //根据手册公式计算
            ptDev->Hum = (uint8_t)(ptDev->Hum*0.01);      //除以100,得到正常湿度值
					ptDev->read_status = 1;
        }
				
				
	}
}

【数据展示】

在主函数中编写测试代码如下,如果获取到温度数据则显示温湿度,如果获取出错则显示EEROR,其代码如下:

void led_blink(void)
{
	
	UartDevicesRegister();

	DisplayDevice *ptDispDev = OLEDGetDevice();
    if(NULL == ptDispDev )
    {
        printf("Failed to get OLED Display Device!\r\n");
        return;
    }
		uint8_t cnt;
    ptDispDev->Init(ptDispDev);
		ptDispDev->GUI_Set_Horizontal_Mode(ptDispDev,0,128,0,64);
	SensorDevice *ptSHT31Dev = SHT31GetDevice();
	if(NULL == ptSHT31Dev)
	{
		printf("Failed to get Sht31 Device!\r\n");
		return;
	}
	while(1)
	{
		ptSHT31Dev->Read(ptSHT31Dev);
		
		if(cnt>96) cnt = 0;
        ptDispDev->GUI_clear(ptDispDev,0);
		    if(1 == ptSHT31Dev->read_status)
				{
					ptDispDev->GUI_ShowString(ptDispDev,10,16, (uint8_t *)"TEMP:",16,1);
					ptDispDev->GUI_ShowNum(ptDispDev,64,16,(int)ptSHT31Dev->Temp,2,16,1);
					ptDispDev->GUI_ShowString(ptDispDev,16,32, (uint8_t *)"HUM:",16,1);
					ptDispDev->GUI_ShowNum(ptDispDev,64,32,(int)ptSHT31Dev->Hum,2,16,1);
				}
				else
				{
					ptDispDev->GUI_ShowString(ptDispDev,10,16, (uint8_t *)"TEMP:ERROR",16,1);
				}
				ptDispDev->GUI_DrawLine(ptDispDev,0,0,cnt,0,1);
				ptDispDev->GUI_Display(ptDispDev);
		    
				//HAL_Delay(1);
		cnt ++;
	}
}

【实验效果】

image.png

【总结】

使用面向对象对sht31的驱动进行封装,在瑞萨的FSP驱动中,可以快速实现驱动,同时只需要提供驱动的接口,可以实现低耦合的功能。






关键词: 刘工爱评测之瑞萨RA0单片机     SHT31     面向对    

工程师
2025-08-05 09:11:46     打赏
2楼

FSP_SHT31.zip附工程源码


高工
2025-08-05 11:04:02     打赏
3楼

谢谢分享


专家
2025-08-05 11:10:04     打赏
4楼

感谢楼主分享


专家
2025-08-05 16:32:05     打赏
5楼

感谢楼主分享


共5条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]
梦见河水是什么意思 女性体毛多是什么原因 ups是什么快递公司 彩虹像什么挂在天空 女人左手心痒预示什么
西罗手表什么档次 10pcs是什么意思 雨淋棺材有什么说法 2021年属什么 有点拉肚子吃什么药
烤肉用什么油 时年是什么意思 感冒吃什么菜 第二职业干点什么好呢 葡萄糖偏高是什么原因
课代表是什么意思 萎缩性胃炎吃什么水果好 膀胱过度活动症是什么原因引起的 主动脉硬化什么意思 肿标五项查的是什么
螚什么意思hcv8jop1ns9r.cn 扑街是什么意思hcv8jop3ns0r.cn 二氧化碳低是什么原因luyiluode.com 狗狗吃什么hcv9jop2ns8r.cn 吃叶酸有什么好处520myf.com
驾驶证c1和c2有什么区别hcv8jop8ns6r.cn 生黄瓜吃了有什么好处hcv9jop1ns9r.cn 糙皮病是什么病hcv8jop3ns8r.cn 皮革胃是什么意思hcv8jop9ns3r.cn 心肌病是什么病严重吗hcv9jop1ns9r.cn
货值是什么意思zsyouku.com 什么的青年jinxinzhichuang.com 椎体楔形变是什么意思96micro.com 痔疮吃什么食物hcv9jop6ns4r.cn 阴唇痒是什么原因xjhesheng.com
公主抱是什么意思hcv8jop0ns5r.cn 拔罐紫色说明什么hcv8jop8ns7r.cn 猴戏是什么意思hcv7jop9ns6r.cn 看阴茎挂什么科hcv8jop0ns4r.cn cpi是什么hcv9jop5ns4r.cn
百度