產品TeKit001-原理圖&程式碼

Hits: 115

TeKit系列套件終於上市

此套件是由先前專案衍生出的產品

TeKit001運作原理如下圖

download

透過外部感測器收集資料進入Arduino

Arduino會將收集到的資料進行篩選

最後將篩選完的資料上傳至雲端

這樣的運作原理是物聯網前端(資料蒐集)

等待蒐集的資料大過一定數量就成了大數據

這邊使用的雲端為ThingSpeak

網路上有許多關於ThingSpeak介紹

如尚未申請ThingSpeak帳號請透過以下連結進入申請

ThingSpeak註冊

請取得Write API Key

不清楚的朋友可以參考這篇取得Write API Key

(注意文章教學是取得Read API Key,本次須取得Write API Key,不要搞錯瞜)

產品TeKit001程式碼如下

最下方有檔案可直接下載服用

———————–程式開始——————————–

//Power_LED 紅色(11) 設定為電源燈、TRX_LED 綠色(12) 資料上傳雲端寫入燈號、GPSLED 黃色(13) GPS定位燈
//請修改第55行,n5改為WIFI的SSID,09320932改為WIFI 連線密碼,如WIFI SSID為Android,密碼為1234567890,請修改如下
//fSendCmd(“AT+CWJAP=\”Android\”,\”1234567890\””)
//請修改第99行,String sHTTPContent2 = “GET /update?api_key=XXXXXXXX”;
//將XXXXXXXX改為自身ThingSpeak 專屬的Write API Key

#include
#include
SoftwareSerial ESP8266 (8, 9); // TX、RX
#define GpsSerial Serial

//發送AT CMD
bool fSendCmd(String sCMD, String sCMD2=””);

dht DHT;
#define dht_dpin 2
int Power_LED = 11; //綠
int TRX_LED = 13 ; //黃

//GPS 相關變數
String latitude; //緯度
String longitude; //經度
String lndSpeed; //速度
String gpsTime; //UTC時間
String TaipeiTime; //台北時間(UTC +8小時)
String GpsDate; //GPS日期
String GpsAV; //定位是否有效
int GPSLED =11; // GPS定位燈號(紅)

void setup() {
Serial.begin(115200);
ESP8266.begin(9600);
GpsSerial.begin(9600);
Serial.print(“Power On Self Test………..”);
pinMode(Power_LED, OUTPUT);
pinMode(GPSLED, OUTPUT);
pinMode(TRX_LED, OUTPUT);
digitalWrite(Power_LED, HIGH);
digitalWrite(GPSLED, HIGH);
digitalWrite(TRX_LED, HIGH);
delay(2000);
digitalWrite(GPSLED, LOW);
digitalWrite(TRX_LED, LOW);
Serial.println(“Finish”);
Serial.println();
fSendCmd(“AT+CWMODE=1”);
delay(300);
Serial.println(“Setup Config ………..Finish”) ;

//連入AP
Serial.println(“Connected to AP “);
fSendCmd(“AT+CWJAP=\”n5\”,\”09320932\””);//請修改欲連線WIFI的SSID與密碼
delay(3000);
// 顯示IP
Serial.println(“Show IP”);
fSendCmd(“AT+CIFSR”);
delay(1000);

}

void loop(){
//建立TCP連線
Serial.println(“Create a TCP connection”);
fSendCmd(“AT+CIPSTART=\”TCP\”,\”184.106.153.149\”,80″);

//取濕度
DHT.read11(dht_dpin);
Serial.print(“Current humidity = “);
Serial.print(DHT.humidity);
Serial.print(“% “);

//取溫度
Serial.print(“temperature = “);
Serial.print(DHT.temperature);
Serial.println(“C “);

//取GPS資料
Serial.println(GPS_Read());

//取GPS訊號,如定位成功 GPSLED 燈號亮, 定位狀態:A成功,V失敗
if (GpsAV=”A”){
digitalWrite(GPSLED, HIGH);
}

//讀取溫濕度數值,分別寫入兩個變數
double humidity = DHT.humidity;
double temperature=DHT.temperature;
//ESP8266 上傳資料
//經度&緯度資料組合
String sHTTPContent4 = “&field3=” + longitude + “&field4=” + latitude;
//溫度&濕度 資料組合 備註:String(humidity) 將double 轉為String,雲端接收資料的型態為String
String sHTTPContent3 = “&field1=” + String(humidity) + “&field2=” + String(temperature);
//ThingSpeak 上傳資料
digitalWrite(TRX_LED, HIGH);
String sHTTPContent2 = “GET /update?api_key=XXXXXXXX”;//請修改成為自己專屬的Write API Key
String sHTTPContent1 = “AT+CIPSEND=”;
sHTTPContent3 += sHTTPContent4;
sHTTPContent2 += sHTTPContent3;
sHTTPContent1 += sHTTPContent2.length() +2;
fSendCmd(sHTTPContent1,sHTTPContent2);

//關閉TCP連線
Serial.println(“Close TCP connection”);
fSendCmd(“AT+CIPCLOSE”);

digitalWrite(TRX_LED, LOW);
delay(20000);//上傳資料的頻率

}

