Robofun 機器人論壇

標題: 手機透過藍芽接收及控制arduino相關問題 [打印本頁]

作者: qzec0910266    時間: 2018-4-12 09:58
標題: 手機透過藍芽接收及控制arduino相關問題
請問一下各位
這段程式碼是我利用藍芽把溫溼度上傳至app 迴圈裡的程式碼
下一段程式碼是app利用藍芽控制led迴圈裡的程式碼
我想把他們做結合,可是控制led不管放在最前或最後,都會導致溫溼度上傳app中止
請問有辦法讓他既可以上傳又可以控制嗎
謝謝!!
void loop (){

//溫溼度
    serialA=I2CBT.read();
    int temp = myHumidity.readTemperature();
    int humd = myHumidity.readHumidity();
   
    Serial.print("Temperature:");
    Serial.print(temp, 1);
    Serial.print("C");
    Serial.print(" Humidity:");
    Serial.print(humd, 1);
    Serial.println("%");

//溫溼度數值透過藍芽傳送到app
    byte Data[3];
    byte Data1[3];
   
    byte cmmd[20];
    int insize;
   
   
    Data[0]='a';
    Data[1]=temp/256;
    Data[2]=temp%256;
    Data1[0]='b';
    Data1[1]=humd/256;
    Data1[2]=humd%256;
   
     Serial.print(temp);
     Serial.print(" , ");
     Serial.println(humd);

       delay(1000);

     if (serialA == 1){
         for(int j=0;j<3;j++)
         I2CBT.write(Data[j]);
         serialA=0;
      }
     if (serialA == 2){
         for(int j=0;j<3;j++)
         I2CBT.write(Data1[j]);
         serialA=0;
      }
}

=============================================================
void loop() {

  byte cmmd[20];
  int insize;
  
  while(1){
/*
read message from bluetooth
*/
    if ((insize=(I2CBT.available()))>0){
      
       for (int i=0; i<insize; i++){
         Serial.print(cmmd=char(I2CBT.read()));
         Serial.print("\n");
       }
      
    }  
      switch (cmmd[0]) {
        case 97: //"a"     
         
          digitalWrite(raley,HIGH);
         
          break;  
      case 98://"b"
         
          digitalWrite(raley,LOW);
         
          break;
   
      } //Switch
      
  } //while

}

作者: 超新手    時間: 2018-4-12 10:08
1. 因為你的 LED 部份, 加了多餘的 while(1)
    它會讓你的程式卡死在 led 部份
     回不到溫溼度那部份
2. 要把兩個程式合在一起
    記得一定要把相同的部份去掉
    不過你沒貼出來, 不知道你是怎麼寫的

作者: qzec0910266    時間: 2018-4-12 10:12
超新手 發表於 2018-4-12 10:08
1. 因為你的 LED 部份, 加了多餘的 while(1)
    它會讓你的程式卡死在 led 部份
     回不到溫溼度那部份 ...

這是我兩段完整的程式碼
能請超新手大大幫我看一下麻
我是把led改成繼電器
謝謝!!
#include <SoftwareSerial.h>
#include <Wire.h>
#include "SparkFunHTU21D.h"

SoftwareSerial I2CBT(10,11); // TX:10, RX:11
byte serialA;
HTU21D myHumidity;
int  raley =8;  

void setup(){
  pinMode(raley,OUTPUT);
      
  Serial.begin(9600);
  I2CBT.begin(9600);
  myHumidity.begin();
  
}

