2014-5-9 13:36:14 [显示全部楼层]
55504浏览
查看: 55504|回复: 58

[求助] 教你用WIFI shield 简单几步轻松搞定物联网

[复制链接]
本帖最后由 Grey 于 2014-5-19 11:02 编辑

首先感谢DFRobot提供了这么好的一块wifi拓展版,虽说在设置的时候闹了不少小情绪,比方说重启之后就不鸟你了,每次都要等啊,然后突然就连不上了等等各种小问题,当然在使用过程中,你就会发现,板子其实还是不错滴,价廉物美,功能强大,你值得拥有!在开头稍微吐槽一下这块板子艰辛的设置过程,当然也是楼主自己蛋疼,非要把每种设置都要尝试一遍。这里感谢一下wiki的作者youyou酱,让我少了很多自虐的过程。

STEP 1 准备工作:
Arduino UNO                      一块
DFRobot WIFI shield          一块
I/O 拓展版                           一块
SHT1x温湿度传感器            一个

STEP 2 设置wifi
1,给模块供电,然后用电脑去搜索wifi模块创建的网络,一个原名叫DFRobot wifi shield V3 重置芯片之后会变为名叫 HF-LPB的wifi网络。
教你用WIFI shield 简单几步轻松搞定物联网图1
当网络显示“有限制的访问网络”时,这其实是没连接上,要像右图一样,显示连接之后,才能访问模块的设置页面。 最好烧一个blink在arduino里面,然后不要插网线,就剩下WIFI。
楼主80%设置时间就是花在了这啊,特此提醒一下小伙伴。

2选择工作模式,推荐AP+STA双模式,其实这也是这款模块的一大亮点,同时支持两种模式。楼主以前玩过其他的wifi模块,不同时支持双模式,设置起来灰常麻烦。
教你用WIFI shield 简单几步轻松搞定物联网图2

3STA设置
教你用WIFI shield 简单几步轻松搞定物联网图3

点击搜索,选择相应的工作网络,并加入
教你用WIFI shield 简单几步轻松搞定物联网图4

点击确定,这时候会出来一个弹窗,需要你输入密码,这是你要加入网络的密码。别忘了保存,保存会让你重启,你可以等全部设置完再重启。但一定不能忘记保存。

4AP设置
教你用WIFI shield 简单几步轻松搞定物联网图5

ap模式就是你要设置模块的网络,这是给你用来设置参数,网络名字的地方。
5其他设置
教你用WIFI shield 简单几步轻松搞定物联网图11

这是重头戏,连接外网服务器,这边选了比较新的物联网网站machtalk作为平台。填好相应的端口号和远程服务器地址。ps:Yeelink的服务器地址是api.yeelink.net 端口号是80.想用yeelink的小伙伴可以自己设置。
点击保存之后,到基本信息会出现这样一个页面:
教你用WIFI shield 简单几步轻松搞定物联网图6

至此,模块的设置基本完成。
6machtalk
为什么选这个网站呢,因为它很新,非常新,异常的干净,非常适合做一些简单的数据上传服务。
在完成注册之后,你会得到一个API号。
添加设备号,在设备里面点击添加设备
教你用WIFI shield 简单几步轻松搞定物联网图7

填写相应参数
教你用WIFI shield 简单几步轻松搞定物联网图8
点击保存,ok大功告成,至此网站设置也已完成。
7程序;在提供的样例代码里面把自己的API号和设备号替换上去
教你用WIFI shield 简单几步轻松搞定物联网图9
因为你需要设置温湿度两个参数,所以需要改两次,还要注意设备ID。

OK~大功告成
查看结果吧
教你用WIFI shield 简单几步轻松搞定物联网图10
每次一温度变化都是楼主在哈气,原来湿度的变化率远胜于温度。
哈哈哈哈~
由于时间匆忙Yeelink 和乐联的教程稍后奉上,方法可参考Machtalk,就是把远程服务器地址和端口号改一下。
乐联需要使用他们自己的库,yeelink就更简单了。
有什么问题可以提,楼主不定时更新
2.JPG

WIFI machtalk.rar

1.18 KB, 下载次数: 8590

Grey  中级技匠
 楼主|

发表于 2014-6-24 18:56:10

本帖最后由 Grey 于 2015-1-14 10:40 编辑

谢谢22楼的提醒,下完程序不要忘了把开关拨到Arduino上
代码更新:http://machtalk.net:10010/showapi/arduinolibrary

回复

使用道具 举报

Grey  中级技匠
 楼主|