//發送AT CMD
bool fSendCmd(String sCMD, String sCMD2=””){
unsigned long start;
//1.確認裝置是否正常回應OK
String inData=””;
ESP8266.println(“AT”);
for (start = millis(); millis() – start < 100;){ //等候100ms(time out)接收RS232資料
while (ESP8266.available()){
//inData += ESP8266.readStringUntil(‘\n’);
inData += ESP8266.readString();
start = millis(); //重置等待時間
}
}

Serial.print(“ESP8266 Check hot-bit: “);
Serial.println(inData);

//判定無回應OK, 視為裝置不正常,離開發送副程式。
if (inData.indexOf(“OK”) == -1){
return false;
}

//2.發送命令至ESP8266裝置
inData=””;
Serial.print(“ESP8266 Sending sCMD: “);
Serial.println(sCMD);
ESP8266.println(sCMD);
for (start = millis(); millis() – start < 15000;){ //等候15000ms(time out)接收RS232資料 while (ESP8266.available()){ inData += ESP8266.readString(); start = millis(); //重置等待時間 } //當收到OK 或是 ERROR 字串時,表示AT CMD 已完成,不需要等待 Time Out時間 if ((inData.indexOf(“OK”) >=0) or (inData.indexOf(“ERROR”) >=0) or (inData.indexOf(“>”) >=0)){
break;
}
}
Serial.println(“ESP8266 Get Response: “);
Serial.println(inData);

//判斷有第二層AT CMD 提示符號”>”,進入第二層並發送命令
if (inData.indexOf(“>”) >=0){
Serial.print(“ESP8266 Sending L2 CMD>”);
Serial.println(sCMD2);
ESP8266.println(sCMD2);

//第二層命令發送後,等候ESP8266回應,並判別OK 或是 ERROR
for (start = millis(); millis() – start < 5000;){ //等候5000ms(time out)接收RS232資料 while (ESP8266.available()){ inData += ESP8266.readString(); start = millis(); //重置等待時間 } //當收到OK 或是 ERROR 字串時,表示AT CMD 已完成,不需要等待 Time Out時間 if ((inData.indexOf(“OK”) >=0) or (inData.indexOf(“ERROR”) >=0)){
break;
}
}
}

//判定無回應OK, 視為裝置不正常,離開發送副程式。
if (inData.indexOf(“OK”) == -1){
Serial.println(“ESP8266 Return False”);
return false;
}

//一般返回
Serial.println(“ESP8266 Return True”);
return true;
}

//副程式————GPS_Read——————–
String GPS_Read()
{
unsigned long start;
//1.接收GPS Data
String inData=””;
String sReturn=””;

for (start = millis(); millis() – start < 200;){ //等候200ms(time out)接收RS232資料 while (GpsSerial.available()){ char c = GpsSerial.read(); inData += c; start = millis(); //重置等待時間 } } //2. 找出GPS特定資料,GPRMC, GLRMC, GARMC, BDRMC int nR; //字串收尋右邊定位點 int nL; //字串收尋左邊定位點 String sSubstring; //運算子字串 nL = inData.indexOf(“$”); nR = inData.indexOf(“*”); //正常情境, 左邊(nL)定位點>=0, 右邊定位點(nR) > nL
while(nL >=0 && nR > nL){
sSubstring = inData.substring(nL, nR + 3); //取出單一段GPS Protocol (nR+3為了包含2bytes檢查碼)
inData = inData.substring(nR +3); //將以取出的inData 的字元刪除

//找出GPS特定資料,GPRMC, GLRMC, GARMC, BDRMC
if (sSubstring.indexOf(“RMC”) >=0){
//將GPS字串丟入 fGpsParse, 取出GPS欄位資料
fGpsParse(sSubstring);
}
nL = inData.indexOf(“$”);
nR = inData.indexOf(“*”);
}
//return sReturn;
return “$GPS,”+latitude+”,”+longitude+”,”+lndSpeed+”,”+gpsTime+”,”+GpsDate+”,”+GpsAV+”*”;
}

//取出GPS欄位資料
bool fGpsParse(String sMsg){
int nL=0; //左邊定位點
int nR=0; //右邊定位點
int iCase=1; //對應參數值
String sSubstr; //字串片段

//1.確認是否為RMC協議
if(sMsg.indexOf(“RMC”)<=0) return false; //2.定位出nL, nR的位置 nL = sMsg.indexOf(“,”); nR = sMsg.indexOf(“,”, nL +1); //3.利用迴圈,將各段資料(字串)取出 while(nL >=0, nR > nL){
//取出定位點”,”間的資料
sSubstr = sMsg.substring(nL +1, nR);

switch (iCase){
case 1: //UTC Time, hhmmss
gpsTime = sSubstr;
break;
case 2: // A/V
GpsAV = sSubstr;
break;
case 3: //Latitude, ddmm.mmmm
latitude = sSubstr;
break;
case 4: //N/S
break;
case 5: //Longitude, dddmm.mmmm
longitude = sSubstr;
break;
case 6: //E/W
break;
case 7: //Speed knote
break;
case 8: //地面航向 0~359.9度角
break;
case 9: //UTC 日期, ddmmyy
GpsDate = sSubstr;
break;
case 10: //磁偏角
break;
case 11: //磁偏角方向
break;
case 12: //定位模式: A=自主定位, D=差分, E=估算, N=無效資料
break;
case 13: //檢查
break;
}

nL = sMsg.indexOf(“,”, nR);
nR = sMsg.indexOf(“,”, nL + 1);
iCase ++;
}
return true;
}

———————–程式結束——————————–

 

原始檔案下載

TeKit001 產品介紹
TeKit001 產品實際運作狀況
產品TeKit001-原理圖&程式碼

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *