历史上的今天
返回首页

历史上的今天

今天是:2025年08月14日(星期四)

正在发生

2019年08月14日 | STM32之SHT30温湿度传感器驱动代码

2019-08-14 来源:eefocus

SHT30温湿度串口显示

第一部分:SHT30温湿度模块代码头文件(SHT30.h)


#ifndef SHT30_H

#define SHT30_H

#include "delay.h"

#include "sys.h"

#include "stdio.h"

#include "usart.h"

#include "string.h"

#include "sys.h"

 

extern u8 humiture_buff1[20];

extern u8 humiture_buff2[20];

extern u8 Refresh_SHT30_Data;

extern u8 send_data_fleg;

extern u8 Temperature_L;

extern u8 Humidity_L;

extern u8 Temperature_H;

extern u8 Humidity_H;

 

void SHT30_Init(void);

void IIC_ACK(void);

void IIC_NACK(void);

u8 IIC_wait_ACK(void);

void IIC_Start(void);

void IIC_Stop(void);

void IIC_SendByte(u8 byte);

u8 IIC_RcvByte(void);

void SHT30_read_result(u8 addr);

 

#endif

 

第二部分:SHT30温湿度模块代码(SHT30.c)


#include "SHT30.h"

#include "wifi_esp8266.h"

#include "oled.h"

 

#define write 0

#define read  1

//IIC总线地址接口定义

#define SCL PAout(4)

#define SDA_OUT PAout(5)

#define SDA_IN PAin(5)

#define IIC_INPUT_MODE_SET()  {GPIOA->CRL&=0xFF0FFFFF;GPIOA->CRL|=0x00800000;}

#define IIC_OUTPUT_MODE_SET() {GPIOA->CRL&=0xFF0FFFFF;GPIOA->CRL|=0x00300000;}

 

float humiture[4];

u8 Refresh_SHT30_Data=0;

u8 humiture_buff1[20];

u8 humiture_buff2[20];

 

u8 Temperature_L=15;

u8 Humidity_L=50;

u8 Temperature_H=30;

u8 Humidity_H=80;

 

void SHT30_Init(void)

{

  /*1.开时钟*/

  RCC->APB2ENR |= 1<<2;

  /*2.设置GPIO模式*/

  GPIOA->CRL &= 0x0000FFFF;

  GPIOA->CRL |= 0x33330000;

  /*3.设置GPIO空闲电平*/

  GPIOA->ODR |= 0xF<<4;

  //printf("SHT30_Init OK!n");

}

 /*主机发送ACK*/

void IIC_ACK(void)

{

  IIC_OUTPUT_MODE_SET();

  SCL=0;

  DelayUs(2); 

  SDA_OUT=0;

  DelayUs(2);     

  SCL=1;

  DelayUs(2);                  

  SCL=0;                     

  DelayUs(1);    

}

 /*主机不发送ACK*/

void IIC_NACK(void)

{

  IIC_OUTPUT_MODE_SET();

  SCL=0;

  DelayUs(2); 

  SDA_OUT=1;

  DelayUs(2);      

  SCL=1;

  DelayUs(2);                   

  SCL=0;                     

  DelayUs(1);    

}

 /*主机等待从机的ACK*/

u8 IIC_wait_ACK(void)

{

    u8 t = 200;

    IIC_OUTPUT_MODE_SET();

    SDA_OUT=1;//8位发送完后释放数据线,准备接收应答位 

    DelayUs(1);

    SCL=0;

    DelayUs(1); 

    IIC_INPUT_MODE_SET();

    DelayUs(1); 

    while(SDA_IN)//等待SHT30应答

    {

t--;

DelayUs(1); 

if(t==0)

{

  SCL=0;

  return 1;

}

DelayUs(1); 

    }

    DelayUs(1);      

    SCL=1;

    DelayUs(1);

    SCL=0;             

    DelayUs(1);    

    return 0;

}

/*******************************************************************

功能:启动I2C总线,即发送I2C起始条件.  

********************************************************************/

void IIC_Start(void)

