Robofun 機器人論壇

 找回密碼
 申請會員
搜索
熱搜: 活動 交友 discuz
樓主: RJay

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

[複製鏈接]
發表於 2018-2-20 06:56:56 | 顯示全部樓層
本帖最後由 超新手 於 2018-2-20 06:58 編輯

紅色部分自己修改,可別照抄
unsigned char f=0;
void loop(){
.............
   if(f) {
     if(ir沒偵測到人){
         f=0;
         digitalwrite(led,low);
      }
   } else {
       if(ir偵測到人){
         f=1;
         digitalwrite(led,high);
      }
   }
}
 樓主| 發表於 2018-2-20 10:52:56 | 顯示全部樓層
本帖最後由 RJay 於 2018-2-20 10:54 編輯

請問我現在連接藍芽後APP變得非常卡頓
這是甚麼原因
APP
APP2.png
APP.png
arduino
void loop() {
  int a = analogRead(smoke);
  int b = dht.readHumidity();
  int c = dht.readTemperature();
  int d = dht.readTemperature(true);
  byte Data[12];
  Data[0]=97;
  Data[1]=a/256;
  Data[2]=a%256;
  Data[3]='b';
  Data[4]=b/256;
  Data[5]=b%256;
  Data[6]='c';
  Data[7]=c/256;
  Data[8]=c%256;
  Data[9]='d';
  Data[10]=d/256;
  Data[11]=d%256;
  
if (Serial.available() > 0) {
    char val = Serial.read();
    switch (val) {
      case 1:
        for (int i = 0 ; i < 12 ; i++)
        Serial.write(Data);
        delay(100);
        break;   
      case 2:
        digitalWrite(fan, HIGH);
        break;
      case 3:
        digitalWrite(fan, LOW);
        break;
    }
}
if (a>380){
   digitalWrite(bz,HIGH);
   }
   else{
   digitalWrite(bz,LOW);
   }
   R=digitalRead(red);
   if(R1){
   if(R == LOW){
      Serial.write(0);
      delay(500);
      R1=0;
      digitalWrite(led,LOW);
  }
  }
   else{
   if(R==HIGH){
      Serial.write(1);
      delay(500);
      R1=1;
      digitalWrite(led,HIGH);
  }
}
    if(digitalRead(button) == HIGH)
    if(digitalRead(led) == HIGH){
       digitalWrite(led, LOW);
       delay(500);
      }
    else{
       digitalWrite(led, HIGH);
       delay(500);
      }
發表於 2018-2-20 10:57:20 來自手機 | 顯示全部樓層
因為你加了 delay(500). 這樣做,每0.5秒才會處理一次命令
發表於 2018-2-20 11:12:51 來自手機 | 顯示全部樓層
你可不可以不要省略 if(digitalRead(button) == HIGH) 的括號?我有點搞不清楚你要做什麼了?感覺上 ir 和按鍵的邏輯會互相衝突
 樓主| 發表於 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端連接到藍芽就會黑屏然後無回應 是不是因為很多感應器都用在一起的關係
 樓主| 發表於 2018-2-20 15:25:48 | 顯示全部樓層
現在只要連到藍芽都很卡 不管有沒有傳資料 這是哪裡出了問題@@
發表於 2018-2-20 16:13:10 | 顯示全部樓層
上面已經回答了...
你加了delay(500),才會卡卡
黑屏應該是 serial.write(0) 和  serial.write(1) 造成的
這樣寫都是錯(不好)的
 樓主| 發表於 2018-2-20 16:34:21 | 顯示全部樓層
可是現在我就算把它去掉 或是用其他比較簡單的程式連到就會卡住了
 樓主| 發表於 2018-2-20 17:08:21 | 顯示全部樓層
我現在找到問題了
那請問發出1或0這個動作要怎麼寫才是對的
發表於 2018-2-20 17:31:53 | 顯示全部樓層
寫在 data 那邊,要改的地方“至少“有三個
1.原來只需 12 個 bytes
現在宣告成 13 bytes
2.第12個 byte 的值是 0 或1,由 ir 決定
3. 本來要傳12bytes,改傳 13 bytrs
當然, app 也要一起修改
 樓主| 發表於 2018-2-20 19:29:26 | 顯示全部樓層
現在按鈕出了個問題 有時候會衝突到 而且他會莫名其妙地把我的arduino reset
請問這要怎麼處理
發表於 2018-2-20 19:51:09 來自手機 | 顯示全部樓層
可以先把程式全部貼出來嗎?
 樓主| 發表於 2018-2-20 20:14:48 | 顯示全部樓層
#include <SoftwareSerial.h>
#include <DHT.h>   
#define DHTTYPE DHT22
const int smoke=A5;
const int tem=2;
const int red=3;
const int button=4;
const int fan=12;
const int led=13;
int R;
unsigned char R1=0;
DHT dht(tem, DHTTYPE);
void setup() {
  Serial.begin(9600);
  pinMode(smoke,INPUT);
  pinMode(tem,INPUT);
  pinMode(red,INPUT);
  pinMode(button,INPUT);
  pinMode(fan,OUTPUT);
  pinMode(led,OUTPUT);
  dht.begin();
}
void loop() {
  R=digitalRead(red);
  int a = analogRead(smoke);
  int b = dht.readHumidity();
  int c = dht.readTemperature();
  int d = dht.readTemperature(true);
  byte Data[13];
  Data[0]=97;
  Data[1]=a/256;
  Data[2]=a%256;
  Data[3]='b';
  Data[4]=b/256;
  Data[5]=b%256;
  Data[6]='c';
  Data[7]=c/256;
  Data[8]=c%256;
  Data[9]='d';
  Data[10]=d/256;
  Data[11]=d%256;
  if(R == HIGH){
      Data[12]='e';
  }
   if(R==LOW){
      Data[12]='f';
  }
if (Serial.available() > 0) {
    char val = Serial.read();
    switch (val) {
      case 1:
        for (int i = 0 ; i < 13 ; i++)
        Serial.write(Data[i]);
        delay(100);
        break;   
      case 2:
        digitalWrite(fan, HIGH);
        break;
      case 3:
        digitalWrite(fan, LOW);
        break;
    }
}
if(R1){
if(R == LOW){
      R1=0;
      digitalWrite(led,LOW);
      }
}
else{
if(R==HIGH){
      R1=1;
      digitalWrite(led,HIGH);
      }
}
if(digitalRead(button) == HIGH){
    if(digitalRead(led) == HIGH){
       digitalWrite(led, LOW);
       delay(500);
      }
    else{
       digitalWrite(led, HIGH);
       delay(500);
      }
}
}
發表於 2018-2-20 20:44:38 | 顯示全部樓層
1.看不出那邊有問題,你的 button 怎麼接?
    你應該是直接用 arduino 上的led,
    而沒有另外再接 led 吧?
2. 最後幾行那個 button 的功能是?
    怎麼看都覺得很怪
    照理說,我猜你要做的功能應該是
    1) 如果button是關(High),不管有沒有人
      ,led都是關
    2)如果button是開(low),Led 會根據 ir 有沒有
        偵測到人,來決定led要不要開關才是
   
 樓主| 發表於 2018-2-20 20:56:00 | 顯示全部樓層
