11395浏览
查看: 11395|回复: 10

[入门] wido详细上手教程 (WiDo试用回馈帖)

[复制链接]
此贴来源于WiDo的试用计划,由“吹口琴的钢铁侠”所发,作者上学太忙,让楼主代为搬运。望各位客官笑纳,大家要记得来参加我们的试用活动哦!以下是正文:

首先必须要感谢DFRobot给我的试用机会!

在Wido之前我用过W5100的以太网模块,相比较而言,Wido就是相当便携,非常方便,而且对于Wifi信号的接受能力是比较强的。

拿到板子之后,断断续续玩了几次,中途上学过了两周,玩的差不多了,正好可以来写教程。

目前网上比较好的教程也就官方的WIKI,https://wiki.dfrobot.com.cn/index ... A%E6%90%9C%E7%B4%A2
参数什么的先不看了,首先作为一块wifi板子,当然要连上wifi,下载好库https://github.com/Lauren-ED209/Adafruit_CC3000_Library/archive/master.zip
先用官方的例程。

第一个是buildtest.ino,用来初步测试。
注意下载时要选择Leonardo板卡。

打开串口监视器就会这样的信息。
wido详细上手教程 (WiDo试用回馈帖)图1

Wido会在串口调试中打印出CC3000固件的版本,Wido模块的mac地址以及附近路由器的数量,SSID,信号强度以及加密类型。

比如我的就是版本1.28,MAC地址0x00 0x19 0x94 0x47 0xE3 0x7B,找到的两个wifi信号是

SSID Name    : Tenda_084FB8
RSSI         : 35
Security Mode: 2

SSID Name    : TP-LINK_33701E
RSSI         : 35
Security Mode: 3

加密模式中数字0到3分别表示 WLAN_SEC_UNSEC, WLAN_SEC_WEP, WLAN_SEC_WPA or WLAN_SEC_WPA2(这点可以在代码的注释中看到)

这个例程也可以用来查看四周的wifi信号。

看完有哪些信号,当然就要连上他们了,在代码中找到这两句
[mw_shl_code=applescript,true]#define WLAN_SSID       "myNetwork"        // cannot be longer than 32 characters!
#define WLAN_PASS       "myPassword"       //

[/mw_shl_code]

就把引号的里面内容改成自己的Wifi内容,比如
[mw_shl_code=applescript,true]#define WLAN_SSID       "TP-LINK_33701E"        // cannot be longer than 32 characters!
#define WLAN_PASS       "19890226"     //

[/mw_shl_code]


再次下载到板子里去,打开串口监视器,就会这样类似的信息。连上了路由器,而且还ping了别的网站。
wido详细上手教程 (WiDo试用回馈帖)图2

我又主动Ping了一下WIDO,出现这个样子,我也不清楚= =
wido详细上手教程 (WiDo试用回馈帖)图3

这个实例代码有点烦,而且现在对我没什么用,那就下次再看吧= =

官方WIKI中的实例二有点好玩,但不怎么有用,下次有空了再说= =

wiki中的案例三,就是一个比较有用的应用了,可以让wido连上外网的一台服务器,并发送数据,照着原文的方法,很容易就可以实现相似的结果。
为了折腾,当然要连上自己的服务器,既然要连主机,你就先连一下同一个局域网的笔电。

那么首先你要连接的电脑要有服务器软件,我用了Apache加PHP(直接装AppServ),最简单的当然是在主机上建一个文本,让wido去访问。

比如我在D:\AppServ\www\twdio中建了一个hi.txt的文件,内容是


syntaxhighlighter_copycode
[mw_shl_code=applescript,true]Hi,Wido!
Im PC,nice to meet you!

[/mw_shl_code]
创建完成后可以用别的PC或手机试试

这时候再来分析实例三的代码(比刚才的那段短多了= =),整个代码的逻辑比较明显。
首先设定参数来初始化wido,然后连上路由器,接着再想办法连上目标服务器。

[mw_shl_code=applescript,true]#include <Adafruit_CC3000.h>
#include <ccspi.h>
#include <SPI.h>
#include <string.h>
#include "utility/debug.h"

#define WiDo_IRQ 7
#define WiDo_VBAT 5
#define WiDo_CS 10

Adafruit_CC3000 WiDo = Adafruit_CC3000(WiDo_CS, WiDo_IRQ, WiDo_VBAT,
SPI_CLOCK_DIVIDER);

#define WLAN_SSID "TP-LINK_33701E"
#define WLAN_PASS "19890226"
#define WLAN_SECURITY WLAN_SEC_WPA2

