Robofun 機器人論壇

標題: 請問DHT11如果要傳送到手機 [打印本頁]

作者: leo0983405269    時間: 2017-10-6 19:48
標題: 請問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[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
1.dht11不是這樣用的
不是用 analogread
2. 0~5
3.當然可以分開顯示
作者: leo0983405269    時間: 2017-10-11 09:24
好  我再試試看  抱歉
作者: leo0983405269    時間: 2017-10-18 18:21
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
超新手 發表於 2017-10-6 21:05
1.dht11不是這樣用的
不是用 analogread
2. 0~5

不好意思 可以麻煩您看一下這篇下面的問題嗎?
作者: 超新手    時間: 2017-10-23 18:00
1. DHT11 應該就是你貼的這個程式
2. 要上傳成什麼格式都OK
   但 APP Inventor 那邊程式, 你會改嗎?


作者: leo0983405269    時間: 2017-10-23 18:13
超新手 發表於 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
雖然我沒跑過這個 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]  就是相對應的資料
這樣應該比較簡單
作者: leo0983405269    時間: 2017-10-23 19:12
超新手 發表於 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++)




這樣嗎?



作者: 超新手    時間: 2017-10-23 19:45
不對
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
或是直接用 switch(reciveunsigned1bytenumber)
可以省下一個變數


另外,你應該用的是
reciveunsigned1bytenumber
而不是
recivesigned1bytenumber
所有的函數都要改掉
作者: leo0983405269    時間: 2017-10-23 21:22
超新手 發表於 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下面的.....我是應該加上什麼可以給點方向嗎

作者: leo0983405269    時間: 2017-10-23 21:26
超新手 發表於 2017-10-23 20:28
或是直接用 switch(reciveunsigned1bytenumber)
可以省下一個變數

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

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

我使用超音波回傳到手機的功能是有的
我會在查清楚一點
感謝告知
作者: 超新手    時間: 2017-10-24 08:24
怎麼寫都可以, 只要和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的資料, 而不會有錯嗎?

作者: leo0983405269    時間: 2017-10-25 11:26
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那邊怎麼改

