本帖最后由 michael_llh 于 2016-9-14 18:01 编辑
首先我们看下项目中需要用到的内容有几个: 1.LCD 2.温度传感器 3.土壤湿度传感器 4.光照传感器 5.水泵 6.轴流风机 那么下面我们来看下这些内容的具体驱动如何实现,前提是大家要知道就是关于本次试用的套件当中给了传感器套件,关于这些套件的介绍如下: 网址:http://wiki.seeedstudio.com/wiki/Grove_-_Starter_Kit_V2.0 这里提供了所有的关于Arduino的代码实现介绍以及产品的介绍。 下面我们一个一个进行说明: 1.LCD
关于LCD的介绍和LCD的连线如上,这里需要注意就是我们的连线一定要连接到我们的IIC接口上面,任意一个就可以,这四个设备是可以通过地址来进行区分的,所以我们不用担心一个总线如何实现三个内容。
我们来看下代码实现,关于LCD的代码Demo是非常多的。
驱动LCD需要把我们的库放到我们的library目录下面。 下载后我们拷贝下面的文件夹内关于LCD驱动的内容:
最后得到的目录结构如下,这个是在Arduino的默认库文件路径下,复制到这里。
然后我们就可以直接调用显示的函数驱动我们的LCD了。 具体的使用方法我们可以相应在github页面当中看到。或者参考例程当中的代码。(这里不再详细说明) https://github.com/Seeed-Studio/Grove_LCD_RGB_Backlight/
2.温度传感器
该温度传感器的测量温度范围为-40°到125°,温差是在正负1.5°C范围内,说实话这个温差特别大。 我们以官网的Demo来讲一下这温度传感器的代码实现。 首先是要定义一个模拟的引脚,这个是一个模拟量的传感器。(这里定义的是一个常量,和普通变量的区别就是说定义了之后就不能再修改了,之后再次进行修改就会报错) 第二个我们需要定义一个关于我们温度计算的一个常量,这里我们需要详细说明一下它是干嘛的,这是一个温敏电阻的值,板子上面有一个电阻,就是板子上面注释为NTC的一个贴片器件,温敏电阻故名思议,就是当温度发生改变的时候电阻值就会发生改变,我们就是通过检测他的电阻值的变化来得到温度的。这个值是需要根据温敏电阻来确定的。那么热敏电阻有两类,这里用的NTC,他的特点是电阻值和温度大小成负指数关系,也就是说温度越大电阻值越小。 这个值我们可以在我们的数据手册中查找到:(但是我没找到对应我们的程序中给定的3975,对应型号的那个电阻的B值和这个不一样,所以这里大家记住这个程序的流程,在自己实际使用的时候买的电阻对应型号然后找到这个B值就行,我估计这里是给错了这个值,所以最后得到的温度好像不是那么准确,但是我们这里需要知道的型号好像不对,并没有NCP18WF104F03RC这个型号,只有NCP18WF104F03RB的型号)
接下来我们就可以读取我们的模拟量。
- int val = analogRead(pinTemp);
复制代码
然后将这个模拟量转成当前的电阻值大小。我们在这里解释一下这个式子,因为使用温敏电阻的话我们想要得到温度,那么电阻值的大小是我们首先要得到的,然后通过温敏电阻和温度关系进而得到我们温度。
- float resistance = (float)(1023-val)*10000/val;
复制代码
我们看下基本的原理:这就是我们上面这个式子的来源,这里对应的VCC为什么是1023呢,是因为我们的Arduino的ADC是8位的,对输入的电压值进行划分成1024份,这样当我们读到一个设置的时候乘以每一份代表的电压大小就得到实际的电压值了,所以这里的1023代表的就是5V了,至于为什么是1023是因为寄存器是从0开始数数的,而不是从1开始,所以这里是1024-1得到1023。后面的10000就是我们的R1的值,为10K的电阻。
最后一步是把他计算成我们的温度大小,这个公式是温敏电阻的计算公式,关于为什么公式长这样看这里: http://wiki.seeedstudio.com/wiki/Grove_-_Temperature_Sensor float temperature = 1/(log(resistance/10000)/B+1/298.15)-273.15;
上面那个式子就是由我们红色的方框当中的式子化简出来的,但是要注意一点这里的exp是代表的以自然数e为底的一个指数,然后这里我们这里需要把我们的T化简出来,因为T是我们最终要得到的值,T0是我们的给定的一个参考温度25度,因为是用开尔文的温度来表示所以这里转换出出来就是298.15。R0的话就是我们的10K电阻。
到这里大家应该会清楚一点到底应该如何计算我们的温度了吧。
3.土壤湿度传感器 这里我们参考了DFrobot的土壤湿度传感器进行制作的,因为本次的套件当中没有湿度传感器。原理图如下,这里的三极管我们使用的是8050,基本普通的NPN管就可以的。然后读取模拟的数据,从发射极引到我们的模拟端口A0 ~ A5。这样就可以直接采集我们的湿度信息了,当我们的湿度较大的时候,数值也会比较大,我们这里就是利用水的导电性,也就是图中的Soil Resistance,如何湿度越大,说明水分越多,导电性自然越好,所以此时我们采集的电压值也就越大,从而得到相应的湿度信息。
4.光照传感器: 这里利用的是光敏电阻的特点,型号是GL5528,这里的测量原理和我们的温度传感器的测量原理是非常类似的,也是通过将我们的转换成我们的电压值进行测量,原理就是一个已知电阻大小的10K电阻和GND相连然后和我们的待测电阻串联,待测电阻另外一段连接到VCC,单片机的引脚连接到两个电阻的中间,通过测量两个电阻之间的电压,然后得到该支路的电流进而算出所求的电阻。
程序流程也比较简单,直接调用analogRead就可以直接得到我们的模拟电压值,这里就是等价于我们的光照强度值,这不过是我们人为认为的光照值,真正的光照值通过这样的测量还是不够的,需要和我们的温度传感器一样经过一系列的转换最终得到相应的亮度信息。但是这里我们不需要精确的得到亮度值,因为我们对亮度值本身是没有概念的,亮度单位是坎德拉/平方米(cd/m2),相信很多人都不知道,我也不知道,百度的。所以我们在这里只需要定性的知道这个值是明亮还是阴暗就可以了,但是如果从数据分析上来说当然需要得到精确的亮度值,这样数据分析才有意义,但是从功能实现上面莱索,我们这样的实现就已经可以了。但是我们上面的温度我们是感知的,所以需要得到一个最终的结果。如果亮度要得到一个准确的并且使用国际单位的亮度值还是使用数字式的亮度来实现这个会比较好。
我们上面漏说了一个内容,在这里补充一下,就是我们的温度测量模块和我们的亮度模块上面都有一个LM358,这个是一个运放芯片,那么在这里是起什么作用呢? 下面是我们的温度传感器的原理图,这里的运放在这里构成了一个电压跟随器,首先我们了解一下电压跟随器的特点,输入阻抗高,而输出阻抗低,这样我们就很好理解了,输入阻抗大的话将前级的信号损耗掉,这样输入单片机的电流不会太大,这样保证了输出连接的单片机器件的安全。 这样的连接方式其实是很常见的,用在前级和后级之间进行隔离,隔离前后电路的干扰,保证后级电路的稳定性。具体的话大家可以再深入了解一下。
5.轴流风机、水泵 这两个是用的同一个东西实现的所以我们这里放在一起讲。使用的是继电器模块来控制的。
那么我们说继电器是什么呢?简单说就是一个开关,只是说这个开关比较特别可以控制220V这种的电气,那么他是什么原理呢?(官网没有给原理图的PDF,给了Eagle的文件,这个文件是PCB的工程,来实现)这里我们不具体去分析原理图了,说明一下原理。
实质是为了实现小电流来实现控制大电流的一个开关。内部是有线圈的控制触点的,比如说当我们给高电平的时候线圈通电,然后线圈通过电流产生了磁力吸引触点,然后是的控制的开关打开。 当我们使用了一些电流比较大,或者电流不稳定的设备的时候,一定要注意供电的问题。特特别是控制电机这一类的东西,如果电流不是很大,倒是可以驱动,可以直接连接到Edison的Arduino扩展口上面,但是如果电流比较大或者是不稳定的电流外设一定要独立供电,否则很容易造成板子的损坏。 因为风机和水泵的电流都比较大,怕影响到Edison的工作,所以这我们通过连接继电器的方式使用外部电源来隔离两者,保证Edison的正常工作,连接线如下,一定要注意连线,继电器控制的是一路的通断,很多人接的时候搞不清楚。
好了到这里我们的所有的关于硬件的介绍就结束了,下一讲中我们说一下物联网程序的实现。
相关资料:
|