trainning_template

Dependencies:   mbed

Committer:
brainliang
Date:
Tue Dec 01 07:10:01 2020 +0000
Revision:
6:398753e95e87
Parent:
5:7534fc9248a8
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 6:398753e95e87 191 getdata();
brainliang 5:7534fc9248a8 192 return H;
brainliang 5:7534fc9248a8 193 }
brainliang 5:7534fc9248a8 194 //-------
brainliang 5:7534fc9248a8 195 float dht11::gettemperature()
brainliang 5:7534fc9248a8 196 {
brainliang 6:398753e95e87 197 getdata();
brainliang 5:7534fc9248a8 198 return T;
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
brainliang 5:7534fc9248a8 214
brainliang 5:7534fc9248a8 215
xmwmx 4:fe1e9f9c7b33 216 //============================================================SR501
xmwmx 1:1197997ae0ea 217 void sr501::triggered() //触发中断!!
Dennis_Yu 0:6dca851b4779 218 {
brainliang 5:7534fc9248a8 219 // usb2pc.printf("sr501 Triggered!\r\n");
Dennis_Yu 0:6dca851b4779 220 status = true;
Dennis_Yu 0:6dca851b4779 221 }
xmwmx 1:1197997ae0ea 222 //--------
xmwmx 1:1197997ae0ea 223 sr501::sr501(PinName pSignal) //启动热释电!!!
xmwmx 2:cd0ea77c7d66 224 : status(false), signal(pSignal)
Dennis_Yu 0:6dca851b4779 225 {
xmwmx 2:cd0ea77c7d66 226 signal.rise(this, &sr501::triggered);
brainliang 5:7534fc9248a8 227 // usb2pc.printf("sr501 start!\r\n");
Dennis_Yu 0:6dca851b4779 228 }
xmwmx 1:1197997ae0ea 229 //-------
xmwmx 1:1197997ae0ea 230 bool sr501::operator==(const bool &target)
Dennis_Yu 0:6dca851b4779 231 {
Dennis_Yu 0:6dca851b4779 232 if(status == target)
xmwmx 1:1197997ae0ea 233 {
Dennis_Yu 0:6dca851b4779 234 return true;
xmwmx 1:1197997ae0ea 235 }
Dennis_Yu 0:6dca851b4779 236 else
xmwmx 1:1197997ae0ea 237 {
Dennis_Yu 0:6dca851b4779 238 return false;
xmwmx 1:1197997ae0ea 239 }
Dennis_Yu 0:6dca851b4779 240 }
xmwmx 1:1197997ae0ea 241 //-------
Dennis_Yu 0:6dca851b4779 242 void sr501::reset()
Dennis_Yu 0:6dca851b4779 243 {
Dennis_Yu 0:6dca851b4779 244 status = false;
Dennis_Yu 0:6dca851b4779 245 }
xmwmx 1:1197997ae0ea 246 //-------
xmwmx 1:1197997ae0ea 247 int sr501::read()
xmwmx 1:1197997ae0ea 248 {
xmwmx 2:cd0ea77c7d66 249 return signal.read();
xmwmx 1:1197997ae0ea 250 }
xmwmx 4:fe1e9f9c7b33 251 //========================================== //BH1750
xmwmx 1:1197997ae0ea 252 BH1750::BH1750(PinName sda,PinName scl) //启动光强!!!!!(默认设置)
xmwmx 1:1197997ae0ea 253 :link(sda,scl)
xmwmx 1:1197997ae0ea 254 {
xmwmx 1:1197997ae0ea 255 status = true;
xmwmx 1:1197997ae0ea 256 char mode[1]={BH1750_CONTINUOUS_HIGH_RES_MODE};
xmwmx 2:cd0ea77c7d66 257 //usb2pc.printf("modifying\r\n");
xmwmx 1:1197997ae0ea 258 while(status)
xmwmx 1:1197997ae0ea 259 {
xmwmx 1:1197997ae0ea 260 status = link.write(BH1750_I2CADDR, mode, sizeof(mode), false);
xmwmx 1:1197997ae0ea 261 wait_ms(10);
xmwmx 1:1197997ae0ea 262 }
brainliang 5:7534fc9248a8 263 // usb2pc.printf("BH1750 start with default mode!\r\n");
xmwmx 1:1197997ae0ea 264 }
xmwmx 1:1197997ae0ea 265 //--------
xmwmx 1:1197997ae0ea 266 BH1750::BH1750(PinName sda,PinName scl,char mode[]) //启动光强!!!!!(自定义设置)
xmwmx 1:1197997ae0ea 267 :link(sda,scl)
xmwmx 1:1197997ae0ea 268 {
xmwmx 1:1197997ae0ea 269 status = true;
xmwmx 1:1197997ae0ea 270 while(status)
xmwmx 1:1197997ae0ea 271 {
xmwmx 1:1197997ae0ea 272 status = link.write(BH1750_I2CADDR, mode, sizeof(mode), false);
xmwmx 1:1197997ae0ea 273 wait_ms(10);
xmwmx 1:1197997ae0ea 274 }
brainliang 5:7534fc9248a8 275 // usb2pc.printf("BH1750 start with customize mode!\r\n");
xmwmx 1:1197997ae0ea 276 }
xmwmx 1:1197997ae0ea 277 //--------
xmwmx 1:1197997ae0ea 278 float BH1750::getlightdata() //读取光强(lux)
xmwmx 1:1197997ae0ea 279 {
xmwmx 1:1197997ae0ea 280 status = true;
xmwmx 1:1197997ae0ea 281 status = link.read(BH1750_I2CADDR, rawdata, 2, false);
xmwmx 1:1197997ae0ea 282 if(!status)
xmwmx 1:1197997ae0ea 283 {
xmwmx 1:1197997ae0ea 284 float result = ((rawdata[0]<<8)|rawdata[1])/1.2;
xmwmx 1:1197997ae0ea 285 return result;
xmwmx 1:1197997ae0ea 286 }
xmwmx 1:1197997ae0ea 287 else
xmwmx 1:1197997ae0ea 288 {
brainliang 5:7534fc9248a8 289 // usb2pc.printf("BH1750 read fail!\r\n");
xmwmx 1:1197997ae0ea 290 return -1;
xmwmx 1:1197997ae0ea 291 }
xmwmx 2:cd0ea77c7d66 292 }
brainliang 5:7534fc9248a8 293
xmwmx 4:fe1e9f9c7b33 294 //============================================DS18B20
xmwmx 4:fe1e9f9c7b33 295 DS18B20::DS18B20(PinName pin)
xmwmx 4:fe1e9f9c7b33 296 :datapin(pin)
xmwmx 4:fe1e9f9c7b33 297 {
brainliang 5:7534fc9248a8 298 // if(start()){usb2pc.printf("DS18B20 started\r\n");}
brainliang 5:7534fc9248a8 299 if(start()){}
xmwmx 4:fe1e9f9c7b33 300 }
xmwmx 4:fe1e9f9c7b33 301 //-----------
xmwmx 4:fe1e9f9c7b33 302 int DS18B20::start()
xmwmx 4:fe1e9f9c7b33 303 {
xmwmx 4:fe1e9f9c7b33 304 //usb2pc.printf("starting\r\n");
xmwmx 4:fe1e9f9c7b33 305 datapin.output();
xmwmx 4:fe1e9f9c7b33 306 datapin=0;
xmwmx 4:fe1e9f9c7b33 307 wait_us(600);
xmwmx 4:fe1e9f9c7b33 308 datapin.input();
xmwmx 4:fe1e9f9c7b33 309 datapin.mode(PullUp);
xmwmx 4:fe1e9f9c7b33 310 wait_us(70);
xmwmx 4:fe1e9f9c7b33 311 while(datapin.read()){return 0;}
xmwmx 4:fe1e9f9c7b33 312 //usb2pc.printf("started\r\n");
xmwmx 4:fe1e9f9c7b33 313 wait_us(250);
xmwmx 4:fe1e9f9c7b33 314 return 1;
xmwmx 4:fe1e9f9c7b33 315 }
xmwmx 4:fe1e9f9c7b33 316 //----------
xmwmx 4:fe1e9f9c7b33 317 void DS18B20::writebyte(uint8_t send)
xmwmx 4:fe1e9f9c7b33 318 {
xmwmx 4:fe1e9f9c7b33 319 datapin.output();
xmwmx 4:fe1e9f9c7b33 320 datapin=1;
xmwmx 4:fe1e9f9c7b33 321 wait_us(20);
xmwmx 4:fe1e9f9c7b33 322 for(int i=0;i<8;i++)
xmwmx 4:fe1e9f9c7b33 323 {
xmwmx 4:fe1e9f9c7b33 324 datapin.output();
xmwmx 4:fe1e9f9c7b33 325 datapin=0; //产生读写时序的起始信号
xmwmx 4:fe1e9f9c7b33 326 wait_us(2); //要求至少1us的延时
xmwmx 4:fe1e9f9c7b33 327 datapin=send & 0x01; //对总线赋值,从最低位开始写起
xmwmx 4:fe1e9f9c7b33 328 wait_us(70);//延时70us,写0在60~120us之间释放,写1的话大于60us均可释放
xmwmx 4:fe1e9f9c7b33 329 datapin=1; //释放总线,为下一次mcu送数据做准备,
xmwmx 4:fe1e9f9c7b33 330 send>>=1; //有效数据移动到最低位,2次写数据间隙至少需1us
xmwmx 4:fe1e9f9c7b33 331 }
xmwmx 4:fe1e9f9c7b33 332 datapin.output();
xmwmx 4:fe1e9f9c7b33 333 datapin=1;
xmwmx 4:fe1e9f9c7b33 334 wait_us(70);
xmwmx 4:fe1e9f9c7b33 335 }
xmwmx 4:fe1e9f9c7b33 336 //-----------
xmwmx 4:fe1e9f9c7b33 337 uint8_t DS18B20::readByte() //mcu读一个字节
xmwmx 4:fe1e9f9c7b33 338 {
xmwmx 4:fe1e9f9c7b33 339 uint8_t i,value=0;
xmwmx 4:fe1e9f9c7b33 340 for(i=0;i<8;i++)
xmwmx 4:fe1e9f9c7b33 341 {
xmwmx 4:fe1e9f9c7b33 342 datapin.output();
xmwmx 4:fe1e9f9c7b33 343 datapin=0; //起始信号
xmwmx 4:fe1e9f9c7b33 344 wait_us(2);
xmwmx 4:fe1e9f9c7b33 345 datapin.input(); //mcu释放总线
xmwmx 4:fe1e9f9c7b33 346 datapin.mode(PullUp);
xmwmx 4:fe1e9f9c7b33 347 if(datapin)
xmwmx 4:fe1e9f9c7b33 348 {
xmwmx 4:fe1e9f9c7b33 349 value=value|0x80;//保存高电平数据,低电平的话不用保存,移位后默认是0
xmwmx 4:fe1e9f9c7b33 350 }
xmwmx 4:fe1e9f9c7b33 351 value>>=1;
xmwmx 4:fe1e9f9c7b33 352 wait_us(30); //延时40us
xmwmx 4:fe1e9f9c7b33 353 }
xmwmx 4:fe1e9f9c7b33 354 return value;
xmwmx 4:fe1e9f9c7b33 355 }
xmwmx 4:fe1e9f9c7b33 356 //------------
xmwmx 4:fe1e9f9c7b33 357 float DS18B20::transfer(uint8_t h,uint8_t l)
xmwmx 4:fe1e9f9c7b33 358 {
xmwmx 4:fe1e9f9c7b33 359 //h=0x01;
xmwmx 4:fe1e9f9c7b33 360 //l=0x01;
xmwmx 4:fe1e9f9c7b33 361 int flag=(h&0x01)>>7;
xmwmx 4:fe1e9f9c7b33 362 if(!flag)
xmwmx 4:fe1e9f9c7b33 363 {
xmwmx 4:fe1e9f9c7b33 364 float i=(h*256+l)*0.25;
xmwmx 4:fe1e9f9c7b33 365 //usb2pc.printf("flag:%d\th:%d\tl:%d\r\n",flag,h,l);
xmwmx 4:fe1e9f9c7b33 366 return i;
xmwmx 4:fe1e9f9c7b33 367 }
xmwmx 4:fe1e9f9c7b33 368 else
xmwmx 4:fe1e9f9c7b33 369 {
xmwmx 4:fe1e9f9c7b33 370 float i=((~h)*256+(~l))*0.25*-1;
xmwmx 4:fe1e9f9c7b33 371 //usb2pc.printf("flag:%d\th:%d\tl:%d\r\n",flag,h,l);
xmwmx 4:fe1e9f9c7b33 372 return i;
xmwmx 4:fe1e9f9c7b33 373 }
xmwmx 4:fe1e9f9c7b33 374 }
xmwmx 4:fe1e9f9c7b33 375 //----------
xmwmx 4:fe1e9f9c7b33 376 int DS18B20::getdata()
xmwmx 4:fe1e9f9c7b33 377 {
xmwmx 4:fe1e9f9c7b33 378 T=5000;
xmwmx 4:fe1e9f9c7b33 379 start();
xmwmx 4:fe1e9f9c7b33 380 writebyte(0xcc);
xmwmx 4:fe1e9f9c7b33 381 writebyte(0x44);
xmwmx 4:fe1e9f9c7b33 382 wait(2);
xmwmx 4:fe1e9f9c7b33 383
xmwmx 4:fe1e9f9c7b33 384 start();
xmwmx 4:fe1e9f9c7b33 385 writebyte(0xcc);
xmwmx 4:fe1e9f9c7b33 386 writebyte(0xbe);
xmwmx 4:fe1e9f9c7b33 387 uint8_t a=readByte();//l
xmwmx 4:fe1e9f9c7b33 388 uint8_t b=readByte();//h
xmwmx 4:fe1e9f9c7b33 389 T=transfer(b,a);
xmwmx 4:fe1e9f9c7b33 390
xmwmx 4:fe1e9f9c7b33 391 if(T==5000){return 0;}
xmwmx 4:fe1e9f9c7b33 392 else{return 1;}
xmwmx 4:fe1e9f9c7b33 393 }
xmwmx 4:fe1e9f9c7b33 394 //----------
xmwmx 4:fe1e9f9c7b33 395 float DS18B20::gettemperature()
xmwmx 4:fe1e9f9c7b33 396 {
xmwmx 4:fe1e9f9c7b33 397 if(getdata()){return T;}
brainliang 5:7534fc9248a8 398 //else{usb2pc.printf("get temperature fail!\r\n");return 0;}
brainliang 5:7534fc9248a8 399 else{return 0;}
xmwmx 4:fe1e9f9c7b33 400 }
brainliang 5:7534fc9248a8 401 // ==================================================
brainliang 5:7534fc9248a8 402
xmwmx 4:fe1e9f9c7b33 403 //=============================================
xmwmx 4:fe1e9f9c7b33 404 BMP180::BMP180(PinName sda,PinName scl)
xmwmx 4:fe1e9f9c7b33 405 :i2c(sda,scl)
xmwmx 4:fe1e9f9c7b33 406 {
xmwmx 4:fe1e9f9c7b33 407 OSS=OSS_3;
xmwmx 4:fe1e9f9c7b33 408 uint8_t c = readByte(BMP180_ADDRESS, BMP180_WHO_AM_I);
xmwmx 4:fe1e9f9c7b33 409 if(c == 0x55) {
xmwmx 4:fe1e9f9c7b33 410
brainliang 5:7534fc9248a8 411 // usb2pc.printf("BMP-180 is 0x%x\r\n", c);
brainliang 5:7534fc9248a8 412 // usb2pc.printf("BMP-180 should be 0x55\r\n");
brainliang 5:7534fc9248a8 413 // usb2pc.printf("BMP-180 online...\r\n");
xmwmx 4:fe1e9f9c7b33 414
xmwmx 4:fe1e9f9c7b33 415 BMP180Calibration();
brainliang 5:7534fc9248a8 416 // usb2pc.printf("BMP-180 calibration complete...\r\n");
xmwmx 4:fe1e9f9c7b33 417 }
xmwmx 4:fe1e9f9c7b33 418 else
xmwmx 4:fe1e9f9c7b33 419 {
brainliang 5:7534fc9248a8 420 // usb2pc.printf("BMP-180 is 0x%x\r\n", c);
brainliang 5:7534fc9248a8 421 // usb2pc.printf("BMP-180 should be 0x55\r\n");
xmwmx 4:fe1e9f9c7b33 422 while(1); // idle here forever
xmwmx 4:fe1e9f9c7b33 423 }
xmwmx 4:fe1e9f9c7b33 424 }
xmwmx 4:fe1e9f9c7b33 425 void BMP180::writeByte(uint8_t address, uint8_t subAddress, uint8_t data)
xmwmx 4:fe1e9f9c7b33 426 {
xmwmx 4:fe1e9f9c7b33 427 char data_write[2];
xmwmx 4:fe1e9f9c7b33 428 data_write[0] = subAddress;
xmwmx 4:fe1e9f9c7b33 429 data_write[1] = data;
xmwmx 4:fe1e9f9c7b33 430 i2c.write(address, data_write, 2, 0);
xmwmx 4:fe1e9f9c7b33 431 }
xmwmx 4:fe1e9f9c7b33 432
xmwmx 4:fe1e9f9c7b33 433 char BMP180::readByte(uint8_t address, uint8_t subAddress)
xmwmx 4:fe1e9f9c7b33 434 {
xmwmx 4:fe1e9f9c7b33 435 char data[1]; // `data` will store the register data
xmwmx 4:fe1e9f9c7b33 436 char data_write[1];
xmwmx 4:fe1e9f9c7b33 437 data_write[0] = subAddress;
xmwmx 4:fe1e9f9c7b33 438 i2c.write(address, data_write, 1, 1); // no stop
xmwmx 4:fe1e9f9c7b33 439 i2c.read(address, data, 1, 0);
xmwmx 4:fe1e9f9c7b33 440 return data[0];
xmwmx 4:fe1e9f9c7b33 441 }
xmwmx 4:fe1e9f9c7b33 442
xmwmx 4:fe1e9f9c7b33 443 void BMP180::readBytes(uint8_t address, uint8_t subAddress, uint8_t count, uint8_t * dest)
xmwmx 4:fe1e9f9c7b33 444 {
xmwmx 4:fe1e9f9c7b33 445 char data[14];
xmwmx 4:fe1e9f9c7b33 446 char data_write[1];
xmwmx 4:fe1e9f9c7b33 447 data_write[0] = subAddress;
xmwmx 4:fe1e9f9c7b33 448 i2c.write(address, data_write, 1, 1); // no stop
xmwmx 4:fe1e9f9c7b33 449 i2c.read(address, data, count, 0);
xmwmx 4:fe1e9f9c7b33 450 for(int ii = 0; ii < count; ii++) {
xmwmx 4:fe1e9f9c7b33 451 dest[ii] = data[ii];
xmwmx 4:fe1e9f9c7b33 452 }
xmwmx 4:fe1e9f9c7b33 453 }
xmwmx 4:fe1e9f9c7b33 454
xmwmx 4:fe1e9f9c7b33 455
xmwmx 4:fe1e9f9c7b33 456 // Stores all of the BMP180's calibration values into global variables
xmwmx 4:fe1e9f9c7b33 457 // Calibration values are required to calculate temp and pressure
xmwmx 4:fe1e9f9c7b33 458 // This function should be called at the beginning of the program
xmwmx 4:fe1e9f9c7b33 459 // These BMP-180 functions were adapted from Jim Lindblom of SparkFun Electronics
xmwmx 4:fe1e9f9c7b33 460 void BMP180::BMP180Calibration()
xmwmx 4:fe1e9f9c7b33 461 {
xmwmx 4:fe1e9f9c7b33 462 ac1 = readByte(BMP180_ADDRESS, 0xAA) << 8 | readByte(BMP180_ADDRESS, 0xAB);
xmwmx 4:fe1e9f9c7b33 463 ac2 = readByte(BMP180_ADDRESS, 0xAC) << 8 | readByte(BMP180_ADDRESS, 0xAD);
xmwmx 4:fe1e9f9c7b33 464 ac3 = readByte(BMP180_ADDRESS, 0xAE) << 8 | readByte(BMP180_ADDRESS, 0xAF);
xmwmx 4:fe1e9f9c7b33 465 ac4 = readByte(BMP180_ADDRESS, 0xB0) << 8 | readByte(BMP180_ADDRESS, 0xB1);
xmwmx 4:fe1e9f9c7b33 466 ac5 = readByte(BMP180_ADDRESS, 0xB2) << 8 | readByte(BMP180_ADDRESS, 0xB3);
xmwmx 4:fe1e9f9c7b33 467 ac6 = readByte(BMP180_ADDRESS, 0xB4) << 8 | readByte(BMP180_ADDRESS, 0xB5);
xmwmx 4:fe1e9f9c7b33 468 b1 = readByte(BMP180_ADDRESS, 0xB6) << 8 | readByte(BMP180_ADDRESS, 0xB7);
xmwmx 4:fe1e9f9c7b33 469 b2 = readByte(BMP180_ADDRESS, 0xB8) << 8 | readByte(BMP180_ADDRESS, 0xB9);
xmwmx 4:fe1e9f9c7b33 470 mb = readByte(BMP180_ADDRESS, 0xBA) << 8 | readByte(BMP180_ADDRESS, 0xBB);
xmwmx 4:fe1e9f9c7b33 471 mc = readByte(BMP180_ADDRESS, 0xBC) << 8 | readByte(BMP180_ADDRESS, 0xBD);
xmwmx 4:fe1e9f9c7b33 472 md = readByte(BMP180_ADDRESS, 0xBE) << 8 | readByte(BMP180_ADDRESS, 0xBF);
xmwmx 4:fe1e9f9c7b33 473 }
xmwmx 4:fe1e9f9c7b33 474
xmwmx 4:fe1e9f9c7b33 475 // Temperature returned will be in units of 0.1 deg C
xmwmx 4:fe1e9f9c7b33 476 long BMP180::BMP180GetTemperature()
xmwmx 4:fe1e9f9c7b33 477 {
xmwmx 4:fe1e9f9c7b33 478 long ut = 0;
xmwmx 4:fe1e9f9c7b33 479 uint8_t rawData[2] = {0, 0};
xmwmx 4:fe1e9f9c7b33 480
xmwmx 4:fe1e9f9c7b33 481 writeByte(BMP180_ADDRESS, 0xF4, 0x2E); // start temperature measurement
xmwmx 4:fe1e9f9c7b33 482 wait_ms(5);
xmwmx 4:fe1e9f9c7b33 483 readBytes(BMP180_ADDRESS, 0xF6, 2, &rawData[0]); // read raw temperature measurement
xmwmx 4:fe1e9f9c7b33 484 ut = rawData[0]*256+ rawData[1];
xmwmx 4:fe1e9f9c7b33 485
xmwmx 4:fe1e9f9c7b33 486 long x1, x2;
xmwmx 4:fe1e9f9c7b33 487
xmwmx 4:fe1e9f9c7b33 488 x1 = (((long)ut - (long)ac6)*(long)ac5) >> 15;
xmwmx 4:fe1e9f9c7b33 489 x2 = ((long)mc << 11)/(x1 + md);
xmwmx 4:fe1e9f9c7b33 490 b5 = x1 + x2;
xmwmx 4:fe1e9f9c7b33 491
xmwmx 4:fe1e9f9c7b33 492 return ((b5 + 8)>>4)/10.0;
xmwmx 4:fe1e9f9c7b33 493 }
xmwmx 4:fe1e9f9c7b33 494
xmwmx 4:fe1e9f9c7b33 495 // Calculate pressure read calibration values
xmwmx 4:fe1e9f9c7b33 496 // b5 is also required so BMP180GetTemperature() must be called first.
xmwmx 4:fe1e9f9c7b33 497 // Value returned will be pressure in units of Pa.
xmwmx 4:fe1e9f9c7b33 498 long BMP180::BMP180GetPressure()
xmwmx 4:fe1e9f9c7b33 499 {
xmwmx 4:fe1e9f9c7b33 500 long up = 0;
xmwmx 4:fe1e9f9c7b33 501 writeByte(BMP180_ADDRESS, 0xF4, 0x34 | OSS << 6); // Configure pressure measurement for highest resolution
xmwmx 4:fe1e9f9c7b33 502 wait_ms(5+8*OSS); // delay 5 ms at lowest resolution, 29 ms at highest
xmwmx 4:fe1e9f9c7b33 503 uint8_t rawData[3] = {0, 0, 0};
xmwmx 4:fe1e9f9c7b33 504 readBytes(BMP180_ADDRESS, 0xF6, 3, &rawData[0]); // read raw pressure measurement of 19 bits
xmwmx 4:fe1e9f9c7b33 505 up = (((long) rawData[0] << 16) | ((long)rawData[1] << 8) | rawData[2]) >> (8 - OSS);
xmwmx 4:fe1e9f9c7b33 506
xmwmx 4:fe1e9f9c7b33 507 long x1, x2, x3, b3, b6, p;
xmwmx 4:fe1e9f9c7b33 508 unsigned long b4, b7;
xmwmx 4:fe1e9f9c7b33 509
xmwmx 4:fe1e9f9c7b33 510 b6 = b5 - 4000;
xmwmx 4:fe1e9f9c7b33 511 // Calculate B3
xmwmx 4:fe1e9f9c7b33 512 x1 = (b2 * (b6 * b6)>>12)>>11;
xmwmx 4:fe1e9f9c7b33 513 x2 = (ac2 * b6)>>11;
xmwmx 4:fe1e9f9c7b33 514 x3 = x1 + x2;
xmwmx 4:fe1e9f9c7b33 515 b3 = (((((long)ac1)*4 + x3)<<OSS) + 2)>>2;
xmwmx 4:fe1e9f9c7b33 516
xmwmx 4:fe1e9f9c7b33 517 // Calculate B4
xmwmx 4:fe1e9f9c7b33 518 x1 = (ac3 * b6)>>13;
xmwmx 4:fe1e9f9c7b33 519 x2 = (b1 * ((b6 * b6)>>12))>>16;
xmwmx 4:fe1e9f9c7b33 520 x3 = ((x1 + x2) + 2)>>2;
xmwmx 4:fe1e9f9c7b33 521 b4 = (ac4 * (unsigned long)(x3 + 32768))>>15;
xmwmx 4:fe1e9f9c7b33 522
xmwmx 4:fe1e9f9c7b33 523 b7 = ((unsigned long)(up - b3) * (50000>>OSS));
xmwmx 4:fe1e9f9c7b33 524 if (b7 < 0x80000000)
xmwmx 4:fe1e9f9c7b33 525 p = (b7<<1)/b4;
xmwmx 4:fe1e9f9c7b33 526 else
xmwmx 4:fe1e9f9c7b33 527 p = (b7/b4)<<1;
xmwmx 4:fe1e9f9c7b33 528
xmwmx 4:fe1e9f9c7b33 529 x1 = (p>>8) * (p>>8);
xmwmx 4:fe1e9f9c7b33 530 x1 = (x1 * 3038)>>16;
xmwmx 4:fe1e9f9c7b33 531 x2 = (-7357 * p)>>16;
xmwmx 4:fe1e9f9c7b33 532 p += (x1 + x2 + 3791)>>4;
xmwmx 4:fe1e9f9c7b33 533
xmwmx 4:fe1e9f9c7b33 534 return p;
xmwmx 4:fe1e9f9c7b33 535 }
xmwmx 4:fe1e9f9c7b33 536 //===============================
xmwmx 4:fe1e9f9c7b33 537 GP2Y1010::GP2Y1010(PinName led,PinName measure)
xmwmx 4:fe1e9f9c7b33 538 :measurePin(measure),ledPower(led)
xmwmx 4:fe1e9f9c7b33 539 {
xmwmx 4:fe1e9f9c7b33 540 samplingTime = 280;
xmwmx 4:fe1e9f9c7b33 541 deltaTime = 40;
xmwmx 4:fe1e9f9c7b33 542 sleepTime = 9680;
xmwmx 4:fe1e9f9c7b33 543
xmwmx 4:fe1e9f9c7b33 544 voMeasured = 0;
xmwmx 4:fe1e9f9c7b33 545 calcVoltage = 0;
xmwmx 4:fe1e9f9c7b33 546 dustDensity = 0;
xmwmx 4:fe1e9f9c7b33 547 }
xmwmx 4:fe1e9f9c7b33 548
xmwmx 4:fe1e9f9c7b33 549 float GP2Y1010::getairdata()
xmwmx 4:fe1e9f9c7b33 550 {
xmwmx 4:fe1e9f9c7b33 551 ledPower=1;
xmwmx 4:fe1e9f9c7b33 552
xmwmx 4:fe1e9f9c7b33 553 wait_us(samplingTime);
xmwmx 4:fe1e9f9c7b33 554
xmwmx 4:fe1e9f9c7b33 555 voMeasured = measurePin.read();
xmwmx 4:fe1e9f9c7b33 556
xmwmx 4:fe1e9f9c7b33 557 wait_us(deltaTime);
xmwmx 4:fe1e9f9c7b33 558 ledPower=0;
xmwmx 4:fe1e9f9c7b33 559 wait_us(sleepTime);
xmwmx 4:fe1e9f9c7b33 560
xmwmx 4:fe1e9f9c7b33 561 calcVoltage = voMeasured*5.0;
xmwmx 4:fe1e9f9c7b33 562 dustDensity = 0.17*calcVoltage-0.1;
xmwmx 4:fe1e9f9c7b33 563
xmwmx 4:fe1e9f9c7b33 564 if ( dustDensity < 0)
xmwmx 4:fe1e9f9c7b33 565 {
xmwmx 4:fe1e9f9c7b33 566 dustDensity = 0.00;
xmwmx 4:fe1e9f9c7b33 567 }
xmwmx 4:fe1e9f9c7b33 568 return dustDensity ;
xmwmx 4:fe1e9f9c7b33 569 }