作者: leo0983405269    時間: 2017-10-25 11:27
超新手 發表於 2017-10-24 08:24
怎麼寫都可以, 只要和APP端格式相同即可
不用特別傳 'b', 'c' 這些字元
void loop (){

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

昨天電腦有點問題  晚點會再試試看  謝謝
作者: 超新手    時間: 2017-10-25 12:17
>>請問 如果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
超新手 發表於 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
本帖最後由 超新手 於 2017-10-25 19:59 編輯

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

可是我 library 裡面有
我才頭痛...
作者: 超新手    時間: 2017-10-25 20:10
改成 雙引號也不行嗎?
作者: leo0983405269    時間: 2017-10-25 20:14
超新手 發表於 2017-10-25 19:50
找不到 dht.h 檔
Dht library 不是預設的
如果你曾經成功過

請問DHT版本有關係嗎

我有找到一個網頁

有歷年版本

改小寫的也沒有用

作者: 超新手    時間: 2017-10-25 20:18
它一定有範例,直接開它的範例試試看
作者: leo0983405269    時間: 2017-10-25 20:22
我是直接叫範例出來 把它註解弄掉
改一些腳位而已  
作者: leo0983405269    時間: 2017-10-25 21:26
我把整個arduino全部刪掉 再安裝就成功了  打擾您  謝謝
作者: leo0983405269    時間: 2017-10-31 18:17
超新手 發表於 2017-10-25 20:18
它一定有範例,直接開它的範例試試看

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





我這邊宣告有問題嗎?




但是我單獨測試他編譯是沒有問題的

作者: 超新手    時間: 2017-10-31 18:58
沒看到你有宣告?
DHT dht(DHTPIN, DHTTYPE);
作者: leo0983405269    時間: 2017-10-31 20:08
超新手 發表於 2017-10-31 18:58
沒看到你有宣告?
DHT dht(DHTPIN, DHTTYPE);

對   我以為只要#define DHTTYPE DHT11   // DHT 11 就好了  謝謝
作者: leo0983405269    時間: 2017-10-31 21:34
超新手 發表於 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();這行有錯誤
但是我當初傳送超音波沒有用到這幾行
但是我找範例傳送溫度資料他們是有那幾行

作者: 超新手    時間: 2017-10-31 21:50
1.資料往下設即可
data[6]=senddata/256;
data[7]=senddata%256;
2.陣列要宣告到data[8]
3.serial.write 要送 8個位元
4. i2c .....當然是多餘的

作者: leo0983405269    時間: 2017-11-1 12:19
超新手 發表於 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;
作者: 超新手    時間: 2017-11-1 14:45
1. i < 7 才是 7 個
2. serial.write(data[ i]);
打錯字了
作者: leo0983405269    時間: 2017-11-1 16:26
超新手 發表於 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傳送三種資料還有哪邊有問題沒有改到嗎
一直打擾你也很抱歉
作者: 超新手    時間: 2017-11-1 17:29
你宣告了兩次 data
一次是 data[7],一次是 data[3]
其實從 data[3]到float hic
這幾行都是多餘的
沒看到你有用過它來做過什麼
作者: leo0983405269    時間: 2017-11-3 15:55
超新手 發表於 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  等等

跟超音波一樣的意思  不是嗎  還是我從一開始出發就錯了...

作者: 超新手    時間: 2017-11-3 16:22
你已經在上面讀了一次
int y = dht.readHumidity();
int z = dht.readTemperature();
然後下面再讀一次
float h = dht.readHumidity();
float t = dht.readTemperature();
第二次這個值 h, t, 從頭到尾也沒看到你用過
其他也一樣, 就多讀而已
當然, 放著也不會怎麼樣..

作者: leo0983405269    時間: 2017-11-7 18:17
超新手 發表於 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;
作者: 超新手    時間: 2017-11-7 19:17
本帖最後由 超新手 於 2017-11-7 19:22 編輯

1.怎麼寫都可以,只要兩邊一致就可以
2. 要傳幾個 byte,當然要宣告足夠記憶體
byte data[9];
作者: leo0983405269    時間: 2017-11-7 19:25
超新手 發表於 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





作者: leo0983405269    時間: 2017-11-7 19:30
超新手 發表於 2017-11-7 19:17
1.怎麼寫都可以,只要兩邊一致就可以
2. 要傳幾個 byte,當然要宣告足夠記憶體
byte data[9]; ...

摁  我有改成9個 byte


作者: 超新手    時間: 2017-11-7 19:52
本帖最後由 超新手 於 2017-11-7 20:05 編輯

你少打;在'b'和'c'後面
='b';
='c';
作者: 超新手    時間: 2017-11-7 20:51
這個 app , 應該不行。七樓寫的還比較對
作者: leo0983405269    時間: 2017-11-7 21:06
超新手 發表於 2017-11-7 20:51
這個 app , 應該不行。七樓寫的還比較對

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

測距的也不見了

七樓那個傳送兩筆資料的


我單獨測試DHT11傳送到手機

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

      

手機得到的會是 37  93

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

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


作者: leo0983405269    時間: 2017-11-8 16:53
本帖最後由 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
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
至於 APP 不太正常的問題
有可能是APP程式簡略的寫法所造成
其實這個APP沒寫的很好
只要 BYTEAVAILABLETORECEIVE > 0
它就開始去讀
而且後面根本連確認都沒確認, 就直接
ReceiveUnsigned1ByteNumber
但是搞不好此時才收到 1 個 BYTE,
尤其你傳的資料量一多, 問題就可能會出來


作者: leo0983405269    時間: 2017-11-8 19:02
超新手 發表於 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, 下載次數: 351)

22222.jpg

作者: 超新手    時間: 2017-11-8 19:29
Arduino 的 for loop 應該是 j < 6
作者: leo0983405269    時間: 2017-11-10 14:17
超新手 發表於 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的問題
謝謝
作者: 超新手    時間: 2017-11-10 14:27
>>.應該是這樣吧
不是....
for(int i = 0; i < 8; i++)
i = 0 ~7 , 沒有 8, 你又少傳一個BYTE
這個問題...你已經錯三次了


作者: 超新手    時間: 2017-11-10 14:41
我就是在回答47 樓的問題
作者: leo0983405269    時間: 2017-11-10 14:46
超新手 發表於 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  我不知道兩邊的關係耶  不好意思


作者: 超新手    時間: 2017-11-10 14:59
說真的, 你一次討論兩個程式, 我也常搞不清楚你在說那一個
你說手機會收到錯誤資料
所以我就往前看到 43F 的Arduino程式
那邊的程式會少送一個字元. 所以會錯

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

作者: leo0983405269    時間: 2017-11-10 15:39
本帖最後由 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
                                                                                                   所以直接把它拿掉了

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


作者: 超新手    時間: 2017-11-10 17:09
要這樣寫才對
IF BYTETOREAD > 0 THEN
IF  Receive= 97 THEN
  IF  Receive = 'b' THEN
    IF  Receive = 'c' THEN
     ENDIF
  ENDIF
