俯首观天 发表于 2013-7-28 09:08:21

菜鸟关于LEWEI50 E-KIT的一点拓展

本帖最后由 俯首观天 于 2013-7-28 09:14 编辑

    在翘首以盼中,在徘徊独步间,我终于收到了LEWEI50 E-KIT套件,又在翘首以盼中,在徘徊独步间,我终于熬到了放假回家捣鼓一番,呵呵。先附上几张开箱图片:












    大家可以看出,外包装很有专业风格。里面细心铺垫了多层泡沫,而且线材和各种模块都是上乘的品质。而uno和w5100的组合设计,不仅减小了套件的体积,也增加了系统硬件的稳定性,总之,我比较喜欢这种风格。当然了,我写的这个不是一篇软文,入门教程我推荐大家看以下几个朋友的文章:交警gg玩arduino--路面温控系统草创篇(LEWEI50 E-KIT平台支持)基于乐联网的温湿度(DHT11)监控应用-LEWEI50 E-KIT试用LEWEI50 E-KIT从0开始一步一步使用过程    同时附上LEWEI50E-KIT的使用说明书,里面详细讲述了从上传数据到反向控制红外设备的全过程,如果你感兴趣的话,它将是你很好的教材。下面我只是谈谈我作为一个菜鸟的小小心得,高手略过。。。    按照说明书的叙述,里面提供了用一个命令控制led开关的方法,瘦网虫大侠的思路是服务器端增加一个设备,设备的上传数值作为led开关变量的储存地。然后本地读取变量后按条件执行。例如1为开灯,0为关灯,触发命令1后,灯打开,同时上传0作为参数,供下次再触发的时候关灯使用,反之亦然。大侠这么做思路巧妙,但是服务器由于技术策略的原因,限制了数据上传最小间隔10s,这就会造成led反控的响应能力降低,在快速开关led的时候,会出现频繁失效的情况。所以我改变了这种方式,将led状态的判断放在本地来做,这就绕过了服务器的限制,提高了响应能力。代码如下:#include <SPI.h>
#include <Ethernet.h>
#include <LeweiTcpClient.h>
#include <EEPROM.h>
#include <dht11.h>
#define LW_USERKEY "you key"
#define LW_GATEWAY "01"
dht11 DHT11;
//DHT11 vcc pin->+5v
//DHT11 data pin->d3
//DHT11 gnd pin->gnd
#define DHT11PIN 3 //dht11数据脚
LeweiTcpClient *client;
long starttime;
int postInterval = 5000;
int w=1;//状态参数
void setup()
{
Serial.begin(9600);
client = new LeweiTcpClient(LW_USERKEY, LW_GATEWAY);
UserFunction uf2 (changeLedState,"changeLed");
client->addUserFunction(uf2);
starttime = millis();
pinMode(4, OUTPUT);
client->easySetupMode(true);
}

void loop()
{
client->keepOnline();
    if ((millis()-starttime) > postInterval)
    {
      sendDht11Value();
      starttime = millis();
    }
}

void changeLedState()
{
switch (w)
{
    //开灯并改变参数
    case 1:
      digitalWrite(4,HIGH);
      client->setRevCtrlMsg("true","On");
      w=2;
      break;
//关灯并改变参数
    case 2:
      digitalWrite(4,LOW);
      client->setRevCtrlMsg("true","Off");
      w=1;
      break;
}
}
void sendDht11Value()
{
      int chk = DHT11.read(DHT11PIN);
      switch (chk)
      {
      case DHTLIB_OK:
                  client->sendSensorValue("你的温度标识",(String)DHT11.temperature);
                  client->sendSensorValue("你的湿度标识",(String)DHT11.humidity);
                  break;
      }
}
把代码刷入LEWEI50 E-KIT后,我们只要在web中新增如下地方即可:

插入后应该如下:
之后重启一下你的LEWEI50 E-KIT,试试自定义命令,是不是快多了呢?
    这算是一点小小的心得吧,玩了一会儿后,我觉得LEWEI50 E-KIT这样默默的上传,我们要查看数据都要上网才能实现,不是很方便,恰好手头有一块1602,那就来加个LEWEI50 E-KIT的小屏幕吧。代码如下:#include <SPI.h>
