Suaig 发表于 2017-3-31 16:47:09

自动代码生成arduino全系列移植,Arduino联网就那么简单

本帖最后由 Suaig 于 2017-5-3 23:59 编辑

手把手把机智云移植到任意arduino uno R3/2560的步骤(不带LOG)
换句话说,你的手里闲置的Arduino uno R3能具备联网功能了。而且还能体验到Arduino代码自动生成工具和APP代码自动生成工具。 开发更简单啦。
不过需要你准备一块ESP8266(当然也能使其他WiFi模块:如汉枫LPB100 TICC3200等等)

硬件准备:1.烧写了最新机智云固件的WIFI模组2.Arduino uno R3/2560   连接准备:模组的串口连接UNO的串口0,模组的串口连接2560的串口3PS:使用新版自动代码生成。

1.登录机智云,创建数据点。

这里建立了一个布尔型的可写变量作为灯的开关,和一个数值型的电压测量作为举例。

2.利用机智云的自动代码生成,生成arduino uno R3

3.下载下来的目录结构如下: 我们把Gizwits下的所有文件拷贝到examples文件夹的simpleTry文件夹下,对,我们就是用这个简单历程进行修改。

4.打开simpleTry看到文件结构:
直接编译是会出错的。因为#include <Gizwits.h>。我们并没有安装库,而是直接在同一个文件夹下编译。这里我们把它改成#include “Gizwits.h”,这样就可以编译成功了。然后我们给他添加AIRLINK连网代码和最基本的RESET代码,其实是两个按键扫描。
这里一定要注释掉Serial.println因为uno R3只有一个串口。我们自动生成的代码已经默认使用了这个串口和WIFI模组通信,所以我们不能使用这个串口来作为任何调试信息的输出。电路图连接如下:
这里我电路图显示的ESP8266是一个完整最小系统,图中仅仅连接了通讯和工作所使用的TXD,RXD,VCC和GND,完整最小系统电路
Code://Configure networkif(digitalRead(7) == LOW) //Trigger Condition{    delay(10);    while(digitalRead(7) == LOW);    myGizwits.setBindMode(WIFI_AIRLINK_MODE);//0x01:Enter AP Mode;0x02:Enter Airlink Mode    //Serial.println("START_AIRLINK");}
if(digitalRead(8) == LOW) //Trigger Condition{    delay(10);    while(digitalRead(8) == LOW);    myGizwits.setBindMode(WIFI_RESET_MODE);//0x01:Enter AP Mode;0x02:Enter Airlink Mode   // Serial.println("START_RESET");}
里面用到一个关键函数myGizwits.setBindMode。这个函数是置WIFI模块工作模式的API函数说明:http://docs.gizwits.com/zh-cn/deviceDev/ArduinoUNO/sdk.html

好啦,目前我们写好了连接代码,接下来,我们要把arduino采集到的数据上传到机智云了!机智云提供了myGizwits.write函数,直接上报相应数据点到服务器。
上传示例代码如下: 这个代码是把A0采集到的电压值上传到服务器。肯定有人在想,我怎么知道这个类型怎么写呢,这个是在gizwits_product.h中的VALUE_TYPE_T定义的, 你要上报哪个数值,就写哪个数值。
然后我怎么接收服务器的数据呢, 这里添加你对开关按下和打开的处理逻辑。这里开关打开和关闭属于事件,事件的定义在gizwits_protocol.h中的这里你看到了这里有很多事件。
完整代码:
#include "Gizwits.h"
Gizwits myGizwits;
void setup() {// put your setup code here, to run once:
Serial.begin(9600);pinMode(7,INPUT_PULLUP);pinMode(8,INPUT_PULLUP);myGizwits.begin();}
void loop() {//Configure networkif(digitalRead(7) == LOW) //Trigger Condition{    delay(10);    while(digitalRead(7) == LOW);    myGizwits.setBindMode(WIFI_AIRLINK_MODE);//0x01:Enter AP Mode;0x02:Enter Airlink Mode   // Serial.println("START_AIRLINK");}
if(digitalRead(8) == LOW) //Trigger Condition{    delay(10);    while(digitalRead(8) == LOW);    myGizwits.setBindMode(WIFI_RESET_MODE);//0x01:Enter AP Mode;0x02:Enter Airlink Mode    //Serial.println("START_RESET");}
if(myGizwits.wifiHasBeenSet(WIFI_CON_ROUTER)){   digitalWrite(8,LOW);   //Serial.println("Success_con_Router");}else if(myGizwits.wifiHasBeenSet(WIFI_AIRLINK)){    digitalWrite(8,HIGH);   //Serial.println("IN_AIR_LINK");}float varW_Volt = 5 *((float)analogRead(A0)/1024);//Add Sensor Data CollectionmyGizwits.write(VALUE_VOLT, varW_Volt);
bool varR_led = 0;if(myGizwits.hasBeenSet(EVENT_LED)){    myGizwits.read(EVENT_LED,&varR_led);//Address for storing data    if(varR_led == 1)    {      //Serial.println("LED_ON");    }     else    {      //Serial.println("LED_OFF");    }}    /*float varW_Volt = 0;//Add Sensor Data CollectionmyGizwits.write(VALUE_VOLT, varW_Volt);

bool varR_led = 0;if(myGizwits.hasBeenSet(EVENT_LED)){    myGizwits.read(EVENT_LED,&varR_led);//Address for storing data }

//binary datapoint handle*/
myGizwits.process();}5.连接方式: 选对应的模组,我这里是乐鑫的,然后进入下一个界面。 这里不是按KEY2了。因为这是开发板上的,我们这里是数字管脚7连接的开关,连接成功后:
接下来我们讲讲ARDUINO 2560的移植,2560呢有多个串口,所以我们自然可以把串口0作为LOG日志的输出处理了。但是生成的代码默认是用Serial,怎么改?

1.打开Gizwits.cpp找到所有的Serial改成你所要的串口号,例如Serial3.这里我是用串口3.
这种每次改都很麻烦,我们使用一个宏定义。#define ESP8266WIFI Serial3 然后把所有的Serial改成 ESP8266WIFI 如图:
好嘞,那我们可以在前面加上日志调试输出了!
如图。。不多说,上代码,
回帖下载源码和完整版PDF教程!!**** Hidden Message *****

nan336523 发表于 2017-4-29 21:20:13

我使用的楼主的源程序为什么会提示VALUE_VOLT这个未**呢??

热爱生活 发表于 2017-4-12 21:08:07

Suaig 发表于 2017-4-11 15:49
邮箱



<P> /*****************************************</P>
<P>Name:    Gizwits + ArduinoUnoWiFi Library
Author:<A href="mailto:tli@gizwits.com">tli@gizwits.com</A> / <A href="mailto:bing@arduino.org.cn">bing@arduino.org.cn</A>
Version: V1.0
Init:    2016-12-23
Modify:   2016-12-23
*******************************************/</P>
<P>//只有一个buer开关数据点
#include "Gizwits.h"
#include <Wire.h></P>
<P>Gizwits myGizwits;</P>
<P>void setup() {
// put your setup code here, to run once:</P>
<P>Serial.begin(9600);
pinMode(7,INPUT_PULLUP);
pinMode(8,INPUT_PULLUP);
pinMode(9,INPUT_PULLUP);
   digitalWrite(9,HIGH);//9号数字接口连接led灯 测试是否接收到数据
         delay(500);
         digitalWrite(9,LOW);
         delay(500);
         digitalWrite(9,HIGH);
         delay(500);
         digitalWrite(9,LOW);
myGizwits.begin();
}</P>
<P>void loop() {

//Configure network
//if(XXX) //Trigger Condition
//myGizwits.setBindMode(0x02);//0x01:Enter AP Mode;0x02:Enter Airlink Mode
    /*
bool varR_buer = 0;
if(myGizwits.hasBeenSet(EVENT_BUER))
{
    myGizwits.read(EVENT_BUER,&varR_buer);//Address for storing data
}
//binary datapoint handle
*/
//Configure network
if(digitalRead(7) == LOW) //Trigger Condition
{
    delay(10);
    while(digitalRead(7) == LOW);
    myGizwits.setBindMode(WIFI_AIRLINK_MODE);//0x01:Enter AP Mode;0x02:Enter Airlink Mode
   // Serial.println("START_AIRLINK");
}</P>
<P>
if(digitalRead(8) == LOW) //Trigger Condition
{
    delay(10);
    while(digitalRead(8) == LOW);
    myGizwits.setBindMode(WIFI_RESET_MODE);//0x01:Enter AP Mode;0x02:Enter Airlink Mode
    //Serial.println("START_RESET");
}</P>
<P>
if(myGizwits.wifiHasBeenSet(WIFI_CON_ROUTER))
{
   digitalWrite(8,LOW);
   //Serial.println("Success_con_Router");
}
else if(myGizwits.wifiHasBeenSet(WIFI_AIRLINK))
{
    digitalWrite(8,HIGH);
   //Serial.println("IN_AIR_LINK");
}
   bool varR_buer = 0;
if(myGizwits.hasBeenSet(EVENT_BUER))
{
    myGizwits.read(EVENT_BUER,&varR_buer);//Address for storing data
    digitalWrite(9,HIGH);//9号数字接口连接led灯 测试是否接收到数据
    //测试发现 没有数据
   delay(500);
   digitalWrite(9,LOW);
   delay(500);
   if(varR_buer == 1)
    {
      // //测试发现 没有数据
         digitalWrite(9,HIGH);
         delay(100);
         digitalWrite(9,LOW);
         delay(100);
         digitalWrite(9,HIGH);
         delay(100);
         digitalWrite(9,LOW);
            digitalWrite(9,HIGH);
         delay(100);
         digitalWrite(9,LOW);
         delay(100);
         digitalWrite(9,HIGH);
         delay(100);
         digitalWrite(9,LOW);   digitalWrite(9,HIGH);
         delay(100);
         digitalWrite(9,LOW);
         delay(100);
         digitalWrite(9,HIGH);
         delay(100);
         digitalWrite(9,LOW);
         delay(100);
    }
    else
    {
      //Serial.println("LED_OFF");
      
    }
}
myGizwits.process();
}</P>

Suaig 发表于 2017-4-1 20:47:12

没人定,自顶

MCU记忆 发表于 2017-4-5 07:39:17

精品 一般人看不到

星星点灯 发表于 2017-4-5 14:32:07

为什么按你所说的连接后,刚开始可以用,但是过了两三分钟后,就用不了了,串口显示一连串的乱码

peter58 发表于 2017-4-5 20:41:54

来学习的,谢谢

淡淡淡的 发表于 2017-4-6 10:15:46

给对方各方广泛

bigfanofloT 发表于 2017-4-6 11:39:25

前来顶贴

Suaig 发表于 2017-4-6 22:38:08

星星点灯 发表于 2017-4-5 14:32
为什么按你所说的连接后,刚开始可以用,但是过了两三分钟后,就用不了了,串口显示一连串的乱码
...

刚开始可以?后来连不了?具体说明一下

clide2000 发表于 2017-4-7 08:14:05

这个必须要支持。收藏学习下uno+esp8266的工作方式

sl_Iot 发表于 2017-4-7 14:18:24

好东西,正需要

soso123 发表于 2017-4-7 16:15:13

教程很详细,多谢

梦飞闪灵 发表于 2017-4-8 10:06:42

可以移植到nano板子上吗?

wks 发表于 2017-4-8 19:43:42

好东西 收下了

追逐龙帝 发表于 2017-4-9 17:06:29

好帖,很难找到

断剑 发表于 2017-4-9 22:23:17

来学习的,谢谢

热爱生活 发表于 2017-4-10 19:46:49

谢谢您的分享 学习了!

热爱生活 发表于 2017-4-10 21:47:06

本帖最后由 热爱生活 于 2017-4-10 21:51 编辑

Suaig 发表于 2017-4-6 22:38
刚开始可以?后来连不了?具体说明一下

您好 感谢您提供的方法和步骤
根据您讲解 我将R3版与APP连接完成
但连接成功后 大约几分钟的样子 设备自动离线 就没有反应了
需要重新给板子上电才可以显示在线
另外 设备无法接受到手机发送的数据
请您再做一下 测试 让代码更加稳定实用 谢谢

本来就马上要放弃机智云了 看了这个帖子 想在试试。

Suaig 发表于 2017-4-11 15:48:14

梦飞闪灵 发表于 2017-4-8 10:06
可以移植到nano板子上吗?

NANO和Mini都可以,参考UNO就行

Suaig 发表于 2017-4-11 15:48:57

热爱生活 发表于 2017-4-10 21:47
您好 感谢您提供的方法和步骤
根据您讲解 我将R3版与APP连接完成
但连接成功后 大约几分钟的样子 设备自 ...

可以把代码发给我看看,我这边没问题啊。

Suaig 发表于 2017-4-11 15:49:38

热爱生活 发表于 2017-4-10 21:47
您好 感谢您提供的方法和步骤
根据您讲解 我将R3版与APP连接完成
但连接成功后 大约几分钟的样子 设备自 ...

邮箱312251702@qq.com
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 自动代码生成arduino全系列移植,Arduino联网就那么简单