ENDIF
ENDIF
如果 97 的頭都不對了, 就不收了, 否則後面會被讀掉
更好的寫法是
WHILE BYTETOREAD > 0
IF  Receive= 97 THEN
  IF  Receive = 'b' THEN
    IF  Receive = 'c' THEN
        BREAK;
     ENDIF
  ENDIF
ENDIF
ENDIF
作者: leo0983405269    時間: 2017-11-10 18:20
超新手 發表於 2017-11-10 17:09
要這樣寫才對
IF BYTETOREAD > 0 THEN
IF  Receive= 97 THEN



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

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







因為他也只有 IF THEN 這拼圖

可以擴充        else     
                     else if
沒有 WHILE 這種拼圖
作者: 超新手    時間: 2017-11-10 19:25
本帖最後由 超新手 於 2017-11-10 19:36 編輯

你貼的圖上面有,
就是while test do
作者: 超新手    時間: 2017-11-10 19:27
本帖最後由 超新手 於 2017-11-10 19:40 編輯

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

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

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

摁  我靜下來想想  你的建議
謝謝
作者: 超新手    時間: 2017-11-10 20:38
本帖最後由 超新手 於 2017-11-10 20:39 編輯

仔細想想,用while 也有點問題
不如
IF BYTETOREAD >= 9
IF  Receive= 97 THEN
  IF  Receive = 'b' THEN
    IF  Receive = 'c' THEN
      
     ENDIF
  ENDIF
ENDIF
ENDIF
ENDIF
作者: leo0983405269    時間: 2017-11-14 18:38
超新手 發表於 2017-11-10 20:38
仔細想想,用while 也有點問題
不如
IF BYTETOREAD >= 9

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

因為





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

原本arduino程式是這樣的型態





現在arduino程式變成




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


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

但是加上>0 超音波的值還是沒有
作者: 超新手    時間: 2017-11-14 19:51
1.一次都沒有嗎?應該至少有一兩次才對
2.Clock1 timer是多久送一次
作者: leo0983405269    時間: 2017-11-14 19:56
超新手 發表於 2017-11-14 19:51
1.一次都沒有嗎?應該至少有一兩次才對
2.Clock1 timer是多久送一次

什麼是一次兩次?


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

timer  2000

論壇裡有網友說不能設太短
會卡住
作者: 超新手    時間: 2017-11-14 20:15
你先試看看使用序列監控視窗來除錯
不用改任何程式,
先拔掉藍牙, 接到USB
在Arduino序列監控視窗中設好鮑率後, 輸入 a(就是97)
應該會收到 a , b, c 和一大堆看不懂的字元才對

作者: 超新手    時間: 2017-11-14 20:27
因為你送9bytes
但接收只處理3 bytes
當處理到第4個 byte的時候
又送了 9bytes 過來
當處理到第5 byte
又送了 9 byte
因此很快就會爆掉
但應該至少有一次會成功
可以先用序列監控視窗測試
看看是不是卡住在 dht 或 sonar
或是其他問題


作者: leo0983405269    時間: 2017-11-14 20:40
超新手 發表於 2017-11-14 20:15
你先試看看使用序列監控視窗來除錯
不用改任何程式,
先拔掉藍牙, 接到USB


設定鮑率是下面那個9600嗎

輸入a 就只有 跳出a b c  ....
作者: 超新手    時間: 2017-11-14 21:02
不,還有一個看不懂的字元,表示 arduino 端程式”應該”有正常工作
作者: leo0983405269    時間: 2017-11-14 21:33
超新手 發表於 2017-11-14 21:02
不,還有一個看不懂的字元,表示 arduino 端程式”應該”有正常工作




我一直送A給他  他就這樣 "應該"是有在運作?
作者: 超新手    時間: 2017-11-15 09:05
本帖最後由 超新手 於 2017-11-15 11:54 編輯

>>我一直送A給他  他就這樣 "應該"是有在運作?
是的, 你的手機程式不就是在做這件事
每2秒送一次 a, 同時看有沒有收到值
因為送的是ascii code, 所以有些字會看不到, 或是亂碼
但 a, b, c 一定看的到
也就是 arduino 端看起來沒問題, 至少有反應

