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位址 ,可以查詢最新傳入的資料(但不會自動更新,請按重新整理)
請搭配自製通訊板使用
圖左: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(); // 處理用戶連線
}