2484|1

7201

帖子

11

TA的资源

版主

楼主
 

【沁恒RISC-V内核 CH582】AHT10 [复制链接]

 

AHT10传感器,带转接板4.7元,体积小,精度湿度±2%RH,温度精度±0.3℃。这个是国产温湿度传感器,性价比是比较高的,前面采购元件时顺便买了一个回来,今天介绍AHT10温湿度传感器的使用。

关于AHT10温湿度传感器的数据手册在官方网站上面可以下载到:AHT10温湿度传感器的数据手册

网上给的驱动基本上是STM32的,今天我把CH582的驱动移植如下:

myii2.h:

  • /*
  • * myiic.h
  • *
  • * Created on: 2022年2月27日
  • * Author: Administrator
  • */
  • #ifndef SRC_MYIIC_H_
  • #define SRC_MYIIC_H_
  • #include "CH58x_common.h"
  • //IO方向设置
  • typedef unsigned char u8;
  • #define I2C_Pin_SCL GPIO_Pin_8
  • #define I2C_Pin_SDA GPIO_Pin_9
  • #define SCL_H GPIOB_SetBits( I2C_Pin_SCL )
  • #define SCL_L GPIOB_ResetBits( I2C_Pin_SCL )
  • #define SDA_H GPIOB_SetBits( I2C_Pin_SDA )
  • #define SDA_L GPIOB_ResetBits( I2C_Pin_SDA )
  • #define SCL_read GPIOB_ReadPortPin( I2C_Pin_SCL )
  • #define SDA_read GPIOB_ReadPortPin( I2C_Pin_SDA )
  • #define SCL_out GPIOB_ModeCfg(I2C_Pin_SCL, GPIO_ModeOut_PP_5mA)
  • #define SCL_in GPIOB_ModeCfg(I2C_Pin_SCL, GPIO_ModeIN_PU)
  • #define SDA_out GPIOB_ModeCfg(I2C_Pin_SDA, GPIO_ModeOut_PP_5mA)
  • #define SDA_in GPIOB_ModeCfg(I2C_Pin_SDA, GPIO_ModeIN_PU)
  • //IIC所有操作函数
  • void IIC_Init(void); //初始化IIC的IO口
  • void IIC_Start(void); //发送IIC开始信号
  • void IIC_Stop(void); //发送IIC停止信号
  • void IIC_Send_Byte(u8 txd); //IIC发送一个字节
  • u8 IIC_Read_Byte(unsigned char ack);//IIC读取一个字节
  • u8 IIC_Wait_Ack(void); //IIC等待ACK信号
  • void IIC_Ack(void); //IIC发送ACK信号
  • void IIC_NAck(void); //IIC不发送ACK信号
  • void IIC_Write_One_Byte(u8 daddr,u8 addr,u8 data);
  • u8 IIC_Read_One_Byte(u8 daddr,u8 addr);
  • #endif /* SRC_MYIIC_H_ */

myii2c.c

  • /*
  • * myiic.c
  • *
  • * Created on: 2022年2月27日
  • * Author: Administrator
  • */
  • #include "myiic.h"
  • #include "CH58x_common.h"
  • //初始化IIC
  • void IIC_Init(void)
  • {
  • SCL_out;
  • SDA_out;
  • }
  • //产生IIC起始信号
  • void IIC_Start(void)
  • {
  • SDA_out; //sda线输出
  • SDA_H;
  • SCL_H;
  • mDelayuS(4);
  • SDA_L;//START:when CLK is high,DATA change form high to low
  • mDelayuS(4);
  • SCL_L;//钳住I2C总线,准备发送或接收数据
  • }
  • //产生IIC停止信号
  • void IIC_Stop(void)
  • {
  • SDA_out;//sda线输出
  • SCL_L;
  • SDA_L;//STOP:when CLK is high DATA change form low to high
  • mDelayuS(4);
  • SCL_H;
  • SDA_H;//发送I2C总线结束信号
  • mDelayuS(4);
  • }
  • //等待应答信号到来
  • //返回值:1,接收应答失败
  • // 0,接收应答成功
  • u8 IIC_Wait_Ack(void)
  • {
  • u8 ucErrTime=0;
  • SDA_in; //SDA设置为输入
  • SDA_H;mDelayuS(1);
  • SCL_H;mDelayuS(1);
  • while(SDA_read)
  • {
  • ucErrTime++;
  • if(ucErrTime>250)
  • {
  • IIC_Stop();
  • return 1;
  • }
  • }
  • SCL_L;//时钟输出0
  • return 0;
  • }
  • //产生ACK应答
  • void IIC_Ack(void)
  • {
  • SCL_L;
  • SDA_out;
  • SDA_L;
  • mDelayuS(2);
  • SCL_H;
  • mDelayuS(2);
  • SCL_L;
  • }
  • //不产生ACK应答
  • void IIC_NAck(void)
  • {
  • SCL_L;
  • SDA_out;
  • SDA_H;
  • mDelayuS(2);
  • SCL_H;
  • mDelayuS(2);
  • SCL_L;
  • }
  • //IIC发送一个字节
  • //返回从机有无应答
  • //1,有应答
  • //0,无应答
  • void IIC_Send_Byte(u8 txd)
  • {
  • u8 t;
  • SDA_out;
  • SCL_L;//拉低时钟开始数据传输
  • for(t=0;t<8;t++)
  • {
  • if((txd&0x80)>>7)
  • SDA_H;
  • else
  • SDA_L;
  • txd<<=1;
  • mDelayuS(2);
  • SCL_H;
  • mDelayuS(2);
  • SCL_L;
  • mDelayuS(2);
  • }
  • }
  • //读1个字节,ack=1时,发送ACK,ack=0,发送nACK
  • u8 IIC_Read_Byte(unsigned char ack)
  • {
  • unsigned char i,receive=0;
  • SDA_in;//SDA设置为输入
  • for(i=0;i<8;i++ )
  • {
  • SCL_L;
  • mDelayuS(2);
  • SCL_H;
  • receive<<=1;
  • if(SDA_read)receive++;
  • mDelayuS(1);
  • }
  • if (!ack)
  • IIC_NAck();//发送nACK
  • else
  • IIC_Ack(); //发送ACK
  • return receive;
  • }