我自己試了一下,
但因為我沒有 sensor 可用, 所以就亂送資料
看來三個值都有顯示
你可以參考看看
  1. void setup() {
  2.   Serial.begin(9600);
  3. }
  4. int testx, testy, testz;// 測試用, 請自行修成自己的程式
  5. void loop() {
  6.   // put your main code here, to run repeatedly:
  7.   byte Data[9];
  8.   int x = testx;// 測試用, 請自行修成自己的程式
  9.   int y = testy;// 測試用, 請自行修成自己的程式
  10.   int z = testz;// 測試用, 請自行修成自己的程式
  11.   Data[0] = 'a';
  12.   Data[1] = x / 256;
  13.   Data[2] = x % 256;
  14.   Data[3] = 'b';
  15.   Data[4] = y / 256;
  16.   Data[5] = y % 256;
  17.   Data[6] = 'c';
  18.   Data[7] = z / 256;
  19.   Data[8] = z % 256;
  20.   if (Serial.available() > 0) {
  21.     char c = Serial.read();
  22.     switch (c) {
  23.       case 97:
  24.         for (int i = 0 ; i < 9 ; i++) {
  25.           Serial.write(Data[i]);
  26.         }
  27. // 測試用, 請自行修成自己的程式
  28.         testx++;
  29.         testy+=2;
  30.         testz+=3;
  31. // 測試用, 請自行修成自己的程式
  32.         break;
  33.     }
  34.   }
  35. }
複製代碼


另外. 其實不用送那麼多對齊字元(如 'a', 'b', 'c')
送一個是有點少, 沒對齊的機率是 1/256(資料錯誤)
送二個, 沒對齊的機率是 1/65536, 也差不多了
送三個, 沒對齊的機率是 1/16777216


附帶說明一下
下面 app 程式的這種寫法只適用顯示正數
如果出現負數, 顯示結果就會完全不正確
免得以後的人照抄, 又發現問題而不知道如何解決

1.jpg (55.23 KB, 下載次數: 616)

1.jpg

作者: leo0983405269    時間: 2017-11-15 10:25
本帖最後由 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);  這是不是有點奇怪 還是我自己的問題
作者: 超新手    時間: 2017-11-15 10:37
當然不對...
其實你的 Arduino 程式基本上不用修改
就直接用即可
問題在app 端,

作者: leo0983405269    時間: 2017-11-15 10:48
超新手 發表於 2017-11-15 10:37
當然不對...
其實你的 Arduino 程式基本上不用修改
就直接用即可


不是要把您給的範例

加入進去 我原本的arduino嗎

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

我直接用原本的arduino  然後改app就可以了?
作者: 超新手    時間: 2017-11-15 11:10

你的 arduino 已經用序列監控視窗"稍微"測過
加上你之前的測試.
應該沒太大問題
應該是 app 端有問題
因為基本上你這樣試(只收超音波), 是有可能有問題
不如一次到位, 三筆資料都收
我已經試過這個 app, 可以收沒問題



作者: leo0983405269    時間: 2017-11-15 11:18
本帖最後由 leo0983405269 於 2017-11-15 11:32 編輯
超新手 發表於 2017-11-15 11:10

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


您有成功?


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






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


真的很謝謝您的協助
作者: leo0983405269    時間: 2017-11-22 13:58
超新手 發表於 2017-11-15 11:10

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

可以請問一下  9V的電池有可能因為感應器太多
所以沒辦法正常運作嗎
我多加個七彩LED燈  燈跟其他感應器的功能有出來  遙控車的功能卻沒有了

#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();
  pinMode(A3, OUTPUT);
}

void loop()
{
  byte Data[12];
  byte cmmd[20];
  int val;
  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
  int y = dht.readHumidity();
  int z = dht.readTemperature();
  int e = analogRead(A5);
  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;
  Data[9]='d';
  Data[10]=e/256;
  Data[11]=e%256;

  digitalWrite(A3, HIGH);
  delay(2000);  
  digitalWrite(A3, LOW);  
  delay(2000);


  if(Serial.available()>0)
  {
    val = Serial.read();
    switch(val)
    {
      case 97:   //測距離溫溼度氣體
      for(int i = 0; i < 12; i++)
        Serial.write(Data); //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);
}
作者: 超新手    時間: 2017-11-22 14:36
中間這四行
digitalWrite(A3, HIGH);
  delay(2000);  
  digitalWrite(A3, LOW);  
  delay(2000);
可是會讓你的車子失聯 4 秒...

作者: leo0983405269    時間: 2017-11-22 17:14
超新手 發表於 2017-11-22 14:36
中間這四行
digitalWrite(A3, HIGH);
  delay(2000);  

懂了  謝謝
作者: cc1357    時間: 2022-3-12 21:33

谢谢大大分享




歡迎光臨 Robofun 機器人論壇 (https://robofun.net/forum/) Powered by Discuz! X3.2