会计师94 发表于 2014-4-15 16:27:07

传感器和gps实现电脑串口显示通讯。现在的问题是程序执行一段时间就会停止。求帮助

#include <Wire.h>   
//===============================================

#include <SoftwareSerial.h>
#include <string.h>
#include <TinyGPS.h>
//================================================

#define u16 unsigned int
#define u8unsigned char
#define u32 unsigned long
#define u64 unsigned long long
#define MS5611 0x77
#define Reset0x1e
#define Temperature 0x50
#define Pressure        0x40

#define        CONV   0x40
#define READ   0x00
#define OSR           0x08
#define D1           0x00
#define        D2           0x10
#define        PROM_RD        0xa0


u8 i;
uint32_td1;
uint32_td2;
int32_t TEMP = 0;
u16 Prom;
float P,T,dT,OFF,SENS;       
float Tem;
float Pre;
const float sea_press = 1013.25;

//===============================================
SoftwareSerial GPS(8, 9); //4RX,5TX
TinyGPS gps;
unsigned long fix_age;
long lat, lon;
float LAT, LON;
void gpsdump(TinyGPS &gps);
//bool feedgps();
//void getGPS();// gps初始化结束
//============================================

void initial(u8 address)
{
// Serial.println();
// Serial.println("PROM COEFFICIENTS ivan");   
Wire.beginTransmission(address);
Wire.write(0x1E); // reset
Wire.endTransmission();
delay(10);   
for (int i=0; i<6; i++)
{   
    Wire.beginTransmission(address);   
    Wire.write(0xA2 + (i * 2));   
    Wire.endTransmission();   
    Wire.beginTransmission(address);   
    Wire.requestFrom(address, (u8) 6);   
    delay(1);   
    if(Wire.available())   
    {
    Prom = Wire.read() << 8 | Wire.read();    }   
    else
    {   
      Serial.println("Error reading PROM 1");}   
   
   }
      Serial.println(Prom);
    Serial.println();
   
    //===================================================
    // GPS.begin(9600);                   // GPS module baud rate
    // Serial.begin(9600);                  // the Serial port of Arduino baud rate.
   //delay(500);

//========================================================
}

long getVal(int address, byte code)
{
unsigned long ret = 0;
Wire.beginTransmission(address);
Wire.write(code);
Wire.endTransmission();
delay(10);// start read sequence
Wire.beginTransmission(address);
Wire.write((byte) 0x00);
Wire.endTransmission();
Wire.beginTransmission(address);
Wire.requestFrom(address, (int)3);
if (Wire.available() >= 3)
{    ret = Wire.read() * (unsigned long)65536 + Wire.read() * (unsigned long)256 + Wire.read();}
else {    ret = -1;}
Wire.endTransmission();
return ret;         
}
int lightsensorvolue;   
byte dht_dpin=7;         
byte dht_dat;


void setup(){{

   Serial.begin(9600);//通信
   delay(300);
   GPS.begin(9600);               
   Serial.begin(9600);               
    delay(500);

}
Wire.begin();
initial(MS5611);
delay(5);

InitDHT();//温度定义开始
//Serial.println("HELLO READY GO\n\n");
delay(1000);//温度定义结束
   
}


void loop()

{
{
    {

    int32_t T1    = 0;   
    int64_t OFF1= 0;   
    int64_t SENS1 = 0;
    d1 = getVal(MS5611,0x48);//temp
    d2 = getVal(MS5611,0x58);//pressure
   
    dT   = d2 - ((int32_t)Prom << 8);
    OFF = ((int64_t)Prom*pow(2,17) + dT*Prom/pow(2,6));
    SENS = ((int64_t)Prom*pow(2,16) + dT*Prom/pow(2,7));
    T = 2000+((float)(dT*Prom))/pow(2,23);
   
    if(T< 2000) // if temperature lower than 20 Celsius   
   {   
      
    T1    = pow(dT, 2) / 2147483648;   
    OFF1= 5 * pow((T - 2000), 2) / 2;   
    SENS1 = 5 * pow((T - 2000), 2) / 4;   
    if(TEMP < -1500) // if temperature lower than -15 Celsius   
    {   
      OFF1= OFF1 + 7 * pow((T + 1500), 2);      
      SENS1 = SENS1 + 11 * pow((T + 1500), 2) / 2;   
    }   
      
}
    T -= T1;   
    OFF -= OFF1;   
   SENS -= SENS1;
    Tem = (float)T/ 100;
    Pre =((((float)(d1*SENS))/pow(2,21) - OFF)/pow(2,15))/100;
    Serial.print("1.Actual TEMP= ");
    Serial.print(Tem);
    Serial.print("   Actual PRESSURE= ");
    Serial.println(Pre);      
    delay(1000);//大气压结束   
}


StartDHT22();//温湿开始
for (byte i=0;i<5;i++)
dht_dat = readByte();
byte checksum=dht_dat+dht_dat+dht_dat+dht_dat;
if(dht_dat == checksum){
   
    int HighByte = dht_dat;
    int LowByte = dht_dat;
    int TReading = (HighByte << 8) + LowByte;
    int Whole = TReading / 10;
    int Fract = TReading % 10;
    Serial.print("3.humidity=");
    Serial.print(Whole);
    Serial.print(".");
    Serial.print(Fract);
    Serial.print("%");
    HighByte = dht_dat;
    LowByte = dht_dat;
    TReading = (HighByte<<8)+LowByte;
    Whole=TReading/10;
    Fract=TReading%10;
    Serial.print("   temperature =");
    int SignBit = TReading & 0x8000;
    if(SignBit)
      Serial.print("-");
      Serial.print(Whole);
      Serial.print(".");
      Serial.print(Fract);
      Serial.println("C");
      
}
delay(1000);

      myGPS();
      delay(2000);
}
lightsensorvolue=analogRead(A3);
if (analogRead(A3)>400){
Serial.print("2.OPEN:");
Serial.println( analogRead(A3));
}
if(analogRead(A3)<400){
Serial.print( "2.CLOSE:");
Serial.println(analogRead(A3));
}
delay(2000);//延时2S,
}


