2015-5-17 16:14:46 [显示全部楼层]
9838浏览
查看: 9838|回复: 20

空气传感器问题

[复制链接]
大家有谁玩过Sharp GP2Y1010AU0F 空气质量传感器呢?我现在遇到一个问题,我用面包板把紫外线,空气质量,温湿度,大气压传感器和uno全部连在了一起,想同时得到当前环境下的这些数据,现在问题来了,其他传感器都正常,就是空气传感得到的这行数据显示不正常,只有把独立的空气质量程序写进去,数据才能正常。。。
空气传感器问题图1

下面是代码,温湿度和大气压都用的I2C总线,我把他们并联起来了,没有问题。
#include <Wire.h>

const int ADDR =0x40;
int X0,X1,Y0,Y1,Y2,Y3;
double X,Y,X_out,Y_out1,Y_out2;

#define BMP180ADD 0xEE>>1  // I2C address of BMP180  
                         //write is (0xEE)     read is (0xEF)      
//yixiashikongqizhiliang chuanganqideshengmign
int measurePin = 0; //Connect dust sensor to Arduino A0 pin
//int ledPower = 2;   //Connect 3 led driver pins of dust sensor to Arduino D2

int samplingTime = 280;
int deltaTime = 40;
int sleepTime = 9680;

float voMeasured = 0;
float calcVoltage = 0;
float dustDensity = 0;
//kongqich
unsigned char OSS;                           
/**********************MSB      LSB******/
int ac1;           // 0xAA     0xAB
int ac2;           // 0xAC     0xAD
int ac3;           // 0xAE     0xAE
unsigned int ac4;  // 0xB0     0xB1
unsigned int ac5;  // 0xB2     0xB3
unsigned int ac6;  // 0xB4     0xB5
int b1;            // 0xB6     0xB7
int b2;            // 0xB8     0xB9
int mb;            // 0xBA     0xBB
int mc;            // 0xBC     0xBD
int md;            // 0xBE     0xBF
float temperature;  
double pressure;   
double pressure2;
long b5;         
double altitude;  



void setup()
{
  Serial.begin(9600);
  Wire.begin();
  OSS = 2;  // Oversampling Setting           0: single    1: 2 times    2: 4 times   3: 8 times
  BMP180start();

  delay(100);  
   Wire.beginTransmission(ADDR);
   Wire.endTransmission();

  pinMode(13,OUTPUT);

}

void loop()
{
  //ziwaixian
  int sensorValue;
  int analogValue = analogRead(1);//connect UV sensors to Analog 0   
  if (analogValue<20)
  {
    sensorValue = 0;
  }
  else
  {
    sensorValue = 0.05*analogValue-1;
  }
  Serial.print("the UV Value is  ");
  Serial.println(sensorValue);//print the value to serial
  //ziwaixian

  //wenshidu
  Wire.beginTransmission(ADDR);                    
   Wire.write(0xE3);                               //发送读温度命令
   Wire.endTransmission();

   Serial.print("Temp");Serial.print("\t");Serial.println("RH");

   /**读取温度数据**/
   digitalWrite(13,HIGH);                          //LED亮开始读数据
   Wire.requestFrom(ADDR,2);                       //回传数据

   if(Wire.available()<=2);
   {
     X0 = Wire.read();
     X1 = Wire.read();
     X0 = X0<<8;
     X_out = X0+X1;
   }

   /**计算并显示温度**/
   X=(175.72*X_out)/65536;                        
   X=X-46.85;
   Serial.print(X);Serial.print("C");Serial.print("\t");

   /**发送湿度测量命令**/       
   Wire.beginTransmission(ADDR);                     
   Wire.write(0xE5);
   Wire.endTransmission();

   /**读取湿度数据**/       
   Wire.requestFrom(ADDR,2);
   if(Wire.available()<=2);
   {
     Y0 = Wire.read();Y2=Y0/100; Y0=Y0%100;
     Y1 = Wire.read();
     Y_out1 = Y2*25600;
     Y_out2 = Y0*256+Y1;
   }

   /**计算并显示湿度**/
   Y_out1 = (125*Y_out1)/65536;                     
   Y_out2 = (125*Y_out2)/65536;
   Y = Y_out1+Y_out2;
   Y=Y-6;
   Serial.print(Y);Serial.println("%");

   digitalWrite(13,LOW);
   //wenshidu

  //kongqi
  delayMicroseconds(samplingTime);

  voMeasured = analogRead(measurePin); // read the dust value

  delayMicroseconds(deltaTime);
  //digitalWrite(ledPower,HIGH); // turn the LED off
  delayMicroseconds(sleepTime);

  // 0 - 5V mapped to 0 - 1023 integer values
  // recover voltage
  calcVoltage = voMeasured * (5.0 / 1024.0);

  // linear eqaution taken from http://www.howmuchsnow.com/arduino/airquality/
  // Chris Nafis (c) 2012
  dustDensity = 0.17 * calcVoltage - 0.1;

  Serial.print("Raw Signal Value (0-1023): ");
  Serial.print(voMeasured);

  Serial.print(" - Voltage: ");
  Serial.print(calcVoltage);

  Serial.print(" - Dust Density: ");
  Serial.println(dustDensity); // unit: mg/m3
  //kongqi

  //daqiya
  calculate();
  show();
  //daqiya
  delay(5000);
}

