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 編輯

至於要怎樣做成你要的功能
首先要先想辦法把迴圈分解,
才能在收命令的同時, 也可以轉馬達
也就是


  1. 宣告兩個變數
  2. int Delay, State;
  3. void loop() {
  4. if (BT.available()) {
  5. val = BT.read();
  6. ......
  7. }
  8. if(Delay) {
  9.   Delay--;
  10. } else if(State == 1) {
  11.   POS 加 1, 當 POS 大於 180, 將 State = 2
  12.   然後servo轉至 POS的位置
  13. } else if(State == 2) {
  14.   POS 減 1, 當 POS 等於 0, 將 State = 0
  15.   然後servo轉至 POS的位置
  16. }
  17. delay(15);

  18. }
複製代碼

這樣, 只要根據 BT.read() 的讀值
去設定   Delay,  State 和 pos 的值
就可以達到你要的結果

作者: frongle    時間: 2018-12-25 19:28
我不太懂後後面的意思




歡迎光臨 Robofun 機器人論壇 (https://robofun.net/forum/) Powered by Discuz! X3.2