trainning_template

Dependencies:   mbed

Committer:
brainliang
Date:
Tue Dec 01 05:21:19 2020 +0000
Revision:
5:7534fc9248a8
Parent:
4:fe1e9f9c7b33
Child:
6:398753e95e87
trainning_template

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