Robofun 機器人論壇

 找回密碼
 申請會員
搜索
熱搜: 活動 交友 discuz
查看: 442|回復: 78

請問DHT11如果要傳送到手機

[複製鏈接]
發表於 2017-10-6 19:48:33 | 顯示全部樓層 |閱讀模式
本帖最後由 leo0983405269 於 2017-10-6 19:59 編輯

#include <SoftwareSerial.h>
#include <Wire.h>
SoftwareSerial I2CBT(10,11); // TX:10, RX:11
byte serialA;

void setup(){
  Serial.begin(9600);
  I2CBT.begin(9600);
}

void loop (){
    byte Data[6];
    byte cmmd[20];
    int insize;
    int x=analogRead(A0);//read sensor value
    int y=analogRead(A0);//read sensor value

    serialA=I2CBT.read();
    Data[0]='a';
    Data[1]=x/256;
    Data[2]=x%256;
    Data[3]='b';
    Data[4]=y/256;
    Data[5]=y%256;
     Serial.print(x);
     Serial.print(" , ");
     Serial.println(y);

     if (serialA == 49){
         for(int j=0;j<5;j++)
         I2CBT.write(Data[j]);
         serialA=0;
      }
  delay(100);
}

請問我使用DHT11這個arduino的溫濕度感應
我腳位接在A0
那我讀取資料都是從A0裡面得到
那這樣資料算是一筆溫度溼度還是兩筆資料溫度跟溼度
arduino是應該寫成Data[0]到[2]還是Data[0]到Data[5]
如果是0~2這樣他讀取資料不是應該只有一筆嗎?
那如果我想在手機端顯示的部分分成
溫度跟溼度分開顯示有辦法嗎?

麻煩各位謝謝


另外想問
是不是要在前面加上去下面那行在最頂端
#include "DHT.h"
我已經有加入資料庫了

  
發表於 2017-10-6 21:05:28 | 顯示全部樓層
1.dht11不是這樣用的
不是用 analogread
2. 0~5
3.當然可以分開顯示
 樓主| 發表於 2017-10-11 09:24:03 | 顯示全部樓層
好  我再試試看  抱歉
 樓主| 發表於 2017-10-18 18:21:47 | 顯示全部樓層
1.dht11不是這樣用的
不是用 analogread

請問第一段話  dht11不是這樣用的
是這段程式不對還是錯在analogread這邊而已
還是整個都不行這樣用
我查過之後發現DHT11是數位資料
如果您要換成其他元件,例如數位感測器的話,做法是一樣的。請先看一下這個元件的資料範圍是多少。
這是我找的資料可是它的範例是類比
那我應該是改成digitalWrite(A0)這樣就可以嗎?
下面這個範例我有試出來
是一樣把Serial.print的都註解掉
然後修改成類似一開始上傳的程式碼傳送資料這樣嗎?
#include "DHT.h"
#define DHTPIN 2   
#define DHTTYPE DHT11   

DHT dht(DHTPIN, DHTTYPE); // Initialize DHT sensor

void setup() {
  Serial.begin(9600);
  Serial.println("DHT11 test!");
  dht.begin();
  }

void loop() {
  delay(2000);
  float h = dht.readHumidity();
  float t = dht.readTemperature();
  float f = dht.readTemperature(true);
  if (isnan(h) || isnan(t) || isnan(f)) {
    Serial.println("Failed to read from DHT sensor!");
    return;
    }
  Serial.print("Humidity: ");
  Serial.print(h);
  Serial.print("%\t");
  Serial.print("Temperature: ");
  Serial.print(t);
  Serial.print("*C\t");
  Serial.print(f);
  Serial.print("*F\n");
  }
 樓主| 發表於 2017-10-23 17:49:21 | 顯示全部樓層
超新手 發表於 2017-10-6 21:05
1.dht11不是這樣用的
不是用 analogread
2. 0~5

不好意思 可以麻煩您看一下這篇下面的問題嗎?
發表於 2017-10-23 18:00:18 | 顯示全部樓層
1. DHT11 應該就是你貼的這個程式
2. 要上傳成什麼格式都OK
   但 APP Inventor 那邊程式, 你會改嗎?

 樓主| 發表於 2017-10-23 18:13:49 | 顯示全部樓層
超新手 發表於 2017-10-23 18:00
1. DHT11 應該就是你貼的這個程式
2. 要上傳成什麼格式都OK
   但 APP Inventor 那邊程式, 你會改嗎?

我想要把DHT11偵測到的數值像網路上的教學傳送兩筆資料到手機
改成傳送三筆資料  超音波感測器 溫溼度感應器(這個算兩筆資料還是一筆資料?)
APP INVENTOR 我有在網路上找人家教傳送兩筆資料
223.jpg

卡在我不知道該從哪個程式碼去修改傳送資料到手機

我以為是我一開始上傳的這種形式
int x=DigitalRead(A0);//read sensor value
int y=DigitalRead(A1);//read sensor value

但是好像是要用後來我上傳的DHT11程式碼去改
發表於 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]  就是相對應的資料
這樣應該比較簡單
 樓主| 發表於 2017-10-23 19:12:30 | 顯示全部樓層
超新手 發表於 2017-10-23 18:35
雖然我沒跑過這個 app,
, 但感覺上, 應該是有問題的
其實你應該利用目前可用的 app 程式來修改

我理解是  以下這邊不改
packet[0] = 97; //key send to phone
packet[1] = sendData / 256; //divides sendData to two 1 byte packets
packet[2] = sendData % 256;
然後
case 97: //測距離
for(int i = 0; i < 3; i++)
case 98 : //測溫度
for(int i = 0; i < 3; i++)
case 99 : //測溼度
for(int i = 0; i < 3; i++)
1234.jpg