{

  IIC_OUTPUT_MODE_SET();

  SDA_OUT=1;

  SCL=1;

  DelayUs(4);

  SDA_OUT=0;

  DelayUs(4); 

  SCL=0;

}

 

/*******************************************************************

功能:结束I2C总线,即发送I2C结束条件.  

********************************************************************/

void IIC_Stop(void)

{

IIC_OUTPUT_MODE_SET();

SCL=0;

SDA_OUT=0;  

DelayUs(4);

SCL=1;

DelayUs(4);

SDA_OUT=1;

DelayUs(4);

}

 

/*******************************************************************

字节数据发送函数               

函数原型: void  SendByte(UCHAR c);

功能:将数据c发送出去,可以是地址,也可以是数据

********************************************************************/

void  IIC_SendByte(u8 byte)

{

u8  BitCnt;

IIC_OUTPUT_MODE_SET();

SCL=0;

for(BitCnt=0;BitCnt<8;BitCnt++)//要传送的数据长度为8位

{

if(byte&0x80) SDA_OUT=1;//判断发送位

else SDA_OUT=0; 

byte<<=1;

DelayUs(2); 

SCL=1;

DelayUs(2);

SCL=0;

DelayUs(2);

}

}

/*******************************************************************

 字节数据接收函数               

函数原型: UCHAR  RcvByte();

功能: 用来接收从器件传来的数据  

********************************************************************/    

u8 IIC_RcvByte(void)

{

  u8 retc;

  u8 BitCnt;

  retc=0; 

  IIC_INPUT_MODE_SET();//置数据线为输入方式

  DelayUs(1);                    

  for(BitCnt=0;BitCnt<8;BitCnt++)

  {  

SCL=0;//置时钟线为低,准备接收数据位

DelayUs(2);               

SCL=1;//置时钟线为高使数据线上数据有效                

retc=retc<<1;

if(SDA_IN) retc |=1;//读数据位,接收的数据位放入retc中 

DelayUs(1);

  }

  SCL=0;    

  return(retc);

}

/*******************************************************************

 温湿度获取函数               

函数原型: SHT30_read_result(u8 addr);

功能: 用来接收从器件采集并合成温湿度

********************************************************************/ 

void SHT30_read_result(u8 addr)

{

u16 tem,hum;

u16 buff[6];

float Temperature=0;

float Humidity=0;

IIC_Start();

IIC_SendByte(addr<<1 | write);//写7位I2C设备地址加0作为写取位,1为读取位

IIC_wait_ACK();

IIC_SendByte(0x2C);

IIC_wait_ACK();

IIC_SendByte(0x06);

IIC_wait_ACK();

IIC_Stop();

DelayMs(50);

IIC_Start();

IIC_SendByte(addr<<1 | read);//写7位I2C设备地址加0作为写取位,1为读取位

if(IIC_wait_ACK()==0)

{

buff[0]=IIC_RcvByte();

IIC_ACK();

buff[1]=IIC_RcvByte();

IIC_ACK();

buff[2]=IIC_RcvByte();

IIC_ACK();

buff[3]=IIC_RcvByte();

IIC_ACK();

buff[4]=IIC_RcvByte();

IIC_ACK();

buff[5]=IIC_RcvByte();

IIC_NACK();

IIC_Stop();

}

tem = ((buff[0]<<8) | buff[1]);//温度拼接

hum = ((buff[3]<<8) | buff[4]);//湿度拼接

/*转换实际温度*/

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))//过滤错误数据

{

humiture[0]=Temperature;

humiture[2]=Humidity;

sprintf(humiture_buff1,"%6.2f*C %6.2f%%",Temperature,Humidity);//111.01*C 100.01%(保留2位小数)

}

printf("温湿度:%sn",humiture_buff1);

hum=0;

tem=0;

}

推荐阅读

史海拾趣

HELUKABEL公司的发展小趣事

HELUKABEL(和柔)公司在电子行业中以其卓越的电缆产品和解决方案而闻名,其发展历程中充满了多个值得一提的故事。以下是五个关于HELUKABEL在电子行业中发展起来的相关故事:

1. 从德国起源到全球扩张

HELUKABEL成立于1969年(也有资料提及为1978年),最初便专注于高品质电缆的生产。公司总部位于德国,凭借其卓越的产品质量和客户服务,迅速在欧洲市场站稳脚跟。随着全球化进程的加速,HELUKABEL开始实施国际化战略,逐步在全球37个国家建立了60多个子公司,形成了覆盖全球的销售和服务网络。这一过程中,HELUKABEL不仅将德国的技术和质量标准带到了世界各地,还根据当地市场需求进行产品调整和优化,实现了本土化经营。

2. 工业4.0时代的机器人电缆解决方案

随着工业4.0和智能制造的兴起,机器人成为制造业不可或缺的一部分。然而,机器人作业环境的复杂性和多轴运动对电缆提出了极高的要求。HELUKABEL凭借其深厚的电缆技术积累,研发出了适用于各种工业机器人的管线包技术。这些管线包不仅安装简便、空间占用小,还能确保机器人在高速、高负荷运行下的稳定性和可靠性。Robotec作为HELUKABEL旗下的子公司,更是专注于机器人电缆和组件的研发与生产,为全球机器人制造商提供了优质的解决方案。

3. 汽车轻量化进程中的电缆应用

汽车轻量化是近年来汽车行业的重要趋势之一,旨在提高燃油效率、降低排放。HELUKABEL凭借其丰富的电缆产品线和技术实力,积极参与到了这一进程中。公司提供的轻量化电缆不仅具有优异的电气性能和机械强度,还能有效减轻汽车整体重量。例如,在力劲集团的汽车轻量化生产车间中,HELUKABEL的电缆产品被广泛应用于控制柜和测量系统中,为汽车轻量化生产提供了坚实的电气连接保障。

4. 供应链优化与本土化战略

面对全球供应链的不确定性和挑战,HELUKABEL积极实施本土化战略以应对市场变化。公司在中国等关键市场建立了生产基地和供应链体系,实现了从原材料采购到成品生产的本地化。这一战略不仅缩短了产品交付周期、降低了物流成本,还提高了供应链的灵活性和抗风险能力。特别是在疫情期间,HELUKABEL通过本土化供应链体系确保了产品的稳定供应,赢得了客户的信赖和好评。

5. 技术创新与产品多样化

HELUKABEL始终将技术创新作为企业发展的核心驱动力。公司不断投入研发资源,推出了一系列具有自主知识产权的新产品和新技术。这些产品涵盖了低压至中压范围内的各类连接和控制用电器设备所需的电缆和线缆产品。同时,HELUKABEL还积极代理欧洲、美国等地区的知名品牌产品,为客户提供更加多样化的选择。通过技术创新和产品多样化战略的实施,HELUKABEL在电子行业中保持了领先地位并持续拓展市场份额。

雅特力(Artery)公司的发展小趣事

雅特力深知人才是企业发展的核心力量。因此,公司始终重视人才培养和团队建设。雅特力通过招聘优秀的专业人才、开展内部培训、设立激励机制等方式,打造了一支高素质、高效率的团队。这支团队不仅具备丰富的技术知识和实践经验,还具备高度的创新意识和团队协作能力。正是有了这样一支优秀的团队,雅特力才能够在激烈的市场竞争中脱颖而出,实现持续稳健的发展。

Fullywell Semiconductor Co Ltd公司的发展小趣事

Fullywell Semiconductor成立于2005年,由一群在半导体领域拥有多年经验的工程师和投资人共同创立。公司初期专注于研发高性能模拟集成电路,以解决当时市场上对于低功耗、高精度信号处理芯片的迫切需求。通过不懈的努力,Fullywell成功推出了其首款产品——一款针对移动通信设备的低功耗射频前端芯片,迅速获得了市场的认可。这一技术创新不仅为公司赢得了首批重要客户,也为后续的发展奠定了坚实的技术基础。

虹冠电子(Champion)公司的发展小趣事

