[协议]stm32读取AHT20程序示例

news2024/11/25 20:15:18

AHT20温度传感器使用程序:

使用i2c读取温度传感器数据很简单,但市面上有至少两个手册,我这个对应的手册贴出来:

main:

#include "stm32f10x.h"                  // Device header
#include <stdint.h>
#include "delay.h"
#include "OLED.h"
#include "MPU6050.h"
#include "AHT20.h"
#include "serial.h"
#include "i2c.h"
#include "Delay.h"

int16_t AX,AY,AZ,GX,GY,GZ;int count=0;
uint8_t ReceiveData=0,ReceiveData1=0;uint32_t arr[6]={0};uint32_t H1=0,T1=0;
int main (void)
{
    Serial_USART1_Init();
    printf("begin\r\n");
    I2C_GPIO_Init();
	OLED_Init();
	//AHT20Init();
    //AHT20_Begin_Measure();
    I2C_Start();
    I2C_Send_DataByte(0x71);
    I2C_Receive_Ack();
    ReceiveData=I2C_Read_DataByte();
    if((ReceiveData&0x08)==0x08){
        printf("success\r\n");
    }
    else{
        printf("failed\r\n");
    }
    
    /*开启测量*/
    I2C_Start();
    I2C_Send_DataByte(0x70);
    I2C_Receive_Ack();
    I2C_Send_DataByte(0xAC);
    I2C_Receive_Ack();
    I2C_Send_DataByte(0x33);
    I2C_Receive_Ack();
    I2C_Send_DataByte(0x00);
    I2C_Receive_Ack();
    I2C_Stop();
    
    Delay_ms(210);
    
    I2C_Start();
    I2C_Send_DataByte(0x71);
    I2C_Receive_Ack();
    
    ReceiveData1=I2C_Read_DataByte();
    if((ReceiveData1&0x80)==0x00){
        printf("completed\r\n");
    }
    else{
        printf("uncompleted\r\n");
    }
    I2C_Send_Ack(0);
    arr[0]=I2C_Read_DataByte();//hum
    I2C_Send_Ack(0);
    arr[1]=I2C_Read_DataByte();//temp
    I2C_Send_Ack(0);
    arr[2]=I2C_Read_DataByte();//湿度+温度
    I2C_Send_Ack(0);
    arr[3]=I2C_Read_DataByte();//temp
    I2C_Send_Ack(1);
    I2C_Stop();
    
    H1=arr[0];
    H1=(H1<<8)|arr[1];
    H1=(H1<<8)|arr[2];
    H1=H1>>4;
    
    H1=H1*1000/1024/1024;
    printf("H1=%d\r\n",H1);
    printf("H1=%d%d.%d\r\n",H1/100,(H1/10)%10,H1%10);
        
    T1=arr[2];
    T1=T1&0x0000000F;
    T1=T1<<8;
    T1=T1|arr[3];
    T1=T1<<8;
    T1=T1|arr[4];
    
    T1=(T1*2000/1024/1024-500);
    //printf("T1=%d",T1);
    printf("T1=%d%d.%d",T1/100,T1/10%10,T1%10);
         
    OLED_ShowString(1,1,"str");
      
	while(1){
        MPU6050_Get_Data(&AX);
        //printf("%d\r\n",AX);
        OLED_ShowSignedNum(3,1,count,2);
		OLED_ShowSignedNum(2,1,AX,10);
        count++;
	}

}

AHT20.c:

#include "stm32f10x.h"                  // Device header
#include "delay.h"
#include "i2c.h"
#include <stdint.h>
#include "AHT20.h"
#define Dev_Addr 0x70
#define Command1 0xAC
#define Command2 0x33
#define Command3 0x00



//开启测量
void AHT20_Begin_Measure(){
    I2C_Start();
    I2C_Send_DataByte(Dev_Addr);//0x70
    I2C_Receive_Ack();
    I2C_Send_DataByte(Command1);//0xAC
    I2C_Receive_Ack();
    I2C_Send_DataByte(Command2);//0x33
    I2C_Receive_Ack();
    I2C_Send_DataByte(Command3);//0x00
    I2C_Receive_Ack();
    I2C_Stop();
    Delay_ms(150);

}

