参加STM32L0方案秀活动至今已过去一两个月了,直到近端时间才着手去做,先来几张图片* v2 ], `& m1 l" | X, g 这是目前的显示界面,做的时候突然发现手头上的光强传感器不在身边, 在毕业的时候放老家了,所以目前只能先驱动DHT11,显示温湿度,& I! H1 w( _1 c$ u* L- _ 至于PM2.5的检测,目前手头上暂时没有相应的传感器,等待下面有时间采购回来在加上. c+ \8 P W; j! I LD2是作为程序运行的指示灯,这一张图片是灯灭的时候,下一张的照片灯是亮着的1 [0 {, a- s; P 这是目前的东西,STM32L073Nucle板子,DHT11传感器,LCD12864显示,12864驱动的时候使用了一片74HC245做电平转换(以前在用到12864的时候,在搭硬件的时候,12864总是会出现一些问题,所以我直接加了一片245做电平转换,因为目前没有去读液晶操作,所以没有使用到74LVT4245).; u. r* N1 N L+ i( `& } ~ u 程序:, e) U( _0 G6 T0 ?2 [1 F main.c中主程序如下7 B( v8 ]' f, @% Y+ B int main(void) { /* USER CODE BEGIN 1 */ u8 wd=0,sd=0,gq=0; /* USER CODE END 1 */ 6 P* d7 ~) `) d4 ~$ h! U! A /* MCU Configuration----------------------------------------------------------*/ 1 b0 S! y8 R% s, ?, M /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); . W5 }7 @) G' z' W" I /* Configure the system clock */ SystemClock_Config();6 }8 N5 T* K3 n; ^ /* Initialize all configured peripherals */ MX_GPIO_Init(); /* USER CODE BEGIN 2 */ lcd12864_init(); /* USER CODE END 2 */8 j" G( o/ ]* s0 H write_dat(0x80,16," 环境温度检测 "); q r' K, p1 }; j* B+ ` write_dat(0x90,16,"湿度: % ");: E, g9 s7 a- D8 b0 h write_dat(0x88,16,"温度: ℃ "); write_dat(0x98,16,"光强: cd ");/ s% U( q7 w/ K7 Z/ y# P /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */" W( L& F( M% G 3 {. C: I2 \! @ /* USER CODE BEGIN 3 */7 o7 A9 T9 g4 B3 Z DHT11_Read_Data(&wd,&sd);8 I, A& J1 ~+ T2 C( r( ~' ~* Y- Y. L+ ` write_number(0x93,sd); write_number(0x8b,wd); write_number(0x9b,gq); HAL_Delay(500);. N4 G0 L* k. f4 U5 @# `* W# v 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的驱动我以前发过帖子,直接移植过来就可以了,这次就不发了 ) t1 J3 k) z6 l% \4 R3 s DHT11.c程序如下7 C# h# y$ ?# j5 K #include "stm32l0xx_hal.h" #include "dht11.h"9 a& d0 Y+ y1 @' a #include "gpio.h"0 [5 u- u1 _/ @0 y void delay_us(uint32_t value)6 x2 M# H, K3 i$ G. Q" b4 [ { uint32_t i; i = value * 8; while(i--); } void DHT11_IO_IN(void) { GPIO_InitTypeDef GPIO_InitStruct; /*Configure GPIO pin : PC10 */6 ?/ {4 ?/ w! X% m GPIO_InitStruct.Pin = IO_DHT11;) Y8 m$ c+ {+ V7 ?; G GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init(GPIO_DHT11, &GPIO_InitStruct);2 U& X* A, Z7 o) n } void DHT11_IO_OUT(void)5 m6 R! W) X! u8 K* [. R {5 f+ l, y7 D; p7 h9 H0 _) _ GPIO_InitTypeDef GPIO_InitStruct;9 d/ F1 n# Q% E1 |; A: _$ i % y6 _' F0 z4 a( X" ^ /*Configure GPIO pin : PC10 */8 ?) ] K7 @ W, w) j& A3 r GPIO_InitStruct.Pin = IO_DHT11; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;# N# @ g y4 s- B GPIO_InitStruct.Pull = GPIO_NOPULL;$ @0 A" {' Z M GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;3 ^9 @2 n/ ?/ `( o( w" t6 q" n HAL_GPIO_Init(GPIO_DHT11, &GPIO_InitStruct); }6 ^7 d6 R6 l4 i //复位DHT11 void DHT11_Rst(void) 5 j% D' [ o( u& I { DHT11_IO_OUT(); //SET OUTPUT# {/ V- w' U' j: Y DHT11_DQ_Low; //拉低DQ4 g: m8 } k$ \8 m' J HAL_Delay(20); //拉低至少18ms DHT11_DQ_High; //DQ=1 * E5 }7 U# V4 ]2 t delay_us(30); //主机拉高20~40us }. J9 q. x6 `/ r1 O5 \ //等待DHT11的回应: ~6 V6 v" D4 @ //返回1:未检测到DHT11的存在 //返回0:存在 uint8_t DHT11_Check(void) { uint8_t retry=0;$ f7 ]/ W: j1 k) }, f; u DHT11_IO_IN();//SET INPUT 0 R; ?7 ^3 B8 j+ t( A while ((HAL_GPIO_ReadPin(GPIO_DHT11,IO_DHT11)==GPIO_PIN_SET)&&retry<100)//DHT11会拉低40~80us5 m; x0 u9 P W$ v. z { retry++;3 E6 t7 u2 j: T1 y delay_us(3);// 1us }; if(retry>=100)return 1; else retry=0;4 u+ @" @; k7 V+ H& _" F* A# m while ((HAL_GPIO_ReadPin(GPIO_DHT11,IO_DHT11)==GPIO_PIN_RESET)&&retry<100)//DHT11拉低后会再次拉高40~80us+ n! @, \, W* z. } n {4 S0 t4 a8 @( x retry++; delay_us(3); ~/ S6 u- H0 U5 d: O };6 K$ ^/ J7 u4 j: w& E if(retry>=100)return 1; _. K5 X8 n. \5 W5 i return 0; } //从DHT11读取一个位1 s. D& L' B( V+ n- z //返回值:1/0: A0 c* \; d# C( { uint8_t DHT11_Read_Bit(void) { uint8_t retry=0; while((HAL_GPIO_ReadPin(GPIO_DHT11,IO_DHT11)==GPIO_PIN_SET)&&retry<100)//等待变为低电平& c1 n4 Y o3 Y) z {+ U `) g+ X* A* u9 q# j retry++; delay_us(3);- |3 s$ {7 C: z5 l, I7 a* ] }# o9 E/ M6 I: F8 s retry=0; while((HAL_GPIO_ReadPin(GPIO_DHT11,IO_DHT11)==GPIO_PIN_RESET)&&retry<100)//等待变高电平 { retry++;: Y6 D1 C; }4 z# U7 e* a* |* ^) ~+ r5 y delay_us(3);! ?3 N5 V# b [" Y } delay_us(50);//等待40us if(HAL_GPIO_ReadPin(GPIO_DHT11,IO_DHT11)==GPIO_PIN_SET)/ L8 F8 n1 d7 p return 1; else return 0; 4 Q+ e5 V" M+ V/ P) \8 H } //从DHT11读取一个字节 //返回值:读到的数据 uint8_t DHT11_Read_Byte(void) ! i/ b: V- A! T, Q$ h/ @ { + i$ U. Z( _: K5 _ uint8_t i,dat;+ b. U, V1 _& _# M dat=0;3 ~" n2 T& }7 `$ `5 J for (i=0;i<8;i++) 0 S$ [) G6 t) Z, A4 r6 g4 I9 ` { dat<<=1; dat|=DHT11_Read_Bit();% u! j6 i. f! ^1 ] } return dat; }% X5 }( E. y, C k8 b Q //从DHT11读取一次数据3 Q3 [" e* n) k8 t //temp:温度值(范围:0~50°)& B8 }( R% ~ R: \ //humi:湿度值(范围:20%~90%) //返回值:0,正常;1,读取失败 uint8_t DHT11_Read_Data(uint8_t *temp,uint8_t *humi) & e( e* F" u$ G' i { uint8_t buf[5];& s# I/ g. y! l4 O, ? uint8_t i; DHT11_Rst();% J+ H" m: b5 F3 }) M& O8 G( i) f if(DHT11_Check()==0)$ a4 R" v N: }5 y {9 h& z4 S- }9 z4 m4 s1 ] for(i=0;i<5;i++)//读取40位数据8 h2 v, M7 g( y2 G3 M7 N5 f { buf=DHT11_Read_Byte(); } if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4]) { *humi=buf[0];. ]/ `- H# w/ Q *temp=buf[2]; } }else return 1; return 0; } //初始化DHT11的IO口 DQ 同时检测DHT11的存在 //返回1:不存在8 V8 w+ \5 Q9 B2 o //返回0:存在 uint8_t DHT11_Init(void) { DHT11_Rst(); //复位DHT119 W/ H/ H# T4 L6 |- H return DHT11_Check();//等待DHT11的回应 } 在DHT11的驱动中,us级的延时函数我使用的是/ M9 t, G( B1 o' ^ void delay_us(uint32_t value) { uint32_t i;5 b9 Z( g; G( ]7 @0 m+ n i = value * 8; while(i--); } ; k! S5 j+ R/ q% Q& u3 y! r ,前两天在调节的时候,STM32总是检测不到DHT的存在,今天下午对照时序检查的时候才发现是因为1 r5 d: y1 p8 s# G( h( h( s1 I //复位DHT11 void DHT11_Rst(void) : `0 d; Z; P: Q( z; x { ! D9 [$ E: v( o) C& n DHT11_IO_OUT(); //SET OUTPUT DHT11_DQ_Low; //拉低DQ HAL_Delay(20); //拉低至少18ms DHT11_DQ_High; //DQ=1 delay_us(30); //主机拉高20~40us }$ R$ @$ z. i/ `4 L; `4 @' g2 f 函数里面是先拉低持续至少18MS,然后拉高20~40us,这里我写成了拉高30ms了,所以总是检测不到DHT11的存在 0 b$ P- n) H. E0 H( |6 N DHT11.h中的程序 9 |/ Y5 f" _8 p. C% n6 g' `% Q 9 `. O' Z) P, d7 T; ] #ifndef __DHT11_H, ~+ {( O" Q$ s, E; D #define __DHT11_H #include "stm32l0xx_hal.h" #include "gpio.h": D8 C6 R. N9 i6 {9 a+ M1 Q & o9 R/ @: s* l' r7 j #define IO_DHT11 GPIO_PIN_10 #define GPIO_DHT11 GPIOC6 x8 y0 J4 U. V$ c1 e ; ^6 |3 B w: @+ Z- B6 t #define DHT11_DQ_High HAL_GPIO_WritePin(GPIO_DHT11, IO_DHT11, GPIO_PIN_SET);5 s9 u1 z& l" d m #define DHT11_DQ_Low HAL_GPIO_WritePin(GPIO_DHT11, IO_DHT11, GPIO_PIN_RESET); ; U1 M* A! C& V$ c ; K+ l1 N5 n+ s; _1 b3 C void DHT11_IO_OUT(void);6 Z+ u' ~/ R/ P; S$ k void DHT11_IO_IN(void); uint8_t DHT11_Init(void);//初始化DHT11& ~# | q' U2 N$ ?: Y; v# |; i+ M uint8_t DHT11_Read_Data(uint8_t *temp,uint8_t *humi) ;//读取温湿度 uint8_t DHT11_Read_Byte(void);//读出一个字节 uint8_t DHT11_Read_Bit(void);//读出一个位$ ]- B) @( }2 P6 B9 s* P" ] uint8_t DHT11_Check(void);//检测是否存在DHT110 w! [( K+ w9 s: W Q! [ void DHT11_Rst(void);//复位DHT11 6 Z* L: `) P* B4 ?2 E void delay_us(uint32_t value);2 _) P; g- l' u void delay40us(void);6 s0 O1 C, B( g0 w) l4 _+ I( F! ^ ) R. s+ ~/ M# c7 w* Q #endif $ A1 {- p/ U1 g 目前的话,先做成这个样子,传感器的话,等后续拿到之后,再添加上去$ D$ j W' a- I* V2 O: I9 _ 前端时间申请了机智云的gokit2开发套件 这几天就要到了,我打算先学习一下,后续能够将数据上传云端,方便远程查询。 V2 t. m$ Z* s4 o: T' I' [4 V 在最后,还是要谢谢ST社区的活动和支持,当然还有机智云,,, 9 v# y' q+ j1 `6 s/ S. Q ' R; g9 \0 P) e1 T2 M+ J0 { ! `" H3 i6 b2 h6 L& _0 \ f 2 U( W8 p3 w2 Y9 O# ^ ! \1 [' a5 s0 V1 d : F# ~ C5 M1 r- j6 _7 ]$ p |
基于STM32L051使用CubeMX生成工程文件ST系列芯片通用经验分享
基于STM32L051开始添加需要的代码经验分享
STM32L051测试I2C协议设备的添加经验分享
基于STM32L051测试Flash和EEPROM的读写
基于STM32L051串口测试与Enocean模块通讯问题
基于STM32L0的EEPROM读写经验分享
基于STM32L0 ADC使用HAL库关于校准问题经验分享
【工程师笔记】汇总处
【经验之谈】基于STM32L053芯片使用STM32CUBE软件开发低功耗设备的经验分享
在 STM32L0 和 STM32L4 系列微控制器中使用 LPUART 使功耗最小
谢谢支持