本周正式开始制作环境采集系统第一阶段——数据采集终端;即各种传感器收集环境数据。
1. 风速传感器:风速传感器现被广泛运用于物联网项目中,该传感器输出模拟电压值,配合arduino的驱动,使测量风速变得更加简单。同时风速传感器可连续监测地点的风速风量大小,能够对所处巷道的风速风量进行实时显示,是矿井通风安全参数测量的重要仪表,可广泛应用于温室、环境保护、气象站、船舶、码头、养殖等环境的风速测量。其棕色线是VCC,蓝色线是信号,黑色线是GND。
风速传感器的工作原理:超声波风速传感器是利用超声波时差法来实现风速的测量。声音在空气中的传播速度,会和风向上的气流速度叠加。若超声波的传播方向与风向相同,它的速度会加快;反之,若超声波的传播方向若与风向相反,它的速度会变慢。因此,在固定的检测条件下,超声波在空气中传播的速度可以和风速函数对应。
计算公式是:风速值 = (输出电压-0.4)/1.6*32.4;
2. 风向传感器:风向传感器是一种以风向箭头的转动探测、感受外界的风向信息,并将其传递给同轴码盘,同时输出对应风向相关数值的物理装置。风向传感器可测量室外环境中的近地风向,按工作原理可分为光电式、电压式和罗盘式等,被广泛应用于气象、海洋、环境、农业、林业、水利、电力、科研等领域。其棕色线是VCC,蓝色线是信号,黑色线是GND。
风向传感器的工作原理:风向传感器的核心采用绝对式格雷码盘编码(四位格雷码或七位格雷码),利用光电信号转换原理,可以准确的输出相对应的风向信息;电压式风向传感器的核心采用精密导电塑料传感器,通过电压信号输出相对应的风向信息;电子罗盘式风向传感器的核心采用电子罗盘定位绝对方向,通过RS485接口输出风向信息。
计算公式是:风向值=(输出电压-0.4)/16*360 。
输出电压上升0.1V对应风向顺时针转移一个方向。
3. DHT22数字温湿度传感器:DHT22数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。传感器包括一个电容式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。单线制串行接口,使系统集成变得简易快捷。超小的体积、极低的功耗,信号传输距离可达20米以上,使其成为各类应用甚至最为苛刻的应用场合的最佳选则。产品连接方便,可直接插接到Arduino传感器扩展板上。其输出信号类型为数字信号。
4. 土壤温湿度传感器:该传感器能够胜任监控土壤温度、湿度条件的这种应用。传感器内部集成度SHT1X提供这种高精度的要求。其有4个引脚,黄色是sck(时钟信号),红色是VDD(电源),黑色或者绿色是GND(接地),蓝色是DATA(数据输出)。
5. 粉尘传感器:一般粉尘传感器的原理大致为:外部含尘空气吸引下进入吸引口,经导流装置(遮掉外部光线)进入检测器暗室。暗室内的平行光与受光部的视野成直角交叉构成灵敏区(图中斜线部分),粉尘通过灵敏区时,其90℃方向散射光透过狭缝射进来由光电倍增管接收并转换成光电流,经光电流积分电路转换成与散射光成正比的脉冲电信号,计算出粉尘的质量浓度信号输出。
我使用的是PPD42NS粉尘传感器,该传感器为PWM方式输出,结构紧凑,重量轻,光学原理,能够探测1微米以上的粉尘粒子。此外,这个传感器还有两种输出模式,解决不同灵敏度使用要求,洁净环境Vout输出高电平信号(4V)。对应的接线为VCC->PIN3,GND->PIN1,受控角->pin5;而pin2和pin4则为两种模式输出,pin4为设定好的信号输出脚,最小检测颗粒为1μm,而pin2则为可调灵敏度输出教,默认的灵敏度为最小2.5μm,可以通过pin5控制脚来手动调节灵敏度。此外,粉尘传感器的运行周期大约为30S,
30S为一个读取粉尘的周期
6.紫外线传感器:紫外线传感器
紫外线传感器主要功能是采集空气中紫外线强度,这里使用UVM-30A紫外线传感器模块,具有准确度高,造价相对较低的特点,其详细参数如下:
产品名称:UVM-30A紫外线传感器模块
长尺寸:28mm X宽12mm X高10mm
1、工作电压: DC 3-5V
2、输出电压: DC 0-1V
3、测试精度:±1UV INDEX
4、工作电流:典型值 0.06mA 最大值 0.1mA
5、响应波长:200nm-370nm
6、工作温度:-20℃-85℃
7. 光照传感器:光照传感器
概述:
供电电源 :3-5V
光照度范围:0-65535 lx
传感器内置16bitAD转换器
不区分环境光源
接近于视觉灵敏度的分光特性
可对广泛的亮度进行1勒克斯的高精度测定
标准NXP IIC通信协议
模块内部包含通信电平转换,与5V单片机Io直接连接
主要特点:
电源电压 Vmax的 4.5 V 工作温度 Topr -40- 85 ℃贮藏温度 Tstg -40- 100 ℃ SDA灌电流 7mA
功率耗散 260 毫瓦 for operating above Ta=25℃
Features I2C 总线接口(f / s模式支持) 50Hz / 60Hz光噪声reject-function
光源的依赖性不大. (例如白炽灯.荧光灯.卤素灯.白LED)
小测变异(+/- 20%)13)的红外线的影响很小.
光照度与勒克斯
光照度可用照度计直接测量。光照度的单位是勒克斯,是英文lux的音译,也可写为lx。
黑夜:0.001—0.02;月夜:0.02—0.3;阴天室内:5—50;阴天室外:50—500;晴天室内:100—1000;夏季中午太阳光下的照度:约为10*6次方;阅读书刊时所需的照度:50—60;家用摄像机标准照度:1400
接线方式:
VCC----3.3v,SDA-----A4,SCL-------A5,ADR------A3,GND-------GND。
本周的问题集解决方式:
1. LCD输出小数不会弄;
解决方法:在书上看到了u8g.print()函数,该函数用于输出任何类型的数据,但是在使用该函数之前,仍然要使用setFont()制定现实的字体,但与drawStr()不同的是,print输出的字符的显示位置还需要有setPrintPos()函数来指定。
2. 风速风向连接实物图数据始终读不对;
解决方法:接地线位于主板的接地线连通,把俩接地线连通就好。
3. LCD的灯直接用pinMode(LED,OUTPUT)灯就亮是否正常?
解决方法: 学长解释是正常现象。
4. 风速开始读取数值不对;
解决方法:外接电源,让风速风向传感器的电压在7~12V之间。
5. 粉尘传感器的问题,没弄清传感器的原理和规格,不知道除了VCC和GND外的三根线哪些是数据输出,应该使用哪一根作为信号传输线,后来通过请教了解了线的问题。测试出的数据又过大,粉尘数过多,而且起伏很大,与一般实测数据差别过大;
解决方法:通过滤波和更改公式等方式解决。
本周的主要工作:
1. 熟悉各种传感器;
2. 每个传感器在主板上实现功能;
3. 再将所有的传感器在一个主板上实现功能;
4. 将传感器所有返回的数据在LCD上;
5. 撰写报告;
本周主要的工作是弄好无线串口模块,通过无线串口把串口数据发在其他电脑上。本次主要使用的工具是无线调频串口模块E14-TTL100和USB转串口模块。
无线调频串口模块E14-TTL100:无线接收和发送数据的功能,与USB转串口模块的接线是VCC-VCC,GND-GND,TX-RX,RX-TX,SET(低为设置指令状态,高为工作状态)
设置出厂配置的步奏:
第一步:将主机串口设置为9600、8、N、1(串口调试助手);
第二步:将SET引脚拉低,使SET=0;
第三步:等待模块返回“START”字符;
第四步:通过串口发送5字节设置数据到模块;(发送默认设置:C0 12 34 18 00) (16进制发送)
第五步:若命令正确,模块返回“OK”,表示设置成功,否则模块返回“ERROR”,表示设置失败,参数未得到改变。
在出厂设置下,模块串口速率:9600 (停止位校验位为N 1) 空中速率:1K 频点为0 (具体参考用户手册);
用UNO主板代替USB装串口模块,编写一个空程序在UNO里,主板上0,1这两个引脚就分别是RX和TX,其余的接线方式与USB转串口模块一样,这样主板与计算机就可以进行硬串口通信了。
软串口通信:就是进行串口之间的交流,Arduino 还提供了SoftwareSerial类库,可将其他数字引脚通过程序来模拟成串口通信引脚,而使用SoftwareSerial类库模拟成的串口成为软件模拟串口(简称软串口);在UNO和其他使用ATmega 328做控制核心的Arduino上,只有0,1一组硬件串口,而这组串口又常用于与计算机进行通信。软串口事由程序模拟生成的,使用起来不如硬串口稳定,波特率越高越不稳定。
SoftWareSerial 类库成员函数:
在使用SoftWareSerial 类库成员函数之前需要先声明头文件SoftwareSerial.h头文件。
1. SortwareSerial():通过它可以指定软串口的RX和TX的引脚。
2. Listen():开启软串口监听状态,Arduino在同一时间仅能监听一个软串口,需要该对象调用此函数开启监听功能。
3. isListenling():检测软串口是否正处于监听状态。
4. overflow():检测缓冲区是否已经溢出。软串口缓冲区最多可保存64B的数据。
本周的问题及解决方法:
1. 开始建立的硬串口不能通信。
解决方法:后面研究了软串口通信,运用软串口进行了串口通信。
2. 发送的数据在串口调试助手经常出现乱码。
解决方法:经常忘记用16进制发送C0 12 34 18 00进行初始化。
本周的工作 :
1. 复习之前学习内容,完善程序;
2. 撰写报告;
3. 认识和使用无线模块,发送数据到另外的电脑上。
本周的主要任务是整理与规范主程序,由于粉尘传感器程序始终弄不好,导致进度有点慢。
1. 把每一个模块都封装成一个函数和类库,为了之后增加和修改程序更加方便;
2. 把引脚全部运用宏定义;
3. 同一数据类型放在一起;
本周的问题及解决方式:
1. 粉尘传感器在加了延时之后,数据不对,后面查明原因是因为粉尘传感器用的系统时间,之系统时间之内数据不断累加得到最终的正确值,但是加了延时以后,使粉尘传感器在30秒之内累加的次数减少,从而得出的数据较正常值偏小且不稳定;
解决方式:该问题困扰我们很久,使我们这两周的项目进度推迟很多,用过在时间函数内输出,也把该粉尘传感器这个程序封装成函数等方式,但是都失败了,最终在网上看到一篇关于粉尘传感器的程序,他的程序对这个问题的解决方法是让程序先运行粉尘传感器的程序30秒,在运行其他的传感器,最后在程序的最后清零,让程序重新循环,虽然这样确实能够这个时间问题,但是新的问题又出来了,就是每隔30秒才能显示一次数据,等待的时间太长,目前正在解决这个问题。
2. 在vc++里面把一个函数装成“.h”的文件,但是在一个“.cpp”文件里引用时只能用”.h”来引用,不能用< .h>来引用;
解决方式:目前还没找到如何解释这个问题的理由。
3. 把主程序里各部分封装成函数或者类库,在Arduino编写器上,该函数或者类库放在主程序中可以运行,但是写成类库或者函数单独放在一个文件中,然后去调用这些函数或者类库用“.h”头文件去引用却报出找不到该文件的错误。而在VC++中完全可以运行。
解决方式:解决方式:是由于类库文件没有按格式写好。
本周的工作:
1. 做好中间节点;
2. 解决未解决的问题;
由于连续一两周没有写报告了,所以这里一起写了。这连续几周主要在弄GSM上传数据与服务器接受的工作。
首先还是介绍所需要的器材:
1. SIM900A:SIM900A采用工业标准接口,工作频率为GSM/GPRS 850/900/1800/1900MHz,可以低功耗实现语音、SMS、数据和传真信息的传输。另外,SIM900A的尺寸大小为24x24x3mm,能适用于M2M应用中的各类设计需求,尤其适用于紧凑型产品设计,是我们上传数据最重要的模块,我们通过SIM900A把数据GET或者POST到服务器上去。
2. Ethernet:Ethernet是模拟上传数据到yeelink平台的工具。Ethernet采用多种连接介质,包括同轴缆、双绞线和光纤等。其中双绞线多用于从主机到集线器或交换机的连接,而光纤则主要用于交换机间的级联和交换机到路由器间的点到点链路上。Ethernet的工作原理是采用带冲突检测的载波帧听多路访问(CSMA/CD)机制。Ethernet中节点都可以看到在网络中发送的所有信息,因此,我们说以太网是一种广播网络。
Ethernet的工作过程如下:
当Ethernet中的一台主机要传输数据时,它将按如下步骤进行:
1、监听信道上是否有信号在传输。如果有的话,表明信道处于忙状态,就继续监听,直到信道空闲为止。
2、若没有监听到任何信号,就传输数据
3、传输的时候继续监听,如发现冲突则执行退避算法,随机等待一段时间后,重新执行步骤1(当冲突发生时,涉及冲突的计算机会发送会返回到监听信道状态。
注意:每台计算机一次只允许发送一个包,一个拥塞序列,以警告所有的节点)
4、若未发现冲突则发送成功,所有计算机在试图再一次发送数据之前,必须在最近一次发送后等待9.6微秒(以10Mbps运行)。
上传服务器方式有两种,一种是GET,另一种是POST;
GET上传的数据一般是很小的并且安全性能不高的数据, 而POST上传的数据适用于数据量大,数据类型复杂,数据安全性能要求高的地方。
GET和POST的使用方法一般如下:
1.采用GET方式向服务器传递数据的步骤
1.利用Map集合对数据进行获取并进行数据处理
if (params!=null&&!params.isEmpty()) {
for (Map.Entry
sb.append(entry.getKey()).append("=");
sb.append(URLEncoder.encode(entry.getValue(),encoding));
sb.append("&");
}
sb.deleteCharAt(sb.length()-1);
}
2.新建一个StringBuilder对象
sb=new StringBuilder()
3.新建一个HttpURLConnection的URL对象,打开连接并传递服务器的path
connection=(HttpURLConnection) new URL(path).openConnection();
4.设置超时和连接的方式
connection.setConnectTimeout(5000);
connection.setRequestMethod("GET");
2.采用POST方式向服务器传递数据的步骤
1.利用Map集合对数据进行获取并进行数据处理
if (params!=null&&!params.isEmpty()) {
for (Map.Entry
sb.append(entry.getKey()).append("=");
sb.append(URLEncoder.encode(entry.getValue(),encoding));
sb.append("&");
}
sb.deleteCharAt(sb.length()-1);
}
2.新建一个StringBuilder对象,得到POST传给服务器的数据
sb=new StringBuilder()
byte[] data=sb.toString().getBytes();
3.新建一个HttpURLConnection的URL对象,打开连接并传递服务器的path
connection=(HttpURLConnection) new URL(path).openConnection();
4.设置超时和允许对外连接数据
connection.setDoOutput(true);
5.设置连接的setRequestProperty属性
connection.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
connection.setRequestProperty("Content-Length", data.length+"");
6.得到连接输出流
outputStream =connection.getOutputStream();
7.把得到的数据写入输出流中并刷新
outputStream.write(data);
outputStream.flush();
yeelink平台的使用:
因为我们的服务器还未做成功,所以就借用yeelink平台来作为我们就收我们所发送的数据的服务器,方便测试。
遇到的问题:
1.上传数据到yeelink上,有时候数值不正常或者发不上去;
解决方式:这属于正常现象,数值不正确与网络有关,网络不通畅的情况下这些现象完全有可能发生。
2.上传数据到yeelink时,一个传感器只能上传一个数据,不能上传多个数据;
解决方式: 把有多个数值的传感器数值分解成一个个数据分别上传。
3.上传数据到yeelink上时,不能够上传小数,上传小数就会产生乱码;
解决方式:上传数据到yeelink上的小数,需要用字符串发送,字符串还有一定的长度限制,需要在程序中计算出字符串的长度。
4.在测试GSM模块时串口经常产生乱码;
解决方式:把输出函数由print改为write;