参加STM32L0方案秀活动至今已过去一两个月了,直到近端时间才着手去做,先来几张图片
这是目前的显示界面,做的时候突然发现手头上的光强传感器不在身边, 在毕业的时候放老家了,所以目前只能先驱动DHT11,显示温湿度, 至于PM2.5的检测,目前手头上暂时没有相应的传感器,等待下面有时间采购回来在加上
LD2是作为程序运行的指示灯,这一张图片是灯灭的时候,下一张的照片灯是亮着的
这是目前的东西,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社区的活动和支持,当然还有机智云,,, |
STM32
超强工具——STM32CubeMX 你会用吗?
集结出发! STM32全国研讨会系列之一:ST智能门铃中国首秀
关于STM32启动文件的几个小问题
【银杏科技ARM+FPGA双核心应用】STM32H7系列35——USB_VCP_FS
【银杏科技ARM+FPGA双核心应用】STM32H7系列28——USB_HID
粉丝分享 | 图说CRC原理应用及STM32硬件CRC外设
STM32L151进入低功耗,并由RTC唤醒的故事
[转]stm32控制NFC模块(PN532)源码(P2P,模拟卡,读写卡等
STM32G070RB+LVGL移植
微信公众号
手机版
谢谢支持