STM32驱动AHT10&OLED显示温湿度

这篇具有很好参考价值的文章主要介绍了STM32驱动AHT10&OLED显示温湿度。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

AHT10温湿度传感器介绍

①实物图

aht10 stm32,STM32专栏,stm32,单片机,arm

②产品说明

AHT10是新一代的温湿度传感器,使用SMD封装,上面有一个改进型的MEMS半导体电容式湿度传感器和一个标准的片上温度传感器原件,可用于空调,除湿器等温湿度控制领域的检测。

③电气参数

电气参数 AHT10模块
工作电压 DC1.8-3.3V
通讯接口 IIC
湿度 分辨率:0.024 %RH 误差:±2%RH
温度 分辨率:0.01℃ 误差:±0.3℃

④AHT10工作原理

AHT10使用IIC通讯,在使用其作为温湿度检测相关控制时候,需要注意其相关时许和相关寄存器操作说明,启动和停止时许如下:
aht10 stm32,STM32专栏,stm32,单片机,arm

驱动代码

①OLED相关驱动代码

OLED的代码在一些开源网站上面,基本上都已经开源了其底层驱动代码,并写好了相关接口,在这里我不做详细介绍,需要的小伙伴可以自行下载,链接:http://www.lcdwiki.com/zh/0.96inch_OLED_Module_MC096VX

②AHT10的STM32端口模拟IIC代码

STM32使用模拟IIC的时候跟51单片机有轻微区别,需要配置引脚的输入输出模式。

#include "I2C.h"
#include "delay.h"

#define SDA GPIO_Pin_7
#define SCL GPIO_Pin_6
#define I2C_Prot GPIOB

#define SDA_High 	GPIO_SetBits(I2C_Prot,SDA)
#define SDA_Low 	GPIO_ResetBits(I2C_Prot,SDA)
#define SCL_High 	GPIO_SetBits(I2C_Prot,SCL)
#define SCL_Low 	GPIO_ResetBits(I2C_Prot,SCL)

void SDA_OUT(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Pin   = SDA;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;
	GPIO_Init(I2C_Prot,&GPIO_InitStructure);	
}

void SDA_IN(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Pin   = SDA;
	GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_IPU;
	GPIO_Init(I2C_Prot,&GPIO_InitStructure);	
}

//初始化IIC
void I2C_Initation(void)
{					     
	GPIO_InitTypeDef GPIO_InitStructure;
	RCC_APB2PeriphClockCmd(	RCC_APB2Periph_GPIOB, ENABLE );	//使能GPIOB時鐘
	   
	GPIO_InitStructure.GPIO_Pin = SDA|SCL;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;   //推挽輸出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(I2C_Prot, &GPIO_InitStructure);
	GPIO_SetBits(I2C_Prot,SDA|SCL); 	//PB6,PB7 輸出高
}

//IIC起始信号
void I2C_Start(void)
{
	SDA_OUT();     	//SDA设置为输出
	SDA_High;	
	SCL_High;
	delay_us(4);
	SDA_Low;		//START:当SCL为高电平时候,SCL拉低 
	delay_us(4);
	SCL_Low;		//准备发送或接收 
}

//IIC结束信号
void I2C_Stop(void)
{
	SDA_OUT();		//SDA配置为输出
	SDA_Low; 		//STOP:当SCL为低电平时候,SDA由低变为高
 	delay_us(4);
	SCL_High;	
	delay_us(4);
	SDA_High;		//发送IIC结束信号
	delay_us(4);							   	
}

u8 I2C_Write_Ack(void)
{
	u8 TimeAck = RESET;
	SDA_IN();
	SCL_High;
	delay_us(2);
	
	while(GPIO_ReadInputDataBit(I2C_Prot,SDA))
	{
		if(++TimeAck > 250)
		{
			I2C_Stop();
			return 1;
		}
	}
	SCL_Low;
	delay_us(2);	
	return 0;
}

// ack=0时, 不产生ACK应答, ack=1时候,产生ACK应答	
void I2C_Is_Ack(u8 ack)
{
	SCL_Low;
	SDA_OUT();
	if(ack)
		SDA_Low;	
	else
		SDA_High;	
	delay_us(2);
	SCL_High;		
	delay_us(2);
	SCL_Low;
}
					 				     
