极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 16154|回复: 8

[Serial2Yeelink] Processing版,Windows和Ubuntu测试可用

[复制链接]
发表于 2012-9-20 18:02:37 | 显示全部楼层 |阅读模式



知道Yeelink很有一段时间,可是苦于自己没有网络模块,也没有机会去买,所以就是只有看看别人做的东西,了解一下。

为了能测试一下Yeelink的功能,就想用串口发送数据给电脑,然后通过电脑上传数据到Yeelink。在极客工坊找到了这样的帖子http://www.geek-workshop.com/forum.php?mod=viewthread&tid=1294,原来早有人写了一个通过串口发送到程序。下载下来测试了一下很好使,但是发现程序只有开始,没有结束,很悲剧。

家里的一本processing的书买回来很久了,一直没有看。于是就趁着这几天能够抽点时间,用Processing自己写了一个程序。基本上实现了功能,悲剧的是这个程序不光没有结束,连开始也没有。不过目前在Ubuntu和Windows xp上测试可用

程序的使用:

在程序所在文件夹中,需要一个配置文件,文件名为default.ini。

内容如下:


注意:每行键名的冒号后都有一空格,串口和波特率间有一空格。

测试的效果图:(线性有点不好,改了改,勉强可看。)



与官方网页上的图形比较:



发送成功界面:



发送失败界面:



发送失败会有一定的错误码返回,我自己测试了几个,并将错误说明如下:
返回码:200   发送成功
返回码:403   Apikey错误
返回码:406   服务器拒收,可能是发送间隔小于10秒,或者数据格式或数据长度或设备号或传感器号错误。
有时可能显示返回码为“hea”,这种情况是404错误,页面未找到,可能是传送的地址有误。这个一般是程序错误了。

(汗,返回码为“hea”这为一个bug,这些错误码都是自己在调试的时候根据服务器返回的信息了解的,不一定准确。Windows用户可以通过使用processing直接运行程序从控制台返回的结果来查看发送过程,Linux用户可以直接从shell运行程序,程序会直接返回相关信息。由于串口权限问题,Ubuntu下需要rootq权限才能打开串口,请使用sudo运行程序。)





由于没有条件,Mac上就没有测试了,有条件的童鞋,自己使用源码试试吧。Mac的串口应该为/dev/ttyUSB*吧。

下面附上程序。第一次使用processing,代码其乱无比,惨不忍睹。各位勉强看看吧。

[pre lang="Processing" line="1" file="a23"]
import processing.net.*;
import processing.serial.*;

PFont f;//////////////

Serial myPort;  // Create object from Serial class
Client c;

float [] dataGroup=new float[60];
String[] lines;


String data, temp, wendu, U_ApiKey, sensorID, deviceID, port, Rate;
int val, wdLength, i=1;  

long count=0;

void setup() {

  dataGroup[0]=20.00;
  size(300, 200);
  background(50);
  fill(200);

  f=createFont(" Arial ", 36, true);///////
  textFont(f, 12);
  textSize(16);

  text("Wait the data...", 10, 20);  
  println("Wait the data....");

  lines = loadStrings("default.ini");
  String[] pieces;

  //println(lines[0]);
  if (lines[0].equals("[yeelink]")) {

    pieces = split(lines[1], ' ');//获取串口
    //    println(pieces);
    if (pieces.length == 3) {
      println(pieces[0]);
      if (pieces[0].equals("Port:")) {
        port = pieces[1];
        Rate = pieces[2];
        text("Port:"+port, 195, 60);
        println("Port:"+port);
        text("Rate:"+Rate, 195, 80);
        println("Rate:"+Rate);
      }
    }

    pieces = split(lines[2], ' ');//获取ApiKey
    // println(pieces);
    if (pieces.length == 2) {
      if (pieces[0].equals("U-ApiKey:")) {
        U_ApiKey = pieces [1];
        println(U_ApiKey);
      }
    }

    pieces = split(lines[3], ' ');//获取deviceID
    //  println(pieces);
    if (pieces.length == 2) {
      if (pieces[0].equals("deviceID:"))
        deviceID = pieces[1];
      text("deviceID:"+deviceID, 195, 20);
      println("device:ID"+deviceID);
    }

    pieces = split(lines[4], ' ');//获取sensorID
    // println(pieces);
    if (pieces.length == 2) {
      if (pieces[0].equals("sensorID:")) {
        sensorID = pieces[1];
        text("sensorID:"+sensorID, 195, 40);
        println("sensorID:"+sensorID);
      }
    }
  }

  myPort = new Serial(this, port, int(Rate));///设置串口
  myPort.buffer(15);

  for (int i=1;i<=59;i++)
  {
    dataGroup=300;////////显示数组赋初值
  }
}
////////////////////////线性移动转换/////////////////////////////////
void proce()
{
  for (int i=0;i<59;i++) {
    dataGroup =dataGroup [i+1];//为数据显示
  }
}

