多虧於公司intern的實驗室,
我才有榮幸玩到Arduino的wifi套件!
不然一塊三千多塊,實在是買不下去阿!
這篇主要教大家,
怎麼用這塊wifi shield去做到下列的事情
- scan network AP
- connect to a network AP
- send a request
- create a WebServer using exists connection
恩,在開始之前,請先準備好環境!
注意!在我寫文章的這個時候!
arduino已經出到了1.0.5版!
最一開始我是用1.0.1版開發,但1.0.1版是沒有wifi的lib,
所以我自己去github把wifi的lib抓下來,再放在我的lib裡面!
的確!大部份功能都可以work!
除了建立webserver以外!
但是不要天真的以為用1.0.5版就可以建立webserver,
根據撞牆了幾個小時,發現要downgrade至1.0.2版才能建立webserver...
其實1.0.5版也可以,只是要
做一些操作!實在太麻煩!
總而言之,請使用1.0.2
1. 把wifi shield直接插在你的arduino板上!官網其實有備註,如果你是用比較舊的板子(UNO R3),還要稍微接一下線!
請看這篇吧!
2. include necessary lib#include
3. 開始寫code3.1 掃描附近所有的apvoid setup(){
Serial.begin(9600);
}
void loop(){
fnScanNetwork();
}
void fnScanNetwork(){
int iNum = WiFi.scanNetworks();
Serial.print('=========number of available networks:');
Serial.print(iNum);
Serial.println('=========');
// print the each SSID and Signal
for (int i = 0; i
Serial.print(WiFi.SSID(i)); // pring SSID
Serial.print('\tSignal: ');
Serial.print(WiFi.RSSI(i)); // print Signal
Serial.print(' dBm');
Serial.print('\tEncryption: ');
Serial.println(WiFi.encryptionType(i)); // print Encryption Type
}
}
上面比較需要注意的大概就是WiFi.RSSI(i),
這隻method就是回傳該AP訊號的強弱!
記得值越大訊號越強!
再來就是WiFi.encryptionType(i),
這是回傳該AP的加密形態是什麼?
內容如下:
* TKIP (WPA) = 2
* WEP = 5
* CCMP (WPA) = 4
* NONE = 7
* AUTO = 8
3.2 連線至某個apchar szSsid[] = 'kerkerker'; // network SSID (name)
char szPass[] = 'safesync'; // network password
int iStatus = WL_IDLE_STATUS;
void setup(){
Serial.begin(9600);
fnConnectToAP();
}
void loop(){
}
void fnConnectToAP(){
while ( iStatus != WL_CONNECTED) {
Serial.println('Connecting to network...');
Serial.print('SSID: ');
Serial.println(ssid);
delay(1000);
iStatus = WiFi.begin(ssid, pass); // connect
}
Serial.print('Connected successfully. IP address:');
IPAddress myAddress = WiFi.localIP();
Serial.println(myAddress);
}
WiFi.begin這個method就是在進行連線!
如果成功的話會看到下面兩張圖!
首先你的wifi shield上的link那顆燈會變成綠色!
而你的Serial Monitor會長得像下面一樣!
3.3 傳送一個request至一個server首先在setup裡面先連線至ap,
接著就送出一個request,
然後就在loop裡面進行讀資料的動作!
如果成功的話,你應該會在你的Serial Monitor看到一大堆回傳的資料才對!
// connect to ap
int iStatus = WL_IDLE_STATUS;
char szSsid[] = 'kerkerker'; // network SSID (name)
char szPass[] = 'safesync'; // network password
// send a request
char szServername[]='www.google.com'; // remote server we will connect to
WiFiClient client;
void setup(){
Serial.begin(9600);
fnConnectToAP();
fnSendRequest();
}
void loop(){
fnReadData();
}
void fnSendRequest(){
if (client.connect(szServername, 80)) {
Serial.println('connected');
// Send a HTTP request:
client.println('GET /search?q=arduino HTTP/1.1');
client.println('Host: www.google.com');
client.println();
}
}
void fnReadData(){
while (client.available()) {
char c = client.read();
Serial.print(c);
}
// if the server's disconnected, stop the client:
if (!client.connected()) {
Serial.println();
Serial.println('disconnecting from server.');
client.stop();
// do nothing forevermore:
while(true);
}
}
3.4 建立一個webserver供人連線輸入下列的code以後,接著只要用browser輸入你的ip,
就會看到Hello World了!
// webserver
WiFiServer server(80);
void setup(){
Serial.begin(9600);
fnConnectToAP();
// fnSendRequest();
fnStartServer();
}
void loop(){
fnWaitingRequest();
// fnReadData();
}
void fnStartServer(){
delay(1000);
server.begin();
}
void fnWaitingRequest(){
WiFiClient client = server.available();
if (client) {
Serial.println('new client comming');
boolean bCurrentLineIsBlank = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
Serial.write(c);
// if you've gotten to the end of the line and the line is blank, the http request has ended,
// so you can send a reply
if (c == '\n' && bCurrentLineIsBlank) {
// send a standard http response header
client.println('HTTP/1.1 200 OK');
client.println('Content-Type: text/html');
client.println('Connection: close'); // the connection will be closed after completion of the response
client.println();
client.println('');
client.println('');
client.print('Hello World ');
client.println('');
break;
}
if (c == '\n') {
// you're starting a new line
bCurrentLineIsBlank = true;
} else if (c != '\r') {
// you've gotten a character on the current line
bCurrentLineIsBlank = false;
}
}
}
// give the web browser time to receive the data
delay(1);
// close the connection:
client.stop();
Serial.println('client disonnected');
}
}
source code:
https://github.com/Ken-Yang/ArduinoWiFiShield基本上蠻簡單的,
code也很好理解!
只是有些tricky的地方,
像是1.0.5版需要update firmware!
官網上也有很多豐富的example!
有空可以去看看!
如果有空,下一篇會教大家怎麼結合wifi+遙控車!
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。