#include <Ethernet.h>
#include <LeweiTcpClient.h>
#include <EEPROM.h>
#include <dht11.h>
#include <LiquidCrystal.h>//1602库文件
#define LW_USERKEY "your key"
#define LW_GATEWAY "01"
dht11 DHT11;
//DHT11 vcc pin->+5v
//DHT11 data pin->d2
//DHT11 gnd pin->gnd
#define DHT11PIN 3
LiquidCrystal lcd(10, 9, 8, 7, 6, 5);
/*
The circuit:
* LCD RS pin to digital pin 10
* LCD Enable pin to digital pin 9
* LCD D4 pin to digital pin 8
* LCD D5 pin to digital pin 7
* LCD D6 pin to digital pin 6
* LCD D7 pin to digital pin 5
* LCD R/W pin to ground
* 10K resistor:
* ends to +5V and ground
* wiper to LCD VO pin (pin 3)
*/
LeweiTcpClient *client;
long starttime;
int postInterval = 5000;
int w=1;
void setup()
{
   lcd.begin(16, 2);
Serial.begin(9600);
client = new LeweiTcpClient(LW_USERKEY, LW_GATEWAY);
   UserFunction uf2 (changeLedState,"changeLed");
client->addUserFunction(uf2);
client->easySetupMode(true);
starttime = millis();
pinMode(4, OUTPUT);
lcd.clear(); //清屏

}

void loop()
{
       lcd.clear(); //清屏
       client->keepOnline();
    if ((millis()-starttime) > postInterval)
    {
      sendDht11Value();
      starttime = millis();
    }
}

void changeLedState()
{
lcd.setCursor(0, 1) ;
switch (w)
{
    case 1:
      digitalWrite(4,HIGH);
      client->setRevCtrlMsg("true","On");
      w=2;
      lcd.print("Led ON");
      break;
    case 2:
      digitalWrite(4,LOW);
      client->setRevCtrlMsg("true","Off");
      w=1;
      lcd.print("Led OFF");
      break;
}

}
void sendDht11Value()
{
      int chk = DHT11.read(DHT11PIN);
      switch (chk)
      {
      case DHTLIB_OK:
                  client->sendSensorValue("wd",(String)DHT11.temperature);
                  lcd.setCursor(0, 0) ;
                  lcd.print("t=");
                  lcd.print((int)DHT11.temperature);
                  client->sendSensorValue("sd",(String)DHT11.humidity);
                  lcd.setCursor(7, 0) ;
                  lcd.print("h=");
                  lcd.print((int)DHT11.humidity);
                  break;
               
      }
}
运行结果如下:





之后有几点要说明一下:


1,,client->easySetupMode(true)这句话,是设置LEWEI50 E-KIT可以动态修改userkey和网关号,这大大方便了我们程序的修改。只需要找到LEWEI50 E-KIT的IP,把它输入浏览器就可以进行修改,数据是放在EEPROM中的,断电也不怕。IP地址查找如图:


2,uno的内存比较小,但是官方以玩家的角度、从售价控制和功能定位出发选择了它。对于服务器提供的所有功能来说已经完全可以胜任。但是如果你想玩出新花样,请注意,代码和数据太多的话容易发生溢出,这时候就会有各种奇怪的问题出现。所以当你明明代码正确,却依然无法正确运行的时候,请考虑是不是发生了溢出。

3,从我的使用来看,arduino ide 1.0.3及以下版本对代码的支持不是很好,很容易出错,所以请一定使用arduinoide 1.0.5或者更高版本来编译。

4,我是一个小菜,有什么可以指教的,请一定一定站内短信我,我感激不尽,嘿嘿。。。

    最后,欢迎大家加入物联网的大家族来,物联网平台是一片新奇的天空,有好多好多玩法等着大家来探索。而作为国内两大翘楚之一的乐联,更是拥有“亲民”的形象。套用广告来说,乐联有你,更精彩。

瘦网虫 发表于 2013-7-29 09:39:59

乐联网有变量存在本地的解决方案,使用“控制设备”那个功能就可以实现。呵呵。:lol

俯首观天 发表于 2013-8-1 19:09:49

瘦网虫 发表于 2013-7-29 09:39 static/image/common/back.gif
乐联网有变量存在本地的解决方案,使用“控制设备”那个功能就可以实现。呵呵。

求指导                        

⒈2з木頭亽oο 发表于 2014-6-4 16:12:22

您好 按照您给的程序运行了 温湿度都能实现但是控制列表里怎么没办法实现开关切换啊?显示的是未在线
页: [1]
查看完整版本: 菜鸟关于LEWEI50 E-KIT的一点拓展