void AHT20Init(){
    //AHT20Reset();
    I2C_Start();
    I2C_Send_DataByte(0x71);
    I2C_Receive_Ack();
    I2C_Send_DataByte(0xbe);
    I2C_Receive_Ack();
    I2C_Send_DataByte(0x08);
    I2C_Receive_Ack();
    I2C_Send_DataByte(0x00);
    I2C_Receive_Ack();
    I2C_Stop();
     
}

void AHT20Reset(){
    I2C_Start();
    I2C_Send_DataByte(0x70);
    I2C_Receive_Ack();
    I2C_Send_DataByte(0xBA);
    I2C_Receive_Ack();
    I2C_Stop();
}

uint8_t AHT20_Read_State_Field(){
    uint8_t StateDataReceive=0;
    I2C_Start();
    I2C_Send_DataByte((Dev_Addr|0x01));
    I2C_Receive_Ack();
    StateDataReceive=I2C_Read_DataByte();
    
    return StateDataReceive;
}

i2c.c:

#include "stm32f10x.h"                  // Device header
#include "delay.h"



void I2C_GPIO_Init(){
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
 	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;//开漏输出
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10|GPIO_Pin_11;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 	GPIO_Init(GPIOB, &GPIO_InitStructure);	 	
	GPIO_SetBits(GPIOB,GPIO_Pin_10|GPIO_Pin_11);//设置引脚为高电平
}

void I2C_W_SCL(uint8_t BitValue){
    GPIO_WriteBit(GPIOB,GPIO_Pin_10,(BitAction)BitValue);        
    Delay_us(10);
}

void I2C_W_SDA(uint8_t BitValue){
    GPIO_WriteBit(GPIOB,GPIO_Pin_11,(BitAction)BitValue);
    Delay_us(10);
}

void I2C_Start(){
    I2C_W_SCL(1);
    I2C_W_SDA(1);
    Delay_us(10); //高电平保持20ms

    I2C_W_SDA(0);
    Delay_us(10);
    I2C_W_SCL(0);
    Delay_us(10);        
}

void I2C_Stop(){
    I2C_W_SCL(0);
    I2C_W_SDA(0);
    Delay_us(10);
    I2C_W_SCL(1);    
    Delay_us(10);
    I2C_W_SDA(1);
 
}

void I2C_Receive_Ack(){
    I2C_W_SCL(0);//进入置SCL=0
    Delay_us(10);
    
    I2C_W_SDA(1);
    I2C_W_SCL(1);
    Delay_us(10);
    I2C_W_SCL(0);
    Delay_us(10);    
}

void I2C_Send_Ack(uint8_t SendAckValue){
    I2C_W_SCL(0);
    if(SendAckValue==0){
        I2C_W_SDA(0);
    }
    I2C_W_SCL(1);
    Delay_us(10);
    I2C_W_SCL(0);            
}

void I2C_Send_DataByte(uint8_t DataSend){
    uint8_t finger=0x80;
    I2C_W_SCL(0);//进入置SCL=0;
    Delay_us(10);
    for(uint8_t k=0;k<8;k++){

        if(DataSend&finger){
            I2C_W_SDA(1);
            Delay_us(10);
        }
        else{
            I2C_W_SDA(0);
            Delay_us(10);
        }
        I2C_W_SCL(1);
        Delay_us(10);
        I2C_W_SCL(0);
        Delay_us(10);        
        finger=finger>>1;
    }
}   

uint8_t I2C_Read_DataByte(){//读取8位数据
    uint8_t DataReceive=0x00;
    uint8_t finger=0x80;
    I2C_W_SCL(0);//进入置SCL=0;
    I2C_W_SDA(1);//考虑设置为浮空,详见AHT20收藏
    Delay_us(10);
    for(uint8_t k=0;k<8;k++){
        I2C_W_SCL(1);
        Delay_us(10);
        if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11)==1){
            DataReceive=DataReceive|(finger>>k);            
        }
        else{
            //不操作
        }
        I2C_W_SCL(0);
        Delay_us(10);
    }
   return DataReceive;    
}
    
