超新手 發表於 2017-11-7 19:52:33

本帖最後由 超新手 於 2017-11-7 20:05 編輯

你少打;在'b'和'c'後面
='b';
='c';

超新手 發表於 2017-11-7 20:51:47

這個 app , 應該不行。七樓寫的還比較對

leo0983405269 發表於 2017-11-7 21:06:33

超新手 發表於 2017-11-7 20:51
這個 app , 應該不行。七樓寫的還比較對

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

測距的也不見了

七樓那個傳送兩筆資料的


我單獨測試DHT11傳送到手機

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

      

手機得到的會是 3793

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

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

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

超新手 發表於 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
只是多此一舉而已

超新手 發表於 2017-11-8 17:42:05

至於 APP 不太正常的問題
有可能是APP程式簡略的寫法所造成
其實這個APP沒寫的很好
只要 BYTEAVAILABLETORECEIVE > 0
它就開始去讀
而且後面根本連確認都沒確認, 就直接
ReceiveUnsigned1ByteNumber
但是搞不好此時才收到 1 個 BYTE,
尤其你傳的資料量一多, 問題就可能會出來

leo0983405269 發表於 2017-11-8 19:02:06

超新手 發表於 2017-11-8 17:35
1,. 我說不行的是39樓的 APP, 這個初步看還 OK
2. >>超音波那部分 不用像其他的一開始給他初始值
我不確知 ...

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






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

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

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

感謝救援....

超新手 發表於 2017-11-8 19:29:31

Arduino 的 for loop 應該是 j < 6

leo0983405269 發表於 2017-11-10 14:17:58

超新手 發表於 2017-11-8 19:29
Arduino 的 for loop 應該是 j < 6

我現在是

Data=97;
Data=x/256;
Data=x%256;
Data='b' ;
Data=y/256;
Data=y%256;
Data='c' ;
Data=z/256;
Data=z%256;

這樣應該是

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

應該是這樣吧


另外請幫忙我看一下47F的問題
謝謝

超新手 發表於 2017-11-10 14:27:32

>>.應該是這樣吧
不是....
for(int i = 0; i < 8; i++)
i = 0 ~7 , 沒有 8, 你又少傳一個BYTE
這個問題...你已經錯三次了

超新手 發表於 2017-11-10 14:41:45

我就是在回答47 樓的問題

leo0983405269 發表於 2017-11-10 14:46:59

超新手 發表於 2017-11-10 14:27
>>.應該是這樣吧
不是....
for(int i = 0; i < 8; i++)


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


EX1
byte Data;

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

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

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

那這邊就是 對的

因為只有0~2

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


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

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





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

超新手 發表於 2017-11-10 14:59:12

說真的, 你一次討論兩個程式, 我也常搞不清楚你在說那一個
你說手機會收到錯誤資料
所以我就往前看到 43F 的Arduino程式
那邊的程式會少送一個字元. 所以會錯

總之..如果你把資料送正確了之後
資料還會是錯的嗎?

leo0983405269 發表於 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;
byte cmmd;
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=97;
Data=x/256;
Data=x%256;
Data='b' ;
Data=y/256;
Data=y%256;
Data='c' ;
Data=z/256;
Data=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
                                                                                                   所以直接把它拿掉了

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

超新手 發表於 2017-11-10 17:09:12

要這樣寫才對
IF BYTETOREAD > 0 THEN
IFReceive= 97 THEN
IFReceive = 'b' THEN
    IFReceive = 'c' THEN
   ENDIF
ENDIF
ENDIF
ENDIF
如果 97 的頭都不對了, 就不收了, 否則後面會被讀掉
更好的寫法是
WHILE BYTETOREAD > 0
IFReceive= 97 THEN
IFReceive = 'b' THEN
    IFReceive = 'c' THEN
      BREAK;
   ENDIF
ENDIF
ENDIF
ENDIF

leo0983405269 發表於 2017-11-10 18:20:56

超新手 發表於 2017-11-10 17:09
要這樣寫才對
IF BYTETOREAD > 0 THEN
IFReceive= 97 THEN




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

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







因為他也只有 IF THEN 這拼圖

可以擴充      else   
                     else if
沒有 WHILE 這種拼圖

超新手 發表於 2017-11-10 19:25:21

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

你貼的圖上面有,
就是while test do

超新手 發表於 2017-11-10 19:27:32

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

我寫的只是架構。基本上就是你寫的這樣
ByteAvailableToReceive

你只要調整一下架構
可別真的照我打的改

leo0983405269 發表於 2017-11-10 19:42:39

超新手 發表於 2017-11-10 19:27
我寫的只是架構。基本上就是你寫的這樣
ByteAvailableToReceive



摁我靜下來想想你的建議
謝謝

超新手 發表於 2017-11-10 20:38:05

本帖最後由 超新手 於 2017-11-10 20:39 編輯

仔細想想,用while 也有點問題
不如
IF BYTETOREAD >= 9
IFReceive= 97 THEN
IFReceive = 'b' THEN
    IFReceive = 'c' THEN
      
   ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
頁: 1 2 [3] 4
查看完整版本: 請問DHT11如果要傳送到手機