aht10.h

  • /*
  • * AHT10.h
  • *
  • * Created on: 2022年2月27日
  • * Author: Administrator
  • */
  • #include "CH58x_common.h"
  • #include "myiic.h"
  • #ifndef SRC_AHT10_H_
  • #define SRC_AHT10_H_
  • #define AHT10_ADDRESS 0x70
  • #define AHT10_WRITE 0x70
  • #define AHT10_READ 0x71
  • /*****************函数声明******************/
  • extern void AHT10Init(void);
  • extern uint8_t AHT10Check(void);
  • extern void AHT10Reset(void);
  • extern uint8_t AHT10ReadData(float *temperature,uint8_t *humidity);
  • #endif /* SRC_AHT10_H_ */

aht10.c

  • /*
  • * AHT10.c
  • *
  • * Created on: 2022年2月27日
  • * Author: Administrator
  • */
  • #include "CH58x_common.h"
  • #include "lcd.h"
  • #include "aht10.h"
  • #include "myiic.h"
  • /**
  • brief AHT10初始化函数
  • param NONE
  • return NONE
  • */
  • void AHT10Init()
  • {
  • IIC_Init();
  • IIC_Start();
  • IIC_Send_Byte(AHT10_ADDRESS);
  • IIC_Send_Byte(0xe1);
  • IIC_Send_Byte(0x08);
  • IIC_Send_Byte(0x00);
  • IIC_Stop();
  • mDelaymS(40);//延时20ms让传感器稳定
  • }
  • /**
  • brief 检查AHT10是否存在
  • param NONE
  • return 0存在 1不存在
  • */
  • u8 AHT10Check(void)
  • {
  • u8 ack=0;
  • IIC_Start();
  • IIC_Send_Byte(AHT10_ADDRESS);
  • ack=IIC_Wait_Ack();
  • IIC_Stop();
  • return ack;
  • }
  • /**
  • brief AHT10软复位
  • param NONE
  • return NONE
  • */
  • void AHT10Reset(void)
  • {
  • IIC_Start();
  • IIC_Send_Byte(AHT10_WRITE);
  • IIC_Wait_Ack();
  • IIC_Send_Byte(0xba);
  • IIC_Wait_Ack();
  • IIC_Stop();
  • }
  • /**
  • brief 检查AHT10读温湿度数据
  • param *temperature:需要读出的温度数据,float指针类型,精度范围+-0.3C
  • param *humidity:需要读出的湿度数据,u8指针类型,精度范围+-2RH
  • return 0 读数据正常 1读数据失败
  • */
  • u8 AHT10ReadData(float *temperature,u8 *humidity)
  • {
  • u8 ack;
  • uint32_t SRH=0,ST=0;
  • u8 databuff[6];
  • IIC_Start();
  • IIC_Send_Byte(AHT10_WRITE);
  • IIC_Wait_Ack();
  • IIC_Send_Byte(0xac);
  • IIC_Wait_Ack();
  • IIC_Send_Byte(0x33);
  • IIC_Wait_Ack();
  • IIC_Send_Byte(0x00);
  • IIC_Wait_Ack();
  • IIC_Stop();
  • mDelaymS(80);//延时一会等待数据读出
  • IIC_Start();
  • IIC_Send_Byte(AHT10_READ);
  • IIC_Wait_Ack();
  • ack=IIC_Read_Byte(1);
  • if((ack&0x40)==0)
  • {
  • databuff[0]=IIC_Read_Byte(1);
  • databuff[1]=IIC_Read_Byte(1);
  • databuff[2]=IIC_Read_Byte(1);
  • databuff[3]=IIC_Read_Byte(1);
  • databuff[4]=IIC_Read_Byte(0);
  • IIC_Stop();
  • SRH=(databuff[0]<<12)+(databuff[1]<<4)+(databuff[2]>>4);
  • ST=((databuff[2]&0X0f)<<16)+(databuff[3]<<8)+(databuff[4]);
  • *humidity=(int)(SRH*100.0/1024/1024+0.5);
  • LCD_ShowIntNum(30, 100, *humidity, 2, BLUE,WHITE, 32);
  • *temperature=((int)(ST*2000.0/1024/1024+0.5))/10.0-50;
  • LCD_ShowFloatNum1(10, 50, *temperature, 4, BLUE,WHITE, 32);
  • return 0;
  • }
  • IIC_Stop();
  • return 1;
  • }

main.c

  • /********************************** (C) COPYRIGHT *******************************
  • * File Name : Main.c
  • * Author : 刘建华
  • * Version : V1.0
  • * Date : 2022/02/27
  • * Description : 演示ST7735 硬件SPI驱动 i2c 驱动AHT10,显示
  • *******************************************************************************/
  • #include "CH58x_common.h"
  • #include "lcd_init.h"
  • #include "lcd.h"
  • #include "aht10.h"
  • UINT16 abcBuff[40];
  • uint32_t temp_value;
  • volatile UINT8 adclen;
  • void DebugInit( void )
  • {
  • GPIOA_SetBits( GPIO_Pin_9 );
  • GPIOA_ModeCfg( GPIO_Pin_8, GPIO_ModeIN_PU );
  • GPIOA_ModeCfg( GPIO_Pin_9, GPIO_ModeOut_PP_5mA );
  • UART1_DefInit();
  • }
  • int main()
  • {
  • UINT8 i;
  • char show_shr[30];
  • float *temperate;
  • uint8_t *humidity;
  • int C25;
  • int cal;
  • C25 = (*((PUINT32)ROM_CFG_TMP_25C));
  • signed short RoughCalib_Value = 0; // ADC粗调偏差值
  • SetSysClock( CLK_SOURCE_PLL_60MHz );
  • /* 配置串口调试 */
  • DebugInit();
  • AHT10Init();
  • LCD_Init();
  • LCD_Fill(0,0,LCD_W,LCD_H,WHITE);
  • LCD_Fill(0,0,LCD_W,LCD_H,WHITE);
  • LCD_ShowString(10,0,"CH582M",BLUE,WHITE,32,0);
  • i = AHT10Check();
  • LCD_ShowChinese(36,30,"温度",BLACK,WHITE,24,0);
  • LCD_ShowChinese(96,56,"℃",BLACK,WHITE,24,0);
  • LCD_ShowChinese(36,80,"湿度",BLACK,WHITE,24,0);
  • LCD_ShowString(70, 100, "%", BLUE,WHITE, 32, 0);
  • while( 1 )
  • {
  • if (i==0) {
  • AHT10ReadData(temperate,humidity);
  • //LCD_ShowFloatNum1(10, 80, *temperate, 4, BLUE,WHITE, 32);
  • //LCD_ShowIntNum(10, 120, *humidity, 2, BLUE,WHITE, 32);
  • }
  • else {
  • LCD_ShowString(10,80,"NO AHT10!",RED,WHITE,16,0);
  • }
  • mDelaymS(1000);
  • }
  • }


吹气后可以看到温度、湿度的变化。

最新回复

吹气结果看温湿度的显示还是比较灵敏的   详情 回复 发表于 2022-2-28 23:29
点赞 关注
 
 

回复
举报

6997

帖子

0

TA的资源

五彩晶圆(高级)

沙发
 

吹气结果看温湿度的显示还是比较灵敏的

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
报名最后一周!2025 英飞凌消费、计算与通讯创新大会-北京站
会议时间:3月18日(周二)09:30签到
参会奖励:电动螺丝刀套装、户外登山包、京东卡

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表