uint8_t I2C_R_SDA(){
    uint8_t BitValue=0;
    BitValue=GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11);
    Delay_us(10);
    return BitValue;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1689194.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MQTT到串口的转发(node.js)

本文针对以下应用场景&#xff1a;已有通过串口通信的设备或软件&#xff0c;想要实现跨网的远程控制。 node.js安装 从 Node.js — Run JavaScript Everywhere下载LTS版本安装包&#xff0c;运行安装程序。&#xff08;傻瓜安装&#xff0c;按提示点击即可&#xff09; 设置环…

RabbitMQ - SimpleMessageListenerContainer的实现逻辑

RabbitMQ - SimpleMessageListenerContainer的实现逻辑 Queue&#xff08;队列&#xff09;&#xff1a;在 RabbitMQ 中用于存储消息的数据结构。生产者将消息发送到队列中&#xff0c;而消费者从队列中接收消息。 Connection&#xff08;连接&#xff09;&#xff1a;连接是应…

【代码随想录 二叉树】二叉树前序、中序、后序遍历的迭代遍历

文章目录 1. 二叉树前序遍历&#xff08;迭代法&#xff09;2. 二叉树后序遍历&#xff08;迭代法&#xff09;3. 二叉树中序遍历&#xff08;迭代法&#xff09; 1. 二叉树前序遍历&#xff08;迭代法&#xff09; 题目连接 &#x1f34e;因为处理顺序和访问顺序是一致的。所…

小程序开发的基本用法

一:基本组件 1.view和scroll-view view等同于div,view写在小程序显示和div一样的效果. srcoll-view scroll-x/scroll-y是div能移动的.但是小程序没有显示大的划的. 且scroll-view才能实现这个,要这个组件且要属性,内部基本结构才能实现. view没有属性实现. 2.swiper和swi…

【Centos7+JDK1.8】Jenkins安装手册

一、安装环境 Centos7 JDK1.8 Jenkins-2.346.3 JDK1.8安装以及网络配置等 自行搜索资料解决。 二、卸载历史安装的Jenkins&#xff0c;直接全部复制粘贴下面的命令 service jenkins stop yum -y remove jenkins rpm -e jenkins rpm -ql jenkins rm -rf /etc/sysconfig/je…

Vue从入门到实战Day12

一、Pinia快速入门 1. 什么是Pinia Pinia是Vue的最新状态管理工具&#xff0c;是Vuex的替代品 1. 提供更加简单的API&#xff08;去掉了mutation&#xff09; 2. 提供符合组合式风格的API&#xff08;和Vue3新语法统一&#xff09; 3. 去掉了modules的概念&#xff0c;每一…

【漏洞复现】懒人网址导航页 search.html SQL注入漏洞

0x01 产品简介 赖人网址导航系统是一种智能化的网址导航平台&#xff0c;旨在帮助用户快速找到所需的网址和资源。该系统提供了智能化的网址搜索和推荐功能&#xff0c;能够根据用户的搜索习惯和偏好推荐相关的网址和资源。同时&#xff0c;系统还提供了网址分类、网址收藏和网…

虚拟化技术[1]之服务器虚拟化

文章目录 虚拟化技术简介数据中心虚拟化 服务器虚拟化服务器虚拟化层次寄居虚拟化裸机虚拟化VMM无法直接捕获特权指令解决方案 服务器虚拟化底层实现CPU虚拟化内存虚拟化I/O设备虚拟化 虚拟机迁移虚拟机动态迁移迁移内容&#xff1a;内存迁移迁移内容&#xff1a;网络资源迁移迁…

二叉树实战演练

目录 1.二叉树前序遍历---leetcode 思路 画图解析&#xff1a; 2.相同的树的判断 思路&#xff1a; 3.对称二叉树 思路分析&#xff1a; 4.另一棵树的子树 思路&#xff1a; 5.二叉树的便利---牛客网 建立二叉树的逻辑图&#xff1a; 总结&#xff1a; 1.…

【嵌入式软件工程师面经】Socket,TCP,HTTP之间的区别

目录&#xff1a; 目录 目录&#xff1a; 一、Socket原理与TCP/IP协议 1.1 Socket概念&#xff1a; 1.2 建立Socket连接&#xff1a; 1.3 SOCKET连接与TCP/IP连接 二、HTTP连接&#xff1a; 2.1 HTTP原理 三、三者的区别和联系 前些天发现了一个巨牛的人工智能学习网站&#xf…

