frongle 發表於 2018-12-24 19:23:31

關於藍芽互傳兩個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:17

本帖最後由 超新手 於 2018-12-24 20:28 編輯

只要在人數變化的時候,主動送人數資料給從端程式即可
也就是在
inroom = inroom - 1;       //房間人數-1

inroom = inroom + 1;       //房間人數+1
的後面, 呼叫 BT.print(其實用 bt.write 即可)
然後根據人數
送 '0' 或 '1' 給 從端程式 即可

超新手 發表於 2018-12-25 08:58:52

本帖最後由 超新手 於 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:16

我不太懂後後面的意思
頁: [1]
查看完整版本: 關於藍芽互傳兩個arduino變數問題