首页
社区
课程
招聘
[原创]Arduino WiFi通信
2016-11-22 18:14 30930

[原创]Arduino WiFi通信

2016-11-22 18:14
30930
Arduino WiFi通信

我们Arduino WiFi入门,一般使用的Wifi模块芯片是ESP8266。现在像我这样天天无线上网不知道wifi的人就已经OUT了,赶紧饿补一下:
ESP8266在搭载应用并作为设备中唯一的应用处理器时,能够直接从外接闪存中启动。内置的高速缓冲存储器有利于提升系统性能,并减少内存需求。
  另外一种情况是,无线上接入承担Wi-Fi适配器的任务时,可以将其添加到任何基于微控制器的设计中,连接简单易行,只需通过SPI/SDIO接口或中央处理器AHB桥接即可。
  ESP8266强大的片上处理和存储能力,使其可通过 GPIO 口集成传感器及其他应用的特定设备,实现了最低前期的开发和运行中最少地占用系统资源。ESP8266高度片内集成,包括天线开关balun、电源管理转换器,因此仅需极少的外部电路,且包括前端模块在内的整个解决房案在设计时将所占 PCB空间降到最低。
  装有ESP8266的系统表现出来的领先特征有:节能VoIP在睡眠/唤醒模式之间的快速切换、配合低功率操作的自适应无线电偏置、前端信号的处理功能、故障排除和无线电系统共存特性为消除蜂窝 /蓝牙/DDR/LVDS/LCD干扰。
更多信息请看附件(ESP8266-用户手册-V0.3.pdf)

然后,开始接线



一接上3.3V电源,立马感到模块发烫,散热不好处理啊。

烧录Arduino程序,测试一下
#include <SoftwareSerial.h>
SoftwareSerial mySerial(3, 2); // RX, TX
void setup()  
{
   Serial.begin(9600);
   while (!Serial) {;}
   Serial.println("hardware serial!");
   mySerial.begin(9600);
   mySerial.println("software seria");
}

void loop()
{
   if (mySerial.available())
     Serial.write(mySerial.read());
   if (Serial.available())
     mySerial.write(Serial.read());
}
当时没有保存测试图片,这里就不发了。
本来想拿点时间认认真真写一下的,后来当然有事(在科锐来学习当然不是闹着玩的,作业超多的哦。没有辛勤的付出,那来的那个什么什么。)

又一大牛浮出水面,大家认出来了么?他就是

想了解,大牛们都在干什么吗?请点击如下链接
http://bbs.pediy.com/showthread.php?t=51839

后来,我有空准备再来做的时候,发现这个还是点麻烦(把我烫了几下是一方面,另一方面是我不想搭单片机环境,不想再买电烙铁等来焊上),就在网上重新买了一个块,这样用起来感觉还是方便一些,关键是这板子也不怎么贵。


板子的接口和我手机的一样,又省下一根数据线了。

如果电脑上出现COM端口说明驱动是安装成功了。否则需要安装驱动,这里就不多说了。
这个使用起来也是很方便的,请看下图吧。

当然官网下载的Arduino IDE是不会这样的,如果你购买了,卖家一般会告诉你怎么做的,如果没有那就自己网上搜搜,一定会找到的。

然后先随便找个代码试了一下发现成功


当然,这只是简单的开始。真正的无线wifi才准备开始
需要说明一点的是:程序编译和上传过程有点慢


测试程序源码:
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>

/* 这里是名称 */
const char *ssid = "ESPap";
/* 这里是密码*/
const char *password = "thereisnospoon";

ESP8266WebServer server(80);

/* Just a little test message.  Go to http://192.168.4.1 in a web browser
* connected to this access point to see it.
*/
void handleRoot() {
        server.send(200, "text/html", "<h1>You are connected</h1>");
}

void setup() {
        delay(1000);
        Serial.begin(115200);
        Serial.println();
        Serial.print("Configuring access point...");
        /* You can remove the password parameter if you want the AP to be open. */
        WiFi.softAP(ssid, password);

        IPAddress myIP = WiFi.softAPIP();
        Serial.print("AP IP address: ");
        Serial.println(myIP);
        server.on("/", handleRoot);
        server.begin();
        Serial.println("HTTP server started");
}

void loop() {
        server.handleClient();
}

上传成功以后就会看到ESPap无线热点,是不是感觉很方便的样子。
需要注意一点的是,密码是:thereisnospoon

如果连接上了,打不开网页,重启一下就好了。

当然网页内容是可以更改的,如果你想换成别的只要把上面源码中的代码稍微修改一下就好了。在这里我就不多做测试了。
void handleRoot() {
        server.send(200, "text/html", "<h1>You are connected</h1>");//把这里的内容修改一下就好
}

我们再来个Get网页的例子吧

测试程序源码:
#include <ESP8266WiFi.h>

const char* ssid     = "your-ssid";
const char* password = "your-password";

const char* host = "www.baidu.com";
const char* streamId   = "....................";
const char* privateKey = "....................";

void setup() {
  Serial.begin(115200);
  delay(10);

  // We start by connecting to a WiFi network

  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  
  WiFi.begin(ssid, password);
  
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFi connected");  
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}

int value = 0;

void loop() {
  delay(5000);
  ++value;

  Serial.print("connecting to ");
  Serial.println(host);
  
  // Use WiFiClient class to create TCP connections
  WiFiClient client;
  const int httpPort = 80;
  if (!client.connect(host, httpPort)) {
    Serial.println("connection failed");
    return;
  }
  
  // We now create a URI for the request
/*  String url = "/input/";
  url += streamId;
  url += "?private_key=";
  url += privateKey;
  url += "&value=";
  url += value;
*/
String url = "https://www.baidu.com/";
  Serial.print("Requesting URL: ");
  Serial.println(url);
  
  // This will send the request to the server
  client.print(String("GET ") + url + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" +
               "Connection: close\r\n\r\n");
  int timeout = millis() + 5000;
  while (client.available() == 0) {
    if (timeout - millis() < 0) {
      Serial.println(">>> Client Timeout !");
      client.stop();
      return;
    }
  }
  
  // Read all the lines of the reply from server and print them to Serial
  while(client.available()){
    String line = client.readStringUntil('\r');
    Serial.print(line);
  }
  
  Serial.println();
  Serial.println("closing connection");
}
上传程序后,如果只是不停打印‘.’(十六进制2E)的话,没有像下图中类似情况的话,重启一下(是按一下开发板的按钮,不是把电脑重启)。
Arduino自带的串口监视工具功能还要有所欠缺,收到的内容看起来变成了乱码,没办法看。


换了个工具试一下,发现还是十六进制好看一点。当然再带个十六进制编辑器就更好了。
数据部分应该是这些:
73 24 00 6C 9C 9F 3C 00 84 6C E0 7C 03 0C 04 0C 84 04 6C E4 0C 23 7C 8F 83 03 EC 13 9B 73 9B 23 84 04 63 84 FB 27 6F DF 64 6F 27 9C E2 E4 04 63 1C 70 C4 C7 64 73 64 72 64 38 FB 67 E0 10 03 0C 04 82 04 24 0C 84 9C 04 04 0C 62 0C 27 E3 7C 03 64 8C 84 8F C7 62 8C F3 6F 67 E7 00 6C 84 8F 6C 60 03 90 1B 13 6F 67 04 6C 20 03 0F 03 6E 7B 87 93 DB 67 04 0C 83 C4 6C 60 03 07 73 DB 93 6E 0C 04 C3 8C 64 60 03 FC 83 6F DC 03 0D 0A 0D 0A 43 6F 6E 6E 65 63 74 69 6E 67 20 74 6F 20 79 6F 75 72 2D 73 73 69 64 0D 0A
现在只记得0D 0A好像是回车换行吧,其他的具体是什么,我就不太清楚,也不想关心了。什么时候需要的这方面的,再做实验。

程序开发是逆向的基础。不知道,你同不同意这个观点。

再来一个wifi扫描的吧,先看一下效果图吧


测试程序源码:
#include "ESP8266WiFi.h"

void setup() {
  Serial.begin(115200);

  // Set WiFi to station mode and disconnect from an AP if it was previously connected
  WiFi.mode(WIFI_STA);
  WiFi.disconnect();
  delay(100);

  Serial.println("Setup done");
}

void loop() {
  Serial.println("scan start");

  // WiFi.scanNetworks will return the number of networks found
  int n = WiFi.scanNetworks();
  Serial.println("scan done");
  if (n == 0)
    Serial.println("no networks found");
  else
  {
    Serial.print(n);
    Serial.println(" networks found");
    for (int i = 0; i < n; ++i)
    {
      // Print SSID and RSSI for each network found
      Serial.print(i + 1);
      Serial.print(": ");
      Serial.print(WiFi.SSID(i));
      Serial.print(" (");
      Serial.print(WiFi.RSSI(i));
      Serial.print(")");
      Serial.println((WiFi.encryptionType(i) == ENC_TYPE_NONE)?" ":"*");
      delay(10);
    }
  }
  Serial.println("");

  // Wait a bit before scanning again
  delay(5000);
}

参考资料:
http://bbs.pediy.com/showthread.php?t=51839

https://en.wikipedia.org/wiki/ESP8266

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

上传的附件:
收藏
点赞1
打赏
分享
最新回复 (6)
雪    币: 440
活跃值: (848)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
猫子 2016-11-22 20:59
2
0
刚哥威武
雪    币: 6769
活跃值: (4422)
能力值: (RANK:600 )
在线值:
发帖
回帖
粉丝
gjden 14 2016-11-22 22:26
3
0
非常不错,辛苦!
雪    币: 606
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
yzlong 2016-11-23 01:26
4
0
刚Debug  V587
雪    币: 2443
活跃值: (434)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
飘云 1 2016-11-23 10:30
5
0
谢谢分享~~

既然楼主用了 Arduino core for ESP8266 那么完全不再需要Arduino板子了~  TTL板子+ ESP8266 就行了,省下一块Arduino单片机

实际折腾的时候,GPIO0要接地,才能刷入程序~
雪    币: 288
活跃值: (212)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
mozha 2 2016-11-23 11:44
6
0
好的,其实是先有Arduino板子,再买的这个小的那板 ESP8266,后来觉得那板D1方便又不贵才买的。
雪    币: 440
活跃值: (848)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
猫子 2016-11-23 14:14
7
0
飘大果然什么都会
游客
登录 | 注册 方可回帖
返回