leo0983405269 發表於 2017-10-6 19:48:33

請問DHT11如果要傳送到手機

本帖最後由 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;
    byte cmmd;
    int insize;
    int x=analogRead(A0);//read sensor value
    int y=analogRead(A0);//read sensor value
    serialA=I2CBT.read();
    Data='a';
    Data=x/256;
    Data=x%256;
    Data='b';
    Data=y/256;
    Data=y%256;
   Serial.print(x);
   Serial.print(" , ");
   Serial.println(y);

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

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

麻煩各位謝謝


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


超新手 發表於 2017-10-6 21:05:28

1.dht11不是這樣用的
不是用 analogread
2. 0~5
3.當然可以分開顯示

leo0983405269 發表於 2017-10-11 09:24:03

好我再試試看抱歉

leo0983405269 發表於 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");
}

leo0983405269 發表於 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 那邊程式, 你會改嗎?

leo0983405269 發表於 2017-10-23 18:13:49

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


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


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

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

但是好像是要用後來我上傳的DHT11程式碼去改

超新手 發表於 2017-10-23 18:35:07

雖然我沒跑過這個 app,
, 但感覺上, 應該是有問題的
其實你應該利用目前可用的 app 程式來修改
第一次傳超音波, 等一段時間再傳温度, 再等一段時間傳濕度,周而復始
   packet = 97; //key send to phone
   packet = sendData / 256; //divides sendData to two 1 byte packets
   packet = sendData % 256;

for(int i = 0; i < 3; i++)
             Serial.write(packet[ i]); //send packet to phone
APP 還是固定送97 去要資料
但 Arduino 端
利用packet 的值來讓 APP 知道這次傳的什麼
而且每次都固定 3 BYTES
例如packet = 97 是超音波, 98 是温度, 99是濕度
而 packet , packet就是相對應的資料
這樣應該比較簡單

leo0983405269 發表於 2017-10-23 19:12:30

超新手 發表於 2017-10-23 18:35
雖然我沒跑過這個 app,
, 但感覺上, 應該是有問題的
其實你應該利用目前可用的 app 程式來修改


我理解是以下這邊不改
packet = 97; //key send to phone
packet = sendData / 256; //divides sendData to two 1 byte packets
packet = 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++)




這樣嗎?


超新手 發表於 2017-10-23 19:45:06

不對
arduino端
只需寫 case97, 然後多宣告一個變數
unsigned char state;
void loop(){
..........
case 97:
if(++state >= 3){
state = 0;
packet=97;

} else if(state == 2){
packet =98;
....
} else {
   packet =99;
.......
}
app 端也有錯
當 avaiable > 0時
只需將資料讀出一次
但你讀了三次
應該把它讀出來,放在變數中
再去判斷它是 97,98或99

超新手 發表於 2017-10-23 20:28:25

或是直接用 switch(reciveunsigned1bytenumber)
可以省下一個變數


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

leo0983405269 發表於 2017-10-23 21:22:14

超新手 發表於 2017-10-23 19:45
不對
arduino端
只需寫 case97, 然後多宣告一個變數


void loop (){
    byte Data;
    byte cmmd;
    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='a';
    Data=x/256;
    Data=x%256;
    Data='b';
    Data=y/256;
    Data=y%256;
    Data='c';
    Data=z/256;
    Data=z%256;
   

   if (serialA == 49){
         for(int j=0;j<5;j++)
         I2CBT.write(Data);
         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=97;

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

我理解是 ++state>=3會執行一種狀態ex超音波
            state == 2   也是執行一種狀態ex溫度
            如果是其他的狀態就執行packet =99ex溼度
那state =0 是一種起始狀態這樣嗎 下面98 99下面的.....我是應該加上什麼可以給點方向嗎

leo0983405269 發表於 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;

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

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

而上面那個 app, 是使用
recivesigned1bytenumber*256+recivesigned1bytenumber
應該錯的, 難道可以測量超過 127 cm的資料, 而不會有錯嗎?

leo0983405269 發表於 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=y/256;
 Data=y%256;
 Data=z/256;
 Data=z%256;
程式要怎麼讓他們分開讀取溫度跟濕度

我想傳B跟C的想法是 因為上面有張APP的程式他是傳送兩筆資料
我傳送三筆資料我有個範例 比較好下手
如果不要BC的話
我在想想看APP那邊怎麼改

leo0983405269 發表於 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();
.......
這些不是你已經的試過, 而已可以正作工作的程式
把那些程式整合在一起就可以了

leo0983405269 發表於 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.


可是








我也拿過其他arduino板子試過

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



這是發生什麼問題啊?

超新手 發表於 2017-10-25 19:50:57

本帖最後由 超新手 於 2017-10-25 19:59 編輯

找不到 dht.h 檔
Dht library 不是預設的
如果你曾經成功過
去 arduino/libraries 目錄下找看看是不是有這個檔案
沒有,就再copy 進去即可
或改成
#include "dht.h" 試試看

leo0983405269 發表於 2017-10-25 20:02:49

超新手 發表於 2017-10-25 19:50
找不到 dht.h 檔
Dht library 不是預設的
如果你曾經成功過


可是我 library 裡面有
我才頭痛...
頁: [1] 2 3 4
查看完整版本: 請問DHT11如果要傳送到手機