/** calculate centure **/
void calculate()
{
  temperature = bmp180GetTemperature(bmp180ReadUT());
  temperature = temperature*0.1;
  pressure = bmp180GetPressure(bmp180ReadUP());
  pressure2 = pressure/101325;
  pressure2 = pow(pressure2,0.19029496);
  altitude = 44330*(1-pressure2);                            //altitude = 44330*(1-(pressure/101325)^0.19029496);
}

/** print reslut **/
void show()
{
  Serial.print("Temperature: ");
  Serial.print(temperature, 1);                            //10 hexadecimal
  Serial.println(" C");
  Serial.print("Pressure: ");
  Serial.print(pressure, 0);                               //10 hexadecimal
  Serial.println(" Pa");
  Serial.print("altitude:");
  Serial.print(altitude);
  Serial.println("m");
}

/**BMP180 satrt program**/
void BMP180start()
{                     /*MSB*/
  ac1 = bmp180ReadDate(0xAA);                      //get full data
  ac2 = bmp180ReadDate(0xAC);  
  ac3 = bmp180ReadDate(0xAE);  
  ac4 = bmp180ReadDate(0xB0);  
  ac5 = bmp180ReadDate(0xB2);  
  ac6 = bmp180ReadDate(0xB4);  
  b1  = bmp180ReadDate(0xB6);  
  b2  = bmp180ReadDate(0xB8);  
  mb  = bmp180ReadDate(0xBA);  
  mc  = bmp180ReadDate(0xBC);  
  md  = bmp180ReadDate(0xBE);
}

/***BMP180 temperature Calculate***/
short bmp180GetTemperature(unsigned int ut)
{
  long x1, x2;
  x1 = (((long)ut - (long)ac6)*(long)ac5) >> 15;  //x1=((ut-ac6)*ac5)/(2^15)
  x2 = ((long)mc << 11)/(x1 + md);                //x2=(mc*2^11)/(x1+md)
  b5 = x1 + x2;                                   //b5=x1+x2
  return ((b5 + 8)>>4);                           //t=(b5+8)/(2^4)
}

/***BMP180 pressure Calculate***/

long bmp180GetPressure(unsigned long up)
{
  long x1, x2, x3, b3, b6, p;
  unsigned long b4, b7;

  b6 = b5 - 4000;

  x1 = (b2 * (b6 * b6)>>12)>>11;
  x2 = (ac2 * b6)>>11;
  x3 = x1 + x2;
  b3 = (((((long)ac1)*4 + x3)<<OSS) + 2)>>2;

  x1 = (ac3 * b6)>>13;
  x2 = (b1 * ((b6 * b6)>>12))>>16;
  x3 = ((x1 + x2) + 2)>>2;
  b4 = (ac4 * (unsigned long)(x3 + 32768))>>15;

  b7 = ((unsigned long)(up - b3) * (50000>>OSS));
  if (b7 < 0x80000000)
    p = (b7<<1)/b4;
  else
    p = (b7/b4)<<1;

  x1 = (p>>8) * (p>>8);
  x1 = (x1 * 3038)>>16;
  x2 = (-7357 * p)>>16;
  p += (x1 + x2 + 3791)>>4;

  return p;
}