//以上都是设置参数初始化

#define TOKEN "7dafd269e271c9bcd0b69f61c3ff6af4" //这是用来连接DFRobot的服务器时的凭证,在其他项目中当然不需要,所以删掉

[/mw_shl_code]

看setup
[C] syntaxhighlighter_viewsource syntaxhighlighter_copycode
  1. void setup(){
  2.   Serial.begin(115200);//打开串口
  3.   Serial.println(F("Hello, Wido!\n")); //先来一句hello
  4.   Serial.println(F("\nInitialising the CC3000 ..."));
  5.   if (!WiDo.begin())//开始初始化,初始化失败的话,就输出下面一句话,并进入死循环
  6.   {
  7.     Serial.println(F("Unable to initialise the CC3000! Check your wiring?"));
  8.     while(1);
  9.   }
  10.   if (!WiDo.connectToAP(WLAN_SSID,WLAN_PASS,WLAN_SECURITY)) {//尝试连接路由器,如果失败,当然也输出一句话,进入死循环
  11.     Serial.println(F("Failed!"));
  12.     while(1);
  13.   }
  14.   Serial.println(F("Connected!"));//上面没有出错的话,就会出现这一句了,已经连上路由器了
  15.   Serial.println(F("Request DHCP"));//等待分配ip地址
  16.   while (!WiDo.checkDHCP())
  17.   {
  18.     delay(100); // ToDo: Insert a DHCP timeout!这好像是公司还没开发完= = ,那就先跳过
  19.   }  
  20. }
复制代码

然后就进入尝试连接服务器的阶段了
  1. void loop(){
  2.   static Adafruit_CC3000_Client IoTclient;//给他取个名字
  3.   if(IoTclient.connected()){    //如果连上服务器了
  4.      
  5.     int sensValue = analogRead(0) *0.0048828125 * 100;//收集传感器数值
  6. /*-------------------------------------------------------------------------------   
  7.     这一段试图和服务器进行一次HTTP连接,但这个连接不是一般性普通的HTTP连接
  8.     char clientString[50];
  9.     sprintf(clientString,"%s%s%s%d%s","GET /data?token=",TOKEN,"¶m=",sensValue," HTTP/1.1");
  10.     Serial.println(clientString);
  11.      
  12.     IoTclient.fastrprintln(clientString);
  13.      
  14.     IoTclient.fastrprint(F("\r\n"));
  15.     IoTclient.fastrprint(F("\r\n"));
  16.      
  17.     Serial.println();
  18. //-------------------------------------------------------------------------------*/
  19.     unsigned long lastRead = millis();//标记连上的时间
  20.     while (IoTclient.connected() && (millis() - lastRead < TIMEOUT_MS)) {//如果现在还连着,而且时间还没到,这里时间限制就是TIMEOUT_MS,如果设置太短会导致连接未完毕就断开,反之则会导致数据更新过慢
  21.       while (IoTclient.available()) {//正在连接中的话
  22.         char c = IoTclient.read();//读取服务器返回的HTTP信息,并通过串口打印出来
  23.         Serial.print(c);
  24.         lastRead = millis();//如果中途服务器端或中间的连接出现问题,就要靠这个时间点来计时了
  25.       }
  26.     }
  27.     IoTclient.close();//时间到了之后,就要自己关闭连接了
  28.   }
  29.   else{//如果还没连上,那就连吧
  30.     uint32_t ip = WiDo.IP2U32(182,254,130,180);//服务器的IP地址
  31.     IoTclient = WiDo.connectTCP(ip,8124);//通过8124端口连接,一般而言,大多数普通的HTTP连接都是80端口的
  32.     Serial.println("Connecting IoT Server...");//串口输出,表示正在努力连接
  33.   }  
  34.   delay(5000);
  35. }
复制代码

分析完了之后,发现一个难点,就是创建一个HTTP连接,一般的GET连接就行,半个月前绞尽脑汁= =,后来发现仔细去看HTTP协议和W5100的例程就可以知道怎么做了。

GET的格式应该是这样的
  1. client.fastrprintln("GET /index.html HTTP/1.1");
  2. client.fastrprintln("Host: example.net");
  3. client.fastrprintln("User-Agent: wido");
  4. client.fastrprintln("Connection: close");
  5. client.fastrprint(F("\r\n"));
  6. client.fastrprint(F("\r\n"));