//IIC发送一位数据
void I2C_Send_Byte(u8 txd)
{                        
    SDA_OUT(); 	    
	SCL_Low;		//拉低时钟开始传输
    for(u8 t=0;t<8;t++)
    {              
		if((txd&0x80)>>7)
			SDA_High;
		else
			SDA_Low;
		txd<<=1; 	  
		delay_us(2);   
		SCL_High;	
		delay_us(2); 
		SCL_Low;	
		delay_us(2);
    }	 
} 


//读一位数据,ack=1时,发送ACK,ack=0,发送nACK   
u8 I2C_Read_Byte(unsigned char ack)
{
	unsigned char i,receive=0;
	SDA_IN();	//SDA设置为输入
    for(i=0;i<8;i++ )
	{
		SCL_High;			
		delay_us(2);
        receive<<=1;
        if(READ_SDA)receive++;   
		SCL_Low;			
		delay_us(1); 
    } 
	
    if (!ack)
		I2C_Is_Ack(0);
    else
		I2C_Is_Ack(1);	
    return receive;
}


//读取一位数据
u8 I2C_Read_Data(void)
{
	u8 Data = RESET;
	SDA_IN();		
	for(u8 i=0;i<8;i++)
	{
		SCL_High;
		delay_us(2);
		Data <<= 1; 
		
		if(GPIO_ReadInputDataBit(I2C_Prot,SDA) == SET)
		{
			Data |= 0x01;
		}
		
		SCL_Low;
		delay_us(2);
	}	
	return Data;
}

③AHT10相关驱动

配合AHT10的手册,先对其相关寄存器进行宏定义,.H头文件如下:

#ifndef _AHT10_H_
#define _AHT10_H_

#include "sys.h"
#include "delay.h"

#define AHT_ADDRESS 0X70 //0X38
#define AHT_WRITE   0X70
#define AHT_READ    0X71 //0X39

extern u8 ACK,DATA[6];

void  AHT10_Write_Reset(void);
u8    AHT10_State(void);
u8    AHT10_Read_Humi_Temp(float *humidity, float *temperature);

#endif

数据处理函数:使用指针的方式灵活操作在主函数中写入

u8 AHT10_Read_Humi_Temp(float *humidity, float *temperature)
{ 
	u32 humi = 0,temp = 0;
	
	I2C_Start();
	I2C_Send_Byte(AHT_WRITE);		
	I2C_Write_Ack();
	I2C_Send_Byte(0XAC);	 //触发测量	
	I2C_Write_Ack();
	I2C_Send_Byte(0X33);		
	I2C_Write_Ack();
	I2C_Send_Byte(0X00);		
	I2C_Write_Ack();
	I2C_Stop();
	
	delay_ms(80);
	
	I2C_Start();
	I2C_Send_Byte(AHT_READ);	
	I2C_Write_Ack();
	ACK = I2C_Read_Data();
	I2C_Is_Ack(1);
	
	if((ACK&0X08) == 0)
	{
		AHT10_Write_Init();
	}
	if((ACK&0X80) == 0)
	{ 	
		for(u8 i=0;i<5;i++){ 
			
			DATA[i] = I2C_Read_Data();			
			if(i == 4)
				I2C_Is_Ack(0);
			 
				I2C_Is_Ack(1);
		} 
		I2C_Stop();
		
		humi = (DATA[0]<<12)|(DATA[1]<<4)|(DATA[2]>>4);
		temp = ((DATA[2]&0X0F)<<16)|(DATA[3]<<8)|(DATA[4]);
		
		*humidity = (humi * 100.0/1024/1024+0.5);
		*temperature = (temp * 2000.0/1024/1024+0.5)/10.0-50;

		return 0;
	}
	
	I2C_Stop();
	return 1;
}

具体测试现象

aht10 stm32,STM32专栏,stm32,单片机,arm

总结

文章中使用的显示方式为0.96寸OLED模块显示,驱动MCU使用的为STM32F103C8T6,在使用AHT10的过程中也可以自己根据AHT10的驱动代码所得到的温湿度值去做其他的接口应用,例如做温控风扇,或者其他温湿度控制系统案例均可移植使用,需要完整工程的可下方留言邮箱获取。文章来源地址https://www.toymoban.com/news/detail-789684.html

