Robofun 機器人論壇

 找回密碼
 申請會員
搜索
熱搜: 活動 交友 discuz
查看: 14429|回復: 64
打印 上一主題 下一主題

Arduino藍芽感測器訊號傳給手機

[複製鏈接]
跳轉到指定樓層
1#
發表於 2018-2-16 00:55:49 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
想請問如果我loop裡面打這些

//煙霧
  S=analogRead(smoke);
  Serial.print("煙霧濃度:");
  Serial.println(S);
  delay(500);
  
//溫溼度
  float h = dht.readHumidity();
  float t = dht.readTemperature();
  float f = dht.readTemperature(true);
  float hif = dht.computeHeatIndex(f, h);
  float hic = dht.computeHeatIndex(t, h, false);
  Serial.print("Humidity: ");
  Serial.print(h);                    
  Serial.print(" %\t");
  Serial.print("Temperature: ");
  Serial.print(t);                    
  Serial.print(" *C ");
  Serial.print(f);                    
  Serial.print(" *F\t");
  Serial.print("Heat index: ");
  Serial.print(hic);                 
  Serial.print(" *C ");
  Serial.print(hif);                  
  Serial.println(" *F");
  delay(500);


  //紅外線
  R=digitalRead(red);
  if(R==HIGH)
  {
  Serial.println("有人!");
  digitalWrite(LEDR,HIGH);
  }
  else
  {
  Serial.println("沒有人");
  digitalWrite(LEDR,LOW);
  }
  delay(500);

以上都還只是測試用
但是我要如何把資料傳給APP INVENTOR2的APP
網路上爬過也試過很多
也曾使用過這個

接收到序列阜的資料

但是我有這種的感測器

這樣就會一堆數值堆在一個標籤裡面

請問我要如何讓他判斷一個感測到的數值到要到他一個正確的位置
推薦
 樓主| 發表於 2018-2-20 11:38:02 | 只看該作者
請問改成這樣是對的嗎
R=digitalRead(red);
if(R1){
if(R == LOW){
      Serial.write(0);
      R1=0;
      digitalWrite(led,LOW);
}
}
else{
   if(R==HIGH){
      Serial.write(1);
      R1=1;
      digitalWrite(led,HIGH);
  }
}
if(digitalRead(button) == HIGH){
if(digitalRead(led) == HIGH){
       digitalWrite(led, LOW);
       delay(500);
      }
else{
       digitalWrite(led, HIGH);
       delay(500);
      }
    }
紅外線那邊可以用按鈕控制燈(無論有沒有感應到)
APP端連接到藍芽就會黑屏然後無回應 是不是因為很多感應器都用在一起的關係
3#
發表於 2018-2-16 07:34:03 來自手機 | 只看該作者
找一下之前的討論串“請問DHT11如果要傳送到手機”
4#
 樓主| 發表於 2018-2-16 23:36:08 | 只看該作者

這是我看你推薦的那一篇文章照著做出來的
以下Arduino端程式
#include <SoftwareSerial.h>
SoftwareSerial I2CBT(0,1);
#include <DHT.h>     
#define DHTTYPE DHT22
const int smoke=2;
const int tem=3;
DHT dht(tem, DHTTYPE);
void setup() {
  Serial.begin(9600);
  pinMode(smoke,INPUT);
  pinMode(tem,INPUT);
  dht.begin();
}
void loop() {
  int x = analogRead(smoke);
  int y = dht.readHumidity();
  int z = dht.readTemperature();
  int a = dht.readTemperature(true);
  byte Data[12];
  Data[0]=97;
  Data[1]=x/256;
  Data[2]=x%256;
  Data[3]='b';
  Data[4]=y/256;
  Data[5]=y%256;
  Data[6]='c';
  Data[7]=z/256;
  Data[8]=z%256;
  Data[9]='d';
  Data[10]=a/256;
  Data[11]=a%256;
  
if (Serial.available() > 0) {
    char val = Serial.read();
    switch (val) {
      case 97:
        for (int i = 0 ; i < 9 ; i++) {
          Serial.write(Data);
          break;
        }
    }
}
}
有很多地方都搞不清楚為甚麼 為甚麼會這樣
像是APP的接收1無位元支無號數是 97 98 99
上面應該有不少錯 因為東西出不來
第一次做兩個連接的 有很多不懂
希望能告訴哪裡有誤 謝謝
5#
發表於 2018-2-17 07:55:31 | 只看該作者
1.因為送出的第0,3,6,9 個 byte
   分別就是 97, 98,99,100
   其中 ′b' 的 ascii code 就是 98, ′c′ 就是 99......
   寫法不同,但結果相同
    可以直接改成 98,99,100,比較直覺
2. 請先確定你的藍牙是否也接在 0 和 1接腳
3. 程式寫錯,那個 serial.write 的 for loop
    應該是 12, 不是 9
6#
 樓主| 發表於 2018-2-17 21:40:53 | 只看該作者
本帖最後由 RJay 於 2018-2-17 21:46 編輯

請問藍芽SoftwareSerial I2CBT(0,1);這一行 0代表RX 1代表TX是嗎 藍芽的那一端就要相反接?
我只有煙霧濃度出現249.29 而且不會變動 是不是哪裡還有問題(接線沒有問題Serial.print 會顯示);
7#
發表於 2018-2-18 00:18:45 | 只看該作者
本帖最後由 超新手 於 2018-2-18 00:48 編輯

1. 你根本沒用到 i2cbt. 那行是多餘的
     既然你可以收到資料,即使是錯的
     我猜接線應該就沒問題了吧?
2. break 也寫錯了,應該在迴圈外
這樣只會執行一次
應該是
case 97:
        for (int i = 0 ; i <12 ; i++) {
          Serial.write(Data[ i]);
        }
break;
8#
 樓主| 發表於 2018-2-18 11:06:27 | 只看該作者
喔喔喔!我成功了 謝謝救援
9#
 樓主| 發表於 2018-2-18 17:51:45 | 只看該作者
我想再請問一下 那如果是紅外線感測器這種
要如何讓手機不顯示數值 只顯示 有/沒有 人這樣的
10#
發表於 2018-2-18 18:09:03 | 只看該作者
Arduino端
如果讀到 high,就傳 1,讀到 low. 就傳 0
手機端
直接判斷讀到的是 0 或 1,顯示不同文字即可
11#
 樓主| 發表於 2018-2-18 20:34:49 | 只看該作者
請問如果我紅外線感應到人 然後LED亮 沒人就滅
我要如何在感應到人的情下把LED關掉然後再次感應到人的時候開啟
12#
發表於 2018-2-18 21:01:53 | 只看該作者
要新增一個變數,
如果有偵測到人,就把這個變數設為1
如果這個變數是1,就不再偵測
沒偵測到人,再把這個變數設為0
13#
 樓主| 發表於 2018-2-18 22:40:07 | 只看該作者
這樣好像可以 那請問這個變數要在哪裡設定呢
那要如何把LED關掉
14#
發表於 2018-2-19 10:27:05 | 只看該作者
開關 led 一般都用 digitalwrite
如 digitalwrite(接腳, high);或
digitalwrite(接腳, low);
15#
 樓主| 發表於 2018-2-19 10:43:46 | 只看該作者
假如我進房間 紅外線感測器感應到我 燈(LED)自動打開
但是我要關燈 不過我在房間裡 我用手機操控她把它關掉 直到我出去 再次進入在打開燈(LED)
(還要可以用按鈕開關燈)這樣的情形可以嗎
17#
 樓主| 發表於 2018-2-19 16:37:54 | 只看該作者
本帖最後由 RJay 於 2018-2-19 16:39 編輯

我現在只能用這個按鈕控制LED
if(digitalRead(button) == HIGH)
if(digitalRead(led) == HIGH){
       digitalWrite(led, LOW);
       delay(500);
}
else{
       digitalWrite(led, HIGH);
       delay(500);
}
但我不知道怎麼用偵測到人的時候還可以把led關閉
如果我把它用成這樣
if(紅外線感測器 == HIGH){
digitalWrite(led, HIGH);
if(digitalRead(button) == HIGH)
if(digitalRead(led) == HIGH){
       digitalWrite(led, LOW);
       delay(500);
}
else{
       digitalWrite(led, HIGH);
       delay(500);
}
}
else
digitalWrite(led, LOW);
偵測到的時候會不受控制 因為她會一直把led打開
請問這要如何解決
18#
發表於 2018-2-19 18:01:29 | 只看該作者
你應該不是要用按鍵吧?要達成你說的功能,應該先在程式最上面宣告一個變數吧?
還是你最後決定要改用按鍵?
19#
 樓主| 發表於 2018-2-19 18:07:20 | 只看該作者
那請問要用甚麼方法做呢 除了紅外線開燈(LED) 還要可以手動跟用手機APP開關燈(LED)
還需要甚麼元件或是程式要怎麼改
20#
發表於 2018-2-19 21:14:50 | 只看該作者
上面有寫......
要新增一個變數,
如果有偵測到人,就把這個變數設為1
如果這個變數是1,就不再偵測
沒偵測到人,再把這個變數設為0
21#
 樓主| 發表於 2018-2-20 00:00:17 | 只看該作者
請問我要怎麼讓感應器不再偵測
請問能寫個範例嗎 我試了一下發現我想不通 加入LED都會亂亮(按按鈕的時候)
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

小黑屋|手機版|Archiver|機器人論壇 from 2005.07

GMT+8, 2024-11-22 05:57 , Processed in 0.208601 second(s), 9 queries , Apc On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表