这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 活动中心 » 板卡试用 » michaelllh的Intel Edision开发进程贴

共22条 1/3 1 2 3 跳转至

michaelllh的Intel Edision开发进程贴

助工
2016-07-20 08:55:02     打赏

      开始认真更新了哈!

先说一下项目内容哈:

近年来,以温室大棚的方式来种植蔬菜的情况越来越多,不仅在城市中,就是在相应的农业基地上,这种大棚的方式都已经被采取。那么,这种种植方式,对于蔬菜的最大好处是什么呢?它们有什么有利条件吗?

  据了解,蔬菜一般都是应季而产的,四季中,夏季的豆角,黄瓜,初秋的花生,入冬的白菜,这都是恒古不变的定律。而在温室大棚出现之后,自动调温以及人工护 养种植的方式,让我们一年四季都可以品尝到隔了蔬菜,当然,冬季里我们能够得到西红柿,韭菜,茄子等等各类夏季出产的蔬菜,无季节性出产,就是对蔬菜最大 的好处。

所以说,不是应季的蔬菜在这个季节看到了,并且品尝到了,它们便是由温室大棚为我们提供而来的蔬菜,这便是为我们的生活带来好滋味好享受的主要条件。

   如果温室大棚与物联网结合起来,一定会有很大的需求,不仅节约了人力成本,也提高了生产效率。

基础部分

   模拟信号输入,输入可接各种模拟量输出的传感器,土壤温湿度传感器、土壤酸碱度传感器等;输出可控制变频器对电机进行调速、控制比例阀对流量进行调节。

液晶显示屏,可以将各个系统参数清晰明了的显示出来。例如温度、湿度、二氧化碳浓度、光照强度。当不需要显示时,用户可以自行设置关闭。

   通过英特尔爱迪生来连接网络,连接到云端服务器,目前服务器这边我们没有自己,会运用第三方的云平台来进行开发,可通过电脑、手机或者平板电脑连接控制系统的wifi对控制系统进行无线实时监控。操作简单,方便快捷。

提高部分

   加入数据存储的功能,对一个季节的蔬菜或者水果的栽培数据进行统计分析,从而得到一个最大产值的环境参数估量。用户可以从后续的数据中来分析和查看整个大棚的管理情况。

  



助工
2016-07-20 08:56:56     打赏
2楼

Intel官网当中对Edison的介绍和入门指南写的非常的详细,具体的网址如下https://software.intel.com/zh-cn/iot/library/edison-getting-started。所以这里我们就不在描述改如何进行板子的第一次设置了。

Edison的开发方式有很多种,相信大家在官网上面也可以看到,首先我们知道Edison安装的是Linux,所以很多东西我们都可以基于Linux的思想来进行开发,简单来说就是可以把它当成我们普通的Linux板子,Linux能干嘛,基本它就也就能干嘛。后面我们会详细讨论这个问题的。

本次的探讨内容我们将基于我们的Arduino进行开发,我们将通过Arduino的官方IDE进行开发Edison的相关内容,同样呢,这部分内容在我们的intel官网也有了很详细的说明,包括这里我们说的安装以及一个点灯程序的介绍,具体的网址如下:

https://software.intel.com/zh-cn/get-started-arduino-install

完成相应的环境安装以及相应的配置之后我们就可以来进行开发了。现在工具栏下面选择板子为Inte Edison,然后在文件选项卡中选择示例中binkly,编译上传,一般没有什么问题就可以看到板子上的LED开始闪烁了。

 

好了,这个是基础应用,接下来我们分别介绍一下我们手上的套件,Grove,这个条件本身是为伽利略的Gen 2设计的,但是同样适合于Edison的使用,接下来我们将依次介绍一下这些器件的使用方法。

目前我们基于的方法是以Arduino的方式呈现的,因为这个方式的开发是比较简单的,在我们现在所说的创客文化中,新奇的创意,快速的产品原型搭建,这个方式是再合适不过的。

关于这个套件,我们可以官网的这个链接中看到。

https://software.intel.com/en-us/iot/hardware/edison/dev-kit#

这里介绍了我们相应的一些设备的外围的传感器的介绍等等,包括使用方法等。

同时我们要了解一个东西,github,这个作为码农应该是非常熟悉的,在github上面intel也提供了这些传感器的相应库以及其他的一些拓展库以及应用,这个是我们需要去了解,并且能够去使用它的,这样可以帮助我们快速开发,具体的网址如下:

https://github.com/intel-iot-devkit

 

上面说的这个是由Intel官方提供的库内容,那么关于我们的开发套件中提供的一些传感设备是由我们的seeed公司制作的,同样我们可以在github上面找到相应的库文件内容:

这个是官方的wiki说明:

http://wiki.seeedstudio.com/wiki/Grove_-_Starter_Kit_V2.0

 

下面这个是github的库文件:

https://github.com/Seeed-Studio/Sketchbook_Starter_Kit_V2.0

 

我们可以直接将其下载下来,或者用git clone命令也是可以的。我们得到下面的文档,每一个文件当中都有一个Arduino IDE的工程:

 

我们选一个来进行测试,其他的我们就不在进行演示了。我们这里选择Grove_RGB_Backlight_LCD当中的Hello World进行测试。

 

这里的工程有一个问题,就是库文件找不到,所以我们从另外一个文件当中把这个库文件拷贝过来,这个文件夹的具体路径和文件如下,拷贝我们的rgb_lcd.cpprgb_lcd.h这两个文件到我们的工程下面:

 

拷贝好之后工程目录如下:

 

打开工程编译就可以了:

 

注意这里是I2C总线,所以我们连接在相应的I2C总线上就可以,这里图中的红色并排的四个任意一个都可以。

 

编译好之后上传我们就可以得到结果了。效果如下:

