RA4M2开发(4)----读取HS3003数据,并在OLED上显示,串口打印

news/2024/12/29 17:55:30/

概述

HS3003是一种数字式温湿度传感器,可以测量环境中的温度和湿度。读取HS3003的数据需要连接传感器到一个数据采集系统,一般是微处理器或者单片机。以下是一个简单的读取HS3003数据的概述:

  1. 连接电路:将HS3003传感器连接到微处理器或单片机的GPIO引脚。需要注意HS3003的电气特性,比如供电电压和信号电平等。
  2. 发送命令:发送读取温湿度数据的命令到HS3003传感器。具体的命令格式和通信协议需要参考HS3003的数据手册。
  3. 接收数据:等待HS3003传感器回应,并接收传感器发送的数据。HS3003传感器的数据一般是经过数字转换后的二进制数据,需要解析成温湿度值。
  4. 解析数据:将接收到的二进制数据解析成温湿度值。具体的解析算法需要参考HS3003的数据手册,一般涉及到位移、位运算、符号扩展等操作。
  5. 处理数据:对得到的温湿度值进行处理,比如校准、滤波、显示等。
  6. 循环读取:根据需要循环执行步骤2到5,以实现连续读取HS3003传感器的温湿度数据。
    需要注意的是,HS3003传感器的使用和读取数据需要按照数据手册的规范和建议操作,否则可能会导致数据精度降低、传感器损坏等问题。
    最近在弄课程,需要样片的可以加群申请:6_15061293。

视频教学

https://www.bilibili.com/video/BV1th4y1R7of/

瑞萨RA开发(4)----读取HS3003数据,并在OLED上显示,串口打印

csdn课程

csdn课程更加详细。
https://edu.csdn.net/course/detail/36131

样品申请

https://www.wjx.top/vm/wBbmSFp.aspx#

硬件准备

首先需要准备一个开发板,这里我准备的是芯片型号R7FAM2AD3CFP的开发板:
在这里插入图片描述

样品申请

https://www.wjx.top/vm/wBbmSFp.aspx#

IIC配置

配置RA4M2的I2C接口,使其作为I2C master进行通信。
对于OLED的IIC配置,可以查看往期的博客。
查看HS3003说明书,最小电路图如下所示。
在这里插入图片描述

由于需要读取HS3003数据,需要使用IIC接口,这里使用PMOD2上的接口(P410和P411)。
在这里插入图片描述

点击Stacks->New Stack->Connectivity -> I2C Master(r_sci_i2c)。
在这里插入图片描述

查看说明书可以得知,ISL29035的地址为0x44(1000100)。
在这里插入图片描述

设置IIC的配置。
在这里插入图片描述

R_SCI_I2C_Open()函数原型

在这里插入图片描述

R_SCI_I2C_Open()函数为执行IIC初始化,开启配置如下所示。

        /* Initialize the I2C module */err = R_SCI_I2C_Open(&g_i2c0_ctrl, &g_i2c0_cfg);/* Handle any errors. This function should be defined by the user. */assert(FSP_SUCCESS == err);

R_SCI_I2C_Write()函数原型

在这里插入图片描述

R_SCI_I2C_Write()函数是向IIC设备中写入数据,写入格式如下所示。

    err = R_SCI_I2C_Write(&g_i2c0_ctrl, &g_i2c_tx_buffer[0], I2C_BUFFER_SIZE_BYTES, false);assert(FSP_SUCCESS == err);

R_SCI_I2C_Read()函数原型

在这里插入图片描述

R_SCI_I2C_Read()函数是向IIC设备中读取数据,读取格式如下所示。

    err = R_SCI_I2C_Write(&g_i2c0_ctrl, &g_i2c_tx_buffer[0], I2C_BUFFER_SIZE_BYTES, false);assert(FSP_SUCCESS == err);

sci_i2c_master_callback()回调函数

对于数据是否发送完毕,可以查看是否获取到I2C_MASTER_EVENT_TX_COMPLETE字段。
在这里插入图片描述