发表于 2015-8-19 10:13:15

update:2015/8/19
wifi shield V3的固件已更新,请先阅读产品维库,再继续操作,千万别用快速设置啊!!!上来就快速设置,会默认取消AP模式。那就只能通过IP地址访问了。
回复

使用道具 举报

lauren  高级技师

发表于 2014-6-24 19:35:32

吊吊吊,很好用的教程,配合上yeelink官方的一些配置信息很快的就能跑通。不过在通过手机配置路由器设置和外网ip设定,完成后,切断手机连接并且将V3扩展板上的开关切到Arduino一边,才能让系统正常工作。这个小细节需要注意一下。
回复

使用道具 举报

fantast_xu  见习技师

发表于 2014-7-14 12:02:35

好吧,我自己来回答我的问题。做之前把这个问题想的太复杂了,其实tcp协议就是tcp协议,哪个平台都一样

先放 Arduino的代码

  1. char tcpbuffer[1024];
  2. int bufferlen = 1024;
  3. void setup()
  4. {
  5.   
  6.   //wifi shield
  7.   Serial1.begin(115200);
  8.   Serial.begin(115200);
  9. }
  10. void loop()
  11. {
  12.   /** function code here */
  13.   
  14.   if(Serial1.available() > 0)
  15.   {
  16.     int reallen = Serial1.readBytes(tcpbuffer, 1024);
  17.     Serial.write(tcpbuffer,reallen);
  18.   }
  19.   
  20. }
复制代码


wifi sheild设定的是Tcp Server模式,ip地址 192.168.1.20,端口8899
因为我用的是Leonardo, 所以wifi 用的是Serail1,电脑用Serial,不冲突

客户端用c#代码如下
  1. using System;
  2. using System.Net;
  3. using System.Net.Sockets;
  4. using System.Collections.Generic;
  5. using System.Text;
  6. namespace WifiShieldTest
  7. {
  8.         class MainClass
  9.         {
  10.                 public static void Main (string[] args)
  11.                 {
  12.                         Console.WriteLine ("Hello World!");
  13.                         //定义发送数据缓存
  14.                         byte[] data = new byte[1024];
  15.                         //定义字符串,用于控制台输出或输入
  16.                         string input, stringData;
  17.                         //定义主机的IP及端口
  18.                         IPAddress ip = IPAddress.Parse("192.168.1.20");
  19.                         IPEndPoint ipEnd = new IPEndPoint(ip, 8899);
  20.                         //定义套接字类型
  21.                         Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  22.                         //尝试连接
  23.                         try
  24.                         {
  25.                                 socket.Connect(ipEnd);
  26.                         }
  27.                         //异常处理
  28.                         catch (SocketException e)
  29.                         {
  30.                                 Console.Write("Fail to connect server");
  31.                                 Console.Write(e.ToString());
  32.                                 return;
  33.                         }
  34.                         //定义接收数据的长度
  35.                         int recv = 0;
  36.                         //将接收的数据转换成字符串
  37.                         //stringData = Encoding.ASCII.GetString(data, 0, recv);
  38.                         //定义从键盘接收到的字符串
  39.                         input = "test";
  40.                         //将从键盘获取的字符串转换成整型数据并存储在数组中   
  41.                         data = Encoding.ASCII.GetBytes(input);
  42.                         //发送该数组
  43.                         socket.Send(data, data.Length, SocketFlags.None);
  44.                         Console.Write("disconnect from server");
  45.                         socket.Shutdown(SocketShutdown.Both);
  46.                         socket.Close();
  47.                 }
  48.                        
  49.         }
  50. }
复制代码


客户端程序跑起来,用Arduino IDE的串口查看程序就能看到通过tcp传过来的字符了

回复

使用道具 举报

sunny_nianda  学徒

发表于 2014-5-30 14:29:08

本帖最后由 sunny_nianda 于 2014-5-30 15:36 编辑

楼主,我照着你的做了一遍,试尽了各种物联网平台,但是都没有数据,数据只存在于串口输出,这是怎么回事呢?void setup()
{
    Serial.begin(9600);//Set Baud Rate to 9600 bps
}

void loop()
{

    double dat;
    int sensorValue = analogRead(A0);//Connect LM35 on Analog 0

     dat = (double) sensorValue * (5/10.24);

    Serial.print(dat);
    Serial.println("`C");

       Serial.println("POST /v1.0/device/**************/1/1/datapoints/add"); //“/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.print("Content-Length: ");
  int thisLength =  10 + getLength(sensorValue);
  Serial.println(thisLength);   
  Serial.println("Content-Type: application/x-www-form-urlencoded");
  Serial.println("Connection: close");
  Serial.println();
  Serial.print("par{\"value\":");
  Serial.print(sensorValue);  
  Serial.println("}");
  delay(1000);
  digitalWrite(13,LOW);
  delay(9000);
}

