自动代码生成arduino全系列移植
本帖最后由 机智小子 于 2017-4-14 12:33 编辑手把手把机智云移植到任意arduino uno R3/2560的步骤(不带LOG)
换句话说,你的手里闲置的Arduino uno R3能具备联网功能了。
不过需要你准备一块ESP8266(当然也能使其他WiFi模块:如汉枫LPB100 TICC3200等等)
硬件准备:1.烧写了最新机智云固件的WIFI模组2.Arduino uno R3/2560 连接准备:模组的串口连接UNO的串口0,模组的串口连接2560的串口3PS:使用新版自动代码生成。
1.登录机智云,创建数据点。
http://club.gizwits.com/data/attachment/forum/201703/31/164248dsz2m4jw4imclszr.pnghttp://club.gizwits.com/data/attachment/forum/201703/31/164249hjihqi0rgt0igzhd.png
这里建立了一个布尔型的可写变量作为灯的开关,和一个数值型的电压测量作为举例。
2.利用机智云的自动代码生成,生成arduino uno R3http://club.gizwits.com/data/attachment/forum/201703/31/164249zexqc5z5ollrh3rl.png
3.下载下来的目录结构如下:http://club.gizwits.com/data/attachment/forum/201703/31/164249krjcqkzqc5kd5hek.png我们把Gizwits下的所有文件拷贝到examples文件夹的simpleTry文件夹下,对,我们就是用这个简单历程进行修改。
4.打开simpleTry看到文件结构:http://club.gizwits.com/data/attachment/forum/201703/31/164249u66xdzl3dqzi6mvd.png
直接编译是会出错的。因为#include <Gizwits.h>。我们并没有安装库,而是直接在同一个文件夹下编译。这里我们把它改成#include “Gizwits.h”,这样就可以编译成功了。然后我们给他添加AIRLINK连网代码和最基本的RESET代码,其实是两个按键扫描。
http://club.gizwits.com/data/attachment/forum/201703/31/164249iptldlwlndmq892e.png这里一定要注释掉Serial.println因为uno R3只有一个串口。我们自动生成的代码已经默认使用了这个串口和WIFI模组通信,所以我们不能使用这个串口来作为任何调试信息的输出。电路图连接如下:
http://club.gizwits.com/data/attachment/forum/201703/31/164249qrwyrboiricojjjx.png
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
http://club.gizwits.com/data/attachment/forum/201703/31/164249ry3yg1rpt69hdc3i.png
好啦,目前我们写好了连接代码,接下来,我们要把arduino采集到的数据上传到机智云了!机智云提供了myGizwits.write函数,直接上报相应数据点到服务器。
上传示例代码如下:http://club.gizwits.com/data/attachment/forum/201703/31/164250m6ksmm2tk6zom2wy.png这个代码是把A0采集到的电压值上传到服务器。肯定有人在想,我怎么知道这个类型怎么写呢,这个是在gizwits_product.h中的VALUE_TYPE_T定义的,http://club.gizwits.com/data/attachment/forum/201703/31/164250y18v5ov8ny3mfe5w.png你要上报哪个数值,就写哪个数值。
然后我怎么接收服务器的数据呢,http://club.gizwits.com/data/attachment/forum/201703/31/164250c5cv5qd85gqhzkks.png这里添加你对开关按下和打开的处理逻辑。这里开关打开和关闭属于事件,事件的定义在gizwits_protocol.h中的 http://club.gizwits.com/data/attachment/forum/201703/31/164250g3mltkzl9koud2o5.png这里你看到了这里有很多事件。
完整代码:
#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.连接方式:http://club.gizwits.com/data/attachment/forum/201703/31/164250bs8t9866m88k231s.png选对应的模组,我这里是乐鑫的,然后进入下一个界面。http://club.gizwits.com/data/attachment/forum/201703/31/164251u2cayyyk422z20a2.png这里不是按KEY2了。因为这是开发板上的,我们这里是数字管脚7连接的开关,连接成功后:http://club.gizwits.com/data/attachment/forum/201703/31/164251joyn8ti1tddyllkw.png
接下来我们讲讲ARDUINO 2560的移植,2560呢有多个串口,所以我们自然可以把串口0作为LOG日志的输出处理了。但是生成的代码默认是用Serial,怎么改?
1.打开Gizwits.cpp找到所有的Serial改成你所要的串口号,例如Serial3.这里我是用串口3.
这种每次改都很麻烦,我们使用一个宏定义。#define esp8266WIFI Serial3http://club.gizwits.com/data/attachment/forum/201703/31/164315ullmkj1x1x6udvyb.png然后把所有的Serial改成 ESP8266WIFI如图: http://club.gizwits.com/data/attachment/forum/201703/31/164315rptvkxhxspxxjww0.png
好嘞,那我们可以在前面加上日志调试输出了!http://club.gizwits.com/data/attachment/forum/201703/31/164251vlynghh2imyoobnb.pnghttp://club.gizwits.com/data/attachment/forum/201703/31/164315czobooonufnouhen.png
如图。。不多说,上代码,
已经不需要这个了,直接在ESP8266里启用了HTTP服务。
实时显示各个IO的状态!
内网,外网,AP模式下都可以实时控制各个IO脚的高低电平和PWM输出.
页:
[1]