這樣嗎?


發表於 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
發表於 2017-10-23 20:28:25 | 顯示全部樓層
或是直接用 switch(reciveunsigned1bytenumber)
可以省下一個變數


另外,你應該用的是
reciveunsigned1bytenumber
而不是
recivesigned1bytenumber
所有的函數都要改掉
 樓主| 發表於 2017-10-23 21:22:14 | 顯示全部樓層
超新手 發表於 2017-10-23 19:45
不對
arduino端
只需寫 case97, 然後多宣告一個變數

void loop (){
    byte Data[9];
    byte cmmd[20];
    int insize;
    int x=analogRead(A0);//read sensor value
    int y=DigitalRead(A1);//read sensor value
    int z=DigitalRead(A2);//read sensor value
    serialA=I2CBT.read();
    Data[0]='a';
    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;
     

     if (serialA == 49){
         for(int j=0;j<5;j++)
         I2CBT.write(Data[j]);
         serialA=0;
      }
  delay(100);
}
請問能用這段程式達到我想要的功能嗎
因為有範例我比較知道怎麼改才比較有機會動手
因為我看您給的case 97:
我能知道 他是一個迴圈可是我不知道要怎麼把那些.....補上



您的回覆我查過大約資料是如下列兩行
signed char, which gives you at least the -127 to 127 range. (-128 to 127 is common)
unsigned char, which gives you at least the 0 to 255 range.
case 97:
if(++state >= 3){
  state = 0;
  packet[0]=97;

} else if(state == 2){
  packet[0] =98;
....
} else {
   packet[0] =99;
.......

我理解是 ++state>=3會執行一種狀態ex超音波
              state == 2   也是執行一種狀態ex溫度
              如果是其他的狀態就執行packet[0] =99  ex溼度
那state =0 是一種起始狀態這樣嗎 下面98 99下面的.....我是應該加上什麼可以給點方向嗎
 樓主| 發表於 2017-10-23 21:26:14 | 顯示全部樓層
超新手 發表於 2017-10-23 20:28
或是直接用 switch(reciveunsigned1bytenumber)
可以省下一個變數

另外,你應該用的是
reciveunsigned1bytenumber
而不是
recivesigned1bytenumber
所有的函數都要改掉

我晚點查書看看兩者差別
因為我看的網站他都是用
recivesigned1bytenumber

我使用超音波回傳到手機的功能是有的
我會在查清楚一點
感謝告知
發表於 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的資料, 而不會有錯嗎?
 樓主| 發表於 2017-10-25 11:26:13 | 顯示全部樓層
int x=analogRead(A0);//read sensor value
 int y=digitalRead(A1);//read sensor value
 int z=digitalRead(A2);//read sensor value

請問 如果x是要讀取超音波的數值  超音波不是有trig跟echo  那我要把A0改成什麼?
那我溫濕度感應器 我腳位接在A2的話

Data[3]=y/256;
 Data[4]=y%256;
 Data[5]=z/256;
 Data[6]=z%256;
程式要怎麼讓他們分開讀取溫度跟濕度

我想傳B跟C的想法是 因為上面有張APP的程式  他是傳送兩筆資料
我傳送三筆資料  我有個範例 比較好下手
如果不要BC的話
我在想想看APP那邊怎麼改
 樓主| 發表於 2017-10-25 11:27:36 | 顯示全部樓層
超新手 發表於 2017-10-24 08:24
怎麼寫都可以, 只要和APP端格式相同即可
不用特別傳 'b', 'c' 這些字元
void loop (){

我試完好像會有一些過大負值

昨天電腦有點問題  晚點會再試試看  謝謝
發表於 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();
.......
這些不是你已經的試過, 而已可以正作工作的程式
把那些程式整合在一起就可以了
 樓主| 發表於 2017-10-25 19:42:06 | 顯示全部樓層
超新手 發表於 2017-10-25 12:17
>>請問 如果x是要讀取超音波的數值  超音波不是有trig跟echo  那我要把A0改成什麼?
我以為你是要我把程式簡 ...

抱歉我DHT11之前有做出來
可是今天要用卻一直有個錯誤
Arduino:1.8.5 (Windows 10), 開發板:"Arduino/Genuino Uno"

C:\Users\OIT11221-19\Desktop\雿喳?sketch_oct25a\sketch_oct25a.ino:1:20: fatal error: dht.h: No such file or directory

compilation terminated.

exit status 1
開發板 Arduino/Genuino Uno 編譯錯誤。

This report would have more information with
"Show verbose output during compilation"
option enabled in File -> Preferences.


可是

1508931206971.jpg


1508931233485.jpg

1508931636907.jpg

我也拿過其他arduino板子試過

可是DHT11  只有三隻腳位 5V GND DATA 我也沒接錯  上面的電源燈也有亮

3468.jpg

這是發生什麼問題啊?
發表於 2017-10-25 19:50:57 | 顯示全部樓層
本帖最後由 超新手 於 2017-10-25 19:59 編輯

找不到 dht.h 檔
Dht library 不是預設的
如果你曾經成功過
去 arduino/libraries 目錄下找看看是不是有這個檔案
沒有,就再copy 進去即可
或改成
#include "dht.h" 試試看
 樓主| 發表於 2017-10-25 20:02:49 | 顯示全部樓層
超新手 發表於 2017-10-25 19:50
找不到 dht.h 檔
Dht library 不是預設的
如果你曾經成功過

可是我 library 裡面有
我才頭痛...
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2017-12-18 09:27 , Processed in 0.207306 second(s), 19 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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