int getLength(int someValue) {
  // there's at least one byte:
  int digits = 1;
  // continually divide the value by ten,
  // adding one to the digit count for each
  // time you divide, until you're at 0:
  int dividend = someValue /10;
  while (dividend > 0) {
    dividend = dividend /10;
    digits++;
  }
  // return the number of digits:
  return digits;
}


回复

使用道具 举报

Phoebe  高级技匠

发表于 2014-5-9 13:38:04

好东西啊,果断收藏
回复

使用道具 举报

Grey  中级技匠
 楼主|

发表于 2014-5-9 13:42:56

本帖最后由 Grey 于 2015-8-19 10:14 编辑
Phoebe 发表于 2014-5-9 13:38
好东西啊,果断收藏
我的沙发啊~ 埋头画圈圈
回复

使用道具 举报

fantast_xu  见习技师

发表于 2014-5-9 13:54:00

好教程,受益非浅,我是初学者,代码中有一个不明白的地方
代码中用Serial.println用来输出http内容,我的理解是Serial只是用来向串口输出或者读入信息,这个串口应该就是板子用usb连接电脑的时候的那个串口,为什么和wifi扩展板也是用这个串口呢?这样不会和电脑的usb发生冲突么?

回复

使用道具 举报

Grey  中级技匠
 楼主|

发表于 2014-5-9 14:24:51

fantast_xu 发表于 2014-5-9 13:54
好教程,受益非浅,我是初学者,代码中有一个不明白的地方
代码中用Serial.println用来输出http内容,我的 ...

当然不会,这些post数据都是送到wifi拓展版的,而wifi又通过post连接到远程网络服务器,USB端也可以收得到这些数据,你可以从串口监视器查看当前数据。
回复

使用道具 举报

fantast_xu  见习技师

发表于 2014-5-9 14:35:47

Grey 发表于 2014-5-9 14:24
当然不会,这些post数据都是送到wifi拓展版的,而wifi又通过post连接到远程网络服务器,USB端也可以收得 ...

谢谢解答,那也就是说我其实可以在电脑的com通讯软件里输入同样的内容来让wifi扩展板进行通讯咯

问题二,在没有例子代码的情况下,我如何可以得知wifi扩展板用的是标准的serial和Arduino通讯的呢?

再次感谢!
回复

使用道具 举报

Grey  中级技匠
 楼主|

发表于 2014-5-9 15:01:24

理论上是的,但我没试过。
你可以先设置STA,然后进行局域网通信,这样你就知道串口好不好用了
回复

使用道具 举报

Phoebe  高级技匠

发表于 2014-5-9 15:04:51

fantast_xu 发表于 2014-5-9 13:54
好教程,受益非浅,我是初学者,代码中有一个不明白的地方
代码中用Serial.println用来输出http内容,我的 ...

如果用UNO(UNO只有一个串口)作为主控器的话,其实这个串口是既连接了USB,又连接了wifi,这时USB只能读数据,但是不能给UNO发。但是Leonardo有Serial和Serial1就不会有这个问题。一个主机发起通讯的时候,串行总线上可能有多个从机,需要确定到底跟哪个从机通讯先,有应答之类的程序,后面就跟双机通讯一样了。串行方式 一不能做多机通信,单工的没法实现主从的概念。。。。。
回复

使用道具 举报

fantast_xu  见习技师

发表于 2014-5-9 15:13:35

本帖最后由 fantast_xu 于 2014-5-9 15:59 编辑
Phoebe 发表于 2014-5-9 15:04
如果用UNO(UNO只有一个串口)作为主控器的话,其实这个串口是既连接了USB,又连接了wifi,这时USB只能读 ...

也就是说在双工的情况下,因为Leonardo有两个Serial口,所以可以实现和usb以及wifi的通讯。按Phoebe大大的意思理解,那个从机先建立通讯,哪个就是Serial?如果此时第二个从机建立通讯,那这个时候自动分配Serial1?

那为什么不是固定的呢?比如在Leonardo的板子上,usb用的就是Serial口,而wifi用的就是Serial1口, 向wifi写数据的时候的代码是Serial1.println(.....)这样子
还是我上面理解的是错误的,其实你的意思是在Serial上就可以有多个设备同时存在?比如usb口和wifi都挂载在Serial串口上。而Serial1口是空着的
回复

使用道具 举报

Grey  中级技匠
 楼主|

发表于 2014-5-12 18:31:07

fantast_xu 发表于 2014-5-9 15:13
也就是说在双工的情况下,因为Leonardo有两个Serial口,所以可以实现和usb以及wifi的通讯。按Phoebe大大的 ...

Phoebe那句话是指单片机多机通信原则。
而这边Leonardo的情况就是和你说的是一样的,Serial1连接wifi板,Serial连接USB到PC。
当你要用Leonaodo的时候,吧Serial改为Serial1 就可以了。
回复

使用道具 举报

Jane  高级技匠

发表于 2014-5-16 10:29:59

楼主写的好详细~谢谢分享
回复

使用道具 举报

fantast_xu  见习技师

发表于 2014-5-16 18:50:53

Grey 发表于 2014-5-12 18:31
Phoebe那句话是指单片机多机通信原则。
而这边Leonardo的情况就是和你说的是一样的,Serial1连接wifi板, ...

谢谢解答!!
回复

使用道具 举报

tommycxd  学徒

发表于 2014-5-16 23:52:11

按照楼主这样的方式配置完是不是wifi模块要能访问外网?我全都按照这个配置的,但是模块好像连不上外网,所以也一直不成功。
回复

使用道具 举报

Grey  中级技匠
 楼主|

发表于 2014-5-19 11:06:08

tommycxd 发表于 2014-5-16 23:52
按照楼主这样的方式配置完是不是wifi模块要能访问外网?我全都按照这个配置的,但是模块好像连不上外网,所 ...

你是指连接machtalk?
不好意思,截图的时候不小心把yeelink上面的设置给贴上去了,已修改,请查看“其他设置”
回复

使用道具 举报

zjjxdb  学徒

发表于 2014-5-22 02:37:15

感谢LZ发帖。求LZ跟新乐联和yeelink的教程啦,还有UNO板子可以操作么
回复

使用道具 举报

Grey  中级技匠
 楼主|

发表于 2014-5-22 11:25:21

zjjxdb 发表于 2014-5-22 02:37
感谢LZ发帖。求LZ跟新乐联和yeelink的教程啦,还有UNO板子可以操作么

表示楼主有点懒啊,相应的yeelink和乐联 其实就是改了一下远程服务器的地址和端口而已
Yeelink: api.yeelink.net  端口号:80
乐联还没开始用,看了一下库, 应该是tcp.lewei50.com 端口号:80
uno当然可以,测试时就是uno+wifi shield V3
回复

使用道具 举报

Grey  中级技匠
 楼主|

发表于 2014-5-30 16:49:50

本帖最后由 Grey 于 2014-6-9 10:03 编辑

machtalk的浮点数据不能这么传的,帖子有样例代码,可以自己参考修改一下。弱弱地打个广告,DFRobot自己的物联网已经在试运行了,马上就要正式推出啦~~~
虽然有点low  但是很实用啊

回复

使用道具 举报

undead2003  见习技师

发表于 2014-6-8 10:16:55

这个是我从串口看到的内容,各位大侠帮看看对不对?但是我在yeelink上面看不到数据?楼上的兄弟说要经过浮点要经过格式转换,这个真的不懂,那位大侠帮帮忙?

par{"value":62}
30.27`C
POST /v1.0/device/device/10965/sensor/18180/datapoints/add
Host: api.yeelink.net
Accept: */*
U-ApiKey: bf6497a31fabf2a574f6b52f5a32b2e8
Content-Length: 12
Content-Type: application/x-www-form-urlencoded
Connection: close

par{"value":62}
回复

使用道具 举报

Grey  中级技匠
 楼主|

发表于 2014-6-9 09:59:36

undead2003 发表于 2014-6-8 10:16
这个是我从串口看到的内容,各位大侠帮看看对不对?但是我在yeelink上面看不到数据?楼上的兄弟说要经过浮 ...

yeelink的端口号是80,有没有在wifi shield 的设置里面设置好api和端口号呢

你这value是62? 所谓的浮点数转换是因为小数点不能被正确识别长度,所以才要那么一步。
Yeelink有一个倍数转换的功能(就是可以帮你处理数据的意思吧,没试过) 建议可以先上传整数试试看。
回复

使用道具 举报

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

本版积分规则

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

硬件清单

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

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

mail