基于stm32f103的SHT30温湿度显示

本次分享的是基于STM32F103C8T6单片机型号和SHT30温湿度传感器以及TFT(3.5)屏的温湿度显示实验
本实验使用的TFT彩色屏的驱动程序由商家提供,我们只需要按照自己显示的形式进行相应的设置进行了。同时SHT30程序部分借鉴了这位博主的分享(表示感谢)
https://blog.csdn.net/Mr_zhang1911116/article/details/125178130

相关工程链接下载

链接:https://pan.baidu.com/s/1dTheiQIh1B5Js0cOIdoDww?pwd=5okx
提取码:5okx
–来自百度网盘超级会员V4的分享

一、硬件材料
stm32f103c8t6
SHT30温湿度传感器
TFT(3.5)屏
杜邦线若干

1.stm32f10c8t6

2.sht30温湿度传感器

3.TFT(3.5)寸屏

二、SHT30介绍

sht30为4引脚IIC控制传感器,这里就不详细说这个模块了,知道怎么用就行了,和DHT11温湿度模块差不多。

sht30.h

#ifndef _SH30_H
#define _SH30_H#include "delay.h"
#include "sys.h"
#include "stdio.h"
#include "usart.h"
#include "string.h"extern u8 humiture_buff1[20];void SHT30_Init(void);
void IIC_ACK(void);//确认字符,表示发来的数据已经确认接收无误
void IIC_NACK(void);//无确认字符,表示数据接收有误或者还未接收完成
u8 IIC_wait_ACK(void);//等待接收确认字符
void IIC_Start(void);//等待IIC传输数据开始
void IIC_Stop(void);//IIC传输数据停止
void IIC_SendByte(u8 byte);//IIC发送数据
u8 IIC_RcvByte(void);//IIC接收数据
void SHT30_read_result(u8 addr);//SHT30温湿度传感器开始读取数据
#endif

sht30.c

