Robofun 機器人論壇

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

請問DHT11如果要傳送到手機

[複製鏈接]
跳轉到指定樓層
1#
發表於 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"
我已經有加入資料庫了

  
2#
 樓主| 發表於 2017-10-11 09:24:03 | 顯示全部樓層
好  我再試試看  抱歉
3#
 樓主| 發表於 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");
  }
4#
 樓主| 發表於 2017-10-23 17:49:21 | 顯示全部樓層
超新手 發表於 2017-10-6 21:05
1.dht11不是這樣用的
不是用 analogread
2. 0~5

不好意思 可以麻煩您看一下這篇下面的問題嗎?
5#
 樓主| 發表於 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程式碼去改
6#
 樓主| 發表於 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++)




這樣嗎?


7#
 樓主| 發表於 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下面的.....我是應該加上什麼可以給點方向嗎
8#
 樓主| 發表於 2017-10-23 21:26:14 | 顯示全部樓層
超新手 發表於 2017-10-23 20:28
或是直接用 switch(reciveunsigned1bytenumber)
可以省下一個變數

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

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

我使用超音波回傳到手機的功能是有的
我會在查清楚一點
感謝告知
9#
 樓主| 發表於 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那邊怎麼改
10#
 樓主| 發表於 2017-10-25 11:27:36 | 顯示全部樓層
超新手 發表於 2017-10-24 08:24
怎麼寫都可以, 只要和APP端格式相同即可
不用特別傳 'b', 'c' 這些字元
void loop (){

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

昨天電腦有點問題  晚點會再試試看  謝謝
11#
 樓主| 發表於 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 我也沒接錯  上面的電源燈也有亮



這是發生什麼問題啊?
12#
 樓主| 發表於 2017-10-25 20:02:49 | 顯示全部樓層
超新手 發表於 2017-10-25 19:50
找不到 dht.h 檔
Dht library 不是預設的
如果你曾經成功過

可是我 library 裡面有
我才頭痛...
13#
 樓主| 發表於 2017-10-25 20:14:35 | 顯示全部樓層
超新手 發表於 2017-10-25 19:50
找不到 dht.h 檔
Dht library 不是預設的
如果你曾經成功過

請問DHT版本有關係嗎

我有找到一個網頁

有歷年版本

改小寫的也沒有用
14#
 樓主| 發表於 2017-10-25 20:22:59 | 顯示全部樓層
我是直接叫範例出來 把它註解弄掉
改一些腳位而已  
15#
 樓主| 發表於 2017-10-25 21:26:06 | 顯示全部樓層
我把整個arduino全部刪掉 再安裝就成功了  打擾您  謝謝
16#
 樓主| 發表於 2017-10-31 18:17:06 | 顯示全部樓層
超新手 發表於 2017-10-25 20:18
它一定有範例,直接開它的範例試試看

請問為什麼這邊他說我沒有宣告的樣子





我這邊宣告有問題嗎?




但是我單獨測試他編譯是沒有問題的
17#
 樓主| 發表於 2017-10-31 20:08:33 | 顯示全部樓層
超新手 發表於 2017-10-31 18:58
沒看到你有宣告?
DHT dht(DHTPIN, DHTTYPE);

對   我以為只要#define DHTTYPE DHT11   // DHT 11 就好了  謝謝
18#
 樓主| 發表於 2017-10-31 21:34:58 | 顯示全部樓層
超新手 發表於 2017-10-31 18:58
沒看到你有宣告?
DHT dht(DHTPIN, DHTTYPE);

#include <SoftwareSerial.h> //Arduino I2C library
#include "DHT.h"
#define DHTPIN A1  
#define DHTTYPE DHT11   // DHT 11
//byte serialA;
//#include <Wire.h>

const int trig =  8; //define Arduino pin
const int echo =  7;
const int TX   = 1;
const int RX   = 0;
const int delay_time = 400; //delay 1000 ms for every measurment

const int Motor_E2 = 11;
const int Motor_E1 = 10;  
const int Motor_M1 = 12;   
const int Motor_M2 = 13;   
char val;  // variable to receive data from the serial port(bluetooth)
DHT dht(DHTPIN, DHTTYPE);
void setup()  
{
  Serial.begin(9600); //set baud rate of Bluetooth
  pinMode(Motor_M1, OUTPUT);
  pinMode(Motor_M2, OUTPUT);
  pinMode(trig, OUTPUT); //set trigger pin to OUTPUT (-> pin trig of Ultrasonic Sensor)
  pinMode(echo, INPUT); //set echo pin to INPUT (-> pin echo of Ultrasonic Sensor)
  dht.begin();
}

void loop()
{
  byte Data[7];
  byte cmmd[20];
  int insize;
  int x =pulseIn(echo, HIGH);
  int y = dht.readHumidity();
  int z = dht.readTemperature();
  //serialA=I2CBT.read();
  
  Data[0]=97;
  Data[1]=x/256;
  Data[2]=x%256;
  Data[3]=y/256;
  Data[4]=y%256;
  Data[5]=z/256;
  Data[6]=z%256;
  
  float duration; //duration to record the time of every back and forth
  float distance;
  digitalWrite(trig, HIGH); //trigger sona for 1 ms
  delayMicroseconds(1000);
  digitalWrite(trig, LOW);
  //int x =pulseIn(echo, HIGH);
  duration = pulseIn(echo, HIGH);
  //use pulseIn() function to get the time of pin echo from HIGH to LOW, unit=microseconds
  distance = (duration / 2) * 0.034;
  //distance = ( half of time of back and forth )x( wave velocity(use 0.034 cm per microsecond) )

  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;
  }
  float hif = dht.computeHeatIndex(f, h);
  float hic = dht.computeHeatIndex(t, h, false);
  
  
  delay(200);
  int sendData = (int) (distance * 100); //times 100 and convert disance to integer
  byte Data[3];

  //Data[0] = 97; //key send to phone
  //Data[1] = sendData / 256; //divides sendData to two 1 byte packets
  //Data[2] = sendData % 256;
這邊原本是傳送超音波的
那我現在要傳送三種資料
要怎麼把這幾行寫到上面的Data[0]~Data[2]
複製到上面去就可以了嗎?
   
  
  if(Serial.available()>0)
  {
    val = Serial.read();
    switch(val)
    {
      case 97:   //測距離
      for(int i = 0; i < 6; i++)
        Serial.write(Date[ i]); //send packet to phone
        break;
      case 'f':   // car forward
                forward(0, 255);
                break;
      case 'd':   // car backward
                backward(0, 255);
                break;
      case 'l':   // car turn left
                left(0, 255);
                break;
      case 'r':   // car turn right
                right(0, 255);
                break;
      case 's':   // car stop
                motorstop(0, 0);
                break;
    }     
  }
}