void loop (){

//溫溼度
    serialA=I2CBT.read();
    int temp = myHumidity.readTemperature();
    int humd = myHumidity.readHumidity();
   
    Serial.print("Temperature:");
    Serial.print(temp, 1);
    Serial.print("C");
    Serial.print(" Humidity:");
    Serial.print(humd, 1);
    Serial.println("%");

//溫溼度數值透過藍芽傳送到app
    byte Data[3];
    byte Data1[3];
   
    byte cmmd[20];
    int insize;
   
   
    Data[0]='a';
    Data[1]=temp/256;
    Data[2]=temp%256;
    Data1[0]='b';
    Data1[1]=humd/256;
    Data1[2]=humd%256;
   
     Serial.print(temp);
     Serial.print(" , ");
     Serial.println(humd);

       delay(1000);

     if (serialA == 1){
         for(int j=0;j<3;j++)
         I2CBT.write(Data[j]);
         serialA=0;
      }
     if (serialA == 2){
         for(int j=0;j<3;j++)
         I2CBT.write(Data1[j]);
         serialA=0;
      }

  //空氣
    while(Serial.available()){
    CopeSerialData(Serial.read());
  }

}

char CopeSerialData(unsigned char ucData){
  static unsigned char ucRxBuffer[250];
  static unsigned char ucRxCnt = 0;
  
  long  pmat25=0,pmat100=0;
  long  pmcount03=0,pmcount05=0,pmcount10=0;
  long  pmcount25=0,pmcount50=0,pmcount100=0;

  ucRxBuffer[ucRxCnt++]=ucData;
  
  if(ucRxBuffer[0]!=0x42&&ucRxBuffer[1]!=0x4D){
    ucRxCnt=0;
    return ucRxCnt;
  }
  if (ucRxCnt<24){
    return ucRxCnt;
  }
  else{
    // G3
   
   
    pmat25=(int)ucRxBuffer[12]*256+(int)ucRxBuffer[13];    Serial.print("PM2.5:");  Serial.print(pmat25);    Serial.print("   ");
    pmat100=(int)ucRxBuffer[14]*256+(int)ucRxBuffer[15];   Serial.print("PM10:");   Serial.print(pmat100);   Serial.println("   ");
   
   
   
    ucRxCnt=0;
   
  }
  
  //空氣數值透過藍芽傳送到app
    byte Data2[3];
    byte Data3[3];
   

   
    Data2[0]='c';
    Data2[1]=pmat25/256;
    Data2[2]=pmat25%256;
    Data3[0]='d';
    Data3[1]=pmat100/256;
    Data3[2]=pmat100%256;
   
     Serial.print(pmat25);
     Serial.print(" , ");
     Serial.println(pmat100);

     if (serialA == 3){
         for(int j=0;j<3;j++)
         I2CBT.write(Data2[j]);
         serialA=0;
      }
     if (serialA == 4){
         for(int j=0;j<3;j++)
         I2CBT.write(Data3[j]);
         serialA=0;
      }
   
  
   return ucRxCnt;

  
    delay(10000);
  
   
}
==========================================================
#include <SoftwareSerial.h>
#include <Wire.h>

int  raley =8;  

SoftwareSerial I2CBT(10,11);

void setup() {
  Serial.begin(9600);
  I2CBT.begin(9600);//bluetooth baud rate  
  pinMode(raley,OUTPUT);
     
}

///////////////////main///////////////////////////

void loop() {

  byte cmmd[20];
  int insize;
  
  while(1){
/*
read message from bluetooth
*/
    if ((insize=(I2CBT.available()))>0){
      
       for (int i=0; i<insize; i++){
         Serial.print(cmmd=char(I2CBT.read()));
         Serial.print("\n");
       }
      
    }  
      switch (cmmd[0]) {
        case 97: //"a"     
         
          digitalWrite(raley,HIGH);
         
          break;  
      case 98://"b"
         
          digitalWrite(raley,LOW);
         
          break;
   
      } //Switch
      
  } //while

}
作者: 超新手    時間: 2018-4-12 10:20
可以把你結合過的程式貼出來嗎?
記得
1. 拿掉 while(1)
2. 相同的部份, 像 I2CBT.read() 也要一起結合



作者: qzec0910266    時間: 2018-4-12 10:31
超新手 發表於 2018-4-12 10:20
可以把你結合過的程式貼出來嗎?
記得
1. 拿掉 while(1)

超新手大大你好
以下是我結合的程式碼
他只會跑溫度跟上傳值就停住了
請問哪裡需要修改??
謝謝


