基本信息
源码名称:基于STM32和zigbee的智能路灯
源码大小:8.56KB
文件格式:.c
开发语言:C/C++
更新时间:2024-09-07
   友情提示:(无需注册或充值,赞助后即可获取资源下载链接)

     嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300

本次赞助数额为: 2 元 
   源码介绍

本系统中,通过光敏电阻实现对路灯亮度的感应,智能地调整路灯的亮度,提高路灯的节能效果。通过人体红外传感器实现对行人的感应,智能地调整路灯的亮度,提高行人的安全性。通过温度传感器实现对路灯温度的感应,防止路灯过热引起安全隐患。通过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