/* Callback function */
i2c_master_event_t i2c_event1 = I2C_MASTER_EVENT_ABORTED;
void sci_i2c_master_callback0(i2c_master_callback_args_t *p_args)
{/* TODO: add your own code here */i2c_event1 = I2C_MASTER_EVENT_ABORTED;if (NULL != p_args){/* capture callback event for validating the i2c transfer event*/i2c_event1 = p_args->event;}
}

HS3003写数据

对于HS3003写数据,手册上的操作方式如下所示。
设备地址+操作地址+数据
在这里插入图片描述

初始化程序如下所示。

void Humiture_HS3003_writeRegister( int reg_address, uint8_t val)
{uint8_t ii[2]={0x00,0x00};ii[0] = reg_address;ii[1] = val;err = R_SCI_I2C_Write(&g_i2c0_ctrl, ii, 0x02, false);assert(FSP_SUCCESS == err);/* Since there is nothing else to do, block until Callback triggers*///while ((I2C_MASTER_EVENT_TX_COMPLETE != i2c_event) && timeout_ms)while ((I2C_MASTER_EVENT_TX_COMPLETE != i2c_event1) && timeout_ms1>0){R_BSP_SoftwareDelay(1U, BSP_DELAY_UNITS_MICROSECONDS);timeout_ms1--;}if (I2C_MASTER_EVENT_ABORTED == i2c_event1){__BKPT(0);}/* Read data back from the I2C slave */i2c_event1 = I2C_MASTER_EVENT_ABORTED;timeout_ms1           = 100000;}

HS3003读数据

对于读取数据,可以直接在发送地址后,进行读取,当时需要注意再发送完地址后,要有等待时间。
在这里插入图片描述

读取操作函数如下所示,先发送操作地址,在进行读取,这里是一次读取32位。

uint32_t Humiture_HS3003_readRegister32(uint8_t reg_address) {uint32_t value;uint8_t data[4];timeout_ms1           = 100000;/* Read data from I2C slave */err = R_SCI_I2C_Read(&g_i2c0_ctrl, &data, 0x04, false);assert(FSP_SUCCESS == err);while ((I2C_MASTER_EVENT_RX_COMPLETE != i2c_event1) && timeout_ms1){R_BSP_SoftwareDelay(1U, BSP_DELAY_UNITS_MILLISECONDS);timeout_ms1--;}if (I2C_MASTER_EVENT_ABORTED == i2c_event1){__BKPT(0);}i2c_event1 = I2C_MASTER_EVENT_ABORTED;timeout_ms1           = 100000;value=data[0];value<<=8;value|=data[1];value<<=8;value|=data[2];value<<=8;value|=data[3];return value;
}

HS3003初始化

首先需要将HS3003进行唤醒,默认情况下是睡眠模式。
唤醒需要对Measurement Requests (MR)进行操作,MR命令用于将HS300x从休眠模式唤醒。通过发送7位从地址和第8位=0 (WRITE)来发起测量请求。

在这里插入图片描述

对于不同精度的数据读取,等待时间是不同的。

在这里插入图片描述

对于等待的时间,可以参考下图红框的数据。
在这里插入图片描述

HS3003读取温湿度

对于读取数据,可以直接在发送地址后,进行读取,当时需要注意再发送完地址后,要有等待时间。
在这里插入图片描述

读取操作函数如下所示,先发送操作地址,在进行读取。

void Humiture_HS3003_init(void)
{Humiture_HS3003_writeRegister(HS300X_ADR,0);}
//读取原始的数据
uint32_t Humiture_HS3003_ReadData_Raw(uint8_t resolution )
{uint8_t rx_buf[ 4 ];uint32_t data=0;Humiture_HS3003_init();//唤醒//8bit->1.2ms//10bit->2.72ms//12bit->9.10ms//14bit->33.90msif(resolution==8)R_BSP_SoftwareDelay(1200U, BSP_DELAY_UNITS_MICROSECONDS);else if(resolution==10)R_BSP_SoftwareDelay(2720U, BSP_DELAY_UNITS_MICROSECONDS);else if(resolution==12)R_BSP_SoftwareDelay(9100U, BSP_DELAY_UNITS_MICROSECONDS);elseR_BSP_SoftwareDelay(34U, BSP_DELAY_UNITS_MILLISECONDS);data=Humiture_HS3003_readRegister32(HS300X_ADR);return data;
}

对于读取的数据,需要进行处理。
湿度在后两个字节的15-2位,温度在前2个字节的13-0位。
在这里插入图片描述

对于原始的数据,要对他进行处理。
在这里插入图片描述

    Data=Humiture_HS3003_ReadData_Raw(14);Temp = (float)( (Data & 0xFFFF) >> 2);//只要低十六位Temp = Temp*HS300X_TEMP_MULTY*165-40;//HS300X_TEMP_MULTY->0.00006163516(1/(2^14-1) )Humidity = (float)( (Data >> 16) &0x3FFF );//只要高十六位,且最高2位不要Humidity = Humidity*HS300X_HUMD_MULTY*100;//HS300X_HUMD_MULTY->0.00006163516(1/(2^14-1) )

实现效果

正常显示数据。
在这里插入图片描述

同时串口也可以打印数据。
在这里插入图片描述

主程序

#include "hal_data.h"
#include <stdio.h>
#include "Humiture_HS3003.h"
#include "oled.h"
#include "bmp.h"
FSP_CPP_HEADER
void R_BSP_WarmStart(bsp_warm_start_event_t event);
FSP_CPP_FOOTERfsp_err_t err = FSP_SUCCESS;
volatile bool uart_send_complete_flag = false;
/* Callback function */
void user_uart_callback(uart_callback_args_t *p_args)
{/* TODO: add your own code here */if(p_args->event == UART_EVENT_TX_COMPLETE){uart_send_complete_flag = true;}
}#ifdef __GNUC__                                 //串口重定向#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
PUTCHAR_PROTOTYPE
{err = R_SCI_UART_Write(&g_uart9_ctrl, (uint8_t *)&ch, 1);if(FSP_SUCCESS != err) __BKPT();while(uart_send_complete_flag == false){}uart_send_complete_flag = false;return ch;
}
int _write(int fd,char *pBuffer,int size)
{for(int i=0;i<size;i++){__io_putchar(*pBuffer++);}return size;
}/* Callback function */
i2c_master_event_t i2c_event1 = I2C_MASTER_EVENT_ABORTED;
void sci_i2c_master_callback0(i2c_master_callback_args_t *p_args)
{/* TODO: add your own code here */i2c_event1 = I2C_MASTER_EVENT_ABORTED;if (NULL != p_args){/* capture callback event for validating the i2c transfer event*/i2c_event1 = p_args->event;}
}/* Callback function */
i2c_master_event_t i2c_event = I2C_MASTER_EVENT_ABORTED;
void sci_i2c_master_callback(i2c_master_callback_args_t *p_args)
{i2c_event = I2C_MASTER_EVENT_ABORTED;if (NULL != p_args){/* capture callback event for validating the i2c transfer event*/i2c_event = p_args->event;}
}uint32_t  timeout_ms1 = 100000;
uint32_t  timeout_ms = 100000;
float Temp=0.0f;
float Humidity=0.0f;
uint32_t Data=0;//温湿度原始数据
/*******************************************************************************************************************//*** main() is generated by the RA Configuration editor and is used to generate threads if an RTOS is used.  This function* is called by main() when no RTOS is used.**********************************************************************************************************************/
void hal_entry(void)
{/* TODO: add your own code here *//* Initialize the I2C module */err = R_SCI_I2C_Open(&g_i2c3_ctrl, &g_i2c3_cfg);/* Handle any errors. This function should be defined by the user. */assert(FSP_SUCCESS == err);OLED_Init();            //初始化OLEDOLED_Clear()    ;OLED_ShowCHinese(0,0,0);//记OLED_ShowCHinese(16,0,1);//帖OLED_ShowString(0,2,"Temp:",16);OLED_ShowString(0,4,"Humidity:",16);/* Initialize the I2C module */err = R_SCI_I2C_Open(&g_i2c0_ctrl, &g_i2c0_cfg);/* Handle any errors. This function should be defined by the user. */assert(FSP_SUCCESS == err);Humiture_HS3003_init();/* Open the transfer instance with initial configuration. */fsp_err_t err = R_SCI_UART_Open(&g_uart9_ctrl, &g_uart9_cfg);assert(FSP_SUCCESS == err);printf("hello world!\n");while(1)
{Data=Humiture_HS3003_ReadData_Raw(14);Temp = (float)( (Data & 0xFFFF) >> 2);//只要低十六位Temp = Temp*HS300X_TEMP_MULTY*165-40;//HS300X_TEMP_MULTY->0.00006163516(1/(2^14-1) )Humidity = (float)( (Data >> 16) &0x3FFF );//只要高十六位,且最高2位不要Humidity = Humidity*HS300X_HUMD_MULTY*100;//HS300X_HUMD_MULTY->0.00006163516(1/(2^14-1) )OLED_Clear()    ;OLED_ShowCHinese(0,0,0);//记OLED_ShowCHinese(16,0,1);//帖OLED_ShowString(0,2,"Temp:",16);OLED_ShowString(0,4,"Humidity:",16);if(Temp<10 && Temp>=0)//0<=Temp<10{OLED_ShowNum(48,2,(int)(Temp),1,16);//显示Temp整数OLED_ShowString(56,2,".",16);OLED_ShowNum(64,2,(int)(Temp*100) - ( ((int)Temp) *100),1,16);//显示Temp小数if(( (int)(Temp*100) - ( ((int)Temp) *100) ) <10  )OLED_ShowString(64,2,"0",16);}else if (Temp>=10 && Temp<100)//10<=Temp<100{OLED_ShowNum(48,2,(int)(Temp),2,16);//显示Temp整数OLED_ShowString(64,2,".",16);OLED_ShowNum(72,2,(int)(Temp*100) - ( ((int)Temp) *100),2,16);//显示Temp小数if(( (int)(Temp*100) - ( ((int)Temp) *100) ) <10  )OLED_ShowString(72,2,"0",16);}else if (Temp>=100 && Temp<1000)//100<=Temp<1000{OLED_ShowNum(48,2,(int)(Temp),3,16);//显示Temp整数OLED_ShowString(72,2,".",16);OLED_ShowNum(80,2,(int)(Temp*100) - ( ((int)Temp) *100),2,16);//显示Temp小数if(( (int)(Temp*100) - ( ((int)Temp) *100) ) <10  )OLED_ShowString(80,2,"0",16);}if(Humidity<10)//0<=Humidity<10{OLED_ShowNum(72,4,(int)(Humidity),1,16);//显示Humidity整数OLED_ShowString(80,4,".",16);OLED_ShowNum(88,4,(int)(Humidity*100) - ( ((int)Humidity) *100),2,16);//显示Temp小数if(( (int)(Humidity*100) - ( ((int)Humidity) *100) ) <10  )OLED_ShowString(88,4,"0",16);}else if(Humidity>10 && Humidity<100){OLED_ShowNum(72,4,(int)(Humidity),2,16);//显示Humidity整数OLED_ShowString(88,4,".",16);OLED_ShowNum(96,4,(int)(Humidity*100) - ( ((int)Humidity) *100),2,16);//显示Temp小数if(( (int)(Humidity*100) - ( ((int)Humidity) *100) ) <10  )OLED_ShowString(96,4,"0",16);}printf("Temp=%.2f,Humidity=%.2f\n",Temp,Humidity);R_BSP_SoftwareDelay(1000U, BSP_DELAY_UNITS_MILLISECONDS);
}#if BSP_TZ_SECURE_BUILD/* Enter non-secure code */R_BSP_NonSecureEnter();
#endif
}

Humiture_HS3003.c

/** Humiture_HS3003.c**  Created on: 2023年2月19日*      Author: a8456* 交流群:615061293*/
#include "hal_data.h"
#include "Humiture_HS3003.h"
extern fsp_err_t err;
extern int  timeout_ms1;
extern  i2c_master_event_t i2c_event1 ;uint32_t Humiture_HS3003_readRegister32(uint8_t reg_address) {uint32_t value;uint8_t data[4];timeout_ms1           = 100000;/* Read data from I2C slave */err = R_SCI_I2C_Read(&g_i2c0_ctrl, &data, 0x04, false);assert(FSP_SUCCESS == err);while ((I2C_MASTER_EVENT_RX_COMPLETE != i2c_event1) && timeout_ms1){R_BSP_SoftwareDelay(1U, BSP_DELAY_UNITS_MILLISECONDS);timeout_ms1--;}if (I2C_MASTER_EVENT_ABORTED == i2c_event1){__BKPT(0);}i2c_event1 = I2C_MASTER_EVENT_ABORTED;timeout_ms1           = 100000;value=data[0];value<<=8;value|=data[1];value<<=8;value|=data[2];value<<=8;value|=data[3];return value;
}void Humiture_HS3003_writeRegister( uint8_t reg_address, uint8_t *buffer, uint8_t len)
{err = R_SCI_I2C_Write(&g_i2c0_ctrl, buffer, len, false);assert(FSP_SUCCESS == err);/* Since there is nothing else to do, block until Callback triggers*///while ((I2C_MASTER_EVENT_TX_COMPLETE != i2c_event) && timeout_ms)while ((I2C_MASTER_EVENT_TX_COMPLETE != i2c_event1) && timeout_ms1>0){R_BSP_SoftwareDelay(1U, BSP_DELAY_UNITS_MICROSECONDS);timeout_ms1--;}if (I2C_MASTER_EVENT_ABORTED == i2c_event1){__BKPT(0);}/* Read data back from the I2C slave */i2c_event1 = I2C_MASTER_EVENT_ABORTED;timeout_ms1           = 100000;}void Humiture_HS3003_init(void)
{Humiture_HS3003_writeRegister(HS300X_ADR,NULL,0);}//读取原始的数据
uint32_t Humiture_HS3003_ReadData_Raw(uint8_t resolution )
{uint8_t rx_buf[ 4 ];uint32_t data=0;Humiture_HS3003_init();//唤醒//8bit->1.2ms//10bit->2.72ms//12bit->9.10ms//14bit->33.90msif(resolution==8)R_BSP_SoftwareDelay(1200U, BSP_DELAY_UNITS_MICROSECONDS);else if(resolution==10)R_BSP_SoftwareDelay(2720U, BSP_DELAY_UNITS_MICROSECONDS);else if(resolution==12)R_BSP_SoftwareDelay(9100U, BSP_DELAY_UNITS_MICROSECONDS);elseR_BSP_SoftwareDelay(34U, BSP_DELAY_UNITS_MILLISECONDS);data=Humiture_HS3003_readRegister32(HS300X_ADR);return data;
}

Humiture_HS3003.h

/** Humiture_HS3003.h**  Created on: 2023年2月19日*      Author: a8456* 交流群:615061293*/#ifndef HUMITURE_HS3003_H_
#define HUMITURE_HS3003_H_#define HS300X_ADR  0x44
#define HS300X_HUMD_MULTY           0.00006163516
#define HS300X_TEMP_MULTY           0.00006163516//uint8_t HuMIture_HS3003_readRegister8(uint8_t reg_address);
uint32_t Humiture_HS3003_readRegister32(uint8_t reg_address);
void Humiture_HS3003_writeRegister( uint8_t reg_address, uint8_t *buffer, uint8_t len);void Humiture_HS3003_init(void);
uint32_t Humiture_HS3003_ReadData_Raw(uint8_t resolution);#endif /* HUMITURE_HS3003_H_ */

http://www.ppmy.cn/news/647029.html

相关文章

PHY M2

一些芯片资料常常遇到MAC MODE 和PHY MODE 不知什么意思&#xff1f; 一般以太网芯片中涉及&#xff0c;一般交换芯片&#xff08;比如ks8993吗&#xff0c;8305sb等&#xff09;可以选择两种模式&#xff0c;mac和phy。 应该就是针对不同的外部接口采用的不同模式吧&#xf…

Renesas瑞萨RA4M2和STM32 CAN通信

刚好拿到一块瑞萨开发板&#xff0c;捣鼓玩下CAN&#xff0c;顺便试下固件升级。 A4M2 工程创建 详细可以参考&#xff0c;我之前写的文章 Renesa 瑞萨 A4M2 移植文件系统FAT32 CAN0 配置信息&#xff0c;使能FIFO&#xff0c;接收标准帧 ID为0x50&#xff0c;数据帧。 代…

【算法】Reconstruct a 2-Row Binary Matrix 重构 2 行二进制矩阵

文章目录 Reconstruct a 2-Row Binary Matrix 重构 2 行二进制矩阵问题描述&#xff1a;分析代码 Tag Reconstruct a 2-Row Binary Matrix 重构 2 行二进制矩阵 问题描述&#xff1a; 给你一个 2 行 n 列的二进制数组&#xff1a; 矩阵是一个二进制矩阵&#xff0c;这意味着…

Flink 自定义源算子之 读取MySQL

1、功能说明&#xff1a; 在Flink 自定义源算子中封装jdbc来读取MySQL中的数据 2、代码示例 Flink版本说明&#xff1a;flink_1.13.0、scala_2.12 自定义Source算子&#xff0c;这里我们继承RichParallelSourceFunction&#xff0c;因为要使用open方法来初始化数据库连接对…

debian10新建文档_图解Debian 10(Buster)安装步骤

Debian 项目发布了它的最新稳定版 Debian 10&#xff0c;其代号是 “Buster”&#xff0c;这个发布版将获得 5 年的支持。Debian 10 可用于 32 位和 64 位系统。这个发布版带来很多新的特色&#xff0c;列出下面一些特色&#xff1a; 引入新的 Debian 10 的主题 “FutureProtot…

三星台式机计算机编号怎么看,[图文解析]手把手教你如何看懂硬盘编号

硬盘作为电脑传统三大零配件之一&#xff0c;直接负责存储用户的全部数据资料&#xff0c;一旦损坏或者出现故障&#xff0c;后果将非常严重。同时&#xff0c;硬盘在IT配件里算是一个精密产品&#xff0c;制造难度比内存、板卡等高出许多。硬盘内部是由机械和电子两大部件组成…

Ubuntu20.04安装详细图文教程(双系统)

Ubuntu安装 前言 最近想把自己开发环境换成linux的&#xff0c;查了一下还是ubuntu桌面比较美观并且作为生产系统生态良好&#xff0c;决定使用ubuntu。开始了着手查找安装Ubuntu双系统的方法。安装有三种&#xff1a; 虚拟机安装wubi安装U盘安装 第一种发挥不出硬件本身的…

台式计算机由哪些硬件组成,台式电脑硬件是由哪些组成的 - 卡饭网

台式电脑硬件的安装步骤 台式电脑硬件的安装步骤 当大家需要一台台式电脑时,大家肯定会想到DIY装机,不仅性价比高,而且可以恰好满足自己的需求,当然装机可以让电脑城的师傅帮你完成,但是为了提高大家的动手能力,小编整理了台式电脑硬件的安装步骤,希望对需要的朋友有所帮助. 猜…