光伏电站在线监测智能诊断系统:开启无人值守新纪元

光伏电站在线监测智能诊断系统&#xff1a;开启无人值守新纪元 大家都知道光伏电站是通过汲取着太阳的光芒&#xff0c;为人类提供源源不断的电能源。然而&#xff0c;随着光伏电站规模的扩大和复杂性的增加&#xff0c;如何有效提高发电效率、减少人工维护成本&#xff0c;实…

力扣Hot100-73矩阵置零(标记数组)

给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 输出&#xff1a;[[1,0,1],[0,0,0],[1,0,1]]示例 2&#xff1a; 输入&…

3、md5比较绕过

青少年ctf&#xff1a;EasyMD5 1、页面是一个上传页面 2、上传两个txt文件&#xff0c;bp抓包 3、go发现提示要PDF文件 4、将文件类型改成PDF类 5、改文件类型提示MD5&#xff0c;也看出它是将文件里的内容读取比较 6、改成s878926199a和QNKCDZO 猜测后端源码&#xff1a; if…

水下哨兵 智能守护——北斗人员落水报警与快速应急响应方案

随着科技的不断发展&#xff0c;人们对于安全的需求也越来越高&#xff0c;尤其是在水域活动中&#xff0c;落水事故时有发生&#xff0c;给人们的生命和财产安全带来了很大威胁。为了更好地保障水域活动者的安全&#xff0c;北斗短报文技术被广泛应用于落水报警系统中&#xf…

SpringBoot 实现私钥解密 前端的公钥加密内容

目录 一、前端公钥加密 二、后端私钥解密 一、前端公钥加密 Nextjs 前端实现RSA公钥加密 JSEncrypt加载问题解决-CSDN博客 二、后端私钥解密 import javax.crypto.Cipher; import java.security.KeyFactory; import java.security.PrivateKey; import java.security.spec.…

重新夺回控制权!原创始人从Synk回购FossID,致力于解决开源许可合规风险

FossID 于 2022 年 9 月被其原始创始人从 Snyk, Inc. 重新收购。为什么 Snyk 在 2021 年收购了 FossID&#xff0c;又在 2022 年将其分拆&#xff0c;以及为什么 FossID 的创始人&#xff08;Oskar Swirtun 和 Jon Aldama&#xff09;后来又回购了该公司&#xff1f; 公司背景 …

word-表格疑难杂症诊治

一、用表格进行排版图片、制作公文头 可以在插入图片时固定列宽 二、表格中的疑难杂症 问题一&#xff1a;表格超过页面&#xff0c;右侧文字看不见 解决&#xff1a;表格窗口-布局-自动调整-根据窗口自动调整表格 问题二&#xff1a;表格底部文字被遮挡 解决&#xff1a;布…

舵机(结构,原理,控制方法)

介绍 舵机&#xff0c;全称为伺服马达&#xff08;Servo Motor&#xff09;&#xff0c;是一种能够精确控制角度或位置的电动机。它广泛应用于模型制作、机器人技术、工业自动化等领域。舵机通过接收控制信号&#xff0c;将其转化为机械运动&#xff0c;从而实现精确的控制。 …

Day38 贪心算法part05

LC435无重叠区间(未掌握) 思路&#xff1a;先对数组进行排序&#xff0c;找到非重叠的区间的个数&#xff0c;然后区间的总数减去非重叠区间的个数即是需要移除的区间的个数与LC452用最少数量的箭引爆气球类似&#xff0c;但是不同的是[1,2]和[2,3]在此题并不是重叠区间但是在…

Substrate 优秀学员专访|从前端到高级测试工程师,他坚定奔赴 Web3 红海

4 月 29 日&#xff0c;第 14 期「Substrate 区块链开发入门课」课程圆满毕业收官&#xff0c;课程涌现了新一批优秀毕业学员&#xff0c;他们即将带着自己在课程中学习的新知识、新经验&#xff0c;奔赴 Web3 行业各个赛道。在这些学员中&#xff0c;有这样一位开发实力突出、…