/*** Read 1 bytes from the BMP180  ***/

int bmp180Read(unsigned char address)
{
  unsigned char data;

  Wire.beginTransmission(BMP180ADD);
  Wire.write(address);
  Wire.endTransmission();

  Wire.requestFrom(BMP180ADD, 1);
  while(!Wire.available());

  return Wire.read();
}

/*** Read 2 bytes from the BMP180 ***/
int bmp180ReadDate(unsigned char address)
{
  unsigned char msb, lsb;
  Wire.beginTransmission(BMP180ADD);
  Wire.write(address);
  Wire.endTransmission();
  Wire.requestFrom(BMP180ADD, 2);
  while(Wire.available()<2);
  msb = Wire.read();
  lsb = Wire.read();
  return (int) msb<<8 | lsb;
}

/*** read uncompensated temperature value ***/
unsigned int bmp180ReadUT()
{
  unsigned int ut;
  Wire.beginTransmission(BMP180ADD);
  Wire.write(0xF4);                       // Write 0x2E into Register 0xF4
  Wire.write(0x2E);                       // This requests a temperature reading
  Wire.endTransmission();  
  delay(5);                               // Wait at least 4.5ms
  ut = bmp180ReadDate(0xF6);               // read MSB from 0xF6 read LSB from (16 bit)
  return ut;
}

/*** Read uncompensated pressure value from BMP180 ***/
unsigned long bmp180ReadUP()
{
  unsigned char msb, lsb, xlsb;
  unsigned long up = 0;

  Wire.beginTransmission(BMP180ADD);
  Wire.write(0xF4);                        // Write 0x34+(OSS<<6) into register 0xF4
  Wire.write(0x34 + (OSS<<6));             // 0x34+oss*64
  Wire.endTransmission();
  delay(2 + (3<<OSS));                     // Wait for conversion, delay time dependent on OSS

  Wire.beginTransmission(BMP180ADD);
  Wire.write(0xF6);                        // Read register 0xF6 (MSB), 0xF7 (LSB), and 0xF8 (XLSB)
  Wire.endTransmission();

  Wire.requestFrom(BMP180ADD, 3);
  while(Wire.available() < 3);             // Wait for data to become available
  msb = Wire.read();
  lsb = Wire.read();
  xlsb = Wire.read();
  up = (((unsigned long) msb << 16) | ((unsigned long) lsb << 8) | (unsigned long) xlsb) >> (8-OSS);//16 to 19 bit
  return up;
}

丄帝De咗臂  高级技匠

发表于 2015-5-17 16:31:44

没玩过
回复

使用道具 举报

大连林海  初级技神

发表于 2015-5-17 17:14:44

太高端 这事得陈老师来咯@@丄帝De咗臂
回复

使用道具 举报

hnyzcj  版主

发表于 2015-5-17 21:00:06

调整下时间间隔。
回复

使用道具 举报

hnyzcj  版主

发表于 2015-5-17 21:00:22

或者做个中断。
回复

使用道具 举报

fbygg  高级技师
 楼主|

发表于 2015-5-17 21:38:54

hnyzcj 发表于 2015-5-17 21:00
或者做个中断。

好的我试一下,谢谢你:)
回复

使用道具 举报

丄帝De咗臂  高级技匠

发表于 2015-5-17 21:42:14

大连林海 发表于 2015-5-17 17:14
太高端 这事得陈老师来咯@@丄帝De咗臂

我想说两年前我玩过,但是忘记了
回复

使用道具 举报

fbygg  高级技师
 楼主|

发表于 2015-5-17 21:43:32

大连林海 发表于 2015-5-17 17:14
太高端 这事得陈老师来咯@@丄帝De咗臂

陈老师是谁呀,我来社区不久,很多人不认识
回复

使用道具 举报

大连林海  初级技神

发表于 2015-5-17 22:08:46

