5.接收資料並傳至Serial

本工具負責接收區域網路中各sensor節點回傳的資料,適合大範圍蒐集數據使用

本工具程式需搭配ESP-01 與 WIFI 模塊下載器(如下圖使用)

接收遠端所回傳的csv格式資料

test 方法:連上ap後在同網域下的電腦瀏覽器輸入,可以丟資料給RX

http://ip位址/cmd?A=1&B=2

ex. http://192.168.1.3/cmd?A=1&B=2

若連上 http://ip位址 ,可以查詢最新傳入的資料(但不會自動更新,請按重新整理)

ex. http://192.168.1.3

請搭配自製通訊板使用

圖左:TX端(自製通訊板) 圖中:搭配sensor shield 圖右:RX端搭配模塊下載器

傳送端TX ESP8266

#include <Arduino.h>

#include <ESP8266WiFi.h> // 提供Wi-Fi功能的程式庫

#include <ESP8266HTTPClient.h>

#include <ESP8266WiFiMulti.h>

////////////////////////////

#define SSID "tomorrows"

#define PASSWORD "----"

////////////////////////////

ESP8266WiFiMulti WiFiMulti;

WiFiServer server(80); // 宣告網站伺服器物件與埠號

const int httpPort = 80;

unsigned long t1,t2;

String cmd, data_A,data_B,host;

int A=0 , B=0 , C=0 , D=0 , E=0;

void data_to_RX(String data3, String data4){

String url = "http://";

url+=host;

url+="/cmd?A=";

url+=data3;

url+="&B=";

url+=data4;

// This will send the request to the server

if((WiFiMulti.run() == WL_CONNECTED)) {

HTTPClient http;

http.begin(url);

int httpCode = http.GET();

if(httpCode > 0) {

if(httpCode == HTTP_CODE_OK) {

String payload = http.getString(); }

} else {}

http.end(); }}

void rec_cmd(){

cmd="" ;

while(Serial.available()){

char c = Serial.read();

cmd+= c;

delay(10);}

if(cmd.charAt(0)=='A'){

data_A="" , data_B="";

for(int i=0 ; i<cmd.length() ;i++){if(cmd.charAt(i)=='A'){A=i;}}

for(int i=0 ; i<cmd.length() ;i++){if(cmd.charAt(i)=='B'){B=i;}}

for(int i=0 ; i<cmd.length() ;i++){if(cmd.charAt(i)=='C'){C=i;}}

for(int i=A+1 ; i<B ; i++){data_A +=cmd.charAt(i);}

for(int i=B+1 ; i<C ; i++){data_B +=cmd.charAt(i);}

data_to_RX(data_A , data_B);

}

if(cmd.charAt(0)=='D'){

host="";

for(int i=0 ; i<cmd.length() ;i++){if(cmd.charAt(i)=='D'){D=i;}}

for(int i=0 ; i<cmd.length() ;i++){if(cmd.charAt(i)=='E'){E=i;}}

for(int i=D+1 ; i<E ; i++){host +=cmd.charAt(i);}

}

Serial.print("OK");}

void setup() {

Serial.begin(9600);

WiFiMulti.addAP(SSID, PASSWORD);

}

void loop(){

if(Serial.available()){

rec_cmd();

}}

傳送端TX Arduino

#include <Wire.h>

#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x3F,16,2);

/////////////////////////////////////////////////////

#define host "192.168.1.3"

//#define host "10.233.95.178"

#define timing 1000 //建議1000毫秒一組數據

/////////////////////////////////////////////////////

unsigned long t1,t2;

int i=0;

String A,B ;

void lcd_disp(String data1,String data2){

lcd.setCursor(0,0);

lcd.print(" ");

lcd.setCursor(0,0);

lcd.print("A=");

lcd.print(data1);

lcd.print(" B=");

lcd.print(data2);

}

void send_host(){

Serial.print("D");

Serial.print(host);

Serial.print("E");

Serial.flush();

}

void setup() {

Serial.begin(9600);

lcd.init();

lcd.backlight();

lcd.clear();

do{

send_host();

delay(200);

lcd.setCursor(0,1);

lcd.print("waiting...");

}while(!Serial.find("OK"));

lcd.setCursor(0,1);

lcd.print("host ok!");

t1=millis();

}

void loop() {

t2=millis();

if(t2>t1+timing){

A="";

B="";

i++;

A=String(i);

B=String(analogRead(A0));

Serial.print("A");

Serial.print(A);

Serial.print("B");

Serial.print(B);

Serial.print("C");

Serial.flush();

lcd_disp(A,B);

lcd.setCursor(0,1);

lcd.print("Sending Data...");

t1=t2;

}

}

接收端RX ESP8266

#include <ESP8266WiFi.h> // 提供Wi-Fi功能的程式庫

#include <ESP8266WebServer.h> // 提供網站伺服器功能的程式庫

///////////////////////////

#define SSID "tomorrows"

#define PASSWORD "----"

///////////////////////////

ESP8266WebServer server(80); // 宣告網站伺服器物件與埠號

unsigned long t1,t2;

String cmd1,cmd2;

// 定義處理首頁請求的自訂函式

void rootRouter() {

server.send(200, "text/html", "A = <b>" + cmd1 + "</b><br>"+"B = <b>" + cmd2 + "</b><br>");

}

void setup() {

Serial.begin(9600);

WiFi.mode(WIFI_STA);

WiFi.begin(SSID, PASSWORD);

while (WiFi.status() != WL_CONNECTED) {delay(500);}

Serial.println(WiFi.localIP());

Serial.println("-----------------------------------------------------");

server.on("/index.html", rootRouter); //處理首頁連結請求的事件

server.on("/", rootRouter);

server.on("/cmd", []() {

cmd1="";

cmd2="";

cmd1=server.arg("A");

cmd2=server.arg("B");

////////////////////////////////(若要加入更多筆資料,請由此下手)

Serial.print(cmd1);

Serial.print(",");

Serial.println(cmd2);

////////////////////////////////(若要加入更多筆資料,請由此下手)

Serial.flush();

server.send(200, "text/html", "OK" );

});

server.onNotFound([](){ // 處理「找不到指定路徑」的事件

server.send(404, "text/plain", "File NOT found!");

});

server.begin();

}

void loop() {

server.handleClient(); // 處理用戶連線

}