void draw() {
  background(50);
fill(200);
  text("Wait the date...", 10, 20);  
  println("Wait the date....");

  text("deviceID:"+deviceID, 195, 20);
  println("deviceID:"+deviceID);

  text("sensorID:"+sensorID, 195, 40);
  println("sensorID:"+sensorID);

  text("Potr:"+port, 195, 60);
  println("Port:"+port);

  text("Rate:"+Rate, 195, 80);
  println("Rate:"+Rate);

  while ( myPort.available () <= 0) {  
    delay(500);///等待串口数据
  }
  temp = myPort.readString();         
  delay(500);
  println(temp);

  if (temp.length()>=14) {
    ///串口就收不稳定,个人觉得这样写好很多
    text("Receive value: "+temp.substring(8, 13), 10, 40);
    print("\r\n");
    wendu=temp.substring(8, 13);
    println("wendu: "+wendu);
    wdLength=wendu.length()+10;//获取发送数据长度

    c = new Client(this, "api.yeelink.net", 80);//建立连接

    c.write("POST /v1.0/device/"+deviceID+"/sensor/"+sensorID+"/datapoints");
    print("POST /v1.0/device/"+deviceID+"/sensor/"+sensorID+"/datapoints");

    c.write(" HTTP/1.1\r\n");//采用1.1长时连接
    print(" HTTP/1.1\r\n");

    c.write("U-ApiKey: "+U_ApiKey+"\r\n");
    print("U-ApiKey: "+U_ApiKey+"\r\n");

    c.write("Content-Type: application/x-www-form-urlencoded\r\n");
    print("Content-Type: application/x-www-form-urlencoded\r\n");

    c.write("Host: api.yeelink.net\r\n");
    print("Host: api.yeelink.net\r\n");

    c.write("Content-Length: " + wdLength + "\r\n");
    print("Content-Length: " + wdLength + "\r\n");

    c.write("\r\n");
    print("\r\n");

    c.write("{\"value\":" + wendu + "}\r\n");
    print("{\"value\":" + wendu + "}\r\n");

    println("\r\nPost done.");
    text("Post done.", 10, 60);

    delay(500);//等待服务器响应时间,没有测试大概选择的时间

    if (c.available() > 0) {
      data = c.readString();
      println(data);////显示服务器返回数据


      String ack=data.substring(9, 12);//获取返回码

      if (ack.equals("200") == true) {

        print("Return code: " + ack + "\r\nPost success.\r\n");
        text("Return code: " + ack, 10, 80);
        
        fill( 0, 200, 0);
        text("Post success",10,100);
        dataGroup [i++]=float(wendu);//发送成功 记录发送数据

        if (i>=60) {
          proce();
          i=59;
        }
        fill(200);
        text((int)(++count), 250, 198);
        print("Count: " + count + "\r\n");
      }
      else {
        print("Return code: " + ack + "\r\nPost failed.");
        text("Return code: " + ack, 10, 80);
        fill(200, 0, 0);
        text("Post failed.", 10, 100);
      }
    }
    c.stop();//////断开连接
  }
  //////////////////////////////温度线绘制////////////////////////////
  stroke(200, 200, 0);
  strokeWeight(2);

  for (int acc=0;acc<59;acc++) {
    int x1=acc*5, x2=(acc+1)*5;

    float y1=190-dataGroup[acc]*2, y2=190-dataGroup[acc+1]*2;//放大数据曲线显示
    if (dataGroup[acc+1]!=300&& dataGroup[acc]!=300) {
      line(x1, y1, x2, y2);
    }
  }
}
[/code]


附上windows和Linux上的程序及源码。
(程序在写的开始就只是用了一个a23的名字做测试,后面一直修改,一直添加,到最后了,也难得改了,就叫他a23吧。)
(汗,linux的程序超大了,10M,我分成两个包了。解压后把文件改为.zip再解压就是了。不好意思了各位。嫌麻烦的就下windows的吧,里面也是有源码的。)




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

 楼主| 发表于 2012-9-20 18:03:33 | 显示全部楼层
本帖最后由 vp110 于 2012-9-28 21:30 编辑

忘了说明:
Arduino端的发送格式和 Serial2Yeelink 一样。
都是 yeelink:20.25 这样的格式。目前软件只设置了 取5个字符,也就这个样要不就是102.5这样。可以将第126行的
[pre lang="Processing" line="1"]wendu=temp.substring(8, 13);[/code]
修改为
[pre lang="Processing" line="1"]wendu=temp.substring(8);[/code]

然后就是数据上传的间隔需大于十秒,不然服务器不接收。




------------------------------------------------------------------------------------------------------
悲剧  port写成potr了,源程序已改过
回复 支持 反对

使用道具 举报

发表于 2012-9-20 22:05:58 | 显示全部楼层
不买5100的模块的话其实很便宜啊,我的模块才35块钱,测试过做WEBSERVER 和访问网站都没问题,函数完全兼容 接线灵活。 enc28j60 很好很强大
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-9-21 13:11:44 | 显示全部楼层
darkorigin 发表于 2012-9-20 22:05
不买5100的模块的话其实很便宜啊,我的模块才35块钱,测试过做WEBSERVER 和访问网站都没问题,函数完全兼容 ...

enc28j60知道便宜好使,可洒家这是在偏远的农村,买个东西不容易。单买一个很不划算。。。最近也没有机会去买。。。就测试测试。。
回复 支持 反对

使用道具 举报

发表于 2012-9-22 18:32:19 | 显示全部楼层
貌似很酷的样子
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-9-22 22:29:10 | 显示全部楼层
迷你强 发表于 2012-9-22 18:32
貌似很酷的样子

强子哥有吗?你一说我才发现 data 写成了 date 了

悲剧。。。。

页面所贴代码以改过。。。。

回复 支持 反对

使用道具 举报

发表于 2012-9-23 08:21:35 | 显示全部楼层
vp110 发表于 2012-9-22 22:29
强子哥有吗?你一说我才发现 data 写成了 date 了

悲剧。。。。

还在画图。。。。。。。W5100还有几天就能上架了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-9-23 21:48:14 | 显示全部楼层
迷你强 发表于 2012-9-23 08:21
还在画图。。。。。。。W5100还有几天就能上架了

额。。是吗?透露下价格吧?
回复 支持 反对

使用道具 举报

发表于 2012-9-24 09:57:53 | 显示全部楼层
很不错的,顶一个!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-5-6 06:06 , Processed in 0.045670 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表