1 前言
如今,科技的发展不断扩展无线通讯领域,在无线通讯技术中运用比较广泛的有UWB、Wifi、NFC、ZigBee等等,它们或多或少都具有不同的属性和特点,但是论组网能力和灵活性,ZigBee技术都能有绝佳的发展前景。本设计是以人工智能为核心,高精准地实时采集城市道路数据,并采取有效手段除尘降温,推动了城市信息化发展以及提高人民幸福指数,以现代科技提高群众健康生活。城市道路除尘降温系统主要目标是取代传统的道路清洁方式,突破传统布线的壁垒,实现现代化道路清洁。相较于传统有线通信连接检测节点与控制节点,通过无线组网可以更加方便实现,具有良好的兼容性。城市的发展从原来的健全基本设施到如今精细化管理不断迈向新台阶,本设计将为城市道路环境数据监测和处理提供高效的、智能化的服务平台。
2 系统实现功能
- 各路段组网:采用星型拓扑结构间隔50米道路绿化带完成监测,实现多个ZigBee终端节点与ZigBee协调器节点组网。
- 实时监测:实现监测城市道路各路段的PM2.5浓度和温度,监测路段蓄水池的水位状况。
- 手动模式:通过ZigBee协调器节点上按键设置根据各季节变化调整各路段的PM2.5和温度阈值,可以根据用户开关各路段的除尘降温装置。
- 自动模式:当道路环境的PM2.5浓度高于该季节的最佳阈值且该路段蓄水池有水,自动打开降温除尘装置;当道路温度高于设置值且该路段蓄水池有水,自动打开降温除尘装置。
- 报警功能:各路段蓄水池水位过低发出声光报警,提醒加水。
- 上位机设计:上位机实现与各路段的信息的远程交互与控制。
3 系统下位机设计
3.1 下位机硬件选型
序号
模块
型号
1
单片机
CC2530单片机
2
通信模块
ZigBee
3
温度传感器
DS18B20
4
水位传感器
——
5
蜂鸣器
——
6
PM2.5传感器
GP2Y1010AU0F
7
水泵驱动模块
——
8
显示模块
OLED屏幕
3.2 下位机实物展示
4 上位机设计
5 下位机部分源码
void APP_Config(void) { usart_config();//串口初始化配置 timer_config();//定时器初始化配置 gpio_config(); //IO口初始化配置 #if defined(ZDO_COORDINATOR) //协调器 key_config(); //按键初始化配置 flash_config(); flash_read(122,0,flash_temp,8); if(flash_temp[0]!=0xff){ min_wendu=flash_temp[0]; max_wendu=flash_temp[1]; min_shidu=flash_temp[2]; max_shidu=flash_temp[3]; mode_relay=flash_temp[4]; max_pm25=flash_temp[5]; max_pm25=max_pm25<<8; max_pm25=max_pm25+flash_temp[6]; } display_info_config(); #else HalAdcSetReference(HAL_ADC_REF_AVDD); P0DIR &= ~0x60; //P0.5 P0.6定义为输入口 #endif usart_sentstring("APP初始化完成\r\n"); printf("printf is ok\r\n"); } void APP(unsigned char task)//用户轮询进程 { #if defined(ZDO_COORDINATOR) //协调器 if(flag_beep==1){ if(cnt_beep>2000){ BEEP_ON; cnt_beep=0; }else{ if(cnt_beep>100){ BEEP_OFF; } } }else{ BEEP_OFF; } key_server();//按键扫描进程 App_Report(); #endif switch(task) //任务进程 { case 0://串口进程 if(rx_update) //串口命令进程,收到\r\n更新命令 { rx_update=0; //清除更新标志位 printf("receive usart command:%s\r\n",rx_temp);//打印接收的数据 rtc_usart_time_set(); //串口设置RTC时间函数 usart_set_mode(); usart_set_relay(); usart_set_range(); usart_check_mode(); usart_check_relay(); usart_check_range(); flash_erase(122);//清除FLASH delayms(100); flash_temp[0]=min_wendu; flash_temp[1]=max_wendu; flash_temp[2]=min_shidu; flash_temp[3]=max_shidu; flash_temp[4]=mode_relay; flash_temp[5]=max_pm25>>8; flash_temp[6]=max_pm25; flash_write(122,0,flash_temp,8); display_info_config(); wipe_buffer(rx_temp,50);//清除串口缓存数据 rx_index=0; //串口缓存指针回0 rx_flag=1; //串口允许接收 timer1cnt=0; } break; case 1://显示刷新进程 if(keymode==0) { #if defined(ZDO_COORDINATOR) //协调器 { display_info(); //温湿度显示 } #else //终端或路由 { } #endif } break; case 2://切换显示进程 if(keymode==0) { #if defined(ZDO_COORDINATOR) //协调器 if(timer1cnt>1000) //定时器进程 { rf_temp[0]='1'; rf_temp[1]='1'; rf_temp[2]='1'; rf_temp[3]='\r'; rf_temp[4]='\n'; rf_temp[5]=mode_relay+0x30; rf_temp[6]=status_relay+0x30; rf_temp[9]=0; RF_ACK(rf_temp); timer1cnt=0; } #else if(timer1cnt>800) //定时器进程,每3秒翻转一次显示内容 { timer1cnt=0; } task=0; #endif } break; case 3://继电器控制进程 #if defined(ZDO_COORDINATOR) //协调器 #endif task=0; break; case 4: break; case 5: break; default: task=0; break; } } void display_info(void) { unsigned char i; LCD_P8x16(40,0,&number[pm25/100]); LCD_P8x16(48,0,&number[pm25%100/10]); LCD_P8x16(56,0,&number[pm25%10]); LCD_P8x16(40,2,&number[temperature/10]); LCD_P8x16(48,2,&number[temperature%10]); LCD_P8x16(40,4,&number[soil/10]); LCD_P8x16(48,4,&number[soil%10]); if(mode_relay==0){ for(i=0;i<2;i++) LCD_P16x16Ch(16*i,6,22+i);//自动 }else{ for(i=0;i<2;i++) LCD_P16x16Ch(16*i,6,24+i);//手动 } if(status_relay==1){ LCD_P16x16Ch(112,6,28);//开 }else{ LCD_P16x16Ch(112,6,29);//关 } flag_beep=0; if(mode_relay==0) status_relay=0;//自动模式下,先关闭 if(temperature>max_wendu){ if(mode_relay==0){ status_relay=1;} flag_beep=1; } if(pm25>max_pm25 ){ if(mode_relay==0){ status_relay=1;} flag_beep=1; } if(soil<min_shidu){//完全没水,报警 flag_water=0; flag_beep=1; }else{ if(soil<max_shidu){//快没水了,报警但还能用 flag_beep=1; flag_water=1; } else { if(soil>max_shidu){//水量充足 flag_water=2; } } } if(flag_water==0)//缺水,不管模式,都关掉 { status_relay=0; } }