你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32L0+环境温度检测

[复制链接]
烟花绽放 发布时间:2016-5-15 21:35
参加STM32L0方案秀活动至今已过去一两个月了,直到近端时间才着手去做,先来几张图片
IMG_20160515_203048.jpg
这是目前的显示界面,做的时候突然发现手头上的光强传感器不在身边,
在毕业的时候放老家了,所以目前只能先驱动DHT11,显示温湿度,
至于PM2.5的检测,目前手头上暂时没有相应的传感器,等待下面有时间采购回来在加上
IMG_20160515_203054.jpg
LD2是作为程序运行的指示灯,这一张图片是灯灭的时候,下一张的照片灯是亮着的
IMG_20160515_203117.jpg
这是目前的东西,STM32L073Nucle板子,DHT11传感器,LCD12864显示,12864驱动的时候使用了一片74HC245做电平转换(以前在用到12864的时候,在搭硬件的时候,12864总是会出现一些问题,所以我直接加了一片245做电平转换,因为目前没有去读液晶操作,所以没有使用到74LVT4245).
程序:
main.c中主程序如下
int main(void)
{

  /* USER CODE BEGIN 1 */
        u8 wd=0,sd=0,gq=0;
  /* USER CODE END 1 */

  /* MCU Configuration----------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* Configure the system clock */
  SystemClock_Config();

  /* Initialize all configured peripherals */
  MX_GPIO_Init();

  /* USER CODE BEGIN 2 */
        lcd12864_init();
  /* USER CODE END 2 */
        write_dat(0x80,16,"  环境温度检测  ");
        write_dat(0x90,16,"湿度:  %      ");
        write_dat(0x88,16,"温度:  ℃      ");
        write_dat(0x98,16,"光强:  cd      ");
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */
                DHT11_Read_Data(&wd,&sd);
                write_number(0x93,sd);
                write_number(0x8b,wd);
            write_number(0x9b,gq);
                HAL_Delay(500);
            HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_RESET);
            HAL_Delay(500);
            HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_SET);
  }
  /* USER CODE END 3 */

}

12864的驱动我以前发过帖子,直接移植过来就可以了,这次就不发了

DHT11.c程序如下
#include "stm32l0xx_hal.h"
#include "dht11.h"
#include "gpio.h"

void delay_us(uint32_t value)
{
        uint32_t i;
        i = value * 8;
        while(i--);
}

void DHT11_IO_IN(void)
{
  GPIO_InitTypeDef GPIO_InitStruct;
        /*Configure GPIO pin : PC10 */
  GPIO_InitStruct.Pin = IO_DHT11;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  HAL_GPIO_Init(GPIO_DHT11, &GPIO_InitStruct);
}

void DHT11_IO_OUT(void)
{
        GPIO_InitTypeDef GPIO_InitStruct;

        /*Configure GPIO pin : PC10 */
        GPIO_InitStruct.Pin = IO_DHT11;
        GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
        GPIO_InitStruct.Pull = GPIO_NOPULL;
        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
        HAL_GPIO_Init(GPIO_DHT11, &GPIO_InitStruct);
}

//复位DHT11
void DHT11_Rst(void)           
{                 
        DHT11_IO_OUT();         //SET OUTPUT
    DHT11_DQ_Low;                 //拉低DQ
    HAL_Delay(20);            //拉低至少18ms
    DHT11_DQ_High;                 //DQ=1
        delay_us(30);             //主机拉高20~40us
}
//等待DHT11的回应
//返回1:未检测到DHT11的存在
//返回0:存在
uint8_t DHT11_Check(void)            
{   
        uint8_t retry=0;
        DHT11_IO_IN();//SET INPUT         
    while ((HAL_GPIO_ReadPin(GPIO_DHT11,IO_DHT11)==GPIO_PIN_SET)&&retry<100)//DHT11会拉低40~80us
        {
                retry++;
                delay_us(3);// 1us
        };         
        if(retry>=100)return 1;
        else retry=0;
    while ((HAL_GPIO_ReadPin(GPIO_DHT11,IO_DHT11)==GPIO_PIN_RESET)&&retry<100)//DHT11拉低后会再次拉高40~80us
        {
                retry++;
                delay_us(3);
        };
        if(retry>=100)return 1;            
        return 0;
}
//从DHT11读取一个位
//返回值:1/0
uint8_t DHT11_Read_Bit(void)                          
{
         uint8_t retry=0;
        while((HAL_GPIO_ReadPin(GPIO_DHT11,IO_DHT11)==GPIO_PIN_SET)&&retry<100)//等待变为低电平
        {
                retry++;
                delay_us(3);
        }
        retry=0;
        while((HAL_GPIO_ReadPin(GPIO_DHT11,IO_DHT11)==GPIO_PIN_RESET)&&retry<100)//等待变高电平
        {
                retry++;
                delay_us(3);
        }
        delay_us(50);//等待40us
        if(HAL_GPIO_ReadPin(GPIO_DHT11,IO_DHT11)==GPIO_PIN_SET)
                return 1;
        else
                return 0;                  
}
//从DHT11读取一个字节
//返回值:读到的数据
uint8_t DHT11_Read_Byte(void)   
{        
    uint8_t i,dat;
    dat=0;
        for (i=0;i<8;i++)
        {
                   dat<<=1;
            dat|=DHT11_Read_Bit();
    }                                                   
    return dat;
}
//从DHT11读取一次数据
//temp:温度值(范围:0~50°)
//humi:湿度值(范围:20%~90%)
//返回值:0,正常;1,读取失败
uint8_t DHT11_Read_Data(uint8_t *temp,uint8_t *humi)   
{        
         uint8_t buf[5];
        uint8_t i;
        DHT11_Rst();
        if(DHT11_Check()==0)
        {
                for(i=0;i<5;i++)//读取40位数据
                {
                        buf=DHT11_Read_Byte();
                }
                if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
                {
                        *humi=buf[0];
                        *temp=buf[2];
                }
        }else return 1;
        return 0;            
}
//初始化DHT11的IO口 DQ 同时检测DHT11的存在
//返回1:不存在
//返回0:存在            
uint8_t DHT11_Init(void)
{                             
        DHT11_Rst();  //复位DHT11
        return DHT11_Check();//等待DHT11的回应
}