/*
设定温度阈值范围:-20℃——125℃
设定相对湿度范围:0%——100%
*/
#include"stm32f10x.h"
#include"sh30.h"
#include"stdio.h"#define write 0 //IIC设备地址一般是7位,也有10位,本程序使用7位IIC设备地址,第8位是写命令
#define read  1 //IIC设备地址一般是7位,也有10位,本程序使用7位IIC设备地址,第8位是读命令//IIC总线接口定义
#define SCL PBout(6)//设置时钟端口
//SHT30数据SDA传输口,有输出也有输入,所以需配置它的输入和输出
#define SDA_OUT PBout(7)//设置输出数据端口
#define SDA_IN PBin(7)//设置输入数据端口
//设置端口高8位的工作模式(具体可以参照端口位配置表),即I/O输入输出方向设置,先用与(&)对PB7引脚的四个位清0,再用或(|)置1
#define IIC_INPUT_MODE_SET()  {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=8<<28;}//改变PB7对应位为1000(CNF[1:0]MODE[1:0]),设置成上拉或者下拉输入
#define IIC_OUTPUT_MODE_SET() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=3<<28;}//改变PB7对应位为0011,设置成通用推挽输出
//#define IIC_INPUT_MODE_SET()  {GPIOB->CRH&=0XFFFF0FFF;GPIOB->CRH|=8<<12;}//改变PB7对应位为1000(CNF[1:0]MODE[1:0]),设置成上拉或者下拉输入
//#define IIC_OUTPUT_MODE_SET() {GPIOB->CRH&=0XFFFF0FFF;GPIOB->CRH|=3<<12;}//改变PB7对应位为0011,设置成通用推挽输出//定义温湿度存储变量
u8 humiture_buff1[20];float Temperature=0;//定义存放温度拼接的变量Temperature,初始化温度为0
float Humidity=0;//定义存放湿度拼接的变量Humidity,初始化湿度为0void SHT30_Init(void)//初始化SHT30的SCL与SDA接口
{GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(   RCC_APB2Periph_GPIOB, ENABLE ); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;//定于SCL连接到STM32的PB6引脚上,定于SDA_OUT/SDA_IN连接到STM32的PB7引脚上GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;   //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);SCL=1;//根据SHT30时序要求,默认时序是高电平(SDA拉低时,SCL跟着拉低,开始数据的传输)SDA_OUT=1;//高电平还未开始数据的传输,拉低时开始数据的传输
}
//主机发送确认字符ACK
void IIC_ACK(void)//IIC协议,需要主机发送确认字符ACK来判断数据是否接收无误
{IIC_OUTPUT_MODE_SET();//配置PB7的SDA输出为推挽输出模式SCL=0;delay_us(2); SDA_OUT=0;delay_us(2);     SCL=1;//数据接收完成之后,将SCL拉高,以便与后面主机发送ACK给从机delay_us(2);                  SCL=0;//数据接收完成,主机发送ACK                     delay_us(1);
}
//主机不发送确认字符ACK
void IIC_NACK(void)//IIC协议,数据传输未完成或者数据传输有误,主机不发送确认字符ACK
{IIC_OUTPUT_MODE_SET();//配置PB7的SDA输出为推挽输出模式SCL=0;delay_us(2); SDA_OUT=1;delay_us(2);      SCL=1;delay_us(2);                   SCL=0;                     delay_us(1);
}
//主机等待从机的确认字符ACK
u8 IIC_wait_ACK(void)//主机等待从机发送ACK,从而判断数据是否接收完成
{u8 t = 200;IIC_OUTPUT_MODE_SET();SDA_OUT=1;//8位发送完后释放数据线,准备接收应答位 delay_us(1);SCL=0;delay_us(1); IIC_INPUT_MODE_SET();delay_us(1); while(SDA_IN)//等待SHT30应答{t--;delay_us(1); if(t==0){SCL=0;return 1;}delay_us(1); }delay_us(1);      SCL=1;delay_us(1);SCL=0;             delay_us(1);    return 0;
}
//启动IIC总线进行通讯,发送IIC通讯的起始条件
void IIC_Start(void)//启动IIC通讯
{IIC_OUTPUT_MODE_SET();//设置PB7的SDA为推挽输出SDA_OUT=1;//根据SHT30时序,启动之前,SDA配置为高电平SCL=1;//根据SHT30时序,启动之前,SCL配置为高电平delay_us(4);//延时4us,给硬件一个反应时间SDA_OUT=0;//SDA引脚拉低,开始数据的传输delay_us(4);SCL=0;//SCL拉低,与SDA对应,响应SDA数据的拉低,表示正式开始数据的传输
}//结束IIC总线通讯,发送IIC通讯的结束条件
void IIC_Stop(void)
{IIC_OUTPUT_MODE_SET();SCL=0;//结束IIC通讯之前,查看SCL是否是拉低状态SDA_OUT=0;//结束IIC通讯之前,查看SDA是否是拉低状态  delay_us(4);   SCL=1;//将时钟拉高,表示已经结束IIC通讯delay_us(4);SDA_OUT=1;//将数据传输引脚拉高,表示正式结束数据的传输delay_us(4);
}//将byte数据发送出去
void  IIC_SendByte(u8 byte)
{u8  Count;IIC_OUTPUT_MODE_SET();SCL=0;//将时钟拉低,开始数据的传输for(Count=0;Count<8;Count++)//要传送的数据长度为8位{if(byte&0x80) SDA_OUT=1;//判断发送位,发送位为1,则还未发送数据else SDA_OUT=0; //判断发送位为0,则开始数据的发送byte<<=1;delay_us(2); SCL=1;delay_us(2);SCL=0;delay_us(2);}
}// 用来接收从器件传来的数据
u8 IIC_RcvByte(void)
{u8 retc;u8 Count;retc=0; IIC_INPUT_MODE_SET();//配置数据线为输入方式delay_us(1);                    for(Count=0;Count<8;Count++){  SCL=0;//配置时钟线为低,准备接收数据位delay_us(2);               SCL=1;//配置时钟线为高使数据线上数据有效                retc=retc<<1;if(SDA_IN) retc |=1;//读数据位,接收的数据位放入retc中 delay_us(1);}SCL=0;    return(retc);
}
//用来接收从器件采集并合成温湿度
void SHT30_read_result(u8 addr)
{//SHT30有两种读取数值的方法,分别是状态查询和数值查询,这里我使用的是数值查询,发送指令为0x2C06u16 tem,hum;//定义存放温湿度计算公式的变量u16 buff[6];//定义6个字节的数组,存放温度高、低八位,湿度高、低八位,两个字节的CRC校验位//发送指令为0x2C06(默认)IIC_Start();IIC_SendByte(addr<<1 | write);//写7位I2C设备地址加0作为写取位,1为写取位IIC_wait_ACK();
//  delay_us(1);IIC_SendByte(0x2C);//前半段发送指令为0x2CIIC_wait_ACK();
//  delay_us(1);IIC_SendByte(0x06);//后半段发送指令为0x06IIC_wait_ACK();
//  delay_us(1);IIC_Stop();delay_ms(50);IIC_Start();IIC_SendByte(addr<<1 | read);//写7位I2C设备地址加1作为读取位,1为读取位
//SHT30返回的数值是6个元素的数组if(IIC_wait_ACK()==0){//      delay_us(1);buff[0]=IIC_RcvByte();//返回温度高8位IIC_ACK();buff[1]=IIC_RcvByte();//返回温度低8位IIC_ACK();buff[2]=IIC_RcvByte();//温度crc校验位IIC_ACK();buff[3]=IIC_RcvByte();//返回湿度高8位IIC_ACK();buff[4]=IIC_RcvByte();//返回湿度低8位IIC_ACK();buff[5]=IIC_RcvByte();//湿度crc校验位IIC_NACK();IIC_Stop();}
//  tem = (buff[0]<<8) + buff[1];
//  hum = (buff[3]<<8) + buff[4];tem = ((buff[0]<<8) | buff[1]);//将buff[0]采集到的温度8位数据与buff[1]采集到的低8位数据相或,实现温度拼接hum = ((buff[3]<<8) | buff[4]);//将buff[3]采集到的湿度8位数据与buff[4]采集到的低8位数据相或,实现湿度拼接//查询SHT30数据手册可知,温湿度的计算方法如下    Temperature= 175.0*(float)tem/65535.0-45.0 ;// T = -45 + 175 * tem / (2^16-1)Humidity= 100.0*(float)hum/65535.0;// RH = hum*100 / (2^16-1)if((Temperature>=-20)&&(Temperature<=125)&&(Humidity>=0)&&(Humidity<=100))//设定温度和湿度的阈值,超过这个阈值则返回错误提示{//printf("温度:%6.2f℃\r\n",Temperature);//printf("湿度:%6.2f%%\r\n",Humidity);}else{//printf("温湿度超过给定阈值!\r\n");}hum=0;tem=0;    }

下面这两句不明白的小伙伴,我另外一篇博文会专门介绍
GPIO寄存器配置讲解

#define IIC_INPUT_MODE_SET()  {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=8<<28;}//改变PB7对应位为1000(CNF[1:0]MODE[1:0]),设置成上拉或者下拉输入
#define IIC_OUTPUT_MODE_SET() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=3<<28;}//改变PB7对应位为0011,设置成通用推挽输出
三、主程序

main.c


/*------------------------TFT3.5接线--------------------------//              GND   电源地
//              VCC   3.3v电源
//              SCL   PA0(SCLK)
//              SDA   PA1(MOSI)
//              RES   PA2
//              DC    PA3
//                          BLK   PA4 控制背光
//              MISO  PA5
//              CS1   PA6
//              CS2   PA7
----------------------------------------------------------------*/#include "delay.h"
#include "sys.h"
#include "led.h"
#include "lcd_init.h"
#include "lcd.h"
#include "pic.h"
#include "usart.h"
#include "SH30.h"extern float Temperature;
extern float Humidity;unsigned char buf[2][24] = {0};int main(void)
{u8 i,j;float t=0;LED_Init();//LED初始化LCD_Init();//LCD初始化SHT30_Init();uart_init(115200);printf("SHT30初始化正常,已准备就绪!\r\n");LCD_Fill(0,0,LCD_W,LCD_H,GREEN);while(1){       SHT30_read_result(0x44);sprintf((char *)buf[0],"Current Temp:%.2f",Temperature);sprintf((char *)buf[1],"Current Humi:%.2f",Humidity);   LCD_ShowString(40,120,buf[0],WHITE,RED,32,0);LCD_ShowString(40,160,buf[1],WHITE,RED,32,0);delay_ms(2000);}
}
四、实验结果

【基于stm32f103的SHT30温湿度显示】相关推荐

  1. 基于SPI的OLED温湿度显示

    本文首先会简单介绍SPI通信协议,然后后面的实验分为两个板块,一个是OLED屏的使用,另一个是在此基础上,结合上次实验(结尾会附上链接),用OLED屏显示温湿度信息. 实验器材:STM32F103C8 ...

  2. 基于51单片机带温湿度显示的可调电子时钟

    一.功能介绍: 该设计在正常显示界面显示年月日,时分秒,还有当前环境的温湿度,通过k4按键选择工作模式,工作模式1为时间调节模式: 工作模式2为闹钟调节模式: 工作模式3为秒表模式: K3,k5分别为 ...

  3. 用STM32F103读取SHT30温湿度数据

    1 准备工作 硬件设备:SHT30模块.六合一.USB-TTL.杜邦线.STM32F103C8T6单片机.给大家看下图片. SHT30 STM32F103C8T6 2)软件准备 : KEIL 5 (5 ...

  4. 基于STC15F104W下的温湿度显示(DHT11)(OLED)

    设计名称:基于DHT11的温湿度计 显示:采用OLED12864显示温度和湿度 测量,采用DHT11模块 Hygrothermograph.c #include<STC15.H> #inc ...

  5. 传感器:SHT30温湿度传感器检测环境温湿度实验(底部附代码)

    一.导言 SHT30温湿度传感器模块是通过IIC驱动,所以大家使用该模块时,需要具备IIC的基本知识,这篇文章带领大家一起使用SHT30模块进行温湿度的测量,当然DHT10/DHT10原理都一样,好了 ...

  6. 基于51单片机的LCD1602显示温湿度

    51单片机基础难点知识理解后,直接通过下面3个小项目可以更好理解51单片机.中断 定时器 串口甚至是基础的IO输入输出都有结合,再加上一些外设模块的学习(如1602显示屏,L298N电机驱动等) 项目 ...

  7. [STM32F1]基于STM32F103实现TM1640点亮16位共阴极数码管,显示“0~F”数字

    本节我们目标是实现TM1640点亮16位共阴极数码管,显示"0~F"数字: 1. 硬件设计 GPIO初始化配置 SCL(PB6)  SDA(PB7):开漏输出,通过IO模拟驱动TM ...

  8. 基于I2C/SPI的温湿度采集与OLED显示

    目录 一.温湿度采集 1.了解I2C总线协议 2.实现AHT20采集程序 3.温湿度的OLED(4SPI)显示 二.OLED显示 1.了解SPI(串行外设接口) 2.使用0.96寸OLED显示屏显示数 ...

  9. STM32F103使用硬件IIC驱动SHT30温湿度传感器

    文章目录 前言 一.SHT30温湿度传感器原理图 二.代码部分 1.SHT30.c文件 2.SHT30.h文件 总结 前言 SHT30是一种常见的温湿度传感器,该传感器广泛应用于各种场景,小米的温湿度 ...

最新文章

  1. 和逛微博、刷朋友圈一样玩转 GitHub
  2. Neko Finds Grapes
  3. 如何在移动设备上调试html5开发的网页
  4. JAVA数据类型及字符编码
  5. Effective C++:unio
  6. linux pidof用法,科技常识:Linux pidof命令使用总结
  7. 差分数组|小a的轰炸游戏-牛客317E
  8. Hadoop Hive概念学习系列之HDFS、Hive、MySQL、Sqoop之间的数据导入导出(强烈建议去看)(十八)...
  9. 本科生 计算机图形学试卷,湖南工程学院《计算机图形学》毕业补考试卷及答案...
  10. 2019.1.23 01迷宫
  11. 读书笔记_中国期货市场量化交易(李尉)04
  12. WinAPI: LoadBitmap - 从资源中载入位图
  13. Atitit..状态机与词法分析  通用分词器 分词引擎的设计与实现 attilax总结
  14. linux 文件查找
  15. iOS应用程序审核机制
  16. 【解决】解决每次打开Office 2013都提示配置进度的解决方法
  17. 台大Machine Learning 2017Fall HW0字数统计和图片淡化 解答
  18. win10安装Dreamweaver cc 2019报无法写入注册表的错误
  19. 攻防世界----confusion1
  20. Mysql 同步 1236_MySQL主从同步报error 1236

热门文章

  1. C++通过基类指针delete派生类数组,析构函数是虚函数,程序为什么会崩溃? https://www.zhihu.com/question/30838092/answer/49623765
  2. html与css入门经典 第9版,HTML与CSS入门经典(第9版)
  3. localstorage跨域问题
  4. 魅族android m lmx4,主流级方案、骁龙425:LG 韩国发布 X4 智能手机
  5. 量化投资学习——创业板盘中临时停牌规则
  6. Aspen_安装_详细教程
  7. 因为有你,F1才如此精彩
  8. Java map转object
  9. 使用RandomAccessFile读写文件
  10. Elmo canopen 之 控制字 0x6040