虹冠电子注重全球市场的拓展,通过建立完善的营销网络和合作伙伴关系,将产品销往世界各地。公司在新竹、汐止以及美国硅谷等地设有研发中心和生产基地,能够为客户提供及时、高效的技术支持和服务。同时,虹冠电子还与国内优秀的晶圆封测大厂等合作伙伴建立了紧密的合作关系,共同推动电源管理技术的发展和应用。

Cincon公司的发展小趣事

经过多年的努力和发展,Cincon在电源行业取得了显著的成就。其产品包括多种类型的电源转换器、适配器和LED电源等,广泛应用于各种电子设备中。凭借卓越的产品质量和创新能力,Cincon赢得了全球客户的信赖和认可。

Delta Electronics Manufacturing Corp公司的发展小趣事

Delta Electronics Manufacturing Corp公司始建于上世纪七十年代,起初以生产电源产品为主。在初创阶段,公司凭借对技术的深度钻研和对市场的敏锐洞察,成功研发出一系列高效、稳定的电源产品。这些产品迅速在市场上获得认可,为Delta在电源领域奠定了坚实的基础。

问答坊 | AI 解惑

2416相比2440的十大优势

三星2009上半年推出的2416芯片相比2440具有压倒性的优势,是完美替代2440的首要选择 1.        性能以及对视频播放能力的支持:2416 主频400MHz和2440持平,但是2416是ARM926JES内核,是ARM920T的增强版本,治理运行速度方面 ...…

查看全部问答>

关于嵌入式的学习和开发

本人只有C语言基础,现在要利用实验室现有博创公司UP-NETARM2410-S嵌入式开发平台(包括GPRS/GPS模块、电机控制模块、摄像头模块等),设计一套能够实现对现场数据的远程无线传输和实时监控功能的远程监控雏形系统。还望大家不吝赐教!!!…

查看全部问答>

我是电气工程与自动化的本科生 我想考嵌入式的研究生 不知道可行吗

我如果从事嵌入式优势是什么   劣势是什么(我的意思是我本科是电气工程与自动化 我该重点自学一些什么方面的知识  ) 还有  那个学校的嵌入式比较好       先谢过了…

查看全部问答>

Sqlite中文目录打不开,有什么解决办法吗?

int rc = _sqlite3_open(_T(\"存储卡\\\\123.db\"), &m_db);    if ( rc != SQLITE_OK )    {       ASSERT(FALSE);    } 打开不成功,如果是英文目录就没有问题!…

查看全部问答>

关于6410裸奔变量创建的地址问题 !

    我的6410裸奔已经起来了  牛人给的的一个简单的BOOT  代码已经可以在DDR里面运行  但是我没有设置变量创建的地址在哪   那6410是自动在内部8K的SRAM创建变量呢  等到满了8K  ...…

查看全部问答>

嵌入式技术交流群 24992320 欢迎加入啊

嵌入式技术交流群 24992320 欢迎加入啊 …

查看全部问答>

求助!!!!!12864液晶显示有问题,大侠们来帮我看一下~~~

我用的是OCM12864-3,程序是显示“欢迎使用”四个字在液晶正中。 程序烧入单片机以后都没问题,当我把电源拔下再插,多试几次,也没有问题。但是!过了3~5分钟,我再上电,“欢迎”这两个字就往上移动了一行,真不知道为什么,郁闷啊!    ...…

查看全部问答>

LaunchPad打横短接J3txd、rxd为何电脑没有找到端口?

如题;需要另外接一个串口转usb(如PL2303之类的)么? 听说这个板子很强大,可以直接连USB线,但是一直没有端口(COM口),是不是程序上面需要设置什么呢? 接法如https://bbs.eeworld.com.cn/thread-371773-1-1.html 二楼的图接法是一样的。 ...…

查看全部问答>

闲置ARM系列开发板 有好几个 需要的联系啊 低价出售了

本帖最后由 开发板之家 于 2015-1-18 23:08 编辑 还有几个其他型号的 有需要的可以留下QQ 我发图片协商 …

查看全部问答>