// 2018/11/6 // Faya-Nugget Sample Code (BLE_SensorCar_1.ino) // 單元: 空氣品質遙控車 // 網址: https://fayalab.blogspot.com/2018/11/BLE-SensorCar.html // 目標: (1) Android藍芽介面控制藍芽遙控車 // (2) 可隨時監測環境溫溼度與灰塵 // Wire : Arduino ==> faya Module // D11 ==> SIG (右輪減速馬達) // D12 ==> DIR (右輪減速馬達) // D6 ==> SIG (左輪減速馬達) // D7 ==> DIR (左輪減速馬達) // D3 ==> TxD (藍芽模組) // D2 ==> RxD (藍芽模組) // D4 ==> Data (溫溼度感應模組) // Rx1 ==> TXD (灰塵感應模組) #include // 引入軟體模擬串列埠的函式庫,用來連接藍芽模組 #include "dht.h" // 引入DHT11 溫溼度測器含式庫 #define delayTime 250 // 定義延遲時間 #define DHTPIN 4 // 定義DHT11腳位 #define Wheel_R_DIR 12 // 右輪方向腳位 #define Wheel_R_SIG 11 // 右輪速度腳位 #define Wheel_L_DIR 7 // 左輪方向腳位 #define Wheel_L_SIG 6 // 左輪速度腳位 const int TX = 2; //藍芽模組 RxD 埠連接到Arduino第2腳 const int RX = 3; //藍芽模組 TxD 埠連接到Arduino第3腳 SoftwareSerial fayaBT(RX, TX); // 設定 SoftwareSerial 腳位 dht faya_dht11; // 建構物件名稱 // 以下變數為灰塵感測器使用 int incomeByte[7]; //儲存七個字節的資料 int data; //暫存每個字節的資料 int z=0; // 字節計數器 數據傳輸共7字節 (0~6) int sum; // 校驗位 = 第1~第4字節的總和 = Vout(H)+Vout(L)+Vref(H)+Vref(L) int A=390; // A = 比例係數 (280~500間) int ud; // 灰塵濃度變數 byte Data[5]; //儲存感測資料 [a]+[temp]+[humid]+[dust_high]+[dust_low] String command; // 儲存藍芽控制字串 void setup() { Serial.begin(2400); // 串列埠通訊 baudrate (灰塵感測器 <=> Arduino) fayaBT.begin(9600); // 軟體串列埠通訊 baudrate (Arduino <=> 藍芽模組) pinMode(Wheel_R_DIR,OUTPUT); //右輪方向腳位 pinMode(Wheel_R_SIG,OUTPUT); //右輪速度腳位 pinMode(Wheel_L_DIR, OUTPUT); //左輪方向腳位 pinMode(Wheel_L_SIG, OUTPUT); //右輪速度腳位 StopMove(); //停止前進 } void loop() { BT_Sensor_Car(); // 呼叫遙控車程式 } //------------副程式 : 接收藍芽指令並呼應相關動作 ------------- void BT_Sensor_Car(){ while(fayaBT.available()>0) // 藍芽資料進來時 { char command = fayaBT.read(); // 讀取來自手機的指令 switch(command) { case 'S': // 指令 'S' = STOP (停止移動) StopMove(); break; case 'F': // 指令 'F' = Move Foraward (向前進) Forward(); break; case 'B': // 指令 'B' = Move Backward (向後退) Backward(); break; case 'R': // 指令 'R' = Turn Right (右轉) turnRight(); break; case 'L': // 指令 'L' = Turn Left (左轉) turnLeft(); break; case 'A': // 指令 'A' = 收集環境資料 collectData(); break; default: break; } } } //---------------- 副程式 : 馬達控制------------------ void StopMove() //停止副程式 { analogWrite(Wheel_R_SIG,0); analogWrite(Wheel_L_SIG,0); } void Forward() //向前進副程式 { digitalWrite(Wheel_R_DIR,LOW); analogWrite(Wheel_R_SIG,200); // 修改數值讓後退速度一致 digitalWrite(Wheel_L_DIR,HIGH); analogWrite(Wheel_L_SIG,170); // 修改數值讓後退速度一致 } void turnRight() //向右轉副程式 { digitalWrite(Wheel_R_DIR,HIGH); analogWrite(Wheel_R_SIG,100); digitalWrite(Wheel_L_DIR,HIGH); analogWrite(Wheel_L_SIG,150); //右轉時左輪動比較快 } void turnLeft() //向左轉副程式 { digitalWrite(Wheel_R_DIR,LOW); analogWrite(Wheel_R_SIG,150); //左轉時右輪動比較快 digitalWrite(Wheel_L_DIR,LOW); analogWrite(Wheel_L_SIG,100); } void Backward()//向後退副程式 { digitalWrite(Wheel_R_DIR,HIGH); analogWrite(Wheel_R_SIG,185); // 修改數值讓前進速度一致 digitalWrite(Wheel_L_DIR,LOW); analogWrite(Wheel_L_SIG,170); // 修改數值讓前進速度一致 } //--------------- 副程式 : 發送感測資料 ------------------- void collectData() { get_dust(); //呼叫get_dust()函式取得灰塵濃度ud Data[0]='a'; //資料傳輸header第1位元 = 'a' int chk = faya_dht11.read11(DHTPIN); // 讀取並儲存溫濕度資料 Data[1]=faya_dht11.temperature; //資料傳輸第2位元 = '溫度值' <70 所以只佔1個byte Data[2]=faya_dht11.humidity; //資料傳輸第3位元 = '濕度值' <100 所以只佔1個byte Data[3]=ud/256; //資料傳輸第4位元 = '灰塵濃度' 0~1300 之間,會佔2個byte,取商數得到高位元byte數 Data[4]=ud%256; //資料傳輸第5位元 = '灰塵濃度' 0~1300 之間,會佔2個byte,取餘數得到低位元byte數 for(int i=0;i<=4;i++){ fayaBT.write(Data[i]); //收集完資料受,將資料透過藍傳到手機端 } command='0'; //資料歸0 } void get_dust() { while (Serial.available()>0) { data=Serial.read(); if(data == 170) // 170 = 0xaa, 起始字節 { z=0; // 字節計數歸零 incomeByte[z]=data; // 將data存到第0個字節(0Xaa) } else { z++; incomeByte[z]=data; // 依序儲存第1字節到第6字節的資料 } if(z==6) //儲存完七個字節後 { sum=incomeByte[1]+ incomeByte[2]+ incomeByte[3] + incomeByte[4]; //加總字節1~4 if(incomeByte[5]==sum && incomeByte[6]==255 ) //比對加總後是否和字節5(校驗位)相同,並且字節6是否為結束位元 0xff { float vo=(incomeByte[1]*256.0+incomeByte[2])*5/1024.0; ud=vo*A; //粉塵濃度 Ud= Vout x A } else { Serial.flush(); //確認傳送緩衝區資料傳送完畢 data='/0'; for(int m=0;m<7;m++){ incomeByte[m]=0; // 七個字節內的資料歸零 } z=0; // Z=6後 } } } }