sr501/BH1750/mq-2/dht11

Dependencies:   mbed

Fork of sensors_2 by w mx

Committer:
xmwmx
Date:
Thu Oct 18 16:23:13 2018 +0000
Revision:
4:fe1e9f9c7b33
Parent:
3:31aec950f7dc
9 kinds of sensors

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Dennis_Yu 0:6dca851b4779 1 #include "sensors.h"
Dennis_Yu 0:6dca851b4779 2 #include "mbed.h"
Dennis_Yu 0:6dca851b4779 3
xmwmx 1:1197997ae0ea 4 extern Serial usb2pc;
xmwmx 1:1197997ae0ea 5 extern DigitalOut myled;
xmwmx 4:fe1e9f9c7b33 6 //============================================================SR501
xmwmx 1:1197997ae0ea 7 void sr501::triggered() //触发中断!!
Dennis_Yu 0:6dca851b4779 8 {
xmwmx 1:1197997ae0ea 9 usb2pc.printf("sr501 Triggered!\r\n");
Dennis_Yu 0:6dca851b4779 10 status = true;
Dennis_Yu 0:6dca851b4779 11 }
xmwmx 1:1197997ae0ea 12 //--------
xmwmx 1:1197997ae0ea 13 sr501::sr501(PinName pSignal) //启动热释电!!!
xmwmx 2:cd0ea77c7d66 14 : status(false), signal(pSignal)
Dennis_Yu 0:6dca851b4779 15 {
xmwmx 2:cd0ea77c7d66 16 signal.rise(this, &sr501::triggered);
xmwmx 1:1197997ae0ea 17 usb2pc.printf("sr501 start!\r\n");
Dennis_Yu 0:6dca851b4779 18 }
xmwmx 1:1197997ae0ea 19 //-------
xmwmx 1:1197997ae0ea 20 bool sr501::operator==(const bool &target)
Dennis_Yu 0:6dca851b4779 21 {
Dennis_Yu 0:6dca851b4779 22 if(status == target)
xmwmx 1:1197997ae0ea 23 {
Dennis_Yu 0:6dca851b4779 24 return true;
xmwmx 1:1197997ae0ea 25 }
Dennis_Yu 0:6dca851b4779 26 else
xmwmx 1:1197997ae0ea 27 {
Dennis_Yu 0:6dca851b4779 28 return false;
xmwmx 1:1197997ae0ea 29 }
Dennis_Yu 0:6dca851b4779 30 }
xmwmx 1:1197997ae0ea 31 //-------
Dennis_Yu 0:6dca851b4779 32 void sr501::reset()
Dennis_Yu 0:6dca851b4779 33 {
Dennis_Yu 0:6dca851b4779 34 status = false;
Dennis_Yu 0:6dca851b4779 35 }
xmwmx 1:1197997ae0ea 36 //-------
xmwmx 1:1197997ae0ea 37 int sr501::read()
xmwmx 1:1197997ae0ea 38 {
xmwmx 2:cd0ea77c7d66 39 return signal.read();
xmwmx 1:1197997ae0ea 40 }
xmwmx 4:fe1e9f9c7b33 41 //========================================== //BH1750
xmwmx 1:1197997ae0ea 42 BH1750::BH1750(PinName sda,PinName scl) //启动光强!!!!!(默认设置)
xmwmx 1:1197997ae0ea 43 :link(sda,scl)
xmwmx 1:1197997ae0ea 44 {
xmwmx 1:1197997ae0ea 45 status = true;
xmwmx 1:1197997ae0ea 46 char mode[1]={BH1750_CONTINUOUS_HIGH_RES_MODE};
xmwmx 2:cd0ea77c7d66 47 //usb2pc.printf("modifying\r\n");
xmwmx 1:1197997ae0ea 48 while(status)
xmwmx 1:1197997ae0ea 49 {
xmwmx 1:1197997ae0ea 50 status = link.write(BH1750_I2CADDR, mode, sizeof(mode), false);
xmwmx 1:1197997ae0ea 51 wait_ms(10);
xmwmx 1:1197997ae0ea 52 }
xmwmx 1:1197997ae0ea 53 usb2pc.printf("BH1750 start with default mode!\r\n");
xmwmx 1:1197997ae0ea 54 }
xmwmx 1:1197997ae0ea 55 //--------
xmwmx 1:1197997ae0ea 56 BH1750::BH1750(PinName sda,PinName scl,char mode[]) //启动光强!!!!!(自定义设置)
xmwmx 1:1197997ae0ea 57 :link(sda,scl)
xmwmx 1:1197997ae0ea 58 {
xmwmx 1:1197997ae0ea 59 status = true;
xmwmx 1:1197997ae0ea 60 while(status)
xmwmx 1:1197997ae0ea 61 {
xmwmx 1:1197997ae0ea 62 status = link.write(BH1750_I2CADDR, mode, sizeof(mode), false);
xmwmx 1:1197997ae0ea 63 wait_ms(10);
xmwmx 1:1197997ae0ea 64 }
xmwmx 1:1197997ae0ea 65 usb2pc.printf("BH1750 start with customize mode!\r\n");
xmwmx 1:1197997ae0ea 66 }
xmwmx 1:1197997ae0ea 67 //--------
xmwmx 1:1197997ae0ea 68 float BH1750::getlightdata() //读取光强(lux)
xmwmx 1:1197997ae0ea 69 {
xmwmx 1:1197997ae0ea 70 status = true;
xmwmx 1:1197997ae0ea 71 status = link.read(BH1750_I2CADDR, rawdata, 2, false);
xmwmx 1:1197997ae0ea 72 if(!status)
xmwmx 1:1197997ae0ea 73 {
xmwmx 1:1197997ae0ea 74 float result = ((rawdata[0]<<8)|rawdata[1])/1.2;
xmwmx 1:1197997ae0ea 75 return result;
xmwmx 1:1197997ae0ea 76 }
xmwmx 1:1197997ae0ea 77 else
xmwmx 1:1197997ae0ea 78 {
xmwmx 1:1197997ae0ea 79 usb2pc.printf("BH1750 read fail!\r\n");
xmwmx 1:1197997ae0ea 80 return -1;
xmwmx 1:1197997ae0ea 81 }
xmwmx 2:cd0ea77c7d66 82 }
xmwmx 4:fe1e9f9c7b33 83 //==============================================MQ-2
xmwmx 2:cd0ea77c7d66 84 mq::mq(PinName dio)
xmwmx 2:cd0ea77c7d66 85 : status(false), signal(dio),signallevel(PC_13)
xmwmx 2:cd0ea77c7d66 86 {
xmwmx 2:cd0ea77c7d66 87 signal.fall(this, &mq::triggered);
xmwmx 2:cd0ea77c7d66 88 usb2pc.printf("mq start!\r\n");
xmwmx 2:cd0ea77c7d66 89 }
xmwmx 2:cd0ea77c7d66 90 //--------
xmwmx 2:cd0ea77c7d66 91 mq::mq(PinName dio,PinName aio)
xmwmx 2:cd0ea77c7d66 92 : status(false), signal(dio),signallevel(aio)
xmwmx 2:cd0ea77c7d66 93 {
xmwmx 2:cd0ea77c7d66 94 signal.fall(this, &mq::triggered);
xmwmx 2:cd0ea77c7d66 95 usb2pc.printf("mq start!\r\n");
xmwmx 2:cd0ea77c7d66 96 }
xmwmx 2:cd0ea77c7d66 97 //--------
xmwmx 2:cd0ea77c7d66 98 void mq::triggered() //触发中断!!
xmwmx 2:cd0ea77c7d66 99 {
xmwmx 2:cd0ea77c7d66 100 usb2pc.printf("mq Triggered!\r\n");
xmwmx 2:cd0ea77c7d66 101 status = true;
xmwmx 2:cd0ea77c7d66 102 }
xmwmx 2:cd0ea77c7d66 103 //--------
xmwmx 2:cd0ea77c7d66 104 bool mq::operator==(const bool &target)
xmwmx 2:cd0ea77c7d66 105 {
xmwmx 2:cd0ea77c7d66 106 if(status == target)
xmwmx 2:cd0ea77c7d66 107 {
xmwmx 2:cd0ea77c7d66 108 return true;
xmwmx 2:cd0ea77c7d66 109 }
xmwmx 2:cd0ea77c7d66 110 else
xmwmx 2:cd0ea77c7d66 111 {
xmwmx 2:cd0ea77c7d66 112 return false;
xmwmx 2:cd0ea77c7d66 113 }
xmwmx 2:cd0ea77c7d66 114 }
xmwmx 2:cd0ea77c7d66 115 //--------
xmwmx 2:cd0ea77c7d66 116 float mq::getairdata()
xmwmx 2:cd0ea77c7d66 117 {
xmwmx 3:31aec950f7dc 118 return signallevel.read();
xmwmx 2:cd0ea77c7d66 119 }
xmwmx 2:cd0ea77c7d66 120 //-----------
xmwmx 2:cd0ea77c7d66 121 void mq::reset()
xmwmx 2:cd0ea77c7d66 122 {
xmwmx 2:cd0ea77c7d66 123 status = false;
xmwmx 2:cd0ea77c7d66 124 }
xmwmx 2:cd0ea77c7d66 125 int mq::read()
xmwmx 2:cd0ea77c7d66 126 {
xmwmx 2:cd0ea77c7d66 127 return signal.read();
xmwmx 3:31aec950f7dc 128 }
xmwmx 4:fe1e9f9c7b33 129 //===========================================DHT11
xmwmx 3:31aec950f7dc 130 dht11::dht11(PinName pin)
xmwmx 3:31aec950f7dc 131 :datapin(pin)
xmwmx 3:31aec950f7dc 132 {
xmwmx 3:31aec950f7dc 133 starttime.start();
xmwmx 3:31aec950f7dc 134 usb2pc.printf("dht11 start!\r\n");
xmwmx 3:31aec950f7dc 135 }
xmwmx 3:31aec950f7dc 136 //----------
xmwmx 3:31aec950f7dc 137 int dht11::getdata()
xmwmx 3:31aec950f7dc 138 {
xmwmx 3:31aec950f7dc 139 int timeout=10000;
xmwmx 3:31aec950f7dc 140 uint8_t data[5];
xmwmx 3:31aec950f7dc 141 uint8_t bit=7;
xmwmx 3:31aec950f7dc 142 uint8_t count=0;
xmwmx 3:31aec950f7dc 143
xmwmx 3:31aec950f7dc 144 for(int i=0;i<5;i++)
xmwmx 3:31aec950f7dc 145 {
xmwmx 3:31aec950f7dc 146 data[i]=0;
xmwmx 3:31aec950f7dc 147 }
xmwmx 3:31aec950f7dc 148 if(starttime.read_ms()<1500){while(starttime.read_ms()<1500){}starttime.stop();}
xmwmx 3:31aec950f7dc 149
xmwmx 3:31aec950f7dc 150 datapin.output();
xmwmx 3:31aec950f7dc 151 datapin=0;
xmwmx 3:31aec950f7dc 152 wait_ms(19);
xmwmx 3:31aec950f7dc 153 datapin=1;
xmwmx 3:31aec950f7dc 154 wait_us(30);
xmwmx 3:31aec950f7dc 155 datapin.input();
xmwmx 3:31aec950f7dc 156
xmwmx 3:31aec950f7dc 157 while(!datapin)
xmwmx 3:31aec950f7dc 158 {
xmwmx 3:31aec950f7dc 159 if(timeout--==0){usb2pc.printf("timeout!no reset\r\n");return 0;}
xmwmx 3:31aec950f7dc 160 }
xmwmx 3:31aec950f7dc 161 timeout=10000;
xmwmx 3:31aec950f7dc 162 while(datapin)
xmwmx 3:31aec950f7dc 163 {
xmwmx 3:31aec950f7dc 164 if(timeout--==0){usb2pc.printf("timeout!no respanse\r\n");return 0;}
xmwmx 3:31aec950f7dc 165 }
xmwmx 3:31aec950f7dc 166 timeout=10000;
xmwmx 3:31aec950f7dc 167 for(int i=0;i<40;i++)
xmwmx 3:31aec950f7dc 168 {
xmwmx 3:31aec950f7dc 169 while(!datapin)
xmwmx 3:31aec950f7dc 170 {
xmwmx 3:31aec950f7dc 171 if(timeout--==0){usb2pc.printf("timeout!\r\n");return 0;}
xmwmx 3:31aec950f7dc 172 }
xmwmx 3:31aec950f7dc 173 timer.start();
xmwmx 3:31aec950f7dc 174 timeout=10000;
xmwmx 3:31aec950f7dc 175 while(datapin)
xmwmx 3:31aec950f7dc 176 {
xmwmx 3:31aec950f7dc 177 if(timeout--==0){usb2pc.printf("timeout!n\r\n");return 0;}
xmwmx 3:31aec950f7dc 178 }
xmwmx 3:31aec950f7dc 179 timeout=10000;
xmwmx 3:31aec950f7dc 180 long t=timer.read_us();
xmwmx 3:31aec950f7dc 181 timer.stop();
xmwmx 3:31aec950f7dc 182 timer.reset();
xmwmx 3:31aec950f7dc 183
xmwmx 3:31aec950f7dc 184 if(bit==0)
xmwmx 3:31aec950f7dc 185 {
xmwmx 3:31aec950f7dc 186 if(t>40){data[count]|=(1<<bit);}
xmwmx 3:31aec950f7dc 187 bit=7;
xmwmx 3:31aec950f7dc 188 count++;
xmwmx 3:31aec950f7dc 189 }
xmwmx 3:31aec950f7dc 190 else
xmwmx 3:31aec950f7dc 191 {
xmwmx 3:31aec950f7dc 192 if(t>40)
xmwmx 3:31aec950f7dc 193 {
xmwmx 3:31aec950f7dc 194 data[count]|=(1<<bit);
xmwmx 3:31aec950f7dc 195 }
xmwmx 3:31aec950f7dc 196 bit--;
xmwmx 3:31aec950f7dc 197 }
xmwmx 3:31aec950f7dc 198 }
xmwmx 3:31aec950f7dc 199 datapin=1;
xmwmx 3:31aec950f7dc 200 if(data[4]==data[0]+data[1]+data[2]+data[3])
xmwmx 3:31aec950f7dc 201 {
xmwmx 3:31aec950f7dc 202 //usb2pc.printf("Humidity (%):%f\r\n",(float)data[0]);
xmwmx 3:31aec950f7dc 203 //usb2pc.printf("Temperature (oC): %f\r\n",(float)data[2]);
xmwmx 3:31aec950f7dc 204 H=data[0]+data[1]/10.0;
xmwmx 3:31aec950f7dc 205 T=data[2]+data[3]/10.0;
xmwmx 3:31aec950f7dc 206 return 1;
xmwmx 3:31aec950f7dc 207 }
xmwmx 3:31aec950f7dc 208 else{usb2pc.printf("error!\r\ndata0:%d\tdata1:%d\r\ndata2:%d\tdata3:%d\r\ndata4:%d\r\n",(int)data[0],(int)data[1],(int)data[2],(int)data[3],(int)data[4]);return 0;}
xmwmx 3:31aec950f7dc 209 }
xmwmx 3:31aec950f7dc 210 //-------
xmwmx 3:31aec950f7dc 211 float dht11::gethumidity()
xmwmx 3:31aec950f7dc 212 {
xmwmx 3:31aec950f7dc 213 return H;
xmwmx 3:31aec950f7dc 214 }
xmwmx 3:31aec950f7dc 215 //-------
xmwmx 3:31aec950f7dc 216 float dht11::gettemperature()
xmwmx 3:31aec950f7dc 217 {
xmwmx 3:31aec950f7dc 218 return T;
xmwmx 4:fe1e9f9c7b33 219 }
xmwmx 4:fe1e9f9c7b33 220 //============================================DS18B20
xmwmx 4:fe1e9f9c7b33 221 DS18B20::DS18B20(PinName pin)
xmwmx 4:fe1e9f9c7b33 222 :datapin(pin)
xmwmx 4:fe1e9f9c7b33 223 {
xmwmx 4:fe1e9f9c7b33 224 if(start()){usb2pc.printf("DS18B20 started\r\n");}
xmwmx 4:fe1e9f9c7b33 225 }
xmwmx 4:fe1e9f9c7b33 226 //-----------
xmwmx 4:fe1e9f9c7b33 227 int DS18B20::start()
xmwmx 4:fe1e9f9c7b33 228 {
xmwmx 4:fe1e9f9c7b33 229 //usb2pc.printf("starting\r\n");
xmwmx 4:fe1e9f9c7b33 230 datapin.output();
xmwmx 4:fe1e9f9c7b33 231 datapin=0;
xmwmx 4:fe1e9f9c7b33 232 wait_us(600);
xmwmx 4:fe1e9f9c7b33 233 datapin.input();
xmwmx 4:fe1e9f9c7b33 234 datapin.mode(PullUp);
xmwmx 4:fe1e9f9c7b33 235 wait_us(70);
xmwmx 4:fe1e9f9c7b33 236 while(datapin.read()){return 0;}
xmwmx 4:fe1e9f9c7b33 237 //usb2pc.printf("started\r\n");
xmwmx 4:fe1e9f9c7b33 238 wait_us(250);
xmwmx 4:fe1e9f9c7b33 239 return 1;
xmwmx 4:fe1e9f9c7b33 240 }
xmwmx 4:fe1e9f9c7b33 241 //----------
xmwmx 4:fe1e9f9c7b33 242 void DS18B20::writebyte(uint8_t send)
xmwmx 4:fe1e9f9c7b33 243 {
xmwmx 4:fe1e9f9c7b33 244 datapin.output();
xmwmx 4:fe1e9f9c7b33 245 datapin=1;
xmwmx 4:fe1e9f9c7b33 246 wait_us(20);
xmwmx 4:fe1e9f9c7b33 247 for(int i=0;i<8;i++)
xmwmx 4:fe1e9f9c7b33 248 {
xmwmx 4:fe1e9f9c7b33 249 datapin.output();
xmwmx 4:fe1e9f9c7b33 250 datapin=0; //产生读写时序的起始信号
xmwmx 4:fe1e9f9c7b33 251 wait_us(2); //要求至少1us的延时
xmwmx 4:fe1e9f9c7b33 252 datapin=send & 0x01; //对总线赋值,从最低位开始写起
xmwmx 4:fe1e9f9c7b33 253 wait_us(70);//延时70us,写0在60~120us之间释放,写1的话大于60us均可释放
xmwmx 4:fe1e9f9c7b33 254 datapin=1; //释放总线,为下一次mcu送数据做准备,
xmwmx 4:fe1e9f9c7b33 255 send>>=1; //有效数据移动到最低位,2次写数据间隙至少需1us
xmwmx 4:fe1e9f9c7b33 256 }
xmwmx 4:fe1e9f9c7b33 257 datapin.output();
xmwmx 4:fe1e9f9c7b33 258 datapin=1;
xmwmx 4:fe1e9f9c7b33 259 wait_us(70);
xmwmx 4:fe1e9f9c7b33 260 }
xmwmx 4:fe1e9f9c7b33 261 //-----------
xmwmx 4:fe1e9f9c7b33 262 uint8_t DS18B20::readByte() //mcu读一个字节
xmwmx 4:fe1e9f9c7b33 263 {
xmwmx 4:fe1e9f9c7b33 264 uint8_t i,value=0;
xmwmx 4:fe1e9f9c7b33 265 for(i=0;i<8;i++)
xmwmx 4:fe1e9f9c7b33 266 {
xmwmx 4:fe1e9f9c7b33 267 datapin.output();
xmwmx 4:fe1e9f9c7b33 268 datapin=0; //起始信号
xmwmx 4:fe1e9f9c7b33 269 wait_us(2);
xmwmx 4:fe1e9f9c7b33 270 datapin.input(); //mcu释放总线
xmwmx 4:fe1e9f9c7b33 271 datapin.mode(PullUp);
xmwmx 4:fe1e9f9c7b33 272 if(datapin)
xmwmx 4:fe1e9f9c7b33 273 {
xmwmx 4:fe1e9f9c7b33 274 value=value|0x80;//保存高电平数据,低电平的话不用保存,移位后默认是0
xmwmx 4:fe1e9f9c7b33 275 }
xmwmx 4:fe1e9f9c7b33 276 value>>=1;
xmwmx 4:fe1e9f9c7b33 277 wait_us(30); //延时40us
xmwmx 4:fe1e9f9c7b33 278 }
xmwmx 4:fe1e9f9c7b33 279 return value;
xmwmx 4:fe1e9f9c7b33 280 }
xmwmx 4:fe1e9f9c7b33 281 //------------
xmwmx 4:fe1e9f9c7b33 282 float DS18B20::transfer(uint8_t h,uint8_t l)
xmwmx 4:fe1e9f9c7b33 283 {
xmwmx 4:fe1e9f9c7b33 284 //h=0x01;
xmwmx 4:fe1e9f9c7b33 285 //l=0x01;
xmwmx 4:fe1e9f9c7b33 286 int flag=(h&0x01)>>7;
xmwmx 4:fe1e9f9c7b33 287 if(!flag)
xmwmx 4:fe1e9f9c7b33 288 {
xmwmx 4:fe1e9f9c7b33 289 float i=(h*256+l)*0.25;
xmwmx 4:fe1e9f9c7b33 290 //usb2pc.printf("flag:%d\th:%d\tl:%d\r\n",flag,h,l);
xmwmx 4:fe1e9f9c7b33 291 return i;
xmwmx 4:fe1e9f9c7b33 292 }
xmwmx 4:fe1e9f9c7b33 293 else
xmwmx 4:fe1e9f9c7b33 294 {
xmwmx 4:fe1e9f9c7b33 295 float i=((~h)*256+(~l))*0.25*-1;
xmwmx 4:fe1e9f9c7b33 296 //usb2pc.printf("flag:%d\th:%d\tl:%d\r\n",flag,h,l);
xmwmx 4:fe1e9f9c7b33 297 return i;
xmwmx 4:fe1e9f9c7b33 298 }
xmwmx 4:fe1e9f9c7b33 299 }
xmwmx 4:fe1e9f9c7b33 300 //----------
xmwmx 4:fe1e9f9c7b33 301 int DS18B20::getdata()
xmwmx 4:fe1e9f9c7b33 302 {
xmwmx 4:fe1e9f9c7b33 303 T=5000;
xmwmx 4:fe1e9f9c7b33 304 start();
xmwmx 4:fe1e9f9c7b33 305 writebyte(0xcc);
xmwmx 4:fe1e9f9c7b33 306 writebyte(0x44);
xmwmx 4:fe1e9f9c7b33 307 wait(2);
xmwmx 4:fe1e9f9c7b33 308
xmwmx 4:fe1e9f9c7b33 309 start();
xmwmx 4:fe1e9f9c7b33 310 writebyte(0xcc);
xmwmx 4:fe1e9f9c7b33 311 writebyte(0xbe);
xmwmx 4:fe1e9f9c7b33 312 uint8_t a=readByte();//l
xmwmx 4:fe1e9f9c7b33 313 uint8_t b=readByte();//h
xmwmx 4:fe1e9f9c7b33 314 T=transfer(b,a);
xmwmx 4:fe1e9f9c7b33 315
xmwmx 4:fe1e9f9c7b33 316 if(T==5000){return 0;}
xmwmx 4:fe1e9f9c7b33 317 else{return 1;}
xmwmx 4:fe1e9f9c7b33 318 }
xmwmx 4:fe1e9f9c7b33 319 //----------
xmwmx 4:fe1e9f9c7b33 320 float DS18B20::gettemperature()
xmwmx 4:fe1e9f9c7b33 321 {
xmwmx 4:fe1e9f9c7b33 322 if(getdata()){return T;}
xmwmx 4:fe1e9f9c7b33 323 else{usb2pc.printf("get temperature fail!\r\n");return 0;}
xmwmx 4:fe1e9f9c7b33 324 }
xmwmx 4:fe1e9f9c7b33 325 //==============================================YL-38
xmwmx 4:fe1e9f9c7b33 326 YL::YL(PinName dio)
xmwmx 4:fe1e9f9c7b33 327 : status(false), signal(dio),signallevel(PC_13)
xmwmx 4:fe1e9f9c7b33 328 {
xmwmx 4:fe1e9f9c7b33 329 signal.fall(this, &YL::triggered);
xmwmx 4:fe1e9f9c7b33 330 usb2pc.printf("YL start!\r\n");
xmwmx 4:fe1e9f9c7b33 331 }
xmwmx 4:fe1e9f9c7b33 332 //--------
xmwmx 4:fe1e9f9c7b33 333 YL::YL(PinName dio,PinName aio)
xmwmx 4:fe1e9f9c7b33 334 : status(false), signal(dio),signallevel(aio)
xmwmx 4:fe1e9f9c7b33 335 {
xmwmx 4:fe1e9f9c7b33 336 signal.fall(this, &YL::triggered);
xmwmx 4:fe1e9f9c7b33 337 usb2pc.printf("YL start!\r\n");
xmwmx 4:fe1e9f9c7b33 338 }
xmwmx 4:fe1e9f9c7b33 339 //--------
xmwmx 4:fe1e9f9c7b33 340 void YL::triggered() //触发中断!!
xmwmx 4:fe1e9f9c7b33 341 {
xmwmx 4:fe1e9f9c7b33 342 usb2pc.printf("YL Triggered!\r\n");
xmwmx 4:fe1e9f9c7b33 343 status = true;
xmwmx 4:fe1e9f9c7b33 344 }
xmwmx 4:fe1e9f9c7b33 345 //--------
xmwmx 4:fe1e9f9c7b33 346 bool YL::operator==(const bool &target)
xmwmx 4:fe1e9f9c7b33 347 {
xmwmx 4:fe1e9f9c7b33 348 if(status == target)
xmwmx 4:fe1e9f9c7b33 349 {
xmwmx 4:fe1e9f9c7b33 350 return true;
xmwmx 4:fe1e9f9c7b33 351 }
xmwmx 4:fe1e9f9c7b33 352 else
xmwmx 4:fe1e9f9c7b33 353 {
xmwmx 4:fe1e9f9c7b33 354 return false;
xmwmx 4:fe1e9f9c7b33 355 }
xmwmx 4:fe1e9f9c7b33 356 }
xmwmx 4:fe1e9f9c7b33 357 //--------
xmwmx 4:fe1e9f9c7b33 358 float YL::getairdata()
xmwmx 4:fe1e9f9c7b33 359 {
xmwmx 4:fe1e9f9c7b33 360 return signallevel.read();
xmwmx 4:fe1e9f9c7b33 361 }
xmwmx 4:fe1e9f9c7b33 362 //-----------
xmwmx 4:fe1e9f9c7b33 363 void YL::reset()
xmwmx 4:fe1e9f9c7b33 364 {
xmwmx 4:fe1e9f9c7b33 365 status = false;
xmwmx 4:fe1e9f9c7b33 366 }
xmwmx 4:fe1e9f9c7b33 367 int YL::read()
xmwmx 4:fe1e9f9c7b33 368 {
xmwmx 4:fe1e9f9c7b33 369 return signal.read();
xmwmx 4:fe1e9f9c7b33 370 }
xmwmx 4:fe1e9f9c7b33 371 //=============================================
xmwmx 4:fe1e9f9c7b33 372 BMP180::BMP180(PinName sda,PinName scl)
xmwmx 4:fe1e9f9c7b33 373 :i2c(sda,scl)
xmwmx 4:fe1e9f9c7b33 374 {
xmwmx 4:fe1e9f9c7b33 375 OSS=OSS_3;
xmwmx 4:fe1e9f9c7b33 376 uint8_t c = readByte(BMP180_ADDRESS, BMP180_WHO_AM_I);
xmwmx 4:fe1e9f9c7b33 377 if(c == 0x55) {
xmwmx 4:fe1e9f9c7b33 378
xmwmx 4:fe1e9f9c7b33 379 usb2pc.printf("BMP-180 is 0x%x\r\n", c);
xmwmx 4:fe1e9f9c7b33 380 usb2pc.printf("BMP-180 should be 0x55\r\n");
xmwmx 4:fe1e9f9c7b33 381 usb2pc.printf("BMP-180 online...\r\n");
xmwmx 4:fe1e9f9c7b33 382
xmwmx 4:fe1e9f9c7b33 383 BMP180Calibration();
xmwmx 4:fe1e9f9c7b33 384 usb2pc.printf("BMP-180 calibration complete...\r\n");
xmwmx 4:fe1e9f9c7b33 385 }
xmwmx 4:fe1e9f9c7b33 386 else
xmwmx 4:fe1e9f9c7b33 387 {
xmwmx 4:fe1e9f9c7b33 388 usb2pc.printf("BMP-180 is 0x%x\r\n", c);
xmwmx 4:fe1e9f9c7b33 389 usb2pc.printf("BMP-180 should be 0x55\r\n");
xmwmx 4:fe1e9f9c7b33 390 while(1); // idle here forever
xmwmx 4:fe1e9f9c7b33 391 }
xmwmx 4:fe1e9f9c7b33 392 }
xmwmx 4:fe1e9f9c7b33 393 void BMP180::writeByte(uint8_t address, uint8_t subAddress, uint8_t data)
xmwmx 4:fe1e9f9c7b33 394 {
xmwmx 4:fe1e9f9c7b33 395 char data_write[2];
xmwmx 4:fe1e9f9c7b33 396 data_write[0] = subAddress;
xmwmx 4:fe1e9f9c7b33 397 data_write[1] = data;
xmwmx 4:fe1e9f9c7b33 398 i2c.write(address, data_write, 2, 0);
xmwmx 4:fe1e9f9c7b33 399 }
xmwmx 4:fe1e9f9c7b33 400
xmwmx 4:fe1e9f9c7b33 401 char BMP180::readByte(uint8_t address, uint8_t subAddress)
xmwmx 4:fe1e9f9c7b33 402 {
xmwmx 4:fe1e9f9c7b33 403 char data[1]; // `data` will store the register data
xmwmx 4:fe1e9f9c7b33 404 char data_write[1];
xmwmx 4:fe1e9f9c7b33 405 data_write[0] = subAddress;
xmwmx 4:fe1e9f9c7b33 406 i2c.write(address, data_write, 1, 1); // no stop
xmwmx 4:fe1e9f9c7b33 407 i2c.read(address, data, 1, 0);
xmwmx 4:fe1e9f9c7b33 408 return data[0];
xmwmx 4:fe1e9f9c7b33 409 }
xmwmx 4:fe1e9f9c7b33 410
xmwmx 4:fe1e9f9c7b33 411 void BMP180::readBytes(uint8_t address, uint8_t subAddress, uint8_t count, uint8_t * dest)
xmwmx 4:fe1e9f9c7b33 412 {
xmwmx 4:fe1e9f9c7b33 413 char data[14];
xmwmx 4:fe1e9f9c7b33 414 char data_write[1];
xmwmx 4:fe1e9f9c7b33 415 data_write[0] = subAddress;
xmwmx 4:fe1e9f9c7b33 416 i2c.write(address, data_write, 1, 1); // no stop
xmwmx 4:fe1e9f9c7b33 417 i2c.read(address, data, count, 0);
xmwmx 4:fe1e9f9c7b33 418 for(int ii = 0; ii < count; ii++) {
xmwmx 4:fe1e9f9c7b33 419 dest[ii] = data[ii];
xmwmx 4:fe1e9f9c7b33 420 }
xmwmx 4:fe1e9f9c7b33 421 }
xmwmx 4:fe1e9f9c7b33 422
xmwmx 4:fe1e9f9c7b33 423
xmwmx 4:fe1e9f9c7b33 424 // Stores all of the BMP180's calibration values into global variables
xmwmx 4:fe1e9f9c7b33 425 // Calibration values are required to calculate temp and pressure
xmwmx 4:fe1e9f9c7b33 426 // This function should be called at the beginning of the program
xmwmx 4:fe1e9f9c7b33 427 // These BMP-180 functions were adapted from Jim Lindblom of SparkFun Electronics
xmwmx 4:fe1e9f9c7b33 428 void BMP180::BMP180Calibration()
xmwmx 4:fe1e9f9c7b33 429 {
xmwmx 4:fe1e9f9c7b33 430 ac1 = readByte(BMP180_ADDRESS, 0xAA) << 8 | readByte(BMP180_ADDRESS, 0xAB);
xmwmx 4:fe1e9f9c7b33 431 ac2 = readByte(BMP180_ADDRESS, 0xAC) << 8 | readByte(BMP180_ADDRESS, 0xAD);
xmwmx 4:fe1e9f9c7b33 432 ac3 = readByte(BMP180_ADDRESS, 0xAE) << 8 | readByte(BMP180_ADDRESS, 0xAF);
xmwmx 4:fe1e9f9c7b33 433 ac4 = readByte(BMP180_ADDRESS, 0xB0) << 8 | readByte(BMP180_ADDRESS, 0xB1);
xmwmx 4:fe1e9f9c7b33 434 ac5 = readByte(BMP180_ADDRESS, 0xB2) << 8 | readByte(BMP180_ADDRESS, 0xB3);
xmwmx 4:fe1e9f9c7b33 435 ac6 = readByte(BMP180_ADDRESS, 0xB4) << 8 | readByte(BMP180_ADDRESS, 0xB5);
xmwmx 4:fe1e9f9c7b33 436 b1 = readByte(BMP180_ADDRESS, 0xB6) << 8 | readByte(BMP180_ADDRESS, 0xB7);
xmwmx 4:fe1e9f9c7b33 437 b2 = readByte(BMP180_ADDRESS, 0xB8) << 8 | readByte(BMP180_ADDRESS, 0xB9);
xmwmx 4:fe1e9f9c7b33 438 mb = readByte(BMP180_ADDRESS, 0xBA) << 8 | readByte(BMP180_ADDRESS, 0xBB);
xmwmx 4:fe1e9f9c7b33 439 mc = readByte(BMP180_ADDRESS, 0xBC) << 8 | readByte(BMP180_ADDRESS, 0xBD);
xmwmx 4:fe1e9f9c7b33 440 md = readByte(BMP180_ADDRESS, 0xBE) << 8 | readByte(BMP180_ADDRESS, 0xBF);
xmwmx 4:fe1e9f9c7b33 441 }
xmwmx 4:fe1e9f9c7b33 442
xmwmx 4:fe1e9f9c7b33 443 // Temperature returned will be in units of 0.1 deg C
xmwmx 4:fe1e9f9c7b33 444 long BMP180::BMP180GetTemperature()
xmwmx 4:fe1e9f9c7b33 445 {
xmwmx 4:fe1e9f9c7b33 446 long ut = 0;
xmwmx 4:fe1e9f9c7b33 447 uint8_t rawData[2] = {0, 0};
xmwmx 4:fe1e9f9c7b33 448
xmwmx 4:fe1e9f9c7b33 449 writeByte(BMP180_ADDRESS, 0xF4, 0x2E); // start temperature measurement
xmwmx 4:fe1e9f9c7b33 450 wait_ms(5);
xmwmx 4:fe1e9f9c7b33 451 readBytes(BMP180_ADDRESS, 0xF6, 2, &rawData[0]); // read raw temperature measurement
xmwmx 4:fe1e9f9c7b33 452 ut = rawData[0]*256+ rawData[1];
xmwmx 4:fe1e9f9c7b33 453
xmwmx 4:fe1e9f9c7b33 454 long x1, x2;
xmwmx 4:fe1e9f9c7b33 455
xmwmx 4:fe1e9f9c7b33 456 x1 = (((long)ut - (long)ac6)*(long)ac5) >> 15;
xmwmx 4:fe1e9f9c7b33 457 x2 = ((long)mc << 11)/(x1 + md);
xmwmx 4:fe1e9f9c7b33 458 b5 = x1 + x2;
xmwmx 4:fe1e9f9c7b33 459
xmwmx 4:fe1e9f9c7b33 460 return ((b5 + 8)>>4)/10.0;
xmwmx 4:fe1e9f9c7b33 461 }
xmwmx 4:fe1e9f9c7b33 462
xmwmx 4:fe1e9f9c7b33 463 // Calculate pressure read calibration values
xmwmx 4:fe1e9f9c7b33 464 // b5 is also required so BMP180GetTemperature() must be called first.
xmwmx 4:fe1e9f9c7b33 465 // Value returned will be pressure in units of Pa.
xmwmx 4:fe1e9f9c7b33 466 long BMP180::BMP180GetPressure()
xmwmx 4:fe1e9f9c7b33 467 {
xmwmx 4:fe1e9f9c7b33 468 long up = 0;
xmwmx 4:fe1e9f9c7b33 469 writeByte(BMP180_ADDRESS, 0xF4, 0x34 | OSS << 6); // Configure pressure measurement for highest resolution
xmwmx 4:fe1e9f9c7b33 470 wait_ms(5+8*OSS); // delay 5 ms at lowest resolution, 29 ms at highest
xmwmx 4:fe1e9f9c7b33 471 uint8_t rawData[3] = {0, 0, 0};
xmwmx 4:fe1e9f9c7b33 472 readBytes(BMP180_ADDRESS, 0xF6, 3, &rawData[0]); // read raw pressure measurement of 19 bits
xmwmx 4:fe1e9f9c7b33 473 up = (((long) rawData[0] << 16) | ((long)rawData[1] << 8) | rawData[2]) >> (8 - OSS);
xmwmx 4:fe1e9f9c7b33 474
xmwmx 4:fe1e9f9c7b33 475 long x1, x2, x3, b3, b6, p;
xmwmx 4:fe1e9f9c7b33 476 unsigned long b4, b7;
xmwmx 4:fe1e9f9c7b33 477
xmwmx 4:fe1e9f9c7b33 478 b6 = b5 - 4000;
xmwmx 4:fe1e9f9c7b33 479 // Calculate B3
xmwmx 4:fe1e9f9c7b33 480 x1 = (b2 * (b6 * b6)>>12)>>11;
xmwmx 4:fe1e9f9c7b33 481 x2 = (ac2 * b6)>>11;
xmwmx 4:fe1e9f9c7b33 482 x3 = x1 + x2;
xmwmx 4:fe1e9f9c7b33 483 b3 = (((((long)ac1)*4 + x3)<<OSS) + 2)>>2;
xmwmx 4:fe1e9f9c7b33 484
xmwmx 4:fe1e9f9c7b33 485 // Calculate B4
xmwmx 4:fe1e9f9c7b33 486 x1 = (ac3 * b6)>>13;
xmwmx 4:fe1e9f9c7b33 487 x2 = (b1 * ((b6 * b6)>>12))>>16;
xmwmx 4:fe1e9f9c7b33 488 x3 = ((x1 + x2) + 2)>>2;
xmwmx 4:fe1e9f9c7b33 489 b4 = (ac4 * (unsigned long)(x3 + 32768))>>15;
xmwmx 4:fe1e9f9c7b33 490
xmwmx 4:fe1e9f9c7b33 491 b7 = ((unsigned long)(up - b3) * (50000>>OSS));
xmwmx 4:fe1e9f9c7b33 492 if (b7 < 0x80000000)
xmwmx 4:fe1e9f9c7b33 493 p = (b7<<1)/b4;
xmwmx 4:fe1e9f9c7b33 494 else
xmwmx 4:fe1e9f9c7b33 495 p = (b7/b4)<<1;
xmwmx 4:fe1e9f9c7b33 496
xmwmx 4:fe1e9f9c7b33 497 x1 = (p>>8) * (p>>8);
xmwmx 4:fe1e9f9c7b33 498 x1 = (x1 * 3038)>>16;
xmwmx 4:fe1e9f9c7b33 499 x2 = (-7357 * p)>>16;
xmwmx 4:fe1e9f9c7b33 500 p += (x1 + x2 + 3791)>>4;
xmwmx 4:fe1e9f9c7b33 501
xmwmx 4:fe1e9f9c7b33 502 return p;
xmwmx 4:fe1e9f9c7b33 503 }
xmwmx 4:fe1e9f9c7b33 504 //===============================
xmwmx 4:fe1e9f9c7b33 505 GP2Y1010::GP2Y1010(PinName led,PinName measure)
xmwmx 4:fe1e9f9c7b33 506 :measurePin(measure),ledPower(led)
xmwmx 4:fe1e9f9c7b33 507 {
xmwmx 4:fe1e9f9c7b33 508 samplingTime = 280;
xmwmx 4:fe1e9f9c7b33 509 deltaTime = 40;
xmwmx 4:fe1e9f9c7b33 510 sleepTime = 9680;
xmwmx 4:fe1e9f9c7b33 511
xmwmx 4:fe1e9f9c7b33 512 voMeasured = 0;
xmwmx 4:fe1e9f9c7b33 513 calcVoltage = 0;
xmwmx 4:fe1e9f9c7b33 514 dustDensity = 0;
xmwmx 4:fe1e9f9c7b33 515 }
xmwmx 4:fe1e9f9c7b33 516
xmwmx 4:fe1e9f9c7b33 517 float GP2Y1010::getairdata()
xmwmx 4:fe1e9f9c7b33 518 {
xmwmx 4:fe1e9f9c7b33 519 ledPower=1;
xmwmx 4:fe1e9f9c7b33 520
xmwmx 4:fe1e9f9c7b33 521 wait_us(samplingTime);
xmwmx 4:fe1e9f9c7b33 522
xmwmx 4:fe1e9f9c7b33 523 voMeasured = measurePin.read();
xmwmx 4:fe1e9f9c7b33 524
xmwmx 4:fe1e9f9c7b33 525 wait_us(deltaTime);
xmwmx 4:fe1e9f9c7b33 526 ledPower=0;
xmwmx 4:fe1e9f9c7b33 527 wait_us(sleepTime);
xmwmx 4:fe1e9f9c7b33 528
xmwmx 4:fe1e9f9c7b33 529 calcVoltage = voMeasured*5.0;
xmwmx 4:fe1e9f9c7b33 530 dustDensity = 0.17*calcVoltage-0.1;
xmwmx 4:fe1e9f9c7b33 531
xmwmx 4:fe1e9f9c7b33 532 if ( dustDensity < 0)
xmwmx 4:fe1e9f9c7b33 533 {
xmwmx 4:fe1e9f9c7b33 534 dustDensity = 0.00;
xmwmx 4:fe1e9f9c7b33 535 }
xmwmx 4:fe1e9f9c7b33 536 return dustDensity ;
xmwmx 4:fe1e9f9c7b33 537 }