(默认是红色的背景,但是拍照看不行,代码中我改成蓝色的了,很简单的修改方法,就是RGB的值,把B的值设置成255,其他为0就可以了。

 

其他模块的也是相应的使用方式,后面有用到我们在具体介绍。


助工
2016-07-20 08:59:52     打赏
3楼

前几天安装Edison的驱动真的被气死,官网下载的驱动,按照好了不能用,真的是一点都不靠谱,但是这也许是个例。哎。。在这里分享一下解决办法。

安装好了官网提供的驱动的出现的情况是这样的。

我们在电脑的设备管理器中看到该端口是一个com没错,但是有一个三角号,此时如果我们用串口调试工具去连接是肯定不行的。

 

我们打开这个设备的属性。提示说我们这个软件的数字签名没有做,看到这个心中真的是,说句不好听的,intel也太欠缺考虑了吧,连这个东西你都没做,你做的什么鬼驱动。

同时我们看到这个设备的制造商是FTDI

 

在FTDI官网中找到了相应的驱动。我们在这里更新我们的驱动程序。

 

 

然后我们不要选择自动更新我们选择计算机中寻找我们的驱动。

 

然后选择到对应驱动文件夹中,下一步之后就可以进行安装了。安装成功之后就没有了三角形的黄色错误提示了。

 

搞了这么久,终于成功登录了,眼泪流下来。 


CDM v2.12.18 WHQL Certified(爱迪生驱动).zip


助工
2016-07-20 09:11:21     打赏
4楼

首先我们看下项目中需要用到的内容有几个:

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来讲一下这温度传感器的代码实现。

首先是要定义一个模拟的引脚,这个是一个模拟量的传感器。(这里定义的是一个常量,和普通变量的区别就是说定义了之后就不能再修改了,之后再次进行修改就会报错)

const int pinTemp = A0;

第二个我们需要定义一个关于我们温度计算的一个常量,这里我们需要详细说明一下它是干嘛的,这是一个温敏电阻的值,板子上面有一个电阻,就是板子上面注释为NTC的一个贴片器件,温敏电阻故名思议,就是当温度发生改变的时候电阻值就会发生改变,我们就是通过检测他的电阻值的变化来得到温度的。这个值是需要根据温敏电阻来确定的。那么热敏电阻有两类,这里用的NTC,他的特点是电阻值和温度大小成负指数关系,也就是说温度越大电阻值越小。

const int B = 3975;

这个值我们可以在我们的数据手册中查找到:(但是我没找到对应我们的程序中给定的3975,对应型号的那个电阻的B值和这个不一样,所以这里大家记住这个程序的流程,在自己实际使用的时候买的电阻对应型号然后找到这个B值就行,我估计这里是给错了这个值,所以最后得到的温度好像不是那么准确,但是我们这里需要知道的型号好像不对,并没有NCP18WF104F03RC这个型号,只有NCP18WF104F03RB的型号)

 

接下来我们就可以读取我们的模拟量。

int val = analogRead(pinTemp);

然后将这个模拟量转成当前的电阻值大小。我们在这里解释一下这个式子,因为使用温敏电阻的话我们想要得到温度,那么电阻值的大小是我们首先要得到的,然后通过温敏电阻和温度关系进而得到我们温度。

float resistance = (float)(1023-val)*10000/val;

我们看下基本的原理:这就是我们上面这个式子的来源,这里对应的VCC为什么是1023呢,是因为我们的ArduinoADC8位的,对输入的电压值进行划分成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.15R0的话就是我们的10K电阻。

 

 

 

到这里大家应该会清楚一点到底应该如何计算我们的温度了吧。

 

3.土壤湿度传感器

这里我们参考了DFrobot的土壤湿度传感器进行制作的,因为本次的套件当中没有湿度传感器。原理图如下,这里的三极管我们使用的是8050,基本普通的NPN管就可以的。然后读取模拟的数据,从发射极引到我们的模拟端口A0 ~ A5。这样就可以直接采集我们的湿度信息了,当我们的湿度较大的时候,数值也会比较大,我们这里就是利用水的导电性,也就是图中的Soil Resistance,如何湿度越大,说明水分越多,导电性自然越好,所以此时我们采集的电压值也就越大,从而得到相应的湿度信息。

 

4.光照传感器:

这里利用的是光敏电阻的特点,型号是GL5528,这里的测量原理和我们的温度传感器的测量原理是非常类似的,也是通过将我们的转换成我们的电压值进行测量,原理就是一个已知电阻大小的10K电阻和GND相连然后和我们的待测电阻串联,待测电阻另外一段连接到VCC,单片机的引脚连接到两个电阻的中间,通过测量两个电阻之间的电压,然后得到该支路的电流进而算出所求的电阻。

 

程序流程也比较简单,直接调用analogRead就可以直接得到我们的模拟电压值,这里就是等价于我们的光照强度值,这不过是我们人为认为的光照值,真正的光照值通过这样的测量还是不够的,需要和我们的温度传感器一样经过一系列的转换最终得到相应的亮度信息。但是这里我们不需要精确的得到亮度值,因为我们对亮度值本身是没有概念的,亮度单位是坎德拉/平方米(cd/m2,相信很多人都不知道,我也不知道,百度的。所以我们在这里只需要定性的知道这个值是明亮还是阴暗就可以了,但是如果从数据分析上来说当然需要得到精确的亮度值,这样数据分析才有意义,但是从功能实现上面莱索,我们这样的实现就已经可以了。但是我们上面的温度我们是感知的,所以需要得到一个最终的结果。如果亮度要得到一个准确的并且使用国际单位的亮度值还是使用数字式的亮度来实现这个会比较好。


我们上面漏说了一个内容,在这里补充一下,就是我们的温度测量模块和我们的亮度模块上面都有一个LM358,这个是一个运放芯片,那么在这里是起什么作用呢?

下面是我们的温度传感器的原理图,这里的运放在这里构成了一个电压跟随器,首先我们了解一下电压跟随器的特点,输入阻抗高,而输出阻抗低,这样我们就很好理解了,输入阻抗大的话将前级的信号损耗掉,这样输入单片机的电流不会太大,这样保证了输出连接的单片机器件的安全。

这样的连接方式其实是很常见的,用在前级和后级之间进行隔离,隔离前后电路的干扰,保证后级电路的稳定性。具体的话大家可以再深入了解一下。

5.轴流风机、水泵

这两个是用的同一个东西实现的所以我们这里放在一起讲。使用的是继电器模块来控制的。

 

那么我们说继电器是什么呢?简单说就是一个开关,只是说这个开关比较特别可以控制220V这种的电气,那么他是什么原理呢?(官网没有给原理图的PDF,给了Eagle的文件,这个文件是PCB的工程,来实现)这里我们不具体去分析原理图了,说明一下原理。

 

实质是为了实现小电流来实现控制大电流的一个开关。内部是有线圈的控制触点的,比如说当我们给高电平的时候线圈通电,然后线圈通过电流产生了磁力吸引触点,然后是的控制的开关打开。

当我们使用了一些电流比较大,或者电流不稳定的设备的时候,一定要注意供电的问题。特特别是控制电机这一类的东西,如果电流不是很大,倒是可以驱动,可以直接连接到EdisonArduino扩展口上面,但是如果电流比较大或者是不稳定的电流外设一定要独立供电,否则很容易造成板子的损坏。

因为风机和水泵的电流都比较大,怕影响到Edison的工作,所以这我们通过连接继电器的方式使用外部电源来隔离两者,保证Edison的正常工作,连接线如下,一定要注意连线,继电器控制的是一路的通断,很多人接的时候搞不清楚。

 

好了到这里我们的所有的关于硬件的介绍就结束了,下一讲中我们说一下物联网程序的实现。

 

 


助工
2016-07-20 09:14:47     打赏
5楼

本次程序当中使用到了一个定时器的类SimpleTimer,但是在Edison的编译当中出现问题了,在这里分享一下如何解决这个问题。

这个库默认是没有的,需要我们自己安装,下载的地址如下:

https://github.com/schinken/SimpleTimer

 

我们将其下载下来,之后我们将其放到我们的工程文件当中,比如下面的方式:

 

之后我们就可以进行使用了。

这里遇到一个问题,不知道为什么,就是使用这两个文件,编译会出错,真的很奇怪,最后没办法,使用了另外一个方式。

网址:http://playground.arduino.cc/Code/SimpleTimer

网页往下拉,之后分别点击了c文件和h文件下面的Get Code,然后自己在工程目录下面创建了对应的SimpleTimer.cSimpleTimer.h两个文件,把代码复制进去编译就可以了。

 

上面的这种方式我们是将我们的代码放在了工程目录下,所以这里涉及到一个C语言的基础知识,在这里讲一下。

#include “SimpleTimer.h”                                   (1)

#include <SimpleTimer.h>                                   (2)

(1)式中的话代表的是在和我们工程同一个目录下面进行查找文件,而(2)式意思就是在我们的整个软件的库文件夹下面查找,有点类似于一种环境变量当中查找的意思。

使用(2)式的方式是比较好的,因为这样当我们创建一个工程的时候,我们不在再工程下面进行添加相应的源文件,直接include就可以了。要实现这样的方式,我们需要在Arduinolibrary下面进行添加库的内容。

默认路径的话是在这个地方,所以我们在这里创建一个文件夹,把我们的文件拷贝进去,这样我们以后可以直接在工程中使用(2)式。

 

这样子做完的话,需要重启一下Arduino IDE,而且这两种方式的话最好选择一种就好,当然推荐是第二种了,然后再次打开Arduino IDE编译一般就没有问题了。

(但是编译进去发现这个Timer是不能用的,气死人了)

研究了很久,最后修改了下源代码就可以使用了,具体的修改内容是将SimpleTimer的函数代码,放到setTimer的方法当中去就可以了。就是下图红色方框的内容。

 

附件当中给出了SimpleTimer的源码供大家下载,我在Blynk社区反馈了这个问题,在新版的程序当中已经解决了这个问题了。

 

关于这个库怎么安装我们简单说一下:

在Arduino IDE中打开我们的项目->加载库->管理库,然后搜索Blynk安装就可以了。

 

 

好了,下面我们分析一下本次项目中的代码内容:

#define BLYNK_PRINT Serial              //开启串口调试

#include <WiFi.h>                      //关于EdisonWiFi的函数

#include <BlynkSimpleIntelEdisonWiFi.h>   //Blynk的关于Edison的函数封装

#include <SimpleTimer.h>                //Arduino的定时器库

#include <Wire.h>                      //顾名思义就相应线的接口,比如说SPII2C等等

#include <rgb_lcd.h>                        //套件中的LCD

 

char auth[] = "d68f5d77328c4c5c9e896c019d37ac1c";  //BlynkToken,用来验证项目身份的

 

char ssid[] = "TP-LINK_C73EAC";                    //路由器名字

char pass[] = "wahahaha";                          //路由WiFi密码

char server_ip[] = "115.159.77.134";               //Blynk服务器地址

int port = 8442;                                   //Blynk服务器端口,默认的端口是8442

 

SimpleTimer timer;                                //定义一个定时器

rgb_lcd lcd;                                    //定义一个LCD对象

 

const int B = 3975;                      //用来计算我们的温度值

const int fanPin =  8;                   //定义一个继电器的引脚,控制轴流风机           

const int waterbumpPin = 4;              //这个是定义继电器控制水泵引脚

const int pinTemp = A0;                  //温度的模拟输入引脚

const int pinLight = A1;                 //光照强度的模拟输入引脚

const int pinEarth = A2;                 //土壤湿度的模拟输入引脚

 

WidgetLCD App_lcd(V3);                   //这个定义的是远程APP上的LCD,区别于本地的LCD

 

void setup()

{  

Serial.begin(9600);   //开启串口调试

 

lcd.begin(16, 2);     //初始化LCD

lcd.print("Connect server...");  //LCD输出连接服务器信息

   

Blynk.begin(auth, ssid, pass, server_ip, port); //连接我们的Blynk服务器


while (Blynk.connect() == false) {

    // Wait until connected,等待连接成功

}

    // 更新显示,表明系统已经连接到服务器

    lcd.clear();

    lcd.print("System Online!");

    

//初始化轴流风机控制引脚,默认为低电平

    pinMode(fanPin, OUTPUT);                

    digitalWrite(fanPin, LOW);

 

//初始化水泵控制引脚,默认为低电平

    pinMode(waterbumpPin, OUTPUT);

    digitalWrite(waterbumpPin, LOW);

    

//更新APP上面的显示,表明系统已经在线

App_lcd.clear();

App_lcd.print(0, 0, "System Online!"); // use: (position X: 0-15, position Y: 0-1, "Message you want to print")


//定时器函数,定时1s钟执行一次time_event函数

timer.setInterval(1000L, timer_event);

}

 

//定时器函数

void timer_event()

{

    // 得到温度信息的初始模拟值

    int val = analogRead(pinTemp);

 

    // 算出此时的温敏电阻的阻值

    float resistance = (float)(1023-val)*10000/val;

 

    // 通过温敏电阻的阻值算出实际的温度值

    float temperature = 1/(log(resistance/10000)/B+1/298.15)-273.15;

 

// 更新BlynkAPP上面的V0引脚的值

    Blynk.virtualWrite(V0, temperature);


// 获取光照强度的模拟值

int sensorValue = analogRead(pinLight);


// 更新我们的APP上面的V1的数据

    Blynk.virtualWrite(V1, sensorValue);

 

// 得到我们的土壤湿度数据

    int earthValue = analogRead(pinEarth);

 

// 更新我们的APP上面的V2的数据

    Blynk.virtualWrite(V2, earthValue);

 

}

 

void loop()

{

Blynk.run();    //运行Blynk和服务器连接

timer.run();    //定时器函数开始运行

}

 

我们这里解释一下上面的模拟引脚,是这样的,我们对应的实际硬件当中是有真实存在的引脚,但是Blynk当中也有这样的virtual的引脚存在,是为了实现APP和硬件相互通信的一种功能,比如我们上面用到的向我们的模拟引脚写入数据,那么我们在APP的控件当中选择模拟的引脚,那么这个控件的数据就会跟着我们写入的数据发生变化,那么反过来,如果APP想给我们的硬件发送相应的数据也是如此,在APP当中对模拟的引脚写入数据,我们在代码端获取这个模拟引脚的值最终就可以完成双方的通信。这个也是我们在物联网当中应该学习的一种思想。

最终的APP界面如下:

 

这里说明一下,控件的用法就是从单击我们的项目然后从右边的控件下拉栏选择相应的空间就可以,这里我们要说说一下我们的LCD空间要选择为Advanced模式,当中选择我们的V3引脚。

 

其他的控件使用也比较容易,大家可以参考这个文档。

http://docs.blynk.cc/#intro

好了,关于程序的内容,我们就暂且谈到这里了。

 

 

 

 

 

 

 

 

 

 

           


助工
2016-07-20 09:21:50     打赏
6楼
占楼!更新

专家
2016-07-20 09:34:29     打赏
7楼
智能农业~!

高工
2016-07-20 10:47:15     打赏
8楼
支持支持~持续关注中~

院士
2016-07-20 13:43:16     打赏
9楼
物联网大棚~~

专家
2016-07-20 17:31:22     打赏
10楼
占楼,加油

共22条 1/3 1 2 3 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]