我有在接1顆LED
差不多 就是偵測到人 led亮  在這同時也可以把led關掉或再次打開(有感應到人的情況下) 就是偵測到人的那時候亮1次之後就一直亮就好 沒偵測到人就關掉 又偵測到人的時候開啟led....loop(也要可以用手機APP開關)
但是我的按鈕是按下去會起來那種 這我就不知道怎用
發表於 2018-2-21 06:07:40 | 顯示全部樓層
>>if(digitalRead(button) == HIGH){
從程式來看, 你的 button 是 high 動作
一般來說,很少看到 high 動作的 button
因為這樣做,硬體接線會比較多一點
你的 button 是怎麼接到 arduino 的?
發表於 2018-2-21 11:36:20 | 顯示全部樓層
RJay 發表於 2018-2-18 11:06
喔喔喔!我成功了 謝謝救援

你好
請問一下
appinventor的字型怎麼改的跟你這張圖片一樣??
謝謝!!
 樓主| 發表於 2018-2-21 16:39:14 | 顯示全部樓層
qzec0910266 發表於 2018-2-21 11:36
你好
請問一下
appinventor的字型怎麼改的跟你這張圖片一樣??

這是手機的畫面 應該是改手機字型吧?
 樓主| 發表於 2018-2-21 16:41:14 | 顯示全部樓層
上面一邊接4下面對角接5V下面另一角接GND
我是想說讓他按下去就會開(關)
發表於 2018-2-21 17:26:27 | 顯示全部樓層
本帖最後由 超新手 於 2018-2-21 19:21 編輯

接 5V 和 GND?
你這樣接. 一按下去不就短路了嗎?
我是不太清楚你是用那種按鍵

一般都一邊接地, 一邊接 MCU, 然後
pinMode(button,INPUT_PULLUP);
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-3-29 18:36 , Processed in 0.138238 second(s), 7 queries , Apc On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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