一个月就这么快的过去了,回首这一个月感觉还是很充实的,现在回想一下这一个月的收获吧。
这一个月我接触了很多以前没有接触到得东西,收获不可谓不大。7月5号开始,我开始做环境数据采集系统,在这之前我还没有亲手接触过arduino,知识仅仅局限在书本的介绍。
和我当初的构想差不多,因为在开题报告的时候也了解了很多,所以脑子里的构思还是很清楚的。我把整个系统构思分为三个部分:采集终端、数据节点、服务器及客户端。
将数据采集放在采集终端,然后将采集终端的数据发送到数据节点;数据节点又把数据初步处理然后通过移动数据网络传输到internet;服务器将已经传入网络的数据进行处理,生成数据视图;最后可以通过web或者其他客户端访问服务器提取数据就可以清晰的看到数据了。
用户还可以通过web或者客户端向服务器发送指令,指令在传输至节点,节点将指令发送到控制器,通过程序的预设实现各种功能,实时控制整个采集系统。
一。 采集终端:
这一个月我基本是把采集终端弄好了,采集终端已经能够采集数据了还在里面加了串口传输和lcd显示。在电脑端可以通过串口看到数据,也已经可以在电脑端出处理数据,也做了测试,也对数据做了测试,数据基本全部正常;此外,因为添加了lcd,所以采集终端系统可以脱离电脑串口直接在lcd上直观查看数据。现在采集终端只需要提供单独的供电就可以脱离电脑工作了,arduino需要5v电源,而风速风向则需要7~24v的外接电源供电,只有有这两个电源就可以很方便的工作了。
现在采集终端包含了许多的设备:arduino INO控制器、风速、风向传感器、温湿度传感器、光照传感器、粉尘灰尘传感器、紫外线传感器、土壤温湿度传感器、无线串口等等。将代码写入uno控制器,然后连接传感器就可以控制传感器了,可以单个实现传感器功能,也可以将多个传感器集成在一个控制器上形成一个采集系统。还可以在采集系统上添加许多通信模块实现数据传输通信,通信模块其实也很多,比如说:无线通信模块,红外模块,GSM/GPRS模块,蓝牙模块,WiFi模块等等。
下面先说说我用上的采集终端传感器吧:
1、光照传感器:光照传感器核心原理就是通过光敏电阻或者光敏二极管三极管来感应光的大小强度,将其感应到的光照强度转化成电压,最后输出电压。光敏电阻体就是在电极上加上电压,设备开启电极间有电流流通,受到适当波长光线照耀时,电流就会随着光照强度的变化而变化,从而实现光电的转化。我使用的传感器就为光敏电阻器电源为3—5V电压驱动,直接可以使用UNO控制器的电源驱动,传感器内置16bitAD转换器,遵守标准NXP IIC通信协议,模块内部包含通信电平转换,与5V单片机Io直接连接,Features I2C 总线接口(f / s模式支持),使用非常方便,而且光源的依赖性不大(例如白炽灯.荧光灯.卤素灯.白LED),小测变异(+/- 20%)13)的红外线的影响很小.处理值也很精确。
编程比较简单,需要添加一个BH1750FVI和Wire的函数库,再调用SetAddress,SetMode、GetLightIntensity等几个函数得到需要的电压值,并通过转化器和换算得到需要的光照强度。
示例程序:
- #include <Wire.h> //IIC连接库
- #include <BH1750FVI.h> //光照的库函数
- BH1750FVI LightSensor; //定义光照对象
- void setup()
- {
- Serial.begin(9600); //设置串口频率
- LightSensor.begin(); //对象LightSensor以主机身份加入通信
- LightSensor.SetAddress(Device_Address_H); //设置通信地址
- LightSensor.SetMode(Continuous_H_resolution_Mode); //设置引脚
- Serial.println("Running..."); //初始化完成提示语
- }
- void loop()
- {
- // put your main code here, to run repeatedly:
- uint16_t lux = LightSensor.GetLightIntensity();// 得到紫外线的值
- Serial.print("Light: "); //串口输出提示信息和值
- Serial.print(lux);
- Serial.println(" lux");
- delay(1000);
- }
2、风向传感器:风向传感器有一个风向信号发生装置,由风标转轴带动一个有6个格雷码光盘的发生装置,发生装置内部每个光盘有6位格雷码,相邻的部分做了透光于不透光处理。通过位于码盘两侧同一半径上6对光电耦合器输出相应的6位格雷码,码盘上安装了36个红外发光二极管下面有6个光电转换器,都正对码盘的6个轨道。风向变动,码盘下面的光电管接收到的电码发生变化,每一个格雷码代表一个风向,分辨率为5,61.4度。
此外风向公式为: WD(风向) = K(分辨率)* GM(格雷码) 。 //格雷码算法
WD风向值=(输出电压-0.4)/16*360 //电压算法,输出电压上升0.1V对应风向顺时针转移一个方向
传感器有格雷码、电压、电流三种输出方式,因为我使用的UNO控制器对电压的处理非常方便,所以使用此款arduino风向传感器, 风向传感器的规格为输入电压7~24V,输出电压为0.4~2v, 编程时要通过公式换算,将0.4~2v的输出电压模拟成控制器的0~5v输入电压范围。
- char* dirstring[16] = { "North","North1","Northeasterly","Northeasterly1","East","East1","Southeast","Southeast1","South","South1","Southwest","Southwest1","West","West1","Northwest","Northwest1"}; //设置16个风向
- void setup() {
- Serial.begin(9600);
- }
- void loop() {
- int sensorValue1 = analogRead(A0); //读取风向传感器
- float value1 = sensorValue1 * (5.0 / 1024.0); //换算公式,得到值
- //Serial.println(value1);
- int winddirection =( value1 *10) ;
- winddirection = winddirection - 4 ; //减去传感器自身电压底限值
- Serial.println(winddirection); //提示信息
- // if(winddirection < 0)
- // winddirection = 0;
- // if(winddirection > 15)
- // winddirection = 15;
- Serial.print("winddirection is ");
- if(winddirection == 0 || winddirection == 15 ) //解决电压误差问题
- { Serial.println( dirstring[0] );}
- else
- { Serial.println( dirstring[winddirection] );}
- delay(500);
- }
3、风速传感器: 风速传感器内部有一个光电子风速计,中心有不锈钢转动轴,内部连接了一个光盘,内部还有红外光速,不锈钢转动轴带动光盘转动,切割红外来实现计算风速。当风推动传感器上的碗推动转动轴,转动轴带动光盘转动,光盘每转动一次切割红外14次,从而有光电晶体产生一个脉冲链,实现信号的发生。脉冲链的速率与风速成正比。
风速换算公式: ws(风速m/s) = Vo(初始风速) - f(F)( 每秒计数值)
风速传感器是看着比较好玩,我也挺喜欢的玩的一个传感器之一,不过也是很简单的传感器,只要用控制器得到传感器的电压在通过公式运算就可以得到风速。
- void setup() {
- Serial.begin(9600);
- }
- void loop() {
- int sensorValue = analogRead(A2);
- // Serial.println(sensorValue);
- float value = sensorValue * (5.0 / 1024.0);
- // Serial.println(value);
- float fanspeed = value