到了这里,关于STM32驱动AHT10&OLED显示温湿度的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32 —— 温湿度( AHT20 )传感器入门

    温湿度的具体使用方法可以看官方给出的基于 STM32 的历程,这里只进行简单介绍 官方历程如下: AHT20-21 DEMO V1_3(stm32) AHT20在STM32上的例程 V1.4 DHT20 是 DHT11 的全新升级产品,配置了专用的 ASIC 传感器芯片、高性能的半导体硅基电容式湿度传感器和一个标准的片上温度传感器,并

    2024年02月07日
    浏览(43)
  • STM32通过I2C接口实现温湿度(AHT20)的采集

    学习I2C总线通信协议,使用STM32F103完成基于I2C协议的AHT20温湿度传感器的数据采集,并将采集的温度-湿度值通过串口输出。具体任务: 1)解释什么是“软件I2C”和“硬件I2C”? (阅读野火配套教材的第23章“I2C–读写EEPROM”原理章节) 2)阅读AHT20数据手册,编程实现:每隔

    2024年02月03日
    浏览(46)
  • 基于STM32F103C8T6单片机的DHT11温湿度传感器与OLED显示屏实时动态数据监测系统设计

    标题: 摘要: 本文提出了一种利用STM32F103C8T6微控制器,结合DHT11数字温湿度传感器和OLED显示屏实现环境温湿度实时、直观显示的方法。该系统通过低功耗且精确的DHT11传感器获取环境温湿度信息,并借助于STM32F103C8T6强大的处理能力和I/O资源进行数据读取、解析以及控制OLE

    2024年01月19日
    浏览(65)
  • STM32日历读取与温湿度显示

    STM32的 RTC 外设(Real Time Clock),实质是一个掉电后还继续运行的定时器。 掉电: 读取STM32F103C8T6 内部的时钟(年月日时分秒),日历(星期x),1秒周期,通过串口输出到PC上位机 1、初始化 RTC 外设; 2、设置时间以及添加配置标志; 3、获取当前时间; 1、定义时间结构体,包含

    2024年02月20日
    浏览(39)
  • stm32项目之DHT11温湿度显示(LCD1602)

    掌握LCD1602的使用 掌握DHT11的原理及使用 看懂LCD1602和DHT11时序图 看懂DHT11的原理 掌握LCD1602的显示 编写程序用LCD1602显示温湿度 DHT11部分: DATA 用于微处理器与 DHT11之间的通讯和同步,采用单总线数据格式,一次 通讯时间4ms左右,数据分小数部分和整数部分,具体格式在下面说明,当

    2024年02月02日
    浏览(52)
  • 使用STM32 在实现温湿度LCD显示并蓝牙透传

    通过温湿度传感器将值传到LCD1602,并实时通过蓝牙透传到手机。 LCD1602 是一种工业字符型液晶,能够同时显示16x02即32字符 (16列两行) DHT11  DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。 HC-01 蓝牙模块。 关于以上这三个模块的使用和详细介绍

    2024年02月17日
    浏览(35)
  • 十一、DHT11 温湿度检测(OLED显示)

    见博客:stm32f103c8t6新建固件库模板(可自取) 固件库模板 MDK5开发环境 stm32参考手册 利用固件库模板点灯工程(下面第三行,手动狗头) OLED模块资料 DHT11数据手册 利用固件库模板点灯工程(下面第三行,手动狗头) CH340 USB→TTL模块 实验程序已经发布到百度网盘,本文末有

    2024年02月01日
    浏览(38)
  • Clion开发Stm32之温湿度传感器(DHT11)驱动编写

    涵盖之前文章: Clion开发STM32之HAL库GPIO宏定义封装(最新版) Clion开发stm32之微妙延迟(采用nop指令实现) Clion开发STM32之日志模块(参考RT-Thread) 头文件 源文件

    2024年02月15日
    浏览(43)
  • STM32Cubemxhal库硬件IIC驱动SHT40温湿度传感器

    STM32cubemx配置硬件IIC如图所示  SHT40的驱动代码 注意:在读sht40的寄存器之后一定要加10几个ms的延时

    2024年02月12日
    浏览(38)
  • STM32(HAL库)驱动SHT30温湿度传感器通过串口进行打印

    目录 1、简介 2、CubeMX初始化配置 2.1 基础配置 2.1.1 SYS配置  2.1.2 RCC配置 2.2 软件IIC引脚配置 2.3 串口外设配置  2.4 项目生成  3、KEIL端程序整合 3.1 串口重映射 3.2 SHT30驱动添加 3.3 主函数代 3.4 效果展示 本文通过STM32F103C8T6单片机通过HAL库方式对SHT30传感器进行数据的读取,并

    2024年02月16日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包