Robofun 機器人論壇

 找回密碼
 申請會員
搜索
熱搜: 活動 交友 discuz

請問DHT11如果要傳送到手機

查看數: 16381 | 評論數: 79 | 收藏 0
關燈 | 提示:支持鍵盤翻頁<-左 右->
    組圖打開中,請稍候......
發佈時間: 2017-10-6 19:48

正文摘要:

本帖最後由 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(96 ...

回復

cc1357 發表於 2022-3-12 21:33:55

谢谢大大分享
leo0983405269 發表於 2017-11-22 17:14:16
超新手 發表於 2017-11-22 14:36
中間這四行
digitalWrite(A3, HIGH);
  delay(2000);  

懂了  謝謝
超新手 發表於 2017-11-22 14:36:25
中間這四行
digitalWrite(A3, HIGH);
  delay(2000);  
  digitalWrite(A3, LOW);  
  delay(2000);
可是會讓你的車子失聯 4 秒...
leo0983405269 發表於 2017-11-22 13:58:57
超新手 發表於 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-15 11:10:23

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


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


不是要把您給的範例

加入進去 我原本的arduino嗎

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

我直接用原本的arduino  然後改app就可以了?
超新手 發表於 2017-11-15 10:37:01
當然不對...
其實你的 Arduino 程式基本上不用修改
就直接用即可
問題在app 端,
leo0983405269 發表於 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);  這是不是有點奇怪 還是我自己的問題
超新手 發表於 2017-11-15 09:05:17
本帖最後由 超新手 於 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, 下載次數: 617)

1.jpg
超新手 發表於 2017-11-14 21:02:52
不,還有一個看不懂的字元,表示 arduino 端程式”應該”有正常工作
超新手 發表於 2017-11-14 20:27:05
因為你送9bytes
但接收只處理3 bytes
當處理到第4個 byte的時候
又送了 9bytes 過來
當處理到第5 byte
又送了 9 byte
因此很快就會爆掉
但應該至少有一次會成功
可以先用序列監控視窗測試
看看是不是卡住在 dht 或 sonar
或是其他問題

超新手 發表於 2017-11-14 20:15:41
你先試看看使用序列監控視窗來除錯
不用改任何程式,
先拔掉藍牙, 接到USB
在Arduino序列監控視窗中設好鮑率後, 輸入 a(就是97)
應該會收到 a , b, c 和一大堆看不懂的字元才對
leo0983405269 發表於 2017-11-14 19:56:37
超新手 發表於 2017-11-14 19:51
1.一次都沒有嗎?應該至少有一兩次才對
2.Clock1 timer是多久送一次

什麼是一次兩次?


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

timer  2000

論壇裡有網友說不能設太短
會卡住
超新手 發表於 2017-11-14 19:51:01
1.一次都沒有嗎?應該至少有一兩次才對
2.Clock1 timer是多久送一次
leo0983405269 發表於 2017-11-14 19:21:52
超新手 發表於 2017-11-14 18:57
為什麼你要把 BytesAvailableToReceive>0 拿掉?


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

但是加上>0 超音波的值還是沒有
超新手 發表於 2017-11-14 18:57:57
為什麼你要把 BytesAvailableToReceive>0 拿掉?

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

GMT+8, 2024-11-23 16:19 , Processed in 0.078365 second(s), 10 queries , Apc On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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