【开发历程】STM32F4之SHT31-DIS温湿度传感器完整学习历程(附模块化程序代码,带详细注释)
前言
本人萌新一枚,学习了STM32之后想自己调点什么练练手,于是打开淘宝。本来想买一块DHT11,翻着翻着就发现了这块小板。本着调就调没调过的原则,从店家购买了SHT31模块。买了后才发现,网上相关的中文资料很少,店家给的资料也没有多少中文。于是不得不走上啃英文手册的道路。这是本人第一次STM32F4实战,第一次IIC通信调试,也是第一次通过翻英文手册自主独立调试。前前后后调了好几天,终于写通。写这篇历程,主要是为了回顾调试过程,以便查缺补漏,看看能不能解决一些当时没能解决的疑问。如果我的学习历程能帮助到大家,自然更好。还要感谢许多相关博客也解决了我许多疑问,同时吹一波谷歌翻译。小白进行STM32F4的IIC通信实战,难免有许多问题。如有不足,欢迎指正。如果有实在谬误荒诞之处,就当博诸君一笑。
第一部分 SHT31传感器介绍
1.1芯片简介
SHT3X系列是由瑞士Sensirion生产的高精度温湿度传感器,也是Sensirion公司目前主打的温湿度传感器系列。现在网上常见的相关资料调试的基本上以SHT30为主,SHT31则较少。当然,现在官网上还有了更高级的SHT35系列,那就是后话了。
这次采用的SHT31-DIS传感器允许宽电压输入,支持2.4V~5.5V(官网标注的实际SHT31系列最低支持电压为2.15V)。采用IIC总线通信,最高可达1MHz的通信速度。并根据ADDR引脚的接法,提供两个可选的地址。传感器的精度为2%RH和0.3℃。传感器最大工作范围-40-125℃,0-100%RH。原装芯片有8个引脚。
还有一点要注意的是SHT31的最佳工作环境是20℃-60℃,20%RH-80%RH已知当传感器暴露在>80%RH的工作环境下超过60小时后,会出现+3%RH的偏差。(不得不吐槽一句,超过80%的空气湿度在南方是分分钟的事,这就顶不住了,难道瑞士很干燥吗?好像确实比较干燥 )不过这个误差是可逆的,在回到最佳工作环境后,还能慢慢校准回来。但是还是会加速传感器老化。
通过查资料,才知道原来还有一个不提供数字接口,直接输出比例模拟电压的SHT3X-ARP系列。如果感兴趣,可以自行搜索。
1.2 引脚介绍
芯片总共有8个引脚
1.SDA :IIC数据线引脚
2.ADDR :地址引脚,可连接VSS或VDD,分别会有不同的地址。不能浮空。
3.ALERT :报警引脚,如果使用,建议接到单片机的外部中断。不用的话建议浮空。
4.SCL :IIC时钟线引脚
5. VDD :电压输入引脚
6.nRESET :复位引脚,低电平有效。如果不用,建议接到VDD。
7.R :没有电气作用的“没卵用“”引脚,连接到VSS
8. VSS :接地
(附上官方推荐的典型应用电路)
1.3命令和模式介绍
首先看一下地址
很明显,当传感器ADDR引脚接VSS时,采用地址A;当传感器ADDR引脚接VDD时,采用地址B。
传感器支持单次数据采集模式和周期性数据采集模式。其实单次数据采集模式下,可选时钟延伸,而周期性数据采集默认开始数据延伸。这里我们默认采用周期性数据采集模式。
SHT3X支持12种工作模式,分别有高,中,低三档可选刷新率。mps=0.5,1,2…时,分别代表每两秒采集一次数据,每秒采集一次数据,每秒采集两次数据…
如希望设定高刷新率,每秒采集一次。那么向传感器写命令0x2130即可。注意当采用mps=10时,会导致传感器自发热,影响测量。
工作顺序为:先发送IIC通信开始标志Start后,写入左移一位的地址,并将空出来的位写0表示写数据。当收到传感器应答后,即可发送命令的高八位,再次等待应答,再发送余下的低八位。然后等待ACK应答即可。
其他命令同理,大部分都是同样的写入模式。
1.4 重要命令及其工作流程
那么我们看几条重要的命令及其工作流程。
设置好工作模式后写入此命令,可以准备好接受数据。先发送IIC通信开始标志Start后,写入左移一位的地址,并将空出来的位写1表示读数据。然后等待ACK应答即可接受数据。注意数据传输顺序是先温度后湿度。并且都是十六位数据。并且每个数据后都附8位的CRC校验。在完成湿度的CRC校验后,即可回复NACK,传感器将停止发送数据,释放SDA线,以便于MCU发送Stop标志,结束通信。
这个Break命令不能Break别的,就是只能Break周期性采集模式。写入后将进入单次采集模式。手册建议,在开启周期性采集模式下,如果要写入命令,先写入Break命令,再写入其他命令。
软复位命令
1.5 SHT3X状态寄存器
SHT3X的状态寄存包含了许多相关状态,可以方便我们查看传感器状态以及命令的执行情况。
读寄存器状态将会返回一个16位的数据。这个数据包含许多信息状态,我们不一一赘述,这里我们关注两个信息。
先上表:
这里我关注的是第0位和第1位
0 命令状态 : 读为0时,说明上一条命令执行成功;读为1时,说明上一条命令执行失败。
1 CRC状态 : 读为0时,说明CRC校验成功;读为1时,说明CRC校验失败。
至于为什么关注这两位,下面再说。
还有一个命令
这个命令可以清除寄存器的4,10,11,15位。
第二部分 代码分解
IIC部分,由于我也是初学IIC,IIC通信代码都还是对着正点原子的照猫画虎。而且这是SHT3X的学习历程,而非IIC的学习历程,时序图也并没有什么好说的。索性直接贴上代码,以作参考。
#include "iic.h"
#include "delay.h"/*********************************************************
函数名:IIC_Init()
描述:IIC初始化
入口参数:无
出口参数;无
附加信息:
说明:
*********************************************************/
void IIC_Init()
{GPIO_InitTypeDef GPIO_InitStructure;RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);//使能GPIOB时钟GPIO_InitStructure.GPIO_Pin= GPIO_Pin_8|GPIO_Pin_9;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;GPIO_Init(GPIOB,&GPIO_InitStructure);IIC_SCL=1; //先拉高IIC_SDA=1;
}
/*********************************************************
函数名:IIC_Start()
描述:IIC起始信号
入口参数:无
出口参数;无
附加信息:
说明:
*********************************************************/
void IIC_Start()
{SDA_OUT(); //SDA输出IIC_SDA=1;IIC_SCL=1;delay_us(4);IIC_SDA=0;delay_us(4);IIC_SCL=1; //钳住I2C总线,准备发送或接收数据
}
/*********************************************************
函数名:IIC_Stop()
描述:IIC结束信号
入口参数:无
出口参数;无
附加信息:
说明:
*********************************************************/
void IIC_Stop()
{SDA_OUT();IIC_SDA=0;IIC_SCL=1;delay_us(4);IIC_SDA=1;delay_us(4); //发送总线结束信号
}
/*********************************************************
函数名:IIC_Send_Ack()
描述:发送应答信号Ack
入口参数:无
出口参数;无
附加信息:
说明:
*********************************************************/
void IIC_Send_Ack()
{SDA_OUT();IIC_SCL=0;IIC_SDA=0;delay_us(2);IIC_SCL=1;delay_us(2);IIC_SCL=0;
}
/*********************************************************
函数名:IIC_Send_NAck()
描述:发送不应答信号NAck
入口参数:无
出口参数;无
附加信息:
说明:
*********************************************************/
void IIC_Send_NAck()
{SDA_OUT();IIC_SCL=0;IIC_SDA=1;delay_us(2);IIC_SCL=1;delay_us(2);IIC_SCL=0;
}
/*********************************************************
函数名:IIC_Wait_Ack(void)
描述:等待Ack应答
入口参数:无
出口参数;接受失败返回1,成功返回0
附加信息:
说明:
*********************************************************/
u8 IIC_Wait_Ack(void)
{u8 ucErrTime=0;SDA_IN(); //SDA设置为输入IIC_SCL=1;delay_us(1);IIC_SDA=1;delay_us(1);while(READ_SDA){ucErrTime++;if(ucErrTime>250){IIC_Stop();return 1;}}IIC_SCL=0;return 0;
}
/*********************************************************
函数名:IIC_Write_Byte(u8 date)
描述:IIC写入一个字节
入口参数:需要写入的字节
出口参数;无
附加信息:
说明:
*********************************************************/
void IIC_Write_Byte(u8 date)
{u8 a,b;u8 i;a=date;SDA_OUT();IIC_SDA=0;for(i=0;i<8;i++){b=(a&0x80)>>7; a=a<<1;IIC_SDA=b; //准备好数据IIC_SCL=0;delay_us(1);IIC_SCL=1;delay_us(1);IIC_SCL=0;}
}
/*********************************************************
函数名:IIC_Read_Byte(u8 ack)
描述:IIC读一个字节
入口参数:返回ACK标志
出口参数;数据date
附加信息:ack=1时,发送ACK,ack=0时,发送NACK。
说明:
*********************************************************/
u8 IIC_Read_Byte(u8 ack)
{u8 i,date=0;IIC_SDA=0;SDA_IN(); //设置SDA为输入for(i=0;i<8;i++){IIC_SCL=0;delay_us(1);IIC_SCL=1;date<<=1;if(READ_SDA) date++;delay_us(1);IIC_SCL=0;}if(ack) IIC_Send_Ack(); //发送ACKelse IIC_Send_NAck(); //发送NACKreturn date;
}
下面进入SHT3X代码,先贴上头文件。自从从51升级到32,学习了库函数之后,就再也不想在入口参数处写数字了,于是我把一些标志,命令和地址封装了起来,如下。其中还有一些我没有提到的命令,由于一般用不太到,我上面没有提。但是,以防万一,为了将来方便,一起封装了起来。
函数的顺序可能有些乱,还请见谅。
#ifndef _SHT3X_H
#define _SHT3X_H#include "sys.h"
#include "iic.h"//ADRESS
#define SHT3X_ADRESS_A 0x44 //ADDR引脚接VSS时地址
#define SHT3X_ADRESS_B 0x45 //ADDR引脚接VDD时地址
#define SHT3X_GENERALL_CALL_ADRESS 0X0006 //广播复位地址,可触发同硬复位一样效果//COMMAND
#define Mode_Set_A 0x2C0D //这里设定为单次采样模式。中断刷新率,开启时钟延伸。
#define Mode_Set_B 0x2322 //这里设定为周期采样模式。每秒四次,中等刷新率。默认开启时钟延伸。注意每秒10次时会导致器件发热。
#define Fetch_Data 0xE000 //获取数据命令
#define ART_ON 0x2B32 //打开ART定期测量
#define Break_Periodic_Mode 0x3093 //中断周期采样模式。这里会回到单次采样模式。
#define Soft_Reset 0x30A2 //传感器软复位,注意只有传感器处于空闲状态才能接受成功。
#define Heater_Enable 0x306D //加热器使能
#define Heater_Disable 0x3066 //加热器禁用
#define Read_Status 0xF32D //读状态寄存器
#define Clear_Status 0x3041 //清部分状态位//FLAG
#define R_H 0
#define T_C 1
#define T_F 2#define CRC_ON 1
#define CRC_OFF 0#define ACK 1
#define NACK 0#define write 0
#define read 1#define Repeatability_Low 0
#define Repeatability_Medium 1
#define Repeatability_High 2#define MPS_0_5 0
#define MPS_1 1
#define MPS_2 2
#define MPS_4 3
#define MPS_10 4#define CRC_Statues 0
#define Command_Statues 1//DATE PROCESS 将原始量转化为物理量
#define SHT3X_TC(date) (175 * (float)date / 65535 -45) //摄氏度处理
#define SHT3X_TF(date) (315 * (float)date / 65535 -49) //华氏度处理
#define SHT3X_RH(date) (100 * (float)date / 65535) //相对湿度处理void SHT3X_Init(void);
void SHT3X_Write(u16 code);
void SHT3X_Write_Command(u16 code);
void SHT3X_Wait_Ack(u8 f);
void SHT3X_Get_Vlaue(void);
void SHT3X_Mode_Set(u8 mps,u8 re);
void SHT3X_Statues_Process(u8 f,u16 sta);u8 SHT3X_CRC_Calculation(u16 date);
void SHT3X_CRC_Check(u8 t,u8 ack,u16 date);
float SHT3X_Date_Process(u8 Flag,u16 date);
u16 SHT3X_Read_Date(u8 ack);
u16 SHT3X_Get_Status(void);#endif
下面正式进入SHT3X.c文件
由于我也是第一次使用IIC通信,遇到了许多问题。比如CRC总是出错,ACK接受不到等。我又没有示波器,实在是没法仔细对照解决通信问题。于是遂采用了伪CRC验证,和伪接受ACK。
#include "SHT3X.h"
#include "delay.h"
#include "usart.h"
/*********************************************************
函数名:SHT3X_Wait_Ack()
描述:SHT3X等待Ack
入口参数:标志f
出口参数;f=1,收不到ack重启通信f=0,收不到也不重启
附加信息:
说明:
*********************************************************/
void SHT3X_Wait_Ack(u8 f)
{u8 flag=1;flag=IIC_Wait_Ack(); if(f) //这里我索性全用的0,采用1的时候好像会陷入死循环。{if(flag) SHT3X_Init();}}
/*********************************************************
函数名:SHT3X_Init()
描述:SHT3X初始化
入口参数:无
出口参数;无
附加信息:
说明:
*********************************************************/
void SHT3X_Init()
{IIC_Start();IIC_Write_Byte(SHT3X_ADRESS_B<<1|write); //这里默认ADDR引脚接VDD,采用地址B。且地址左移一位,并补0,准备写数据SHT3X_Wait_Ack(0);SHT3X_Mode_Set(MPS_4,Repeatability_Medium); //直接用之前封装好的 SHT3X_Wait_Ack(0);}
/*********************************************************
函数名:SHT3X_Get_Vlaue()
描述:一键取值函数
入口参数:无
出口参数;无
附加信息:
说明:
*********************************************************/
void SHT3X_Get_Vlaue()
{SHT3X_Write_Command(Fetch_Data);IIC_Start(); //准备接受数据IIC_Write_Byte(SHT3X_ADRESS_B<<1|read); //采用地址B,并左移一位,补1,准备读数据。SHT3X_Wait_Ack(0);
}
/*********************************************************
函数名:SHT3X_Write(u16 code)
描述:SHT3X写16位数据/命令
入口参数:无
出口参数;无
附加信息:
说明:
*********************************************************/
void SHT3X_Write(u16 code)
{ unsigned int MSB,LSB;u16 date;date=code; //这里采用移位的办法让MSB和LSB分别获得高八位和低八位。MSB=code>>8; //先把数据右移八位让MSB获得高八位date=date<<8; //再把原数据左移八位LSB=date>>8; //然后把左移过八位的数据再右移八位移回,从而使LSB获得低八位IIC_Write_Byte(MSB); //写MSB高八位 SHT3X_Wait_Ack(0);IIC_Write_Byte(LSB); //写LSB低八位SHT3X_Wait_Ack(0);
}
/*********************************************************
函数名:SHT3X_Write_Command(u16 code)
描述:SHT3X直接写入命令
入口参数:要写入的命令
出口参数;无
附加信息:把整个写命令的流程打包,实现一个函数写命令
说明:
*********************************************************/
void SHT3X_Write_Command(u16 code)
{IIC_Start();IIC_Write_Byte(SHT3X_ADRESS_B<<1|write); //这里默认ADDR引脚接VDD,采用地址BSHT3X_Wait_Ack(0);SHT3X_Write(code); //写入命令SHT3X_Wait_Ack(0);
}
/*********************************************************
函数名:SHT3X_Read_Date(u8 ack)
描述: 读数据
入口参数:ack
出口参数;16位date
附加信息:ack=1时,发送ack。ack=0时,返回nack
说明:
*********************************************************/
u16 SHT3X_Read_Date(u8 ack)
{u8 i;u16 MSB,LSB;u16 date;MSB=IIC_Read_Byte(1); //读完一个字节后返回ACKLSB=IIC_Read_Byte(1); //读完一个字节后返回ACKfor(i=0;i<8;i++) //相当于把MSB左移八位 {MSB=MSB*2;}date=MSB+LSB; //然后加合MSB与LSB,重新拼接获得原数据return date;}
/*********************************************************
函数名:SHT3X_CRC_Calculation(u16 date)
描述: CRC数据和计算
入口参数:CRC校验的数据
出口参数;crc
附加信息:
说明:
*********************************************************/
u8 SHT3X_CRC_Calculation(u16 date)
{ u8 i,j=0;u32 crc,p=0x31;crc=date;crc<<=8;p<<=16;for(i=0;i<8;i++){while(!((crc&0x800000)>>23)) {p>>=1; j++;} //对齐最高位crc=crc&p;if(j==15) break;}return crc;
}
/*********************************************************
函数名:SHT3X_CRC_Check(u8 t,u8 ack,u16 date)
描述: CRC数据和检测
入口参数:16位数据,ack标志,t标志
出口参数;无
附加信息: ack=1时,发送ack。ack=0时,发送nack。t=1时,启动校验。t=0时,进行伪校验。
说明:
*********************************************************/
void SHT3X_CRC_Check(u8 t,u8 ack,u16 date)
{u8 crc_re,crc_ca;crc_re=IIC_Read_Byte(ack); if(t) {crc_ca=SHT3X_CRC_Calculation(date); if(crc_ca!=crc_re) SHT3X_Read_Date(ack);}if(!ack) IIC_Stop();
}
/*********************************************************
函数名: SHT3X_Date_Process(u8 Flag);
描述: 数据处理
入口参数:flag标志
出口参数;浮点型Date
附加信息: flag=0,返回RHflag=1,返回TCflag=2,返回TF
说明:
*********************************************************/float SHT3X_Date_Process(u8 Flag,u16 date)
{float Date;if(Flag==2) Date=SHT3X_TF(date);if(Flag==1) Date=SHT3X_TC(date);if(Flag==0) Date=SHT3X_RH(date);return Date;
}
/*********************************************************
函数名: SHT3X_Mode_Set(u8 mps,u8 re)
描述: 模式选择设置
入口参数:标志mps,re
出口参数;无
附加信息: 注意,mps设定为10时会导致器件发热
说明:
*********************************************************/
void SHT3X_Mode_Set(u8 mps,u8 re)
{if(mps==0){if(re==0) SHT3X_Write_Command(0x202F);else if(re==1) SHT3X_Write_Command(0x2024);else if(re==2) SHT3X_Write_Command(0x2032);}else if(mps==1){if(re==0) SHT3X_Write_Command(0x212D);else if(re==1) SHT3X_Write_Command(0x2126);else if(re==2) SHT3X_Write_Command(0x2130);}else if(mps==2){if(re==0) SHT3X_Write_Command(0x222B);else if(re==1) SHT3X_Write_Command(0x2220);else if(re==2) SHT3X_Write_Command(0x2236);}else if(mps==3) {if(re==0) SHT3X_Write_Command(0x2329);else if(re==1) SHT3X_Write_Command(0x2322);else if(re==2) SHT3X_Write_Command(0x2334);}else if(mps==4) {if(re==0) SHT3X_Write_Command(0x272A);else if(re==1) SHT3X_Write_Command(0x2721);else if(re==2) SHT3X_Write_Command(0x2737);}
}
/*********************************************************
函数名: SHT3X_Get_Status(void)
描述: 读传感器模式寄存器
入口参数:无
出口参数;16位传感器状态数据
附加信息: 0位为CRC校验状态位1位为命令状态位
说明:
*********************************************************/
u16 SHT3X_Get_Status(void)
{u16 sta;SHT3X_Write_Command(Read_Status);IIC_Start(); //准备接受数据IIC_Write_Byte(SHT3X_ADRESS_B<<1|read); SHT3X_Wait_Ack(0);sta=SHT3X_Read_Date(ACK);SHT3X_CRC_Check(CRC_OFF,NACK,sta);return sta;
}
/*********************************************************
函数名: SHT3X_Statues_Process(u8 f,u16 sta)
描述: 传感器状态数据处理并送串口传输
入口参数:标志f,读得传感器状态数据sta
出口参数;CRC校验状态或命令执行状态
附加信息:
说明:
*********************************************************/
void SHT3X_Statues_Process(u8 f,u16 sta)
{u16 crc,com;crc=sta&0x01;sta>>=1;com=sta&0x01;if(f){if(com) printf("command failed\r\n");elseprintf("command succeed\r\n");} else {if(crc) printf("crc failed\r\n\r\n");elseprintf("crc succeed\r\n\r\n");}
}
设计是传感器采集好温湿度,然后通过串口发送给上位机。其中usart是直接采用的原子哥的usart函数文件下面附上主函数代码。
#include "stm32f4xx.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "iic.h"
#include "SHT3X.h"
/********************************************************************************************SHT3x-DIS温湿度模块,采用STM32F407ZET6做主控芯片,模拟IIC通信引脚: SDA-->PB9SCL-->PB8AL -->FLOATINGAD -->VSS********************************************************************************************/
int main(void)
{float RH,T; //储存温湿度数据u16 sta; //储存状态数据NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断优先级分组设定delay_init(168);uart_init(115200);printf("USART Ready\r\n");IIC_Init(); //IIC初始化SHT3X_Init(); //SHT3X初始化,设定工作模式while(1){SHT3X_Get_Vlaue(); //SHT3X读值准备T=SHT3X_Read_Date(ACK); //读温度数据SHT3X_CRC_Check(CRC_OFF,ACK,T); //读CRC,伪CRC验证,只读取,不检验RH=SHT3X_Read_Date(ACK); //读湿度数据SHT3X_CRC_Check(CRC_OFF,NACK,RH); //伪验证T=SHT3X_Date_Process(T_C,T); //数据处理RH=SHT3X_Date_Process(R_H,RH);sta=SHT3X_Get_Status(); //读状态printf("SHT31 measuring...\r\n"); //送串口显示printf("C :%.2fC \r\n",T);printf("RH:%.2f%% \r\n",RH);SHT3X_Statues_Process(Command_Statues,sta); //数据处理,同时送串口显示SHT3X_Statues_Process(CRC_Statues,sta);delay_ms(2000);}
}
第三部分 硬件连接
我从淘宝上买的小板上好像没啥可选的,商家帮我直接吧nRESET脚接VDD了,那行吧。
我的代码是把SCL接PB8,SDA接PB9,ADDR接了VDD,ALERT浮空。原子哥的串口好像是采用的串口1。
第四部分 效果展示
在我代码大体完工后,经过一天的调试后,终于成功写通。
刚刚复位后,第一次返回值会出现满读数的情况,之后一切正常。可以看到我们的command succeed,crc succeed。说明伪CRC验证成功,伪ACK接收成功。
这样,我们的代码就算大体成功了。当然还有许多问题,但是基本功能的实现已经完成。当然欢迎各位大佬对我的错误进行指正,同时也希望能帮助到有需要的人。
【开发历程】STM32F4之SHT31-DIS温湿度传感器完整学习历程(附模块化程序代码,带详细注释)相关推荐
- DHT11型温湿度传感器的使用(附源码)
一.产品概述 DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器.它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性.传感器包括一个电阻式感 ...
- CRC校验——以SHT30温湿度传感器为例(内附SHT30的驱动代码)
文章目录 1. 基本原理 2. 计算方法 3. c语言代码实现 4. SHT30代码 4.1 drv.c 4.2 test.c 4.3 Makefile 1. 基本原理 循环冗余校验码(CRC)的基 ...
- 温湿度传感器——DHT11学习总结
一.DHT11的简单介绍 DHT11是一款有已校准数字信号输出的温湿度传感器. 其精度湿度±5%RH, 温度±2℃, 量程湿度20-90%RH, 温度0~50℃--百度百科 注解:相对湿度(RH)是指 ...
- 温湿度传感器的学习笔记
相对湿度的学习 1.RH是相对湿度的缩写,55RH%指的是当前相对湿度为55%. 2.相对湿度是指单位体积空气中,实际水蒸气的分压与相同温度和体积下水饱和蒸气压的百分比.用百分数表达.也就是绝对湿度与 ...
- 关于AHT20温湿度传感器的学习以及使用altium designe绘制AHT20数据采集原理电路的过程
目录 一.芯片简介 1.产品综述 2.产品图片 3.产品应用 二.绘制原理图 1.PCE封装图 2.引脚图 3.绘制元器件 4.绘制采集电路 三.PCB电路设计 四.参考资料 一.芯片简介 1.产品综 ...
- Unity3D 初级案例 推箱子 完整项目 带详细注释
素材来源于 Unity Assets 商店 完整项目github链接 https://github.com/1520386112/Sokoban 运行效果 动画状态机 因为该项目对应的动画逻辑是按一下 ...
- JAVA之多态万字重要知识点详解(附完整带详细注释的例子代码)
定义 允许不同类的对象对同一消息作出不同的响应. 分类 1.编译时多态: 也称为设计时多态,通过方法重载实现. 2.运行时多态: 在程序运行时动态决定调用哪个方法. 必要条件 1.满足继承关系. 2. ...
- python十点半游戏代码_十点半游戏完整代码及详细注释.py
# -*- coding: utf-8 -*- #此版本,于2018年12月9日 #游戏类 class Game: #一般游戏进程,从读取存档开始 def Process(self): #初始回合数为 ...
- java程序计时器_求完整简单java计时器小程序代码,急!!
放肆丶小侽人 回答时间:2019-12-05 向TA提问 import java.awt.Button; import java.awt.Color; import java.awt.FlowLayo ...
最新文章
- 打字游戏--飞机大战
- ElasticSearch优化系列一:集群节点规划
- vue 后台返回的文件流进行预览_vue项目-pdf预览和下载,后台返回文件流形式
- python print换行_聊聊 print 的前世今生
- fir.im Weekly - 做一款 App 需要考虑什么
- 25大技术主题向您发出最后一次约【惠】邀请
- 前端学习(2243)硅谷外卖项目展示
- linux权限bcd码是6,Linux权限管理(1)基本权限
- Atitti v5住宿服务部后勤部建设指引指南.docx
- new一个对象的过程发生了什么
- 六级考研单词之路-三十二
- Ubuntu 各版本代号简介
- 【lzy学习笔记-dive into deep learning】数学预备 2.1-2.4
- Python计算机视觉实验五——针孔照相机模型
- 让华为小米抱团 统一推送联盟究竟是何方神圣?
- 回首2019,瞻仰2020
- 基于硬件的消息队列中间件 Solace 简介之二
- C#控件之Windows Media Player简单加载视频播放
- JavaScript模块 commonJS、AMD、UMD、ES6
- google play store的app数据分析
热门文章
- Lect6_Value_Function_Approximation
- 笑死:Welcome to Skip Thompson's Homepage
- 小布老师讲座笔记(三)
- ZZULIOJ 1197: 考试排名(一)(结构体专题)
- 如何用C语言简单加密文件+
- TM4C1294使用
- python opencv 读取显示图片
- 3、SySeVR测试(上)
- 显示器会影响电脑的显示效果么
- Algorithm:数学建模大赛(CUMCM/NPMCM)之NPMCM全国研究生数学建模竞赛(NPMCM)历年试题集合、试题库、学习网站推荐之详细攻略