极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 11500|回复: 7

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

[复制链接]
发表于 2014-4-15 16:27:07 | 显示全部楼层 |阅读模式
#include <Wire.h>   
//===============================================

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

#define u16 unsigned int  
#define u8  unsigned char
#define u32 unsigned long
#define u64 unsigned long long
#define MS5611 0x77
#define Reset  0x1e
#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_t  d1;
uint32_t  d2;
int32_t TEMP = 0;
u16 Prom[8];
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[i+1] = Wire.read() << 8 | Wire.read();    }   
    else
    {     
      Serial.println("Error reading PROM 1");  }   
     
     }  
      Serial.println(Prom[i+1]);
    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[5];


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[5] << 8);
    OFF = ((int64_t)Prom[2]*pow(2,17) + dT*Prom[4]/pow(2,6));
    SENS = ((int64_t)Prom[1]*pow(2,16) + dT*Prom[3]/pow(2,7));
    T = 2000+((float)(dT*Prom[6]))/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[i] = readByte();
  byte checksum=dht_dat[0]+dht_dat[1]+dht_dat[2]+dht_dat[3];
  if(dht_dat[4] == checksum){
   
    int HighByte = dht_dat[0];
    int LowByte = dht_dat[1];
    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[2];
    LowByte = dht_dat[3];
    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);
  }
回复

使用道具 举报

发表于 2014-4-15 18:23:07 | 显示全部楼层
請問執行多久才會停止, 如果時間不太長的話, 多加一些 debug 用的 Serial.print, 先簡單看看在那裡停了吧.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-4-15 20:01:32 | 显示全部楼层
Super169 发表于 2014-4-15 18:23
請問執行多久才會停止, 如果時間不太長的話, 多加一些 debug 用的 Serial.print, 先簡單看看在那裡停了吧.
...

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

使用道具 举报

发表于 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, 就可以容易確認停止的地方, 再針對有關程式研究問題所在.
回复 支持 反对

使用道具 举报

发表于 2014-4-15 20:48:56 | 显示全部楼层
是否电源功率不够,存在电压拉偏复位
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-4-17 10:16:11 | 显示全部楼层
pliangpalm 发表于 2014-4-15 20:48
是否电源功率不够,存在电压拉偏复位

不会是电压不够的问题。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-4-17 10:16:52 | 显示全部楼层
Super169 发表于 2014-4-15 20:40
理論上干擾只會影響得到的數值, 應該不會導致程式停止.
由於看不到庫的內容, 假設不會有問題.
而在你的程 ...

没找到,头疼了。
回复 支持 反对

使用道具 举报

发表于 2014-5-19 17:49:50 | 显示全部楼层
我也遇到类似的问题,姿态传感器+数传就会莫名其妙的死掉,单独使用就没问题
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-14 19:41 , Processed in 0.036940 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表