STMCU小助手
发布时间:2022-11-16 15:23
|
该智能环境监测系统采用STMF103R4为主控MCU单元,主要外设有LCD1602,DHT11,EEPROM 24C02以及LDR光电检测单元,采用Proteus作为仿真平台用于对系统进行一个初步的验证,采用CubMX和Keil作为程序编辑软件,以实现监测周围环境的主要参数的功能。: _' f) ^* |# O1 w# G, s( m 7 b" z3 w# s& Q o6 H 第一,先介绍一下Proteus上搭建的硬件电路图。 首先是STMF103R4单元,如下图所示:
6 y4 R3 K5 B k- O0 ` 然后是LCD1602模块:9 x5 ~% D8 m" N; n4 f
然后是EEPROM 24C02模块:
然后是DHT11模块: * q6 o( z8 ^$ H. B% \* W) k* i4 o
* P: s% h5 g$ r% ?7 K 最后是LDR光电检测部分,用于转换光强数据:$ m5 X, V# c e' R- w V
: B% _3 s& R9 f! ~& F2 ^ 最最后,再来一张整体的图。1 p- A* L1 U2 J6 Y5 W
! j* c X+ n+ S" \8 _! ^ ! Y( o. S% K: ~ H 第二,对功能进行一个简单的概括 LCD1602实时显示测量的温度与湿度; 对光照强度进行实时监控,在LCD1602上显示AD_Value, 4 ]- b5 h$ B/ [ 设置AD_Value在一定值的时候输出不同占空比的PWM波给LED灯; 将最近的5个温湿度数据输入进24C02中,存储起来,按下按键后在LCD1602上显示最近的5个湿度温度数据, 3 z4 p$ O- l8 }, X: o 再按一次按键就显示实时的温度湿度以及AD_Value。 第三,简单介绍一下Keil中的程序 首先是温湿度采集显示功能,相关程序如下图所示,刚开始调用DHT11_Read_Data函数将温度数据和湿度数据分别赋给temp和humi两个变量,然后将它们赋值给要存储进24C02中的数组,最后调用sprintf格式化函数和LCD_WRITE_StrDATA显示函数将温湿度数据显示再LCD1602中。9 H1 M2 C0 t0 s: K+ W# ^
. C+ o1 y2 P* n- U# M' i) D* h& R 然后是ADC采集功能以及PWM占空比设置功能,光照强度越强,AD采集的电压越小,需要LED的亮度也要越暗些,所以PWM的占空比要小一些,所以AD_Value与PWM的占空比P_Value成一种正关系,即AD_Value越大,P_Value越大,设置P_Value=AD_Value/50就行,因为AD_Value最大值是4096,不要让P_Value超过100就可以了。程序如下图所示。刚开始掉用HAL_ADC_Start函数启动32单片机内部ADC,之前已经初始化了,然后判断是否转换完成和检测完成,都没问题之后再用HAL_ADC_GetValue函数获取ADC转换数据,然后计算出PWM占空比,再进行格式化并在LCD1602上显示。最后将新的占空比写进__HAL_TIM_SET_COMPARE函数中,从而改变输出的PWM波形占空比,改变LED灯的亮度。
! N5 |( t2 n; R8 l; z I 还有就是存储最近的5次温湿度数据进24C02中,程序如下图所示,首先复位一下写地址,然后一个for循环调用AT_24C02_write_data写入函数分别将5个温度数据和5个湿度数据写入24C02中以供备用。 & W4 D7 I# r# y) P/ a# |* R
最后就是一个按键切换的功能,先提前设置好一个标志位flag,主要程序如下图所示,当检测到按键正常按下后,取反标志位flag,然后给LCD1602清一次屏。% k! m5 d9 v o4 n: c0 N3 |+ ` G5 J 3 `9 E6 e- s8 l" R; A1 P" `
最最后在while循环里面判断标志位并设置标志位为不同值时的功能即可。程序如下图所示,flag为1的时候读取24C02中的数据并在LCD1602上显示。 ! G& B7 g2 O* d5 n6 K2 G! A$ U
1 b8 p! L& Y& O' E+ c: O3 X 反之,flag为0的时候则将前三个功能一起应用起来即可。" r0 t1 Z, d3 M; F( |- ? 8 c! W1 U5 l# T' E! {9 Z; [
/ l f2 X+ ]& F3 |+ E N* w 第四,进入实际检验阶段4 Q& [9 M- E+ z 将程序编译好然后在Proteus中显示出来。实际现象如下图所示。 LCD1602第一行显示温度和湿度,第二行显示AD_Value和PWM占空比。 + Q& Y4 g$ j) [, l" n J& c) i4 @# U 按下一次按键后,将24C02存储的最近的5次温度数据和湿度数据显示在LCD1602上。
其实还是仿真还是有点问题的,可能调用的资源比较多,Proteus仿真的时候比较慢,且容易卡住,这个问题应该在实际的板子上能够消除。 补充一下CubMX的配置:) n1 S. {/ G1 F6 j ! k$ e9 _$ ~- j% D' m2 H! X2 n
: @0 ~4 S1 `: W5 B/ g0 `6 e8 L
! g: e: B5 g4 m$ A9 A5 t
作者:jxjajl bilibili " I& L3 Z4 ~ s |
【STM32H735G-DK 测评】STM32H735G-DK External Loder 编译和测试
Keil-MDK 在线调试设置断点的高级用法
请教下STM32N6570 怎么把分辨率改成320x240并可以全屏显示
【福利三:逢7发帖赢大礼】想要充分利用STM32H743VI片内的RAM空间(但并不顺利)
基于stm32平台上的IC-MU磁绝对值编码器SPI通讯和码盘数据处理
使用STM32 MCU和MPU连接PDM数字麦克风
分享STM32资料-采用 STM32U031R8 MCU 的 STM32 Nucleo-64 开发板,官方资料,数据手册等资料
HRTIM 指南
使用 STM32 的 DWT 单元监控内存
DAC,COMP,HRTIM Fault 功能的使用
微信公众号
手机版