マイナス37度 发表于 2014-6-6 10:44:47

yeelink+wifi双开关控制

本帖最后由 マイナス37度 于 2014-6-6 20:15 编辑

求高手帮忙看看,自己是在看不出哪错了,想不出怎么改
源码地址http://www.geek-workshop.com/thread-4194-1-1.html,供大家参考
我的,已经改好了,有兴趣的可以参考
boolean ResponseBegin = false;
String returnValue = "";
unsigned long previousMillis = 0;      
unsigned long interval = 900;
char flag =0;//定义开关循环控制变量
String SENSORno[]={"11941","14701"}; // 把sensor ID 依次替在这里,程序定义为数组,几个开关就写几个
byte ledPin[]={12,13};   //定义输出的针脚
char c ;
void setup()
{
pinMode(12,OUTPUT);
pinMode(13,OUTPUT);
Serial.begin(115200);
}

void loop()
{
    if(Serial.available())
    c = Serial.read();
if(c == '{')
    ResponseBegin = true;
if(c == '}')
    ResponseBegin = false;
if (ResponseBegin)
    returnValue += c;

if (returnValue.length() !=0 && (ResponseBegin == false))
{
    if(returnValue.charAt(returnValue.length() - 1) == '1') //2hao
      {
      digitalWrite( ledPin, HIGH);
      Serial.println("ON");}
    if(returnValue.charAt(returnValue.length() - 1) == '0')
      {
      digitalWrite( ledPin, LOW);
    Serial.println("OFF");}      
    returnValue = "";
    flag ++;
    if(flag>=2) flag =0;
}

unsigned long currentMillis = millis();

if(currentMillis - previousMillis > interval)
{
    previousMillis = currentMillis;
    Serial.print("GET /v1.0/device/7577/sensor/");
    Serial.print(SENSORno);
    Serial.println("/datapoints HTTP/1.1");
    Serial.println("Host: api.yeelink.net");
    Serial.print("Accept: *");
    Serial.print("/");
    Serial.println("*");
    Serial.print("U-ApiKey: ");
    Serial.println("175063fac1143fd891b2e1eb66f90ce6");   // 此处用你的APIKEY替代
    Serial.println("Content-Length: 0");
    Serial.println("Connection: close");
    Serial.println();
    }
}

i7456 发表于 2014-6-6 10:47:15

从你的需求上看,flag的取值应该是0和1
但你的程序里,flag值跑飞了

http://www.arduino.cn/thread-5953-1-1.html

マイナス37度 发表于 2014-6-6 10:48:47

那该怎么改呢,求指点

i7456 发表于 2014-6-6 10:55:39

マイナス37度 发表于 2014-6-6 10:48 static/image/common/back.gif
那该怎么改呢,求指点

flag ++;
if(flag>=2) flag =0;

マイナス37度 发表于 2014-6-6 11:16:02

本帖最后由 マイナス37度 于 2014-6-6 11:18 编辑

代码已更新,还是不行{:soso_e101:}
有一点没想通为什么是》=不是《=

i7456 发表于 2014-6-6 14:05:05

マイナス37度 发表于 2014-6-6 11:16 static/image/common/back.gif
代码已更新,还是不行
有一点没想通为什么是》=不是《=

先说控制一个灯的,你成功了么?

マイナス37度 发表于 2014-6-6 15:41:29

本帖最后由 マイナス37度 于 2014-6-6 15:43 编辑

i7456 发表于 2014-6-6 14:05 static/image/common/back.gif
先说控制一个灯的,你成功了么?

恩,成功了
这是一个灯的代码
boolean ResponseBegin = false;
String returnValue = "";
unsigned long previousMillis = 0;      
unsigned long interval = 900;
char c ;
void setup()
{
Serial.begin(115200);
pinMode(13,OUTPUT);    //遥控pin13板载灯这一路

}

void loop()
{

if(Serial.available())
    c = Serial.read();
if(c == '{')
    ResponseBegin = true;
if(c == '}')
    ResponseBegin = false;
if (ResponseBegin)
    returnValue += c;

if (returnValue.length() !=0 && (ResponseBegin == false))
{
    if(returnValue.charAt(returnValue.length() - 1) == '1')
      {digitalWrite(13,HIGH);Serial.println("ON");}
    if(returnValue.charAt(returnValue.length() - 1) == '0')
      {digitalWrite(13,LOW);Serial.println("OFF");}      
    returnValue = "";
}

unsigned long currentMillis = millis();

if(currentMillis - previousMillis > interval)
{
    previousMillis = currentMillis;
    Serial.println("GET /v1.0/device/7794/sensor/12316/datapoints HTTP/1.1"); /“/device/4290/sensor/9970/”device,sensor 后面的数值用你自己的替代
    Serial.println("Host: api.yeelink.net");
    Serial.print("Accept: *");
    Serial.print("/");
    Serial.println("*");
    Serial.print("U-ApiKey: ");
    Serial.println("*************");   // 此处用你的APIKEY替代
    Serial.println("Content-Length: 0");
    Serial.println("Connection: close");
    Serial.println();
    }
}

マイナス37度 发表于 2014-6-6 15:45:07

本帖最后由 マイナス37度 于 2014-6-6 16:10 编辑

问题出在下面这,但是不会移植
char flag =0;??这句定义字符串类型?
还有下面这段
怎么把引脚和sensor联系起来的呢?想不通
if (flag<7)// 7改成开关数量

{

    //get data from server

    getData();   

}

else

{

    //put data to server

//   postData(readData());

    if(flag=7) {flag =0;}   // 7改成开关数量

}

i7456 发表于 2014-6-6 16:06:49

マイナス37度 发表于 2014-6-6 15:45 static/image/common/back.gif
问题出在下面这,但是不会移植
char flag =0;??这句没看懂
还有下面这段


楼主位的程序是哪里来的?
8楼的又是哪里来的?

楼主位的程序思路是没错的,可能是某些细节没处理好
比如有两个灯,flag应该只有0,1这两个值,但程序中flag++后值一直再增加。
按照我四楼的方法加上一句程序后,监视一下arduino发出的字符串和返回的字符串,才方便分析是哪里出了小问题

マイナス37度 发表于 2014-6-6 16:16:39

i7456 发表于 2014-6-6 16:06 static/image/common/back.gif
楼主位的程序是哪里来的?
8楼的又是哪里来的?



8楼的那段是从源程序剪的
要移植的源程序地址放到顶楼了
问题应该就出在这段程序上,就像你说的我程序flag飞了:L

i7456 发表于 2014-6-6 16:20:26

マイナス37度 发表于 2014-6-6 16:16 static/image/common/back.gif
8楼的那段是从源程序剪的
要移植的源程序地址放到顶楼了
问题应该就出在这段程序上,就像你说的我程序f ...

你说的源程序是什么?

我让你加的那句,目的是flag++后,如果flag的值大于等于2,就让flag等于0,这样flag的值就是0或者1两个状态。

最好等监视下arduino串口发出和收到的字符串,你贴出来看看。

マイナス37度 发表于 2014-6-6 16:27:57

i7456 发表于 2014-6-6 16:20 static/image/common/back.gif
你说的源程序是什么?

我让你加的那句,目的是flag++后,如果flag的值大于等于2,就让flag等于0,这样 ...

flag应该等于12,13,不是等于1和0
这是我要移植的程序/*

Yeelink sensor client power switch example

*/




#include <SPI.h>//调用通读接口库

#include <Ethernet.h>//调用网络模块库

#include <Wire.h>//调用I2C通讯库

#include <math.h>//调用函数库




byte buff;//定义缓冲区???不是很明白

float cm;    //浮点型变量???不是很明白

char flag =0;//定义开关循环控制变量

// for yeelink api

#define APIKEY         "xxxxxxxxxxxxxxxxxxxxxx" // 替换你的 API KEY
#define DEVICEID       136 // 替换你的device ID


String SENSORno[]={"3366","3367","3368","3369","3372","3373","3415"}; // 把sensor ID 依次替在这里,程序定义为数组,几个开关就写几个

//for led pin

byte ledPin[]={A0,A1,A2,A3,5,6,7};   //定义输出的针脚

// assign a MAC address for the ethernet controller.

byte mac[] = { 0x00, 0x1D, 0x72, 0x82, 0x35, 0x9D};

// initialize the library instance:

EthernetClient client;

char server[] = "api.yeelink.net";   // name address for yeelink API




unsigned long lastConnectionTime = 0;          // last time you connected to the server, in milliseconds

boolean lastConnected = false;               // state of the connection last time through the main loop

const unsigned long postingInterval = 3*1000; // delay between 2 datapoints, 30s

String returnValue = "";