在DHT11的驱动中,us级的延时函数我使用的是
void delay_us(uint32_t value)
{
        uint32_t i;
        i = value * 8;
        while(i--);
}

,前两天在调节的时候,STM32总是检测不到DHT的存在,今天下午对照时序检查的时候才发现是因为
//复位DHT11
void DHT11_Rst(void)           
{                 
        DHT11_IO_OUT();         //SET OUTPUT
    DHT11_DQ_Low;                 //拉低DQ
    HAL_Delay(20);            //拉低至少18ms
    DHT11_DQ_High;                 //DQ=1
        delay_us(30);             //主机拉高20~40us
}

函数里面是先拉低持续至少18MS,然后拉高20~40us,这里我写成了拉高30ms了,所以总是检测不到DHT11的存在


DHT11.h中的程序


#ifndef __DHT11_H
#define __DHT11_H
#include "stm32l0xx_hal.h"
#include "gpio.h"

#define IO_DHT11 GPIO_PIN_10
#define GPIO_DHT11 GPIOC

#define  DHT11_DQ_High  HAL_GPIO_WritePin(GPIO_DHT11, IO_DHT11, GPIO_PIN_SET);
#define  DHT11_DQ_Low   HAL_GPIO_WritePin(GPIO_DHT11, IO_DHT11, GPIO_PIN_RESET);



void DHT11_IO_OUT(void);
void DHT11_IO_IN(void);
uint8_t DHT11_Init(void);//初始化DHT11
uint8_t   DHT11_Read_Data(uint8_t *temp,uint8_t *humi) ;//读取温湿度
uint8_t   DHT11_Read_Byte(void);//读出一个字节
uint8_t   DHT11_Read_Bit(void);//读出一个位
uint8_t   DHT11_Check(void);//检测是否存在DHT11
void DHT11_Rst(void);//复位DHT11  
void delay_us(uint32_t value);
void delay40us(void);

#endif

目前的话,先做成这个样子,传感器的话,等后续拿到之后,再添加上去
前端时间申请了机智云的gokit2开发套件  这几天就要到了,我打算先学习一下,后续能够将数据上传云端,方便远程查询。
在最后,还是要谢谢ST社区的活动和支持,当然还有机智云,,,






评分

参与人数 1 ST金币 +30 收起 理由
zero99 + 30

查看全部评分

收藏 3 评论9 发布时间:2016-5-15 21:35

举报

9个回答
zhangdaijin 回答时间:2016-5-15 22:07:33
不错  顶楼主
烟花绽放 回答时间:2016-5-16 08:58:28

谢谢支持
沐紫 回答时间:2016-5-16 09:03:53
谢谢分享
烟花绽放 回答时间:2016-5-16 09:41:50

           
suoma 回答时间:2016-5-16 21:13:34
谢谢分享学习一下
anny 回答时间:2016-5-17 09:33:28
谢谢分享
HenryChen 回答时间:2016-5-26 16:59:27
学习。。。。。。。。。。。。。
epochal 回答时间:2017-7-15 08:38:33
好!谢谢分享!
oliversky 回答时间:2019-6-18 09:01:16
老哥,能不能发我一份你的工程文件,我这个调了很久没调出来,我邮箱是497314467@qq.com

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版