基于无线网络的环境监测系统
系统主要包括了数据采集节点和环境管理计算机。采用STM32F103单片机和温度、湿度、光照强度等传感器组成节点环境采集系统;主计算机通过通过USB串口和zigbee无线模块组成数据处理系统。各个节点通过zigbee无线网络组网。如下图所示:
图1 环境无线监控系统示意图
节点系统: 节点系统采用STM32F103单片机+温湿度传感器(DHT11DHT22)+光照强度传感器(TSL2561/BH1750)+无线模块(DL-LN33)。节点系统定时将数据采集并发给主机。 主机: 主机由计算机和无线模块组成。数据采集到计算机后,通过可视化软件显示并记录于数据库。如下图所示:
图2 可视化软件 可视化软件采用Visual Studio 2010开发。使用C#语言,windowsForm应用程序。软件主要涉及了串口通信,曲线图,sqlce数据库等。 样机视图如下:
图3 样机视图
通信协议:
序号 | 定义 | 内容 | 说明 | 备注 | 0 | 0xFE | 帧头 |
|
| 1 | 0x0A | 包长 | 数据长+4=10 |
| 2 | 0x90 | 源端口号 |
|
| 3 | 0x91 | 目的端口号 |
|
| 4 | 0xXX | 远程地址L |
|
| 5 | 0xXX | 远程地址H |
|
| 6 | 0xXX | 温度数据 | 0~150,T=N-50; |
| 7 | 0xXX | 湿度数据 | 0~100 |
| 8、9 | 0xXXXX(H1,H2) | 光强0 | L=H1*250+H2,0<=H1,H2<=250 | 可见光+红外光 | 10、11 | 0xXXXX(H1,H2) | 光强1 | L=H1*250+H2,0<=H1,H2<=250 | 红外光 | 12 | 0xFF | 帧尾 |
|
|
单片机源程序如下:
- #include "led.h"
- #include "delay.h"
- #include "sys.h"
- #include "key.h"
- #include "usart.h"
- #include "lcd.h"
- #include "spi.h"
- #include "flash.h"
- //#include "ds18b20.h"
- #include "timer.h"
- //#include"tls2561.h"
- #include "BH1750.h"
- #include"myiic.h"
- #include "DTH11.h"
-
- extern unsigned int timercount;
- extern u8 timerProcess ;
- extern u8 receiveM;
-
- uint lux_out[2];
- uint (*lux)[2] ;
- int main(void)
- {
- int dis_data=0;
- u8 Mm=0;
- u8 temperature=0;
- u8 humidity=0;
- uchar datao=0;
- //u8 outdatabuff[13]={0xFE, 0x0A, 0x90, 0x91, 0x65,0x12 ,0x00,0x00,0,0,0,0,0xFF} ;
- u8 outdatabuff[13]={0xFE, 0x0A, 0x90, 0x91, 0x16,0x0D ,0x00,0x00,0,0,0,0,0xFF} ;
- // u8 outdatabuff[13]={0xFE, 0x0A, 0x90, 0x91, 0x65,0x12 ,0x00,0x00,0,0,0,0,0xFF} ;
- // short temp;
- lux_out[0]=lux_out[1]=65535;
- SystemInit(); //系统时钟设置
- delay_init(72); //延时初始化
- NVIC_Configuration();
- uart_init(115200);//串口1初始化
- LED_Init();//LED初始化
- // LCD_Init();//初始化液晶
- Timerx_Init(5000,7199);//10Khz的计数频率,计数到5000为500ms
- IIC_Init();
- delay_ms(5);
- // POINT_COLOR=RED;//设置字体为红色
- //LCD_ShowString(60,50,"Mini STM32");
- //LCD_ShowString(60,70,"DS18B20 TEST");
- //LCD_ShowString(60,90,"ATOM@ALIENTEK");
- //LCD_ShowString(60,110,"2011/1/1");
- //while(DS18B20_Init())//初始化DS18B20,兼检测18B20
- //{
- //LCD_ShowString(60,130,"DS18B20 Check Failed!");
- //delay_ms(500);
- //LCD_ShowString(60,130,"Please Check! ");
- //delay_ms(500);
- // LED0=!LED0;//DS0闪烁
- //}
- // LCD_ShowString(60,130,"DS18B20 Ready! ");
- // POINT_COLOR=BLUE;//设置字体为蓝色
- // LCD_ShowString(60,150, "Temperate: . C");
- LED1=0;
- while(DHT11_Init()) //DHT11初始化
- {
-
- delay_ms(100);
- LED0=!LED0;
- Mm++;
- if(Mm>10) break;
-
- }
- Mm=0;
- // TSL2561_Write(CONTROL,0x03); //设置TSL2561未开启状态
- Init_BH1750(); //初始化BH1750
- delay_ms(200);
- Single_Write_BH1750(0x01); // power on
- // while(datao!=0x03)
- // {
- //
- // datao=TSL2561_Read(CONTROL);
- // delay_ms(200);
- // LED0=!LED0;
- // Mm++;
- // if(Mm>5) break;
- // }
- Mm=0;
- // printf("TSL2561 Inial Success!\n");
- // printf("%d\n",TSL2561_Read(CONTROL));
- lux=(uint(*)[2])malloc(2*sizeof(uint));
- if(!lux)
- {
- // printf("malloc failed!/n");
- }
- while(1)
- {
-
- if(timerProcess)
- {
- if(timercount%5==0)
- {
- // lux=Read_Light(); //读取光强
- // lux_out[0]=(*lux)[0];
- // lux_out[1]=(*lux)[1];
- // // printf("Temp:%dHUM:%dGQ:%d,%d\n",temperature,humidity,(*lux)[0],(*lux)[1]);
- // free(lux);
-
- }
-
- if(timercount%10==0)
- {
- // LED0=0;
- //DHT11_Read_Data(&temperature,&humidity); //读取温湿度值
-
- //LED0=0;
- DHT11_Read_Data(&temperature,&humidity); //读取温湿度值
- // lux=Read_Light(); //读取光强
- // lux_out[0]=(*lux)[0];
- // lux_out[1]=(*lux)[1];
- // free(lux);
- // Single_Write_BH1750(0x01); // power on
- Single_Write_BH1750(0x11); // H- resolution mode
- // Delay_mms(800); //延时180ms
- delay_ms(800);
- mread(); //连续读出数据,存储在BUF中
- dis_data=BUF[0];
- dis_data=(dis_data<<8)+BUF[1]; //合成数据
- // printf("Temp:%dHUM:%dGQ:%d,%d\n",temperature,humidity,lux_out[0],lux_out[1]);
- if(temperature>100)temperature=100;
- if(humidity>100)humidity=100;
- outdatabuff[6]=temperature+50;
- outdatabuff[7]=humidity;
- // outdatabuff[8]=(lux_out[0]/256)%256;
- // outdatabuff[9]=lux_out[0]%256;
- // outdatabuff[10]=(lux_out[1]/256)%256;
- // outdatabuff[11]=lux_out[1]%256;
- outdatabuff[8]=(dis_data/250)%250;
- outdatabuff[9]=dis_data%250;
- //outdatabuff[10]=(lux_out[1]/256)%256;
- //outdatabuff[11]=lux_out[1]%256;
- LED1=!LED1;
- for( Mm=0;Mm<13;Mm++)
- {
- USART1->DR=outdatabuff[Mm];
- while((USART1->SR&0X40)==0);//等待发送结束
- }
-
-
- }
- else
- {
- // LED0=1;
- }
- timerProcess=0;
- }
- if(receiveM)
- {
-
- receiveM=0;
- }
-
- }
- }
复制代码
所有资料51hei提供下载:
STM32F103C8_ZNYJC_GY30.zip
(394.17 KB, 下载次数: 118)
|