#include <SoftwareSerial.h>
#include <Wire.h>
#include "SparkFunHTU21D.h"

SoftwareSerial I2CBT(10,11); // TX:10, RX:11
byte serialA;
HTU21D myHumidity;
int  raley =8;  

void setup(){
  pinMode(raley,OUTPUT);
      
  Serial.begin(9600);
  I2CBT.begin(9600);
  myHumidity.begin();
  
}

void loop (){

//溫溼度
    serialA=I2CBT.read();
    int temp = myHumidity.readTemperature();
    int humd = myHumidity.readHumidity();
   
    Serial.print("Temperature:");
    Serial.print(temp, 1);
    Serial.print("C");
    Serial.print(" Humidity:");
    Serial.print(humd, 1);
    Serial.println("%");

//溫溼度數值透過藍芽傳送到app
    byte Data[3];
    byte Data1[3];
   
    byte cmmd[20];
    int insize;

   
   
    Data[0]='a';
    Data[1]=temp/256;
    Data[2]=temp%256;
    Data1[0]='b';
    Data1[1]=humd/256;
    Data1[2]=humd%256;
   
     Serial.print(temp);
     Serial.print(" , ");
     Serial.println(humd);

       delay(1000);

     if (serialA == 1){
         for(int j=0;j<3;j++)
         I2CBT.write(Data[j]);
         serialA=0;
      }
     if (serialA == 2){
         for(int j=0;j<3;j++)
         I2CBT.write(Data1[j]);
         serialA=0;
      }
while(1){
/*
read message from bluetooth
*/
    if ((insize=(I2CBT.available()))>0){
      
       for (int i=0; i<insize; i++){
         Serial.print(cmmd=char(I2CBT.read()));
         Serial.print("\n");
       }
      
    }  
      switch (cmmd[0]) {
        case 97: //"a"     
         
          digitalWrite(raley,HIGH);
         
          break;  
      case 98://"b"
         
          digitalWrite(raley,LOW);
         
          break;
   
      } //Switch
      
  } //while

  //空氣
    while(Serial.available()){
    CopeSerialData(Serial.read());
  }

}

char CopeSerialData(unsigned char ucData){
  static unsigned char ucRxBuffer[250];
  static unsigned char ucRxCnt = 0;
  
  long  pmat25=0,pmat100=0;
  long  pmcount03=0,pmcount05=0,pmcount10=0;
  long  pmcount25=0,pmcount50=0,pmcount100=0;

  ucRxBuffer[ucRxCnt++]=ucData;
  
  if(ucRxBuffer[0]!=0x42&&ucRxBuffer[1]!=0x4D){
    ucRxCnt=0;
    return ucRxCnt;
  }
  if (ucRxCnt<24){
    return ucRxCnt;
  }
  else{
    // G3
   
   
    pmat25=(int)ucRxBuffer[12]*256+(int)ucRxBuffer[13];    Serial.print("PM2.5:");  Serial.print(pmat25);    Serial.print("   ");
    pmat100=(int)ucRxBuffer[14]*256+(int)ucRxBuffer[15];   Serial.print("PM10:");   Serial.print(pmat100);   Serial.println("   ");
   
   
   
    ucRxCnt=0;
   
  }
  
  //空氣數值透過藍芽傳送到app
    byte Data2[3];
    byte Data3[3];
   

   
    Data2[0]='c';
    Data2[1]=pmat25/256;
    Data2[2]=pmat25%256;
    Data3[0]='d';
    Data3[1]=pmat100/256;
    Data3[2]=pmat100%256;
   
     Serial.print(pmat25);
     Serial.print(" , ");
     Serial.println(pmat100);

     if (serialA == 3){
         for(int j=0;j<3;j++)
         I2CBT.write(Data2[j]);
         serialA=0;
      }
     if (serialA == 4){
         for(int j=0;j<3;j++)
         I2CBT.write(Data3[j]);
         serialA=0;
      }
   
  
   return ucRxCnt;

  
    delay(10000);
  
   
}




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