void InitDHT()
{
pinMode(dht_dpin,OUTPUT);
digitalWrite(dht_dpin,HIGH);
}
void StartDHT22(){
pinMode(dht_dpin,OUTPUT);
digitalWrite(dht_dpin,LOW);
delay(1);
digitalWrite(dht_dpin,HIGH);
delayMicroseconds(40);
pinMode(dht_dpin,INPUT);
while(digitalRead(dht_dpin)==LOW);
while(digitalRead(dht_dpin)==HIGH);
}
byte readByte(){
byte result=0;
for(byte i=0;i<8;i++){
while(digitalRead(dht_dpin)==LOW);
delayMicroseconds(45);
if(digitalRead(dht_dpin)==HIGH)
result|= ( 1 <<(7-i));
while (digitalRead(dht_dpin)==HIGH);
}
return result;//温湿度结束
delay(2000);
}

//=====================================================
void myGPS()
{
// GPS.begin(9600);               
//delay(30);
int counter=0;
//GPS.listen();


//for (;;)
//{
   long lat, lon;
   //unsigned long fix_age, time, date, speed, course;
   //unsigned long chars;
// unsigned short sentences, failed_checksum;
   long Latitude, Longitude;
   
   gps.get_position(&lat, &lon,&fix_age);
   getGPS();
   Serial.print("4.Latitude : ");
   Serial.print(LAT/1000000,7);
   Serial.print(" :: Longitude : ");
   Serial.println(LON/1000000,7);

/*if (LAT == 0 && LON == 0)
{
    continue;   
}
counter ;
if (counter<30)
{
    continue;   
}
   break;
} */   
}

void getGPS()
{
   bool newdata = false;
   unsigned long start = millis();
   while (millis() - start < 2000)
   {
      if (feedgps ())
      {
         newdata = true;
       }
   }
   if (newdata)
   {
      gpsdump(gps);
    }
}
bool feedgps()
{
   while (GPS.available())
{
      if (gps.encode(GPS.read()))
      return true;
      }return 0;
}
void gpsdump(TinyGPS &gps)
{

   gps.get_position(&lat, &lon);
   LAT = lat;
   LON = lon;
   {
      feedgps();
    }
   delay(3000);
}

Super169 发表于 2014-4-15 18:23:07

請問執行多久才會停止, 如果時間不太長的話, 多加一些 debug 用的 Serial.print, 先簡單看看在那裡停了吧.

会计师94 发表于 2014-4-15 20:01:32

Super169 发表于 2014-4-15 18:23 static/image/common/back.gif
請問執行多久才會停止, 如果時間不太長的話, 多加一些 debug 用的 Serial.print, 先簡單看看在那裡停了吧.
...

停止的时间不一定,都是在执行完光感传感器之后就会停止。我怀疑是gps的串口通讯和其他三个传感器互相之间干扰。

Super169 发表于 2014-4-15 20:40:10

理論上干擾只會影響得到的數值, 應該不會導致程式停止.
由於看不到庫的內容, 假設不會有問題.
而在你的程式中, 比較有可能出現停止的可能是while (GPS.available()); 如果 GPS 有問題, 可能會一直在等 (只是猜測, 不能確定).
你可以在while (GPS.available()) 之前加上 Serial.println("Before GPS"); 以及之後加上 Serial.println("After GPS")l, 看看是否停在這裡.
可以的話, 多加入 Serial.println("..."); 作 debug, 就可以容易確認停止的地方, 再針對有關程式研究問題所在.

pliangpalm 发表于 2014-4-15 20:48:56

是否电源功率不够,存在电压拉偏复位

会计师94 发表于 2014-4-17 10:16:11

pliangpalm 发表于 2014-4-15 20:48 static/image/common/back.gif
是否电源功率不够,存在电压拉偏复位

不会是电压不够的问题。

会计师94 发表于 2014-4-17 10:16:52

Super169 发表于 2014-4-15 20:40 static/image/common/back.gif
理論上干擾只會影響得到的數值, 應該不會導致程式停止.
由於看不到庫的內容, 假設不會有問題.
而在你的程 ...

没找到,头疼了。

转角 发表于 2014-5-19 17:49:50

我也遇到类似的问题,姿态传感器+数传就会莫名其妙的死掉,单独使用就没问题
页: [1]
查看完整版本: 传感器和gps实现电脑串口显示通讯。现在的问题是程序执行一段时间就会停止。求帮助