void motorstop(byte flag, byte motorspeed)
{
  digitalWrite( Motor_E1, motorspeed);
  digitalWrite( Motor_E2, motorspeed);
}

void forward(byte flag, byte motorspeed)
{
  digitalWrite( Motor_M1, HIGH);
  digitalWrite( Motor_M2, HIGH);

  analogWrite( Motor_E1, 200);
  analogWrite( Motor_E2, 200);
}

void backward(byte flag, byte motorspeed)
{
  digitalWrite( Motor_M1, LOW);
  digitalWrite( Motor_M2, LOW);

  analogWrite( Motor_E1, 200);
  analogWrite( Motor_E2, 200);
}

void right(byte flag, byte motorspeed)
{
  digitalWrite( Motor_M1, HIGH);
  digitalWrite( Motor_M2, HIGH);

  analogWrite( Motor_E1, 150);
  analogWrite( Motor_E2, 0);
}

void left(byte flag, byte motorspeed)
{
  digitalWrite( Motor_M1, HIGH);
  digitalWrite( Motor_M2, HIGH);

  analogWrite( Motor_E1, 0);
  analogWrite( Motor_E2, 150);
}




我想再問一下紅色的三行 我應該要有嗎   
//#include <Wire.h> 這行我查(1) I2C 地址設定 及 I2C 地址掃瞄是這樣
因為我編譯會再serialA=I2CBT.read();這行有錯誤
但是我當初傳送超音波沒有用到這幾行
但是我找範例傳送溫度資料他們是有那幾行
19#
 樓主| 發表於 2017-11-1 12:19:57 | 顯示全部樓層
超新手 發表於 2017-10-31 21:50
1.資料往下設即可
data[6]=senddata/256;
data[7]=senddata%256;

第一個請問資料往下設即可

Data[0]=97;
Data[1]=x/256;
Data[2]=x%256;

因為我這三個就是寫超音波的
所以我直接改成
byte Data[7];
byte cmmd[20];
int insize;
// int x =pulseIn(echo, HIGH);
  int sendData = (int) (distance * 100); //times 100 and convert disance to integer
  byte Data[3];
  int y = dht.readHumidity();
  int z = dht.readTemperature();

  Data[0]=97;
  Data[1]=sendData/256;
  Data[2]=sendData%256;
  Data[3]=y/256;
  Data[4]=y%256;
  Data[5]=z/256;
  Data[6]=z%256;
是這樣改嗎?
第二個所以我還是data0~data6 所以陣列還是7個 這樣
第三個serial.write 還是送0~6 7個位元
           case 97:   //測距離
        for(int i = 0; i < 6; i++)
        Serial.write(Date[ i]); //send packet to phone
        break;
20#
 樓主| 發表於 2017-11-1 16:26:37 | 顯示全部樓層
超新手 發表於 2017-11-1 14:45
1. i < 7 才是 7 個
2. serial.write(data[ i]);
打錯字了

void loop()
{
  byte Data[7];
  byte cmmd[20];
  int insize;
  //int x =pulseIn(echo, HIGH);
  int y = dht.readHumidity();
  int z = dht.readTemperature();
  float duration;
  float distance;
  digitalWrite(trig, HIGH); //trigger sona for 1 ms
  delayMicroseconds(1000);
  digitalWrite(trig, LOW);
  duration = pulseIn(echo, HIGH);
  distance = (duration / 2) * 0.034;
  
  int sendData = (int) (distance * 100); //times 100 and convert disance to integer
  byte Data[3];
  請問這邊是哪裡有錯誤編譯不過去....
  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;
  }
  float hif = dht.computeHeatIndex(f, h);
  float hic = dht.computeHeatIndex(t, h, false);
  
  Data[0]=97;
  Data[1]=sendData/256;
  Data[2]=sendData%256;
  Data[3]=y/256;
  Data[4]=y%256;
  Data[5]=z/256;
  Data[6]=z%256;


  delay(200);
  if(Serial.available()>0)
  {
    val = Serial.read();
    switch(val)
    {
      case 97:   //測距離
      for(int i = 0; i < 7; i++)

另外可以問一下 我這樣arduino傳送三種資料還有哪邊有問題沒有改到嗎
一直打擾你也很抱歉
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-5-4 22:01 , Processed in 0.275778 second(s), 8 queries , Apc On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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