boolean ResponseBegin = false;




void setup() {

for(int i=0;i<7;i++)       //I<7,几个开关,就把7改成几,其实就是循次数

{ pinMode(ledPin,OUTPUT);}


Wire.begin();

// start serial port:

Serial.begin(9600);

// start the Ethernet connection with DHCP:

if (Ethernet.begin(mac) == 0) {

    Serial.println("Failed to configure Ethernet using DHCP");

    for(;;)

      ;

}

else {

    Serial.println("Ethernet configuration OK");

}

}




void loop() {

// if there's incoming data from the net connection.

// send it out the serial port.This is for debugging

// purposes only:




if (client.available()) {

    char c = client.read();

   // Serial.print(c);

      if (c == '{')

      ResponseBegin = true;

      else if (c == '}')

      ResponseBegin = false;




      if (ResponseBegin)

      returnValue += c;   

}



   if (returnValue.length() !=0 && (ResponseBegin == false))

{

    Serial.println(returnValue);

   if (returnValue.charAt(returnValue.length() - 1) == '1') {

      

      Serial.println("turn on the LED");

    //digitalWrite( 7, HIGH);

      digitalWrite( ledPin, HIGH);

   

    }

      else if(returnValue.charAt(returnValue.length() - 1) == '0') {

      Serial.println("turn off the LED");

    //digitalWrite(7, LOW);

      digitalWrite( ledPin, LOW);

    }

   returnValue = "";

    flag ++;

}



// if there's no net connection, but there was one last time   

// through the loop, then stop the client:

if (!client.connected() && lastConnected) {

    Serial.println();

    Serial.println("disconnecting.");

    client.stop();

}





// if you're not connected, and ten seconds have passed since

// your last connection, then connect again and send data:

if(!client.connected() && (millis() - lastConnectionTime > postingInterval)) {

    // read sensor data, replace with your code

    //int sensorReading = readLightSensor();

    Serial.print("yeelink:");




    if (flag<7)// 7改成开关数量

{

    //get data from server

    getData();   

}

else

{

    //put data to server

//   postData(readData());

    if(flag=7) {flag =0;}   // 7改成开关数量

}




   // note the time that the connection was made or attempted:

    lastConnectionTime = millis();

}

// store the state of the connection for next time through

// the loop:

lastConnected = client.connected();



}







// this method makes a HTTP connection to the server and get data back

void getData(void) {

// if there's a successful connection:

if (client.connect(server, 80)) {

    Serial.println("connecting...");

    // send the HTTP GET request:

    client.print("GET /v1.0/device/");

    client.print(DEVICEID);

    client.print("/sensor/");

//   client.print(SENSORID);

    client.print(SENSORno);

    client.print("/datapoints");

    client.println(" HTTP/1.1");

    client.println("Host: api.yeelink.net");

    client.print("Accept: *");

    client.print("/");

    client.println("*");

    client.print("U-ApiKey: ");

    client.println(APIKEY);

    client.println("Content-Length: 0");

    client.println("Connection: close");

    client.println();

    Serial.println("print get done.");

   }

else

{

    // if you couldn't make a connection:

    Serial.println("connection failed");

    Serial.println();

    Serial.println("disconnecting.");

    client.stop();

    }

   // note the time that the connection was made or attempted:

   //lastConnectionTime = millis();
lastConnectionTime = millis();
}

マイナス37度 发表于 2014-6-6 16:34:30

串口发出的就是Serial括号里那些呗,至于收到的占时不知道怎么监控:L

i7456 发表于 2014-6-6 17:06:58

マイナス37度 发表于 2014-6-6 16:27 static/image/common/back.gif
flag应该等于12,13,不是等于1和0
这是我要移植的程序

对于楼主位的程序来说,flag的目的值指定两个数组的组元,因为只有两个组元,所以flag的值应该是0,1。

i7456 发表于 2014-6-6 17:10:09

マイナス37度 发表于 2014-6-6 16:34 static/image/common/back.gif
串口发出的就是Serial括号里那些呗,至于收到的占时不知道怎么监控

可以单独用一个USB转串口模块插在电脑上,只接这个模块上的GND和RX.
这样就可以单独监视arduino发出或者收到的字符串了。

“串口发出的就是Serial括号里那些呗”    这样想当然的想法,玩编程是不好的,要得的细心和准确的结果。
页: [1] 2
查看完整版本: yeelink+wifi双开关控制