fbygg 发表于 2015-5-17 21:38
好的我试一下,谢谢你

就是回复你 调整时间的这班组
回复

使用道具 举报

大连林海  初级技神

发表于 2015-5-17 22:10:01

丄帝De咗臂 发表于 2015-5-17 21:42
我想说两年前我玩过,但是忘记了

好吧 就我没有玩过
回复

使用道具 举报

丄帝De咗臂  高级技匠

发表于 2015-5-18 09:54:02

大连林海 发表于 2015-5-17 22:10
好吧 就我没有玩过

买一个,淘宝很便宜的
回复

使用道具 举报

Cain  初级技匠

发表于 2015-5-18 10:31:08

之前有遇到过一次是因为模拟口电压跳变周围会有干扰,只留一个模拟传感器试试呢,如果程序无误,可以加个滤波或者像之前那老师说的调整间隔
回复

使用道具 举报

fbygg  高级技师
 楼主|

发表于 2015-5-18 12:35:24

Cain 发表于 2015-5-18 10:31
之前有遇到过一次是因为模拟口电压跳变周围会有干扰,只留一个模拟传感器试试呢,如果程序无误,可以加个滤 ...

如果连线不变,只写进空气传感器的程序,显示正常
回复

使用道具 举报

大连林海  初级技神

发表于 2015-5-18 13:11:07

丄帝De咗臂 发表于 2015-5-18 09:54
买一个,淘宝很便宜的

哈哈 好的
回复

使用道具 举报

大连林海  初级技神

发表于 2015-5-18 13:11:10

丄帝De咗臂 发表于 2015-5-18 09:54
买一个,淘宝很便宜的

哈哈 好的
回复

使用道具 举报

Cain  初级技匠

发表于 2015-5-18 13:34:55

fbygg 发表于 2015-5-18 12:35
如果连线不变,只写进空气传感器的程序,显示正常

我的意思是把现在的程序内其他用模拟口的传感器全去掉一点点排除原因
回复

使用道具 举报

fbygg  高级技师
 楼主|
来自手机

发表于 2015-5-18 15:11:48

Cain 发表于 2015-5-18 13:34
我的意思是把现在的程序内其他用模拟口的传感器全去掉一点点排除原因

这样啊,好的,我没课的时候试一下,谢谢
回复

使用道具 举报

fbygg  高级技师
 楼主|

发表于 2015-5-18 18:57:24

Cain 发表于 2015-5-18 13:34
我的意思是把现在的程序内其他用模拟口的传感器全去掉一点点排除原因

问题刚刚解决了,我查了Sharp GP2Y1010AU0F 空气质量传感器的Data Sheet,发现它必须有固定的延时才可以启动,我在程序里把这部分放在了中间,前面程序的运行时间对他造成了影响,这次我把它放在了loop中的最前面,就ok了
回复

使用道具 举报

Rockets  NPC

发表于 2015-5-20 14:50:05

fbygg 发表于 2015-5-18 18:57
问题刚刚解决了,我查了Sharp GP2Y1010AU0F 空气质量传感器的Data Sheet,发现它必须有固定的延时才可以 ...

arduino最大的问题其实就是delay的用法会造成很多困扰。
但delay的用法确实方便很多初级用户的使用。
高级的使用,还是要考虑用中断等方法来执行。
回复

使用道具 举报

fbygg  高级技师
 楼主|

发表于 2015-5-20 16:41:11

Rockets 发表于 2015-5-20 14:50
arduino最大的问题其实就是delay的用法会造成很多困扰。
但delay的用法确实方便很多初级用户的使用。
高 ...

Arduino高级应用应该从哪里学起呢?
回复

使用道具 举报

Rockets  NPC

发表于 2015-5-25 22:11:53

fbygg 发表于 2015-5-20 16:41
Arduino高级应用应该从哪里学起呢?

简单来说,应该看下metro库的应用,能够学会用metro库,基本上可以说进入Arduino的高级基础了。
关于metro库,请在论坛里搜索相关教程吧。
因为我也不是很熟悉的。
希望有更多的人来帮你。
回复

使用道具 举报

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

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail