作者Editor

Arduino WiFi通信

发布于:2016-11-29 15:52:35 阅读:310 回帖:0


我们 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)

名称:  图片1.png
查看次数: 0
文件大小:  230.5 KB


然后,开始接线


名称:  图片2.png
查看次数: 0
文件大小:  264.4 KB
点击图片以查看大图

图片名称:	图片3.png
查看次数:	0
文件大小:	343.0 KB
文件 ID :	108801


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

烧录Arduino程序,测试一下

#include  
 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());
 }


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


名称:  图片4.png
查看次数: 2
文件大小:  138.9 KB


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


名称:  图片5.png
查看次数: 0
文件大小:  39.2 KB


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

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


名称:  图片6.png
查看次数: 0
文件大小:  291.8 KB


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


名称:  图片7.png
查看次数: 0
文件大小:  6.4 KB


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


名称:  图片8.png
查看次数: 1
文件大小:  43.2 KB


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

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


点击图片以查看大图

图片名称:	图片9.png
查看次数:	0
文件大小:	51.2 KB
文件 ID :	108807


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


名称:  图片10.png
查看次数: 0
文件大小:  45.3 KB


测试程序源码:

#include #include  
#include /* 这里是名称 */
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", "You are connected");
}

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


名称:  图片11.png
查看次数: 0
文件大小:  13.7 KB


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


名称:  图片12.png
查看次数: 0
文件大小:  6.0 KB


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

You are connected

");//把这里的内容修改一下就好
}

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

测试程序源码:

#include 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自带的串口监视工具功能还要有所欠缺,收到的内容看起来变成了乱码,没办法看。


名称:  图片13.png
查看次数: 0
文件大小:  11.3 KB


换了个工具试一下,发现还是十六进制好看一点。当然再带个十六进制编辑器就更好了。
数据部分应该是这些:


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扫描的吧,先看一下效果图吧


点击图片以查看大图

图片名称:	图片14.png
查看次数:	0
文件大小:	45.5 KB
文件 ID :	108812


测试程序源码:

#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


*转载请注明来自看雪论坛@PEdiy.com 


附件列表:

最新回复 (0)
返回