实例介绍
本系统中,通过光敏电阻实现对路灯亮度的感应,智能地调整路灯的亮度,提高路灯的节能效果。通过人体红外传感器实现对行人的感应,智能地调整路灯的亮度,提高行人的安全性。通过温度传感器实现对路灯温度的感应,防止路灯过热引起安全隐患。通过ZigBee无线通信技术,实现对路灯的远程监测和控制,提高路灯的管理效率和维护效果。通过WIFI进入云平台,再将通过ZigBee无线通信技术与云平台进行通信,实现对路灯的远程监测和控制。云平台将通过接收各种传感器的信号,实现对路灯的智能控制和调节。
【实例截图】应用场景可以变成校园、城市等,用于毕业论文或毕业设计
【核心代码】
#include "main.h"
#include "adc.h"
#include "tim.h"
#include "usart.h"
#include "gpio.h"
#include "./HAL/ds18b20/ds18b20.h"
#include "./HAL/delay/delay.h"
#define BEEP(a) (a?HAL_GPIO_WritePin(BEEP_GPIO_Port, BEEP_Pin, GPIO_PIN_SET):HAL_GPIO_WritePin(BEEP_GPIO_Port, BEEP_Pin, GPIO_PIN_RESET))
#define IR_IN HAL_GPIO_ReadPin(IR_IN_GPIO_Port,IR_IN_Pin)
uint8_t USART2_TX_BUF[200];
#define u2_printf(...) HAL_UART_Transmit(&huart2,USART2_TX_BUF,sprintf((char *)USART2_TX_BUF,__VA_ARGS__),0xffff)
uint16_t time_1ms,time_500ms; //计时变量1ms,500Ms
uint8_t uart2_value; //串口2相关变量
uint8_t uart2_buf[36],uart2_time,uart2_num;
uint8_t uart2_rx__flag;
uint16_t adc_value; //adc
uint16_t light_value; //光照强度
uint16_t temp; //温度值
uint16_t light; //灯的亮度
uint8_t Zigbee_Head[4] = {0xFC,0X00,0X01,0X02}; //ZigBee相关变量
uint8_t Zigbee_Data[14];
void SystemClock_Config(void);
/****
*******Zigbee发送包头,广播形式发送
*******输入:发送数据的长度
*****/
void Zigbee_Send_Head(uint8_t Data_Len)
{
uint8_t i;
Zigbee_Head[1] = Data_Len = 2;
for(i=0;i<4;i )
u2_printf("%c", Zigbee_Head[i]);
}
//监测函数
void Monitor_function(void)
{
uint8_t i;
if(time_500ms == 1) //每500ms获取一次光照强度、温度
{
time_500ms = 0;
HAL_ADC_Start(&hadc1);
if(HAL_ADC_PollForConversion(&hadc1, 999) == HAL_OK)
adc_value = HAL_ADC_GetValue(&hadc1);
HAL_ADC_Stop(&hadc1);
light_value = (adc_value/4096.0)*100; //获取光照值
temp=Ds18b20_Read_Temp();
Zigbee_Data[0]=0xa1;//通过ZigBee给主机发送温度、灯的亮度和光照强度
Zigbee_Data[1]=temp/100%10;
Zigbee_Data[2]=temp/10%10;
Zigbee_Data[3]=temp/1%10;
Zigbee_Data[4]=light/10;
Zigbee_Data[5]=light_value/10%10;
Zigbee_Data[6]=light_value/1%10;
Zigbee_Send_Head(7);
for(i=0; i<7; i )
u2_printf("%c", Zigbee_Data[i]);
}
}
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_ADC1_Init();
MX_TIM1_Init();
MX_USART2_UART_Init();
MX_TIM3_Init();
HAL_TIM_Base_Start_IT(&htim1);
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_3);
HAL_UART_Receive_IT(&huart2, &uart2_value, 1);
Ds18b20_GPIO_Init(); //温度检测模块引脚初始化
while (1)
{
Monitor_function(); //监测函数
if(temp>=400 && temp<800) //温度在40-80之间,蜂鸣器报警
{
BEEP(1);
}
else
{
BEEP(0);
}
if(IR_IN==0) //人体红外检测到人
{
if(light_value<50) //光照强度小于50,灯的亮度和光照强度成反比
{
light=1000-light_value*15;
}
else //光照强度大于等于50,灯不亮
{
light=0;
}
}
__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_3,light); //灯的亮度
}
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance == htim1.Instance) //定时器1触发中断
{
time_1ms ;
if(time_1ms>= 500)
{
time_1ms= 0;
time_500ms = 1;
}
if(uart2_num != 0)
{
uart2_time ;
if(uart2_time >= 10) //一帧数据接受完成
{
uart2_time = 0;
uart2_num = 0;
uart2_rx__flag = 1;
}
}
}
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == huart2.Instance)//串口1触发中断
{
HAL_UART_Receive_IT(&huart2, &uart2_value, 1);
uart2_buf[uart2_num ] = uart2_value;
uart2_time = 0;
}
}
void Error_Handler(void)
{
__disable_irq();
while (1)
{
}
}
#ifdef USE_FULL_ASSERT
void assert_failed(uint8_t *file, uint32_t line)
{
}
#endif
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论