复制代码
那么就有了一个测试例程。
  1. #include <Adafruit_CC3000.h>
  2. #include <ccspi.h>
  3. #include <SPI.h>
  4. #include <string.h>
  5. #include "utility/debug.h"
  6. #define WiDo_IRQ   7
  7. #define WiDo_VBAT  5
  8. #define WiDo_CS    10
  9. Adafruit_CC3000 WiDo = Adafruit_CC3000(WiDo_CS, WiDo_IRQ, WiDo_VBAT,
  10. SPI_CLOCK_DIVIDER);
  11. #define WLAN_SSID       "TP-LINK_33701E"  
  12. #define WLAN_PASS       "19890226"
  13. #define WLAN_SECURITY   WLAN_SEC_WPA2
  14. #define TIMEOUT_MS      2000
  15. void setup(){
  16.   Serial.begin(115200);
  17.   Serial.println(F("Hello, Wido!\n"));
  18.   Serial.println(F("\nInitialising the CC3000 ..."));
  19.   if (!WiDo.begin())
  20.   {
  21.     Serial.println(F("Unable to initialise the CC3000! Check your wiring?"));
  22.     while(1);
  23.   }
  24.   if (!WiDo.connectToAP(WLAN_SSID,WLAN_PASS,WLAN_SECURITY)) {
  25.     Serial.println(F("Failed!"));
  26.     while(1);
  27.   }
  28.   Serial.println(F("Connected!"));
  29.   Serial.println(F("Request DHCP"));
  30.   while (!WiDo.checkDHCP())
  31.   {
  32.     delay(100);
  33.   }  
  34. }
  35. void loop(){
  36.   static Adafruit_CC3000_Client client;
  37.   if(client.connected()){   
  38.     client.fastrprintln("GET /twido/hi.txt HTTP/1.1");
  39.     client.fastrprintln("Host: 192.168.1.102");
  40.     client.fastrprintln("User-Agent: Arduino-ethernet");
  41.     client.fastrprintln("Connection: close");
  42.     client.fastrprint(F("\r\n"));
  43.     client.fastrprint(F("\r\n"));
  44.      
  45.     Serial.println();
  46.     unsigned long lastRead = millis();
  47.     while (client.connected() && (millis() - lastRead < TIMEOUT_MS)) {
  48.       while (client.available()) {
  49.         char c = client.read();
  50.         Serial.print(c);
  51.         lastRead = millis();
  52.       }
  53.     }
  54.     client.close();
  55.   }else{
  56.     uint32_t ip = WiDo.IP2U32(192,168,1,102);
  57.     client = WiDo.connectTCP(ip,80);
  58.     Serial.println("Connecting IoT Server...");
  59.   }  
  60.   delay(5000);
  61. }
复制代码
结果当然是可以的,
wido详细上手教程 (WiDo试用回馈帖)图4

用这种方法可以连接大多数服务器,当然也可以实现Ulink。
如果觉得还不错,那就赶快去搞一块Wido喽!


drink  中级技师

发表于 2014-12-5 19:23:29

技术贴啊,正好有用,收藏了。
回复

使用道具 举报

Eric  初级技神

发表于 2014-12-5 19:30:33

技术贴,强力支持啊~收藏先~最近也在玩wido,碰到了点小问题,还没解决呢。。。
回复

使用道具 举报

Youyou  初级技匠

发表于 2014-12-5 21:02:46

技术贴,强力收藏!看一遍,能少踩很多坑。
回复

使用道具 举报

Grey  中级技匠

发表于 2014-12-5 21:34:47

感谢分享,楼主辛苦了
回复

使用道具 举报

吹口琴的钢铁侠  初级技匠 来自手机

发表于 2014-12-6 09:14:01

麻烦楼主搬运了
回复

使用道具 举报

Rockets  NPC

发表于 2014-12-6 12:46:23

我来拉个广告
wido的购买链接
https://www.dfrobot.com.cn/goods-997.html
欢迎购买。
回复

使用道具 举报

Ricky  NPC

发表于 2014-12-6 22:03:24

回复

使用道具 举报

金戈大王  学徒

发表于 2014-12-12 20:52:10

楼主的程序不用写服务器端代码吗?
回复

使用道具 举报

金戈大王  学徒

发表于 2014-12-12 20:52:19

楼主的程序不用写服务器端代码吗?
回复

使用道具 举报

吹口琴的钢铁侠  初级技匠

发表于 2014-12-14 09:28:25

金戈大王 发表于 2014-12-12 20:52
楼主的程序不用写服务器端代码吗?

这个尝试中仅仅是请求了服务器端的一个TXT文件,获得文件的内容而已
回复

使用道具 举报

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

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail