Robofun 機器人論壇

 找回密碼
 申請會員
搜索
熱搜: 活動 交友 discuz
樓主: leo0983405269
打印 上一主題 下一主題

請問DHT11如果要傳送到手機

[複製鏈接]
21#
 樓主| 發表於 2017-11-3 15:55:43 | 顯示全部樓層
超新手 發表於 2017-11-1 17:29
你宣告了兩次 data
一次是 data[7],一次是 data[3]
其實從 data[3]到float hic

  float h = dht.readHumidity();
  float t = dht.readTemperature();
  float f = dht.readTemperature(true);
  
  float hif = dht.computeHeatIndex(f, h);
  float hic = dht.computeHeatIndex(t, h, false);

這幾行是從DHT11 的 void 複製出來的

他不是會去讀溫溼度嗎

然後因為一開始int y = dht.readHumidity();
                       int z = dht.readTemperature();

然後去做 y/256
              y%256  等等

跟超音波一樣的意思  不是嗎  還是我從一開始出發就錯了...
22#
 樓主| 發表於 2017-11-7 18:17:11 | 顯示全部樓層
超新手 發表於 2017-11-3 16:22
你已經在上面讀了一次
int y = dht.readHumidity();
int z = dht.readTemperature();

可以問一下為什麼這樣不行

  Data[0]=97;
  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;

會有下面這個錯誤
part100:50:error:expected';'在“數據”之前

part100:53:error:expected';'在“數據”之前


但是這樣可以嗎
  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;
23#
 樓主| 發表於 2017-11-7 19:25:16 | 顯示全部樓層
超新手 發表於 2017-11-7 19:17
1.怎麼寫都可以,只要兩邊一致就可以

不好意思 我沒表達清楚

我現在卡在
  Data[0]=97;
  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;
這樣會有這樣的錯誤
part100:50:error:expected';'在“數據”之前

part100:53:error:expected';'在“數據”之前

只有用下面這個才不會有錯誤出現
  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;

但是我想要用有Data[3]='b'  Data[6]='c' 這幾行的程式
因為我照著網路上的範例自己改了一下app




24#
 樓主| 發表於 2017-11-7 19:30:14 | 顯示全部樓層
超新手 發表於 2017-11-7 19:17
1.怎麼寫都可以,只要兩邊一致就可以
2. 要傳幾個 byte,當然要宣告足夠記憶體
byte data[9]; ...

摁  我有改成9個 byte

25#
 樓主| 發表於 2017-11-7 21:06:33 | 顯示全部樓層
超新手 發表於 2017-11-7 20:51
這個 app , 應該不行。七樓寫的還比較對

這個APP只剩下 遙控車的功能了

測距的也不見了

七樓那個傳送兩筆資料的


我單獨測試DHT11傳送到手機

濕度好像沒問題  但是 溫度 他會直接把攝氏跟華氏加起來  應該是APP端的問題

      

手機得到的會是 37  93

但是我現在還有要接收超音波的數值

我現在這個APP 就是把兩邊的手機程式合上去而已....

26#
 樓主| 發表於 2017-11-8 16:53:31 | 顯示全部樓層
本帖最後由 leo0983405269 於 2017-11-8 16:54 編輯
超新手 發表於 2017-11-7 20:51
這個 app , 應該不行。七樓寫的還比較對




請教一下  為什麼您看到這程式就覺得不行  我上半段是超音波  跟下半段 B C 合併是有問題的 所以我暫時沒有合上去

雖然真的不行   輸出成APK 有的程式有收到值 有的沒有  但是有收到的也是錯的

另外想多問一下  為什麼 超音波那部分 不用像其他的一開始給他初始值  initialize global

      跟之前有問過 ReceiveUnsigned1ByteNumber 乘於256是因為 當初有分/256跟%256  那為什麼有用到+256呢?
27#
 樓主| 發表於 2017-11-8 19:02:06 | 顯示全部樓層
超新手 發表於 2017-11-8 17:35
1,. 我說不行的是39樓的 APP, 這個初步看還 OK
2. >>超音波那部分 不用像其他的一開始給他初始值
我不確知 ...

我能理解多此一舉的意思是
圖中的 if then 在用了 ReceiveUnsigned1ByteNumber  就是多餘的
所以可以槓掉   應該沒有錯吧....






另外有一個困擾是   arduino  int z = dht.readTemperature(); 讀取溫度 這邊

他讀到的資料是  Temperature   XX *C  YY *F   XX跟YY是讀到的數字   

但是手機讀到的值  會是XX+YY=ZZ的值  
                             如果XX是37YY是71  手機上就是會跳出98                     這有救嗎...

感謝救援....

22222.jpg (28.76 KB, 下載次數: 83)

22222.jpg
28#
 樓主| 發表於 2017-11-10 14:17:58 | 顯示全部樓層
超新手 發表於 2017-11-8 19:29
Arduino 的 for loop 應該是 j < 6

我現在是

  Data[0]=97;
  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;

這樣應該是  

byte Data[9];
for(int i = 0; i < 8; i++)

應該是這樣吧


另外請幫忙我看一下47F的問題
謝謝
29#
 樓主| 發表於 2017-11-10 14:46:59 | 顯示全部樓層
超新手 發表於 2017-11-10 14:27
>>.應該是這樣吧
不是....
for(int i = 0; i < 8; i++)

那可能我有點問題
因為我看的教育團隊網址上面
他的例子  


EX1
byte Data[6];

for(int j=0;j<5;j++)
byte cmmd[20];

那他這邊的J就應該是 j<6
因為0~5
EX2
byte Data[3];
byte cmmd[20];

for(int j=0;j<3;j++)

那這邊就是 對的

因為只有0~2  

因為你問我  arduino for loop要改成 <6  
我去看他網址看到錯的範例


byte Data[9];
for(int i = 0; i < 9; i++)

上面兩行 原本 i 是設定<9
結果我在要傳到論壇時  手賤又改成8..





47樓的回覆是  關於if then 還是  int z = dht.readTemperature();
這個跟  for 迴圈小於 6  我不知道兩邊的關係耶  不好意思

30#
 樓主| 發表於 2017-11-10 15:39:24 | 顯示全部樓層
本帖最後由 leo0983405269 於 2017-11-10 15:40 編輯
超新手 發表於 2017-11-10 14:59
說真的, 你一次討論兩個程式, 我也常搞不清楚你在說那一個
你說手機會收到錯誤資料
所以我就往前看到 43F  ...


我主要還是要做 超音波跟溫溼度感應的功能  所以是下面這邊


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

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[9];
  byte cmmd[20];
  int insize;
  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 x = (int) (distance * 100); //times 100 and convert disance to integer
  //float y = dht.readHumidity();
  //float t = dht.readTemperature();
  int y = dht.readHumidity();
  int z = dht.readTemperature();
  


  Data[0]=97;
  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;


  delay(200);
  if(Serial.available()>0)
  {
    val = Serial.read();
    switch(val)
    {
      case 97:   //測距離
      for(int i = 0; i < 9; i++)
        Serial.write(Data[ i]); //send Data 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);
}

以上這是arduino端




以下是手機端      把前天說的 使用  ReceiveUnsigned1ByteNumber     if then 裡面的因為不用在加回去256
                                                                                                   所以直接把它拿掉了

但是現在使用這個程式 只有遙控車的功能  超音波跟溫溼度 在手機畫面都沒有數值進來

31#
 樓主| 發表於 2017-11-10 18:20:56 | 顯示全部樓層
超新手 發表於 2017-11-10 17:09
要這樣寫才對
IF BYTETOREAD > 0 THEN
IF  Receive= 97 THEN



這個開發網頁  有 BYTETOREAD跟ENDIF這拼圖嗎

請問你的想法是圖中那樣嗎







因為他也只有 IF THEN 這拼圖

可以擴充        else     
                     else if
沒有 WHILE 這種拼圖
32#
 樓主| 發表於 2017-11-10 19:42:39 | 顯示全部樓層
超新手 發表於 2017-11-10 19:27
我寫的只是架構。基本上就是你寫的這樣
ByteAvailableToReceive

摁  我靜下來想想  你的建議
謝謝
33#
 樓主| 發表於 2017-11-14 18:38:00 | 顯示全部樓層
超新手 發表於 2017-11-10 20:38
仔細想想,用while 也有點問題
不如
IF BYTETOREAD >= 9

我覺得  連傳送97都沒有做到

因為





原本我只有傳送超音波的值到手機
手機是有收到數值的

原本arduino程式是這樣的型態





現在arduino程式變成




但是如果我手機程式先不要放上接收濕溫度 只測原本接收超音波的功能
但是也沒有  所以我覺得97這值應該沒收到
34#
 樓主| 發表於 2017-11-14 19:21:52 | 顯示全部樓層
超新手 發表於 2017-11-14 18:57
為什麼你要把 BytesAvailableToReceive>0 拿掉?


不好意思 因為改來改去 圖沒拉好

但是加上>0 超音波的值還是沒有
35#
 樓主| 發表於 2017-11-14 19:56:37 | 顯示全部樓層
超新手 發表於 2017-11-14 19:51
1.一次都沒有嗎?應該至少有一兩次才對
2.Clock1 timer是多久送一次

什麼是一次兩次?


手機端的格子裡面一個數字都沒有

timer  2000

論壇裡有網友說不能設太短
會卡住
36#
 樓主| 發表於 2017-11-14 20:40:53 | 顯示全部樓層
超新手 發表於 2017-11-14 20:15
你先試看看使用序列監控視窗來除錯
不用改任何程式,
先拔掉藍牙, 接到USB


設定鮑率是下面那個9600嗎

輸入a 就只有 跳出a b c  ....
37#
 樓主| 發表於 2017-11-14 21:33:27 | 顯示全部樓層
超新手 發表於 2017-11-14 21:02
不,還有一個看不懂的字元,表示 arduino 端程式”應該”有正常工作




我一直送A給他  他就這樣 "應該"是有在運作?
38#
 樓主| 發表於 2017-11-15 10:25:08 | 顯示全部樓層
本帖最後由 leo0983405269 於 2017-11-15 10:29 編輯
超新手 發表於 2017-11-15 09:05
>>我一直送A給他  他就這樣 "應該"是有在運作?
是的, 你的手機程式不就是在做這件事
每2秒送一次 a, 同時看 ...


void setup() {
Serial.begin(9600);
}
int (int) (distance * 100), dht,readHumidity(),dht,readTemperature();// 測試用, 請自行修成自己的程式
void loop() {
  //晚點補上
  byte Data[9];
  int x =(int) (distance * 100);// 測試用, 請自行修成自己的程式
  int y = dht,readHumidity();// 測試用, 請自行修成自己的程式
  int z = dht,readTemperature();// 測試用, 請自行修成自己的程式
  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 (Serial.available() > 0) {
    char c = Serial.read();
    switch (c) {
      case 97:
        for (int i = 0 ; i < 9 ; i++) {
          Serial.write(Data);
        }
// 測試用, 請自行修成自己的程式
        (int) (distance * 100)++;
        dht,readHumidity()+=2;
        dht,readTemperature()+=3;
// 測試用, 請自行修成自己的程式
        break;
    }
  }
}
這樣嗎?  我現在在另外一間教室上課  要下午才能到實驗室試試看最後結果

testx  = (int) (distance * 100);  這是不是有點奇怪 還是我自己的問題
39#
 樓主| 發表於 2017-11-15 10:48:12 | 顯示全部樓層
超新手 發表於 2017-11-15 10:37
當然不對...
其實你的 Arduino 程式基本上不用修改
就直接用即可


不是要把您給的範例

加入進去 我原本的arduino嗎

因為我現在沒辦法在實驗室用  所以我只有先改一些 X Y Z的東西

我直接用原本的arduino  然後改app就可以了?
40#
 樓主| 發表於 2017-11-15 11:18:03 | 顯示全部樓層
本帖最後由 leo0983405269 於 2017-11-15 11:32 編輯
超新手 發表於 2017-11-15 11:10

你的 arduino 已經用序列監控視窗"稍微"測過
加上你之前的測試.


您有成功?


我好像也有點要成功的感覺了...






有了我要的結果了     看來是原本的APP的問題


真的很謝謝您的協助
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-5-3 20:31 , Processed in 0.182270 second(s), 8 queries , Apc On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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