Robofun 機器人論壇

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

請問DHT11如果要傳送到手機

[複製鏈接]
1#
發表於 2017-10-6 21:05:28 | 顯示全部樓層
1.dht11不是這樣用的
不是用 analogread
2. 0~5
3.當然可以分開顯示
2#
發表於 2017-10-23 18:00:18 | 顯示全部樓層
1. DHT11 應該就是你貼的這個程式
2. 要上傳成什麼格式都OK
   但 APP Inventor 那邊程式, 你會改嗎?

3#
發表於 2017-10-23 18:35:07 | 顯示全部樓層
雖然我沒跑過這個 app,
, 但感覺上, 應該是有問題的
其實你應該利用目前可用的 app 程式來修改
第一次傳超音波, 等一段時間再傳温度, 再等一段時間傳濕度,  周而復始
   packet[0] = 97; //key send to phone
   packet[1] = sendData / 256; //divides sendData to two 1 byte packets
   packet[2] = sendData % 256;

for(int i = 0; i < 3; i++)
             Serial.write(packet[ i]); //send packet to phone
APP 還是固定送97 去要資料
但 Arduino 端
利用  packet[0] 的值來讓 APP 知道這次傳的什麼
而且每次都固定 3 BYTES
例如  packet[0] = 97 是超音波, 98 是温度, 99是濕度
而 packet[1] , packet[2]  就是相對應的資料
這樣應該比較簡單
4#
發表於 2017-10-23 19:45:06 | 顯示全部樓層
不對
arduino端
只需寫 case97, 然後多宣告一個變數
unsigned char state;
void loop(){
..........
case 97:
if(++state >= 3){
  state = 0;
  packet[0]=97;

} else if(state == 2){
  packet[0] =98;
....
} else {
   packet[0] =99;
.......
}
app 端也有錯
當 avaiable > 0時
只需將資料讀出一次
但你讀了三次
應該把它讀出來,放在變數中
再去判斷它是 97,98或99
5#
發表於 2017-10-23 20:28:25 | 顯示全部樓層
或是直接用 switch(reciveunsigned1bytenumber)
可以省下一個變數


另外,你應該用的是
reciveunsigned1bytenumber
而不是
recivesigned1bytenumber
所有的函數都要改掉
6#
發表於 2017-10-24 08:24:53 | 顯示全部樓層
怎麼寫都可以, 只要和APP端格式相同即可
不用特別傳 'b', 'c' 這些字元
void loop (){
    byte Data[7];

    int x=analogRead(A0);//read sensor value
    int y=digitalRead(A1);//read sensor value
    int z=digitalRead(A2);//read sensor value
   
    Data[0]='a';
    Data[1]=x/256;
    Data[2]=x%256;
    Data[3]=y/256;
    Data[4]=y%256;
    Data[5]=z/256;
    Data[6]=z%256;
     
    if(Serial.available() > 0) {
     byte serialA=Serial.read();
     if (serialA == 97){
         for(int j=0;j<7;j++)
           Serial.write(Data[j]);        
      }
   }
}

>>我使用超音波回傳到手機的功能是有的
前提是你用了那一個 APP Inventor 程式
這個問題會出現在, 當距離大於 127 時
如128, 它會得到一個負數, 相當於 -128
最早之前的那 app, 他會多此一舉, 讀回負值後, 再加 256 回去
所以又變回 256+(-128)=128, 所以結果也沒問題
其實只要使用 unsigned 去讀, 就不用再處理
直接 reciveunsigned1bytenumber*256+reciveunsigned1bytenumber
即可

而上面那個 app, 是使用
recivesigned1bytenumber*256+recivesigned1bytenumber
應該錯的, 難道可以測量超過 127 cm的資料, 而不會有錯嗎?
7#
發表於 2017-10-25 12:17:01 | 顯示全部樓層
>>請問 如果x是要讀取超音波的數值  超音波不是有trig跟echo  那我要把A0改成什麼?
我以為你是要我把程式簡化,
才叫我用 analogread/digitalRead 做範例的

想要讀超音波, 就用(以下是擷取自你的程式)
digitalWrite(trig, HIGH); //trigger sona for 1 ms
delayMicroseconds(1000);
digitalWrite(trig, LOW);
int x = pulseIn(echo, HIGH);
.....
想要讀温濕度, 就用(以下是擷取自你的程式)
int y = dht.readHumidity();
int z = dht.readTemperature();
.......
這些不是你已經的試過, 而已可以正作工作的程式
把那些程式整合在一起就可以了
8#
發表於 2017-10-25 19:50:57 | 顯示全部樓層
本帖最後由 超新手 於 2017-10-25 19:59 編輯

找不到 dht.h 檔
Dht library 不是預設的
如果你曾經成功過
去 arduino/libraries 目錄下找看看是不是有這個檔案
沒有,就再copy 進去即可
或改成
#include "dht.h" 試試看
9#
發表於 2017-10-25 20:10:58 | 顯示全部樓層
改成 雙引號也不行嗎?
10#
發表於 2017-10-25 20:18:57 來自手機 | 顯示全部樓層
它一定有範例,直接開它的範例試試看
11#
發表於 2017-10-31 18:58:57 | 顯示全部樓層
沒看到你有宣告?
DHT dht(DHTPIN, DHTTYPE);
12#
發表於 2017-10-31 21:50:56 來自手機 | 顯示全部樓層
1.資料往下設即可
data[6]=senddata/256;
data[7]=senddata%256;
2.陣列要宣告到data[8]
3.serial.write 要送 8個位元
4. i2c .....當然是多餘的
13#
發表於 2017-11-1 14:45:09 來自手機 | 顯示全部樓層
1. i < 7 才是 7 個
2. serial.write(data[ i]);
打錯字了
14#
發表於 2017-11-1 17:29:47 | 顯示全部樓層
你宣告了兩次 data
一次是 data[7],一次是 data[3]
其實從 data[3]到float hic
這幾行都是多餘的
沒看到你有用過它來做過什麼
15#
發表於 2017-11-3 16:22:14 | 顯示全部樓層
你已經在上面讀了一次
int y = dht.readHumidity();
int z = dht.readTemperature();
然後下面再讀一次
float h = dht.readHumidity();
float t = dht.readTemperature();
第二次這個值 h, t, 從頭到尾也沒看到你用過
其他也一樣, 就多讀而已
當然, 放著也不會怎麼樣..
16#
發表於 2017-11-7 19:17:07 來自手機 | 顯示全部樓層
本帖最後由 超新手 於 2017-11-7 19:22 編輯

1.怎麼寫都可以,只要兩邊一致就可以
2. 要傳幾個 byte,當然要宣告足夠記憶體
byte data[9];
17#
發表於 2017-11-7 19:52:33 來自手機 | 顯示全部樓層
本帖最後由 超新手 於 2017-11-7 20:05 編輯

你少打;在'b'和'c'後面
='b';
='c';
18#
發表於 2017-11-7 20:51:47 來自手機 | 顯示全部樓層
這個 app , 應該不行。七樓寫的還比較對
19#
發表於 2017-11-8 17:35:54 | 顯示全部樓層
1,. 我說不行的是39樓的 APP, 這個初步看還 OK
2. >>超音波那部分 不用像其他的一開始給他初始值
我不確知道你說的是什麼
3. ReceiveSigned1ByteNumber 才需要+256
這是多此一舉的作法
直接用 ReceiveUnsigned1ByteNumber 即可
尤其是所有的數字都是正值

例如, 如果你送 255 給手機(也就是0xFF)
如果使用 ReceiveSigned1ByteNumber 去收, 手機會收到 -1 的值(-1=0xFF=255)
但如果使用 ReceiveUnsigned1ByteNumber 去收, 手機會收到 255 的值(0xFF=255)
雖然都收到 0xFF, 但是手機端認為收到的是正數, 就會解讀為 255
但是手機端認為收到的是負數, 就會解讀為 -1
但是 -1 並不是正確數字
因為我們"應該"傳的都是正數
不可能有負數這種數字
所以你可以看到APP程式中
一旦收到 < 0 的值
他會加 256, 也就是 256-1=255
只是多此一舉而已
20#
發表於 2017-11-8 17:42:05 | 顯示全部樓層
至於 APP 不太正常的問題
有可能是APP程式簡略的寫法所造成
其實這個APP沒寫的很好
只要 BYTEAVAILABLETORECEIVE > 0
它就開始去讀
而且後面根本連確認都沒確認, 就直接
ReceiveUnsigned1ByteNumber
但是搞不好此時才收到 1 個 BYTE,
尤其你傳的資料量一多, 問題就可能會出來

您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-5-4 15:20 , Processed in 0.251836 second(s), 6 queries , Apc On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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