本次程序当中使用到了一个定时器的类SimpleTimer,但是在Edison的编译当中出现问题了,在这里分享一下如何解决这个问题。
这个库默认是没有的,需要我们自己安装,下载的地址如下:
https://github.com/schinken/SimpleTimer
我们将其下载下来,之后我们将其放到我们的工程文件当中,比如下面的方式:
之后我们就可以进行使用了。
这里遇到一个问题,不知道为什么,就是使用这两个文件,编译会出错,真的很奇怪,最后没办法,使用了另外一个方式。
网址:http://playground.arduino.cc/Code/SimpleTimer
网页往下拉,之后分别点击了c文件和h文件下面的Get Code,然后自己在工程目录下面创建了对应的SimpleTimer.c和SimpleTimer.h两个文件,把代码复制进去编译就可以了。
上面的这种方式我们是将我们的代码放在了工程目录下,所以这里涉及到一个C语言的基础知识,在这里讲一下。
#include “SimpleTimer.h” (1)
#include <SimpleTimer.h> (2)
(1)式中的话代表的是在和我们工程同一个目录下面进行查找文件,而(2)式意思就是在我们的整个软件的库文件夹下面查找,有点类似于一种环境变量当中查找的意思。
使用(2)式的方式是比较好的,因为这样当我们创建一个工程的时候,我们不在再工程下面进行添加相应的源文件,直接include就可以了。要实现这样的方式,我们需要在Arduino的library下面进行添加库的内容。
默认路径的话是在这个地方,所以我们在这里创建一个文件夹,把我们的文件拷贝进去,这样我们以后可以直接在工程中使用(2)式。
这样子做完的话,需要重启一下Arduino IDE,而且这两种方式的话最好选择一种就好,当然推荐是第二种了,然后再次打开Arduino IDE编译一般就没有问题了。
(但是编译进去发现这个Timer是不能用的,气死人了)
研究了很久,最后修改了下源代码就可以使用了,具体的修改内容是将SimpleTimer的函数代码,放到setTimer的方法当中去就可以了。就是下图红色方框的内容。
附件当中给出了SimpleTimer的源码供大家下载,我在Blynk社区反馈了这个问题,在新版的程序当中已经解决了这个问题了。
关于这个库怎么安装我们简单说一下:
在Arduino IDE中打开我们的项目->加载库->管理库,然后搜索Blynk安装就可以了。
好了,下面我们分析一下本次项目中的代码内容:
#define BLYNK_PRINT Serial //开启串口调试
#include <WiFi.h> //关于Edison的WiFi的函数
#include <BlynkSimpleIntelEdisonWiFi.h> //Blynk的关于Edison的函数封装
#include <SimpleTimer.h> //Arduino的定时器库
#include <Wire.h> //顾名思义就相应线的接口,比如说SPI、I2C等等
#include <rgb_lcd.h> //套件中的LCD库
char auth[] = "d68f5d77328c4c5c9e896c019d37ac1c"; //Blynk的Token,用来验证项目身份的
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;
// 更新Blynk的APP上面的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
好了,关于程序的内容,我们就暂且谈到这里了。