基于STM32的光照度自动调节系统
创作时间:
作者:
@小白创作中心
基于STM32的光照度自动调节系统
引用
CSDN
1.
https://blog.csdn.net/weixin_43469377/article/details/124102495
本文介绍了一个基于STM32的光照度自动调节系统,详细描述了硬件器材、PCB绘制、STM32CubeMX配置以及代码实现等步骤。通过光照度传感器和蓝牙模块,用户可以通过手机设定目标光照度,系统会自动调节LED灯的亮度以达到设定值。
基于STM32的光照度自动调节系统
1、硬件器材
- STM32F103C8T6
- HC-05
- 光照度传感器BH1750
- 一个LED灯(作为被调节对象)
- 一个限流电阻(1k~10k)
2、硬件PCB绘制
这个硬件电路其实很简单,直接用洞洞板焊也很快,但是毕竟是我的课设作业,我还是画了一下PCB,显得高级hhh
最终效果:
需要PCB文件的话可以私信我(免费),画的比较简陋
3、stm32cubeMX配置
时钟和下载方式配置:
定时器1kHZ(72M/72/1000)不用定时器中断:
I2C(光照传感器需要):
串口通信(蓝牙需要)注意波特率一致:
要开串口中断:
勾选这三项,然后生成代码:
4、自己添加的代码
添加光照度传感器的代码,基本上就是普通的I2C通信,不细说了(下图不完整,完整的参考https://blog.csdn.net/weixin_43469377/article/details/120923774?spm=1001.2014.3001.5501 或者在我的资源里下载):
串口通信在usart.c添加下面的代码重定向printf函数:
记得添加头文件#include stdio.h
#ifdef __GNUC__
/* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
set to 'Yes') calls __io_putchar() */
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */
/**
* @brief Retargets the C library printf function to the USART.
* @param None
* @retval None
*/
PUTCHAR_PROTOTYPE
{
/* Place your implementation of fputc here */
/* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
return ch;
}
主函数:
头文件需要添加这些
一些参数:
靠调节PWM占空比来调节LED亮度:
初始化串口、LED灯亮度为50%,读取当前光照度:
主要逻辑(注释复制过来乱码了,下面有截图):
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
Set_Value=0;
Now_Value=0;
if(Flag==1) //接收一次命令参数
{
Set_Value=strtoul((char *)Light_Buffer,NULL,10); //设置值保存
HAL_Delay(500);
printf("SET:%lu lx\r\n",Set_Value); //反馈给手机设置值
Now_Value=Value_GY30();
HAL_Delay(500);
printf("NOW:%d lx\r\n",Now_Value); //反馈给手机当前照度
if(Set_Value>Now_Value) //设置照度>当前照度
{
printf("lighter"); //反馈给手机调节
while(Set_Value>Value_GY30())
{
pwmVal+=15;
__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_1, pwmVal); //增大LED亮度直到当前照度达到设置值
}
printf("NOW:%d lx\r\n",Value_GY30()); //反馈给手机当前照度
}
else if(Set_Value<Now_Value) //设置照度<当前照度
{
printf("Darker"); //反馈给手机调节
while(Set_Value<Value_GY30())
{
pwmVal-=15;
__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_1, pwmVal); //减小LED亮度直到当前照度达到设置值
}
printf("NOW:%d lx\r\n",Value_GY30()); //反馈给手机当前照度
}
Flag=0; //一次调节完成,等待下一次命令
}
}
/* USER CODE END 3 */
串口的中断回调函数:
/* USER CODE BEGIN 4 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
UNUSED(huart);
if(huart->Instance==USART1)
{
RxLine++; //接收到的数据加一
Light_Buffer[RxLine-1]=RecieveBuffer[0]; //保存收到的正确数据
if(RxLine==3)
{
// HAL_UART_Transmit_IT(&huart1, (uint8_t *)Light_Buffer, sizeof(Light_Buffer));
Flag=1;
}
RecieveBuffer[0]=0;
HAL_UART_Receive_IT(&huart1, (uint8_t *)RecieveBuffer, 1);
}
}
/* USER CODE END 4 */
有个使用的BUG就是,手机给单片机发送指定光照度时需要发三位数,例如设定为25LX,需要发送025
如果需要使光照度快速达到要求,可以更改这个值,让占空比改变速度变大(下图中的15),但是可能会调过了:
成果展示
光照度调节-演示视频
整个工程已上传到我的资源,需要的朋友可以看看
热门推荐
一键即可超频?XMP 与 EXPO 详解
古代的“枪”杆是用什么材料做的?并不是铁棍,普通人也用不起
意大利文艺复兴时期女性叙事艺术与道德意义探析
膝骨性关节炎让人愁,中医特色疗法来帮忙
聊聊消费者旅程Consumer Journey
极坐标下的几何之美:解开曲线背后的秘密
绍兴市旅游攻略景点大全,绍兴旅游必去十大景点有哪些?看这里!
漫山樱花海,一眼心动!梅州阴那山万株樱花树迎“颜值巅峰”
感冒头疼怎么办?五种实用缓解方法
美联储降息50个基点,十位专家深度解读影响与后续节奏
戾气怎么读:探讨情绪管理与积极心态的重要性
快速停止打嗝的方法有哪些?一文了解一直打嗝的9個常見原因&如何停止打嗝
如何评估创业项目的风险
马克·盖伊:欧洲杯上的惊喜,水晶宫的防守核心
手电筒DIY换灯珠完全攻略:从工具准备到实际操作详解
足坛一夜动态:阿森纳切尔西输球!巴萨西甲5连胜 国米登顶意甲
面向算法认知战的开源情报智能化分析
探访南阳武侯祠博物馆,感受三国历史文化的魅力
宏观经济之印度:一个充满矛盾的经济奇迹
美“海军联盟”发布咨询报告
探寻中国的茶山:地理位置、特色品种及品茗体验一网打尽
耐克与阿迪达斯在中国市场的挑战:市场份额下滑的原因分析
27岁才做牙齿矫正的切身体会:年龄从来不是问题
银行个人账户基金定投:收益计算与赎回策略全解析
补牙后为何牙齿持续疼痛?可能的原因及解决方法解析
互联网创业必备的增值电信业务经营许可详细流程指南
如何提高汽车的燃油效率
量化交易入门:DMI指标学习和应用
毕业生租房地图:北上广深杭30个地铁站性价比排行榜参考
网络文学IP价值的挖掘与商业化运营-洞察分析