Robofun 機器人論壇
標題:
關於藍芽互傳兩個arduino變數問題
[打印本頁]
作者:
frongle
時間:
2018-12-24 19:23
標題:
關於藍芽互傳兩個arduino變數問題
我想要將經過計算後的變數傳給從端的arduino板子,好讓從端的馬達動作,但我所寫的程式沒有讓從端動作,目前能成功的只有從序列阜監控視窗輸入能成功動作,換作是直接傳送經計算的變數就不行了,希望有高手能幫我找出問題
主端程式如下:
#include <SoftwareSerial.h> // 引用程式庫
int sensor1 = 11;
int sensor2 = 10;
int a = 0 , b = 0;
int c = -1 , d = -1;
int inroom = 0;
// 定義連接藍牙模組的序列埠
SoftwareSerial BT(8, 9); // 接收腳, 傳送腳
char val; // 儲存接收資料的變數
void setup() {
Serial.begin(9600); // 與電腦序列埠連線
Serial.println("BT is ready!");
// 藍牙透傳模式的預設連線速率。
BT.begin(9600);
pinMode(sensor1,INPUT);
pinMode(sensor2,INPUT);
}
void loop() {
a = digitalRead(sensor1);
b = digitalRead(sensor2);
if ((c != a) || (d != b)) //人體進出判斷
{
if ((c == 1) && (d == 0) && (a == 1) && (b == 1))
{
Serial.println("out");
inroom = inroom - 1; //房間人數-1
}
if ((c == 0) && (d == 1) && (a == 1) && (b == 1))
{
Serial.println("in");
inroom = inroom + 1; //房間人數+1
}
c = a;
d = b;
}
if (inroom != 0)
{
val = '0';
}
if (inroom == 0)
{
val = '1' ;
}
// 若收到「序列埠監控視窗」的資料,則送到藍牙模組
if (Serial.available()) {
BT.print(val);
Serial.println(val);
}
// 若收到藍牙模組的資料,則送到「序列埠監控視窗」
if (BT.available()) {
val = BT.read();
Serial.print(val);
}
}
從端程式目前沒有問題,但還是丟上來,順便問一下,如果我希望在房間人數為0時讓馬達延遲30秒動作,期間房間人數變為>0時就停止計算那30秒,馬達也不會動作,整個程式從頭來過,我該怎麼寫,這也是我想很久的問題
#include <SoftwareSerial.h> // 引用程式庫
#include <Servo.h>
Servo myservo; // 建立一個 servo 物件,最多可建立 12個 servo
int pos = 0; // 設定 Servo 位置的變數
int a;
// 定義連接藍牙模組的序列埠
SoftwareSerial BT(8, 9); // 接收腳, 傳送腳
char val; // 儲存接收資料的變數
const byte LED_PIN = 13; // 定義LED腳位
void setup() {
Serial.begin(9600);
// 設定HC-05藍牙模組,AT命令模式的連線速率。
BT.begin(9600);
pinMode(LED_PIN, OUTPUT);
myservo.attach(10); // 將 servo 物件連接到 pin 10
}
void loop() {
// 若收到藍牙模組的資料,則送到「序列埠監控視窗」
if (BT.available()) {
val = BT.read();
Serial.println(val);
if (val != '0')
{}
else if (val == '0')
{
// 正轉 180度
for (pos = 0; pos <= 180; pos += 1) // 從 0 度旋轉到 180 度,每次 1 度
{
myservo.write(pos); // 告訴 servo 走到 'pos' 的位置
delay(15); // 等待 15ms 讓 servo 走到指定位置
}
// 反轉 180度
for (pos = 180; pos >= 0; pos -= 1) // 從 180 度旋轉到 0 度,每次 1 度
{
myservo.write(pos); // 告訴 servo 走到 'pos' 的位置
delay(15); // 等待 15ms 讓 servo 走到指定位置
}
}
}
}
最後,謝謝願意協助的你~
作者:
超新手
時間:
2018-12-24 19:45
本帖最後由 超新手 於 2018-12-24 20:28 編輯
只要在人數變化的時候,主動送人數資料給從端程式即可
也就是在
inroom = inroom - 1; //房間人數-1
和
inroom = inroom + 1; //房間人數+1
的後面, 呼叫 BT.print(其實用 bt.write 即可)
然後根據人數
送 '0' 或 '1' 給 從端程式 即可
作者:
超新手
時間:
2018-12-25 08:58
本帖最後由 超新手 於 2018-12-25 09:04 編輯
至於要怎樣做成你要的功能
首先要先想辦法把迴圈分解,
才能在收命令的同時, 也可以轉馬達
也就是
宣告兩個變數
int Delay, State;
void loop() {
if (BT.available()) {
val = BT.read();
......
}
if(Delay) {
Delay--;
} else if(State == 1) {
POS 加 1, 當 POS 大於 180, 將 State = 2
然後servo轉至 POS的位置
} else if(State == 2) {
POS 減 1, 當 POS 等於 0, 將 State = 0
然後servo轉至 POS的位置
}
delay(15);
}
複製代碼
這樣, 只要根據 BT.read() 的讀值
去設定 Delay, State 和 pos 的值
就可以達到你要的結果
作者:
frongle
時間:
2018-12-25 19:28
我不太懂後後面的意思
歡迎光臨 Robofun 機器人論壇 (https://robofun.net/forum/)
Powered by Discuz! X3.2