QAQ ==!

Dependencies:   mbed QEI-1 nRF24L01P xiugai

Committer:
zhangyx
Date:
Wed Nov 13 09:14:24 2019 +0000
Revision:
9:d03b1af2b8d8
add files

Who changed what in which revision?

UserRevisionLine numberNew contents of line
zhangyx 9:d03b1af2b8d8 1 #include "sensors.h"
zhangyx 9:d03b1af2b8d8 2 #include "mbed.h"
zhangyx 9:d03b1af2b8d8 3 #include "converters.h"
zhangyx 9:d03b1af2b8d8 4
zhangyx 9:d03b1af2b8d8 5 #ifdef ENABLE_SENSORS
zhangyx 9:d03b1af2b8d8 6
zhangyx 9:d03b1af2b8d8 7
zhangyx 9:d03b1af2b8d8 8 extern Serial ser2usb;
zhangyx 9:d03b1af2b8d8 9 extern DigitalOut myled;
zhangyx 9:d03b1af2b8d8 10 //============================================================SR501
zhangyx 9:d03b1af2b8d8 11 void sr501::triggered() //触发中断!!
zhangyx 9:d03b1af2b8d8 12 {
zhangyx 9:d03b1af2b8d8 13 // //ser2usb.printf("sr501 Triggered!\r\n");
zhangyx 9:d03b1af2b8d8 14 status = true;
zhangyx 9:d03b1af2b8d8 15 }
zhangyx 9:d03b1af2b8d8 16 //--------
zhangyx 9:d03b1af2b8d8 17 sr501::sr501(PinName pSignal) //启动热释电!!!
zhangyx 9:d03b1af2b8d8 18 : status(false), signal(pSignal)
zhangyx 9:d03b1af2b8d8 19 {
zhangyx 9:d03b1af2b8d8 20 signal.rise(this, &sr501::triggered);
zhangyx 9:d03b1af2b8d8 21 ////ser2usb.printf("sr501 start!\r\n");
zhangyx 9:d03b1af2b8d8 22 }
zhangyx 9:d03b1af2b8d8 23 //-------
zhangyx 9:d03b1af2b8d8 24 bool sr501::operator==(const bool &target)
zhangyx 9:d03b1af2b8d8 25 {
zhangyx 9:d03b1af2b8d8 26 if(status == target)
zhangyx 9:d03b1af2b8d8 27 {
zhangyx 9:d03b1af2b8d8 28 return true;
zhangyx 9:d03b1af2b8d8 29 }
zhangyx 9:d03b1af2b8d8 30 else
zhangyx 9:d03b1af2b8d8 31 {
zhangyx 9:d03b1af2b8d8 32 return false;
zhangyx 9:d03b1af2b8d8 33 }
zhangyx 9:d03b1af2b8d8 34 }
zhangyx 9:d03b1af2b8d8 35 //-------
zhangyx 9:d03b1af2b8d8 36 void sr501::reset()
zhangyx 9:d03b1af2b8d8 37 {
zhangyx 9:d03b1af2b8d8 38 status = false;
zhangyx 9:d03b1af2b8d8 39 }
zhangyx 9:d03b1af2b8d8 40 //-------
zhangyx 9:d03b1af2b8d8 41 int sr501::read()
zhangyx 9:d03b1af2b8d8 42 {
zhangyx 9:d03b1af2b8d8 43 return signal.read();
zhangyx 9:d03b1af2b8d8 44 }
zhangyx 9:d03b1af2b8d8 45 //-------
zhangyx 9:d03b1af2b8d8 46 #ifdef ENABLE_ESP8266
zhangyx 9:d03b1af2b8d8 47 void sr501::send_status(Esp8266 & client, const char * topic)
zhangyx 9:d03b1af2b8d8 48 {
zhangyx 9:d03b1af2b8d8 49 char buff[32];
zhangyx 9:d03b1af2b8d8 50 sprintf(buff, "%d", this->read());
zhangyx 9:d03b1af2b8d8 51
zhangyx 9:d03b1af2b8d8 52 ////ser2usb.printf("-----sr501-----\r\nSending message \"%s\" to topic \"%s\"\r\n", buff, topic);
zhangyx 9:d03b1af2b8d8 53 /*++++++++++++++++++++++++++++++++++++++++++*/
zhangyx 9:d03b1af2b8d8 54 client.publish_value(topic, "_upload"); /* 务必先在topic下发布_upload消息 */
zhangyx 9:d03b1af2b8d8 55 wait(0.01); /* 等一段时间后上传传感器数据 */
zhangyx 9:d03b1af2b8d8 56 client.publish_value(topic, buff); /* 上传传感器数据后等一段时间 */
zhangyx 9:d03b1af2b8d8 57 wait(0.01); /* 然后务必在topic下发布_end消息 */
zhangyx 9:d03b1af2b8d8 58 client.publish_value(topic, "_end"); /*++++++++++++++++++++++++++++++++++++++++++*/
zhangyx 9:d03b1af2b8d8 59
zhangyx 9:d03b1af2b8d8 60 //er2usb.printf("Senging data done.\r\n");
zhangyx 9:d03b1af2b8d8 61 }
zhangyx 9:d03b1af2b8d8 62 #endif // ENABLE_ESP8266
zhangyx 9:d03b1af2b8d8 63 //========================================== //BH1750
zhangyx 9:d03b1af2b8d8 64 BH1750::BH1750(PinName sda,PinName scl) //启动光强!!!!!(默认设置)
zhangyx 9:d03b1af2b8d8 65 :link(sda,scl)
zhangyx 9:d03b1af2b8d8 66 {
zhangyx 9:d03b1af2b8d8 67 status = true;
zhangyx 9:d03b1af2b8d8 68 char mode[1]={BH1750_CONTINUOUS_HIGH_RES_MODE};
zhangyx 9:d03b1af2b8d8 69 ////ser2usb.printf("modifying\r\n");
zhangyx 9:d03b1af2b8d8 70 while(status)
zhangyx 9:d03b1af2b8d8 71 {
zhangyx 9:d03b1af2b8d8 72 status = link.write(BH1750_I2CADDR, mode, sizeof(mode), false);
zhangyx 9:d03b1af2b8d8 73 wait_ms(10);
zhangyx 9:d03b1af2b8d8 74 }
zhangyx 9:d03b1af2b8d8 75 ////ser2usb.printf("BH1750 start with default mode!\r\n");
zhangyx 9:d03b1af2b8d8 76 }
zhangyx 9:d03b1af2b8d8 77 //--------
zhangyx 9:d03b1af2b8d8 78 BH1750::BH1750(PinName sda,PinName scl,char mode[]) //启动光强!!!!!(自定义设置)
zhangyx 9:d03b1af2b8d8 79 :link(sda,scl)
zhangyx 9:d03b1af2b8d8 80 {
zhangyx 9:d03b1af2b8d8 81 status = true;
zhangyx 9:d03b1af2b8d8 82 while(status)
zhangyx 9:d03b1af2b8d8 83 {
zhangyx 9:d03b1af2b8d8 84 status = link.write(BH1750_I2CADDR, mode, sizeof(mode), false);
zhangyx 9:d03b1af2b8d8 85 wait_ms(10);
zhangyx 9:d03b1af2b8d8 86 }
zhangyx 9:d03b1af2b8d8 87 //ser2usb.printf("BH1750 start with customize mode!\r\n");
zhangyx 9:d03b1af2b8d8 88 }
zhangyx 9:d03b1af2b8d8 89 //--------
zhangyx 9:d03b1af2b8d8 90 float BH1750::getlightdata() //读取光强(lux)
zhangyx 9:d03b1af2b8d8 91 {
zhangyx 9:d03b1af2b8d8 92 status = true;
zhangyx 9:d03b1af2b8d8 93 status = link.read(BH1750_I2CADDR, rawdata, 2, false);
zhangyx 9:d03b1af2b8d8 94 if(!status)
zhangyx 9:d03b1af2b8d8 95 {
zhangyx 9:d03b1af2b8d8 96 float result = ((rawdata[0]<<8)|rawdata[1])/1.2;
zhangyx 9:d03b1af2b8d8 97 return result;
zhangyx 9:d03b1af2b8d8 98 }
zhangyx 9:d03b1af2b8d8 99 else
zhangyx 9:d03b1af2b8d8 100 {
zhangyx 9:d03b1af2b8d8 101 //ser2usb.printf("BH1750 read fail!\r\n");
zhangyx 9:d03b1af2b8d8 102 return -1;
zhangyx 9:d03b1af2b8d8 103 }
zhangyx 9:d03b1af2b8d8 104 }
zhangyx 9:d03b1af2b8d8 105
zhangyx 9:d03b1af2b8d8 106 #ifdef ENABLE_ESP8266
zhangyx 9:d03b1af2b8d8 107 void BH1750::send_data(Esp8266 & client, const char * topic)
zhangyx 9:d03b1af2b8d8 108 {
zhangyx 9:d03b1af2b8d8 109 char buff[32];
zhangyx 9:d03b1af2b8d8 110 sprintf(buff, "%.3f", this->getlightdata());
zhangyx 9:d03b1af2b8d8 111
zhangyx 9:d03b1af2b8d8 112 //ser2usb.printf("-----BH1750-----\r\nSending message \"%s\" to topic \"%s\"\r\n", buff, topic);
zhangyx 9:d03b1af2b8d8 113
zhangyx 9:d03b1af2b8d8 114 client.publish_value(topic, "_upload");
zhangyx 9:d03b1af2b8d8 115 wait(0.01);
zhangyx 9:d03b1af2b8d8 116 client.publish_value(topic, buff);
zhangyx 9:d03b1af2b8d8 117 wait(0.01);
zhangyx 9:d03b1af2b8d8 118 client.publish_value(topic, "_end");
zhangyx 9:d03b1af2b8d8 119
zhangyx 9:d03b1af2b8d8 120 //ser2usb.printf("Senging data done.\r\n");
zhangyx 9:d03b1af2b8d8 121 }
zhangyx 9:d03b1af2b8d8 122 #endif // ENABLE_ESP8266
zhangyx 9:d03b1af2b8d8 123 //==============================================MQ-2
zhangyx 9:d03b1af2b8d8 124 mq::mq(PinName dio)
zhangyx 9:d03b1af2b8d8 125 : status(false), signal(dio),signallevel(PC_13)
zhangyx 9:d03b1af2b8d8 126 {
zhangyx 9:d03b1af2b8d8 127 signal.fall(this, &mq::triggered);
zhangyx 9:d03b1af2b8d8 128 //ser2usb.printf("mq start!\r\n");
zhangyx 9:d03b1af2b8d8 129 }
zhangyx 9:d03b1af2b8d8 130 //--------
zhangyx 9:d03b1af2b8d8 131 mq::mq(PinName dio,PinName aio)
zhangyx 9:d03b1af2b8d8 132 : status(false), signal(dio),signallevel(aio)
zhangyx 9:d03b1af2b8d8 133 {
zhangyx 9:d03b1af2b8d8 134 signal.fall(this, &mq::triggered);
zhangyx 9:d03b1af2b8d8 135 //ser2usb.printf("mq start!\r\n");
zhangyx 9:d03b1af2b8d8 136 }
zhangyx 9:d03b1af2b8d8 137 //--------
zhangyx 9:d03b1af2b8d8 138 void mq::triggered() //触发中断!!
zhangyx 9:d03b1af2b8d8 139 {
zhangyx 9:d03b1af2b8d8 140 //ser2usb.printf("mq Triggered!\r\n");
zhangyx 9:d03b1af2b8d8 141 status = true;
zhangyx 9:d03b1af2b8d8 142 }
zhangyx 9:d03b1af2b8d8 143 //--------
zhangyx 9:d03b1af2b8d8 144 bool mq::operator==(const bool &target)
zhangyx 9:d03b1af2b8d8 145 {
zhangyx 9:d03b1af2b8d8 146 if(status == target)
zhangyx 9:d03b1af2b8d8 147 {
zhangyx 9:d03b1af2b8d8 148 return true;
zhangyx 9:d03b1af2b8d8 149 }
zhangyx 9:d03b1af2b8d8 150 else
zhangyx 9:d03b1af2b8d8 151 {
zhangyx 9:d03b1af2b8d8 152 return false;
zhangyx 9:d03b1af2b8d8 153 }
zhangyx 9:d03b1af2b8d8 154 }
zhangyx 9:d03b1af2b8d8 155 //--------
zhangyx 9:d03b1af2b8d8 156 float mq::getairdata()
zhangyx 9:d03b1af2b8d8 157 {
zhangyx 9:d03b1af2b8d8 158 return signallevel.read();
zhangyx 9:d03b1af2b8d8 159 }
zhangyx 9:d03b1af2b8d8 160 //-----------
zhangyx 9:d03b1af2b8d8 161 void mq::reset()
zhangyx 9:d03b1af2b8d8 162 {
zhangyx 9:d03b1af2b8d8 163 status = false;
zhangyx 9:d03b1af2b8d8 164 }
zhangyx 9:d03b1af2b8d8 165 int mq::read()
zhangyx 9:d03b1af2b8d8 166 {
zhangyx 9:d03b1af2b8d8 167 return signal.read();
zhangyx 9:d03b1af2b8d8 168 }
zhangyx 9:d03b1af2b8d8 169
zhangyx 9:d03b1af2b8d8 170 #ifdef ENABLE_ESP8266
zhangyx 9:d03b1af2b8d8 171 void mq::send_data(Esp8266 & client, const char * topic)
zhangyx 9:d03b1af2b8d8 172 {
zhangyx 9:d03b1af2b8d8 173 char buff[32];
zhangyx 9:d03b1af2b8d8 174 sprintf(buff, "%d", this->read());
zhangyx 9:d03b1af2b8d8 175
zhangyx 9:d03b1af2b8d8 176 //ser2usb.printf("-----mq-----\r\nSending message \"%s\" to topic \"%s\"\r\n", buff, topic);
zhangyx 9:d03b1af2b8d8 177
zhangyx 9:d03b1af2b8d8 178 client.publish_value(topic, "_upload");
zhangyx 9:d03b1af2b8d8 179 wait(0.01);
zhangyx 9:d03b1af2b8d8 180 client.publish_value(topic, buff);
zhangyx 9:d03b1af2b8d8 181 wait(0.01);
zhangyx 9:d03b1af2b8d8 182 client.publish_value(topic, "_end");
zhangyx 9:d03b1af2b8d8 183
zhangyx 9:d03b1af2b8d8 184 //ser2usb.printf("Senging data done.\r\n");
zhangyx 9:d03b1af2b8d8 185 }
zhangyx 9:d03b1af2b8d8 186 #endif // ENABLE_ESP8266
zhangyx 9:d03b1af2b8d8 187 //===========================================DHT11
zhangyx 9:d03b1af2b8d8 188 dht11::dht11(PinName pin)
zhangyx 9:d03b1af2b8d8 189 :datapin(pin)
zhangyx 9:d03b1af2b8d8 190 {
zhangyx 9:d03b1af2b8d8 191 starttime.start();
zhangyx 9:d03b1af2b8d8 192 //ser2usb.printf("dht11 start!\r\n");
zhangyx 9:d03b1af2b8d8 193 }
zhangyx 9:d03b1af2b8d8 194 //----------
zhangyx 9:d03b1af2b8d8 195 int dht11::getdata()
zhangyx 9:d03b1af2b8d8 196 {
zhangyx 9:d03b1af2b8d8 197 int timeout=10000;
zhangyx 9:d03b1af2b8d8 198 uint8_t data[5];
zhangyx 9:d03b1af2b8d8 199 uint8_t bit=7;
zhangyx 9:d03b1af2b8d8 200 uint8_t count=0;
zhangyx 9:d03b1af2b8d8 201
zhangyx 9:d03b1af2b8d8 202 for(int i=0;i<5;i++)
zhangyx 9:d03b1af2b8d8 203 {
zhangyx 9:d03b1af2b8d8 204 data[i]=0;
zhangyx 9:d03b1af2b8d8 205 }
zhangyx 9:d03b1af2b8d8 206 if(starttime.read_ms()<1500){while(starttime.read_ms()<1500){}starttime.stop();}
zhangyx 9:d03b1af2b8d8 207
zhangyx 9:d03b1af2b8d8 208 datapin.output();
zhangyx 9:d03b1af2b8d8 209 datapin=0;
zhangyx 9:d03b1af2b8d8 210 wait_ms(19);
zhangyx 9:d03b1af2b8d8 211 datapin=1;
zhangyx 9:d03b1af2b8d8 212 wait_us(30);
zhangyx 9:d03b1af2b8d8 213 datapin.input();
zhangyx 9:d03b1af2b8d8 214
zhangyx 9:d03b1af2b8d8 215 while(!datapin)
zhangyx 9:d03b1af2b8d8 216 {
zhangyx 9:d03b1af2b8d8 217 if(timeout--==0){
zhangyx 9:d03b1af2b8d8 218 //ser2usb.printf("timeout!no reset\r\n");
zhangyx 9:d03b1af2b8d8 219 return 0;
zhangyx 9:d03b1af2b8d8 220 }
zhangyx 9:d03b1af2b8d8 221 }
zhangyx 9:d03b1af2b8d8 222 timeout=10000;
zhangyx 9:d03b1af2b8d8 223 while(datapin)
zhangyx 9:d03b1af2b8d8 224 {
zhangyx 9:d03b1af2b8d8 225 if(timeout--==0){//ser2usb.printf("timeout! no response\r\n");
zhangyx 9:d03b1af2b8d8 226 return 0;}
zhangyx 9:d03b1af2b8d8 227 }
zhangyx 9:d03b1af2b8d8 228 timeout=10000;
zhangyx 9:d03b1af2b8d8 229 for(int i=0;i<40;i++)
zhangyx 9:d03b1af2b8d8 230 {
zhangyx 9:d03b1af2b8d8 231 while(!datapin)
zhangyx 9:d03b1af2b8d8 232 {
zhangyx 9:d03b1af2b8d8 233 if(timeout--==0){//ser2usb.printf("timeout!\r\n");
zhangyx 9:d03b1af2b8d8 234 return 0;}
zhangyx 9:d03b1af2b8d8 235 }
zhangyx 9:d03b1af2b8d8 236 timer.start();
zhangyx 9:d03b1af2b8d8 237 timeout=10000;
zhangyx 9:d03b1af2b8d8 238 while(datapin)
zhangyx 9:d03b1af2b8d8 239 {
zhangyx 9:d03b1af2b8d8 240 if(timeout--==0){//ser2usb.printf("timeout!n\r\n");
zhangyx 9:d03b1af2b8d8 241 return 0;}
zhangyx 9:d03b1af2b8d8 242 }
zhangyx 9:d03b1af2b8d8 243 timeout=10000;
zhangyx 9:d03b1af2b8d8 244 long t=timer.read_us();
zhangyx 9:d03b1af2b8d8 245 timer.stop();
zhangyx 9:d03b1af2b8d8 246 timer.reset();
zhangyx 9:d03b1af2b8d8 247
zhangyx 9:d03b1af2b8d8 248 if(bit==0)
zhangyx 9:d03b1af2b8d8 249 {
zhangyx 9:d03b1af2b8d8 250 if(t>40){data[count]|=(1<<bit);}
zhangyx 9:d03b1af2b8d8 251 bit=7;
zhangyx 9:d03b1af2b8d8 252 count++;
zhangyx 9:d03b1af2b8d8 253 }
zhangyx 9:d03b1af2b8d8 254 else
zhangyx 9:d03b1af2b8d8 255 {
zhangyx 9:d03b1af2b8d8 256 if(t>40)
zhangyx 9:d03b1af2b8d8 257 {
zhangyx 9:d03b1af2b8d8 258 data[count]|=(1<<bit);
zhangyx 9:d03b1af2b8d8 259 }
zhangyx 9:d03b1af2b8d8 260 bit--;
zhangyx 9:d03b1af2b8d8 261 }
zhangyx 9:d03b1af2b8d8 262 }
zhangyx 9:d03b1af2b8d8 263 datapin=1;
zhangyx 9:d03b1af2b8d8 264 if(data[4]==data[0]+data[1]+data[2]+data[3])
zhangyx 9:d03b1af2b8d8 265 {
zhangyx 9:d03b1af2b8d8 266 ////ser2usb.printf("Humidity (%):%f\r\n",(float)data[0]);
zhangyx 9:d03b1af2b8d8 267 ////ser2usb.printf("Temperature (oC): %f\r\n",(float)data[2]);
zhangyx 9:d03b1af2b8d8 268 H=data[0]+data[1]/10.0;
zhangyx 9:d03b1af2b8d8 269 T=data[2]+data[3]/10.0;
zhangyx 9:d03b1af2b8d8 270 return 1;
zhangyx 9:d03b1af2b8d8 271 }
zhangyx 9:d03b1af2b8d8 272 else
zhangyx 9:d03b1af2b8d8 273 {
zhangyx 9:d03b1af2b8d8 274 //ser2usb.printf("error!\r\ndata0:%d\tdata1:%d\r\ndata2:%d\tdata3:%d\r\ndata4:%d\r\n",
zhangyx 9:d03b1af2b8d8 275 // (int)data[0],
zhangyx 9:d03b1af2b8d8 276 // (int)data[1],
zhangyx 9:d03b1af2b8d8 277 // (int)data[2],
zhangyx 9:d03b1af2b8d8 278 // (int)data[3],
zhangyx 9:d03b1af2b8d8 279 // (int)data[4]);
zhangyx 9:d03b1af2b8d8 280 return 0;
zhangyx 9:d03b1af2b8d8 281 }
zhangyx 9:d03b1af2b8d8 282 }
zhangyx 9:d03b1af2b8d8 283 //-------
zhangyx 9:d03b1af2b8d8 284 float dht11::gethumidity()
zhangyx 9:d03b1af2b8d8 285 {
zhangyx 9:d03b1af2b8d8 286 return H;
zhangyx 9:d03b1af2b8d8 287 }
zhangyx 9:d03b1af2b8d8 288 //-------
zhangyx 9:d03b1af2b8d8 289 float dht11::gettemperature()
zhangyx 9:d03b1af2b8d8 290 {
zhangyx 9:d03b1af2b8d8 291 return T;
zhangyx 9:d03b1af2b8d8 292 }
zhangyx 9:d03b1af2b8d8 293
zhangyx 9:d03b1af2b8d8 294 #ifdef ENABLE_ESP8266
zhangyx 9:d03b1af2b8d8 295 void dht11::send_temp(Esp8266 & client, const char * topic)
zhangyx 9:d03b1af2b8d8 296 {
zhangyx 9:d03b1af2b8d8 297 char buff[32];
zhangyx 9:d03b1af2b8d8 298 if(this->getdata())
zhangyx 9:d03b1af2b8d8 299 sprintf(buff, "%.3f", this->gettemperature());
zhangyx 9:d03b1af2b8d8 300 else
zhangyx 9:d03b1af2b8d8 301 {
zhangyx 9:d03b1af2b8d8 302 //ser2usb.printf("dht11 not aviliable\r\n");
zhangyx 9:d03b1af2b8d8 303 return;
zhangyx 9:d03b1af2b8d8 304 }
zhangyx 9:d03b1af2b8d8 305
zhangyx 9:d03b1af2b8d8 306 //ser2usb.printf("Sending message \"%s\" to topic \"%s\"\r\n", buff, topic);
zhangyx 9:d03b1af2b8d8 307
zhangyx 9:d03b1af2b8d8 308 client.publish_value(topic, "_upload");
zhangyx 9:d03b1af2b8d8 309 wait(0.01);
zhangyx 9:d03b1af2b8d8 310 client.publish_value(topic, buff);
zhangyx 9:d03b1af2b8d8 311 wait(0.01);
zhangyx 9:d03b1af2b8d8 312 client.publish_value(topic, "_end");
zhangyx 9:d03b1af2b8d8 313
zhangyx 9:d03b1af2b8d8 314 //ser2usb.printf("Senging data done.\r\n");
zhangyx 9:d03b1af2b8d8 315 }
zhangyx 9:d03b1af2b8d8 316 void dht11::send_humi(Esp8266 & client, const char * topic)
zhangyx 9:d03b1af2b8d8 317 {
zhangyx 9:d03b1af2b8d8 318 char buff[32];
zhangyx 9:d03b1af2b8d8 319 if(this->getdata())
zhangyx 9:d03b1af2b8d8 320 sprintf(buff, "%.3f", this->gethumidity());
zhangyx 9:d03b1af2b8d8 321 else
zhangyx 9:d03b1af2b8d8 322 {
zhangyx 9:d03b1af2b8d8 323 //ser2usb.printf("dht11 not aviliable\r\n");
zhangyx 9:d03b1af2b8d8 324 return;
zhangyx 9:d03b1af2b8d8 325 }
zhangyx 9:d03b1af2b8d8 326
zhangyx 9:d03b1af2b8d8 327 //ser2usb.printf("-----dht11-----\r\nSending message \"%s\" to topic \"%s\"\r\n", buff, topic);
zhangyx 9:d03b1af2b8d8 328
zhangyx 9:d03b1af2b8d8 329 client.publish_value(topic, "_upload");
zhangyx 9:d03b1af2b8d8 330 wait(0.01);
zhangyx 9:d03b1af2b8d8 331 client.publish_value(topic, buff);
zhangyx 9:d03b1af2b8d8 332 wait(0.01);
zhangyx 9:d03b1af2b8d8 333 client.publish_value(topic, "_end");
zhangyx 9:d03b1af2b8d8 334
zhangyx 9:d03b1af2b8d8 335 //ser2usb.printf("Senging data done.\r\n");
zhangyx 9:d03b1af2b8d8 336 }
zhangyx 9:d03b1af2b8d8 337 #endif // ENABLE_ESP8266
zhangyx 9:d03b1af2b8d8 338 //============================================DS18B20
zhangyx 9:d03b1af2b8d8 339 DS18B20::DS18B20(PinName pin)
zhangyx 9:d03b1af2b8d8 340 :datapin(pin)
zhangyx 9:d03b1af2b8d8 341 {
zhangyx 9:d03b1af2b8d8 342 if(start()){//ser2usb.printf("DS18B20 started\r\n");
zhangyx 9:d03b1af2b8d8 343 }
zhangyx 9:d03b1af2b8d8 344 }
zhangyx 9:d03b1af2b8d8 345 //-----------
zhangyx 9:d03b1af2b8d8 346 int DS18B20::start()
zhangyx 9:d03b1af2b8d8 347 {
zhangyx 9:d03b1af2b8d8 348 ////ser2usb.printf("starting\r\n");
zhangyx 9:d03b1af2b8d8 349 datapin.output();
zhangyx 9:d03b1af2b8d8 350 datapin=0;
zhangyx 9:d03b1af2b8d8 351 wait_us(600);
zhangyx 9:d03b1af2b8d8 352 datapin.input();
zhangyx 9:d03b1af2b8d8 353 datapin.mode(PullUp);
zhangyx 9:d03b1af2b8d8 354 wait_us(70);
zhangyx 9:d03b1af2b8d8 355 while(datapin.read()){return 0;}
zhangyx 9:d03b1af2b8d8 356 ////ser2usb.printf("started\r\n");
zhangyx 9:d03b1af2b8d8 357 wait_us(250);
zhangyx 9:d03b1af2b8d8 358 return 1;
zhangyx 9:d03b1af2b8d8 359 }
zhangyx 9:d03b1af2b8d8 360 //----------
zhangyx 9:d03b1af2b8d8 361 void DS18B20::writebyte(uint8_t send)
zhangyx 9:d03b1af2b8d8 362 {
zhangyx 9:d03b1af2b8d8 363 datapin.output();
zhangyx 9:d03b1af2b8d8 364 datapin=1;
zhangyx 9:d03b1af2b8d8 365 wait_us(20);
zhangyx 9:d03b1af2b8d8 366 for(int i=0;i<8;i++)
zhangyx 9:d03b1af2b8d8 367 {
zhangyx 9:d03b1af2b8d8 368 datapin.output();
zhangyx 9:d03b1af2b8d8 369 datapin=0; //产生读写时序的起始信号
zhangyx 9:d03b1af2b8d8 370 wait_us(2); //要求至少1us的延时
zhangyx 9:d03b1af2b8d8 371 datapin=send & 0x01; //对总线赋值,从最低位开始写起
zhangyx 9:d03b1af2b8d8 372 wait_us(70);//延时70us,写0在60~120us之间释放,写1的话大于60us均可释放
zhangyx 9:d03b1af2b8d8 373 datapin=1; //释放总线,为下一次mcu送数据做准备,
zhangyx 9:d03b1af2b8d8 374 send>>=1; //有效数据移动到最低位,2次写数据间隙至少需1us
zhangyx 9:d03b1af2b8d8 375 }
zhangyx 9:d03b1af2b8d8 376 datapin.output();
zhangyx 9:d03b1af2b8d8 377 datapin=1;
zhangyx 9:d03b1af2b8d8 378 wait_us(70);
zhangyx 9:d03b1af2b8d8 379 }
zhangyx 9:d03b1af2b8d8 380 //-----------
zhangyx 9:d03b1af2b8d8 381 uint8_t DS18B20::readByte() //mcu读一个字节
zhangyx 9:d03b1af2b8d8 382 {
zhangyx 9:d03b1af2b8d8 383 uint8_t i,value=0;
zhangyx 9:d03b1af2b8d8 384 for(i=0;i<8;i++)
zhangyx 9:d03b1af2b8d8 385 {
zhangyx 9:d03b1af2b8d8 386 datapin.output();
zhangyx 9:d03b1af2b8d8 387 datapin=0; //起始信号
zhangyx 9:d03b1af2b8d8 388 wait_us(2);
zhangyx 9:d03b1af2b8d8 389 datapin.input(); //mcu释放总线
zhangyx 9:d03b1af2b8d8 390 datapin.mode(PullUp);
zhangyx 9:d03b1af2b8d8 391 if(datapin)
zhangyx 9:d03b1af2b8d8 392 {
zhangyx 9:d03b1af2b8d8 393 value=value|0x80;//保存高电平数据,低电平的话不用保存,移位后默认是0
zhangyx 9:d03b1af2b8d8 394 }
zhangyx 9:d03b1af2b8d8 395 value>>=1;
zhangyx 9:d03b1af2b8d8 396 wait_us(30); //延时40us
zhangyx 9:d03b1af2b8d8 397 }
zhangyx 9:d03b1af2b8d8 398 return value;
zhangyx 9:d03b1af2b8d8 399 }
zhangyx 9:d03b1af2b8d8 400 //------------
zhangyx 9:d03b1af2b8d8 401 float DS18B20::transfer(uint8_t h,uint8_t l)
zhangyx 9:d03b1af2b8d8 402 {
zhangyx 9:d03b1af2b8d8 403 //h=0x01;
zhangyx 9:d03b1af2b8d8 404 //l=0x01;
zhangyx 9:d03b1af2b8d8 405 int flag=(h&0x01)>>7;
zhangyx 9:d03b1af2b8d8 406 if(!flag)
zhangyx 9:d03b1af2b8d8 407 {
zhangyx 9:d03b1af2b8d8 408 float i=(h*256+l)*0.25;
zhangyx 9:d03b1af2b8d8 409 ////ser2usb.printf("flag:%d\th:%d\tl:%d\r\n",flag,h,l);
zhangyx 9:d03b1af2b8d8 410 return i;
zhangyx 9:d03b1af2b8d8 411 }
zhangyx 9:d03b1af2b8d8 412 else
zhangyx 9:d03b1af2b8d8 413 {
zhangyx 9:d03b1af2b8d8 414 float i=((~h)*256+(~l))*0.25*-1;
zhangyx 9:d03b1af2b8d8 415 ////ser2usb.printf("flag:%d\th:%d\tl:%d\r\n",flag,h,l);
zhangyx 9:d03b1af2b8d8 416 return i;
zhangyx 9:d03b1af2b8d8 417 }
zhangyx 9:d03b1af2b8d8 418 }
zhangyx 9:d03b1af2b8d8 419 //----------
zhangyx 9:d03b1af2b8d8 420 int DS18B20::getdata()
zhangyx 9:d03b1af2b8d8 421 {
zhangyx 9:d03b1af2b8d8 422 T=5000;
zhangyx 9:d03b1af2b8d8 423 start();
zhangyx 9:d03b1af2b8d8 424 writebyte(0xcc);
zhangyx 9:d03b1af2b8d8 425 writebyte(0x44);
zhangyx 9:d03b1af2b8d8 426 wait(2);
zhangyx 9:d03b1af2b8d8 427
zhangyx 9:d03b1af2b8d8 428 start();
zhangyx 9:d03b1af2b8d8 429 writebyte(0xcc);
zhangyx 9:d03b1af2b8d8 430 writebyte(0xbe);
zhangyx 9:d03b1af2b8d8 431 uint8_t a=readByte();//l
zhangyx 9:d03b1af2b8d8 432 uint8_t b=readByte();//h
zhangyx 9:d03b1af2b8d8 433 T=transfer(b,a);
zhangyx 9:d03b1af2b8d8 434
zhangyx 9:d03b1af2b8d8 435 if(T==5000){return 0;}
zhangyx 9:d03b1af2b8d8 436 else{return 1;}
zhangyx 9:d03b1af2b8d8 437 }
zhangyx 9:d03b1af2b8d8 438 //----------
zhangyx 9:d03b1af2b8d8 439 float DS18B20::gettemperature()
zhangyx 9:d03b1af2b8d8 440 {
zhangyx 9:d03b1af2b8d8 441 if(getdata()){return T;}
zhangyx 9:d03b1af2b8d8 442 else{//ser2usb.printf("get temperature fail!\r\n");
zhangyx 9:d03b1af2b8d8 443 return 0;}
zhangyx 9:d03b1af2b8d8 444 }
zhangyx 9:d03b1af2b8d8 445
zhangyx 9:d03b1af2b8d8 446 #ifdef ENABLE_ESP8266
zhangyx 9:d03b1af2b8d8 447 void DS18B20::send_temp(Esp8266 & client, const char * topic)
zhangyx 9:d03b1af2b8d8 448 {
zhangyx 9:d03b1af2b8d8 449 char buff[32];
zhangyx 9:d03b1af2b8d8 450 if(this->getdata())
zhangyx 9:d03b1af2b8d8 451 sprintf(buff, "%.3f", this->gettemperature());
zhangyx 9:d03b1af2b8d8 452 else
zhangyx 9:d03b1af2b8d8 453 {
zhangyx 9:d03b1af2b8d8 454 //ser2usb.printf("dht11 not aviliable\r\n");
zhangyx 9:d03b1af2b8d8 455 return;
zhangyx 9:d03b1af2b8d8 456 }
zhangyx 9:d03b1af2b8d8 457
zhangyx 9:d03b1af2b8d8 458 //ser2usb.printf("-----DS18B20-----\r\nSending message \"%s\" to topic \"%s\"\r\n", buff, topic);
zhangyx 9:d03b1af2b8d8 459
zhangyx 9:d03b1af2b8d8 460 client.publish_value(topic, "_upload");
zhangyx 9:d03b1af2b8d8 461 wait(0.01);
zhangyx 9:d03b1af2b8d8 462 client.publish_value(topic, buff);
zhangyx 9:d03b1af2b8d8 463 wait(0.01);
zhangyx 9:d03b1af2b8d8 464 client.publish_value(topic, "_end");
zhangyx 9:d03b1af2b8d8 465
zhangyx 9:d03b1af2b8d8 466 //ser2usb.printf("Senging data done.\r\n");
zhangyx 9:d03b1af2b8d8 467 }
zhangyx 9:d03b1af2b8d8 468 #endif // ENABLE_ESP8266
zhangyx 9:d03b1af2b8d8 469
zhangyx 9:d03b1af2b8d8 470 //==============================================YL-38
zhangyx 9:d03b1af2b8d8 471 YL::YL(PinName dio)
zhangyx 9:d03b1af2b8d8 472 : status(false), signal(dio),signallevel(PC_13)
zhangyx 9:d03b1af2b8d8 473 {
zhangyx 9:d03b1af2b8d8 474 signal.fall(this, &YL::triggered);
zhangyx 9:d03b1af2b8d8 475 //ser2usb.printf("YL start!\r\n");
zhangyx 9:d03b1af2b8d8 476 }
zhangyx 9:d03b1af2b8d8 477 //--------
zhangyx 9:d03b1af2b8d8 478 YL::YL(PinName dio,PinName aio)
zhangyx 9:d03b1af2b8d8 479 : status(false), signal(dio),signallevel(aio)
zhangyx 9:d03b1af2b8d8 480 {
zhangyx 9:d03b1af2b8d8 481 signal.fall(this, &YL::triggered);
zhangyx 9:d03b1af2b8d8 482 //ser2usb.printf("YL start!\r\n");
zhangyx 9:d03b1af2b8d8 483 }
zhangyx 9:d03b1af2b8d8 484 //--------
zhangyx 9:d03b1af2b8d8 485 void YL::triggered() //触发中断!!
zhangyx 9:d03b1af2b8d8 486 {
zhangyx 9:d03b1af2b8d8 487 //ser2usb.printf("YL Triggered!\r\n");
zhangyx 9:d03b1af2b8d8 488 status = true;
zhangyx 9:d03b1af2b8d8 489 }
zhangyx 9:d03b1af2b8d8 490 //--------
zhangyx 9:d03b1af2b8d8 491 bool YL::operator==(const bool &target)
zhangyx 9:d03b1af2b8d8 492 {
zhangyx 9:d03b1af2b8d8 493 if(status == target)
zhangyx 9:d03b1af2b8d8 494 {
zhangyx 9:d03b1af2b8d8 495 return true;
zhangyx 9:d03b1af2b8d8 496 }
zhangyx 9:d03b1af2b8d8 497 else
zhangyx 9:d03b1af2b8d8 498 {
zhangyx 9:d03b1af2b8d8 499 return false;
zhangyx 9:d03b1af2b8d8 500 }
zhangyx 9:d03b1af2b8d8 501 }
zhangyx 9:d03b1af2b8d8 502 //--------
zhangyx 9:d03b1af2b8d8 503 float YL::getairdata()
zhangyx 9:d03b1af2b8d8 504 {
zhangyx 9:d03b1af2b8d8 505 return signallevel.read();
zhangyx 9:d03b1af2b8d8 506 }
zhangyx 9:d03b1af2b8d8 507 //-----------
zhangyx 9:d03b1af2b8d8 508 void YL::reset()
zhangyx 9:d03b1af2b8d8 509 {
zhangyx 9:d03b1af2b8d8 510 status = false;
zhangyx 9:d03b1af2b8d8 511 }
zhangyx 9:d03b1af2b8d8 512 float YL::read()
zhangyx 9:d03b1af2b8d8 513 {
zhangyx 9:d03b1af2b8d8 514 return signallevel.read();
zhangyx 9:d03b1af2b8d8 515 }
zhangyx 9:d03b1af2b8d8 516
zhangyx 9:d03b1af2b8d8 517 #ifdef ENABLE_ESP8266
zhangyx 9:d03b1af2b8d8 518 void YL::send_data(Esp8266 & client, const char * topic)
zhangyx 9:d03b1af2b8d8 519 {
zhangyx 9:d03b1af2b8d8 520
zhangyx 9:d03b1af2b8d8 521 //ser2usb.printf("-----YL-----\r\nSending message \"%s\" to topic \"%s\"\r\n", buff, topic);
zhangyx 9:d03b1af2b8d8 522
zhangyx 9:d03b1af2b8d8 523 client.publish_value(topic, "_upload");
zhangyx 9:d03b1af2b8d8 524 wait(0.01);
zhangyx 9:d03b1af2b8d8 525 client.publish_value(topic,_p(to_string( this->read())));
zhangyx 9:d03b1af2b8d8 526 wait(0.01);
zhangyx 9:d03b1af2b8d8 527 client.publish_value(topic, "_end");
zhangyx 9:d03b1af2b8d8 528
zhangyx 9:d03b1af2b8d8 529 //ser2usb.printf("Senging data done.\r\n");
zhangyx 9:d03b1af2b8d8 530 }
zhangyx 9:d03b1af2b8d8 531 #endif // ENABLE_ESP8266
zhangyx 9:d03b1af2b8d8 532 //=============================================
zhangyx 9:d03b1af2b8d8 533 BMP180::BMP180(PinName sda,PinName scl)
zhangyx 9:d03b1af2b8d8 534 :i2c(sda,scl)
zhangyx 9:d03b1af2b8d8 535 {
zhangyx 9:d03b1af2b8d8 536 OSS=OSS_3;
zhangyx 9:d03b1af2b8d8 537 uint8_t c = readByte(BMP180_ADDRESS, BMP180_WHO_AM_I);
zhangyx 9:d03b1af2b8d8 538 if(c == 0x55)
zhangyx 9:d03b1af2b8d8 539 {
zhangyx 9:d03b1af2b8d8 540 //ser2usb.printf("BMP-180 is 0x%x\r\n", c);
zhangyx 9:d03b1af2b8d8 541 //ser2usb.printf("BMP-180 should be 0x55\r\n");
zhangyx 9:d03b1af2b8d8 542 //ser2usb.printf("BMP-180 online...\r\n");
zhangyx 9:d03b1af2b8d8 543
zhangyx 9:d03b1af2b8d8 544 BMP180Calibration();
zhangyx 9:d03b1af2b8d8 545 //ser2usb.printf("BMP-180 calibration complete...\r\n");
zhangyx 9:d03b1af2b8d8 546 }
zhangyx 9:d03b1af2b8d8 547 else
zhangyx 9:d03b1af2b8d8 548 {
zhangyx 9:d03b1af2b8d8 549 //ser2usb.printf("BMP-180 is 0x%x\r\n", c);
zhangyx 9:d03b1af2b8d8 550 //ser2usb.printf("BMP-180 should be 0x55\r\n");
zhangyx 9:d03b1af2b8d8 551 while(1); // idle here forever
zhangyx 9:d03b1af2b8d8 552 }
zhangyx 9:d03b1af2b8d8 553 }
zhangyx 9:d03b1af2b8d8 554 void BMP180::writeByte(uint8_t address, uint8_t subAddress, uint8_t data)
zhangyx 9:d03b1af2b8d8 555 {
zhangyx 9:d03b1af2b8d8 556 char data_write[2];
zhangyx 9:d03b1af2b8d8 557 data_write[0] = subAddress;
zhangyx 9:d03b1af2b8d8 558 data_write[1] = data;
zhangyx 9:d03b1af2b8d8 559 i2c.write(address, data_write, 2, 0);
zhangyx 9:d03b1af2b8d8 560 }
zhangyx 9:d03b1af2b8d8 561
zhangyx 9:d03b1af2b8d8 562 char BMP180::readByte(uint8_t address, uint8_t subAddress)
zhangyx 9:d03b1af2b8d8 563 {
zhangyx 9:d03b1af2b8d8 564 char data[1]; // `data` will store the register data
zhangyx 9:d03b1af2b8d8 565 char data_write[1];
zhangyx 9:d03b1af2b8d8 566 data_write[0] = subAddress;
zhangyx 9:d03b1af2b8d8 567 i2c.write(address, data_write, 1, 1); // no stop
zhangyx 9:d03b1af2b8d8 568 i2c.read(address, data, 1, 0);
zhangyx 9:d03b1af2b8d8 569 return data[0];
zhangyx 9:d03b1af2b8d8 570 }
zhangyx 9:d03b1af2b8d8 571
zhangyx 9:d03b1af2b8d8 572 void BMP180::readBytes(uint8_t address, uint8_t subAddress, uint8_t count, uint8_t * dest)
zhangyx 9:d03b1af2b8d8 573 {
zhangyx 9:d03b1af2b8d8 574 char data[14];
zhangyx 9:d03b1af2b8d8 575 char data_write[1];
zhangyx 9:d03b1af2b8d8 576 data_write[0] = subAddress;
zhangyx 9:d03b1af2b8d8 577 i2c.write(address, data_write, 1, 1); // no stop
zhangyx 9:d03b1af2b8d8 578 i2c.read(address, data, count, 0);
zhangyx 9:d03b1af2b8d8 579 for(int ii = 0; ii < count; ii++) {
zhangyx 9:d03b1af2b8d8 580 dest[ii] = data[ii];
zhangyx 9:d03b1af2b8d8 581 }
zhangyx 9:d03b1af2b8d8 582 }
zhangyx 9:d03b1af2b8d8 583
zhangyx 9:d03b1af2b8d8 584
zhangyx 9:d03b1af2b8d8 585 // Stores all of the BMP180's calibration values into global variables
zhangyx 9:d03b1af2b8d8 586 // Calibration values are required to calculate temp and pressure
zhangyx 9:d03b1af2b8d8 587 // This function should be called at the beginning of the program
zhangyx 9:d03b1af2b8d8 588 // These BMP-180 functions were adapted from Jim Lindblom of SparkFun Electronics
zhangyx 9:d03b1af2b8d8 589 void BMP180::BMP180Calibration()
zhangyx 9:d03b1af2b8d8 590 {
zhangyx 9:d03b1af2b8d8 591 ac1 = readByte(BMP180_ADDRESS, 0xAA) << 8 | readByte(BMP180_ADDRESS, 0xAB);
zhangyx 9:d03b1af2b8d8 592 ac2 = readByte(BMP180_ADDRESS, 0xAC) << 8 | readByte(BMP180_ADDRESS, 0xAD);
zhangyx 9:d03b1af2b8d8 593 ac3 = readByte(BMP180_ADDRESS, 0xAE) << 8 | readByte(BMP180_ADDRESS, 0xAF);
zhangyx 9:d03b1af2b8d8 594 ac4 = readByte(BMP180_ADDRESS, 0xB0) << 8 | readByte(BMP180_ADDRESS, 0xB1);
zhangyx 9:d03b1af2b8d8 595 ac5 = readByte(BMP180_ADDRESS, 0xB2) << 8 | readByte(BMP180_ADDRESS, 0xB3);
zhangyx 9:d03b1af2b8d8 596 ac6 = readByte(BMP180_ADDRESS, 0xB4) << 8 | readByte(BMP180_ADDRESS, 0xB5);
zhangyx 9:d03b1af2b8d8 597 b1 = readByte(BMP180_ADDRESS, 0xB6) << 8 | readByte(BMP180_ADDRESS, 0xB7);
zhangyx 9:d03b1af2b8d8 598 b2 = readByte(BMP180_ADDRESS, 0xB8) << 8 | readByte(BMP180_ADDRESS, 0xB9);
zhangyx 9:d03b1af2b8d8 599 mb = readByte(BMP180_ADDRESS, 0xBA) << 8 | readByte(BMP180_ADDRESS, 0xBB);
zhangyx 9:d03b1af2b8d8 600 mc = readByte(BMP180_ADDRESS, 0xBC) << 8 | readByte(BMP180_ADDRESS, 0xBD);
zhangyx 9:d03b1af2b8d8 601 md = readByte(BMP180_ADDRESS, 0xBE) << 8 | readByte(BMP180_ADDRESS, 0xBF);
zhangyx 9:d03b1af2b8d8 602 }
zhangyx 9:d03b1af2b8d8 603
zhangyx 9:d03b1af2b8d8 604 // Temperature returned will be in units of 0.1 deg C
zhangyx 9:d03b1af2b8d8 605 long BMP180::BMP180GetTemperature()
zhangyx 9:d03b1af2b8d8 606 {
zhangyx 9:d03b1af2b8d8 607 long ut = 0;
zhangyx 9:d03b1af2b8d8 608 uint8_t rawData[2] = {0, 0};
zhangyx 9:d03b1af2b8d8 609
zhangyx 9:d03b1af2b8d8 610 writeByte(BMP180_ADDRESS, 0xF4, 0x2E); // start temperature measurement
zhangyx 9:d03b1af2b8d8 611 wait_ms(5);
zhangyx 9:d03b1af2b8d8 612 readBytes(BMP180_ADDRESS, 0xF6, 2, &rawData[0]); // read raw temperature measurement
zhangyx 9:d03b1af2b8d8 613 ut = rawData[0]*256+ rawData[1];
zhangyx 9:d03b1af2b8d8 614
zhangyx 9:d03b1af2b8d8 615 long x1, x2;
zhangyx 9:d03b1af2b8d8 616
zhangyx 9:d03b1af2b8d8 617 x1 = (((long)ut - (long)ac6)*(long)ac5) >> 15;
zhangyx 9:d03b1af2b8d8 618 x2 = ((long)mc << 11)/(x1 + md);
zhangyx 9:d03b1af2b8d8 619 b5 = x1 + x2;
zhangyx 9:d03b1af2b8d8 620
zhangyx 9:d03b1af2b8d8 621 return ((b5 + 8)>>4)/10.0;
zhangyx 9:d03b1af2b8d8 622 }
zhangyx 9:d03b1af2b8d8 623
zhangyx 9:d03b1af2b8d8 624 // Calculate pressure read calibration values
zhangyx 9:d03b1af2b8d8 625 // b5 is also required so BMP180GetTemperature() must be called first.
zhangyx 9:d03b1af2b8d8 626 // Value returned will be pressure in units of Pa.
zhangyx 9:d03b1af2b8d8 627 long BMP180::BMP180GetPressure()
zhangyx 9:d03b1af2b8d8 628 {
zhangyx 9:d03b1af2b8d8 629 long up = 0;
zhangyx 9:d03b1af2b8d8 630 writeByte(BMP180_ADDRESS, 0xF4, 0x34 | OSS << 6); // Configure pressure measurement for highest resolution
zhangyx 9:d03b1af2b8d8 631 wait_ms(5+8*OSS); // delay 5 ms at lowest resolution, 29 ms at highest
zhangyx 9:d03b1af2b8d8 632 uint8_t rawData[3] = {0, 0, 0};
zhangyx 9:d03b1af2b8d8 633 readBytes(BMP180_ADDRESS, 0xF6, 3, &rawData[0]); // read raw pressure measurement of 19 bits
zhangyx 9:d03b1af2b8d8 634 up = (((long) rawData[0] << 16) | ((long)rawData[1] << 8) | rawData[2]) >> (8 - OSS);
zhangyx 9:d03b1af2b8d8 635
zhangyx 9:d03b1af2b8d8 636 long x1, x2, x3, b3, b6, p;
zhangyx 9:d03b1af2b8d8 637 unsigned long b4, b7;
zhangyx 9:d03b1af2b8d8 638
zhangyx 9:d03b1af2b8d8 639 b6 = b5 - 4000;
zhangyx 9:d03b1af2b8d8 640 // Calculate B3
zhangyx 9:d03b1af2b8d8 641 x1 = (b2 * (b6 * b6)>>12)>>11;
zhangyx 9:d03b1af2b8d8 642 x2 = (ac2 * b6)>>11;
zhangyx 9:d03b1af2b8d8 643 x3 = x1 + x2;
zhangyx 9:d03b1af2b8d8 644 b3 = (((((long)ac1)*4 + x3)<<OSS) + 2)>>2;
zhangyx 9:d03b1af2b8d8 645
zhangyx 9:d03b1af2b8d8 646 // Calculate B4
zhangyx 9:d03b1af2b8d8 647 x1 = (ac3 * b6)>>13;
zhangyx 9:d03b1af2b8d8 648 x2 = (b1 * ((b6 * b6)>>12))>>16;
zhangyx 9:d03b1af2b8d8 649 x3 = ((x1 + x2) + 2)>>2;
zhangyx 9:d03b1af2b8d8 650 b4 = (ac4 * (unsigned long)(x3 + 32768))>>15;
zhangyx 9:d03b1af2b8d8 651
zhangyx 9:d03b1af2b8d8 652 b7 = ((unsigned long)(up - b3) * (50000>>OSS));
zhangyx 9:d03b1af2b8d8 653 if (b7 < 0x80000000)
zhangyx 9:d03b1af2b8d8 654 p = (b7<<1)/b4;
zhangyx 9:d03b1af2b8d8 655 else
zhangyx 9:d03b1af2b8d8 656 p = (b7/b4)<<1;
zhangyx 9:d03b1af2b8d8 657
zhangyx 9:d03b1af2b8d8 658 x1 = (p>>8) * (p>>8);
zhangyx 9:d03b1af2b8d8 659 x1 = (x1 * 3038)>>16;
zhangyx 9:d03b1af2b8d8 660 x2 = (-7357 * p)>>16;
zhangyx 9:d03b1af2b8d8 661 p += (x1 + x2 + 3791)>>4;
zhangyx 9:d03b1af2b8d8 662
zhangyx 9:d03b1af2b8d8 663 return p;
zhangyx 9:d03b1af2b8d8 664 }
zhangyx 9:d03b1af2b8d8 665
zhangyx 9:d03b1af2b8d8 666 #ifdef ENABLE_ESP8266
zhangyx 9:d03b1af2b8d8 667 void BMP180::send_press(Esp8266 & client, const char * topic)
zhangyx 9:d03b1af2b8d8 668 {
zhangyx 9:d03b1af2b8d8 669 char buff[32];
zhangyx 9:d03b1af2b8d8 670 sprintf(buff, "%ld", this->BMP180GetPressure());
zhangyx 9:d03b1af2b8d8 671
zhangyx 9:d03b1af2b8d8 672 //ser2usb.printf("-----BMP180-----Sending message \"%s\" to topic \"%s\"\r\n", buff, topic);
zhangyx 9:d03b1af2b8d8 673
zhangyx 9:d03b1af2b8d8 674 client.publish_value(topic, "_upload");
zhangyx 9:d03b1af2b8d8 675 wait(0.01);
zhangyx 9:d03b1af2b8d8 676 client.publish_value(topic, buff);
zhangyx 9:d03b1af2b8d8 677 wait(0.01);
zhangyx 9:d03b1af2b8d8 678 client.publish_value(topic, "_end");
zhangyx 9:d03b1af2b8d8 679
zhangyx 9:d03b1af2b8d8 680 //ser2usb.printf("Senging data done.\r\n");
zhangyx 9:d03b1af2b8d8 681 }
zhangyx 9:d03b1af2b8d8 682
zhangyx 9:d03b1af2b8d8 683 void BMP180::send_temp(Esp8266 & client, const char * topic)
zhangyx 9:d03b1af2b8d8 684 {
zhangyx 9:d03b1af2b8d8 685 char buff[32];
zhangyx 9:d03b1af2b8d8 686 sprintf(buff, "%ld", this->BMP180GetTemperature());
zhangyx 9:d03b1af2b8d8 687
zhangyx 9:d03b1af2b8d8 688 //ser2usb.printf("-----BMP180-----\r\nSending message \"%s\" to topic \"%s\"\r\n", buff, topic);
zhangyx 9:d03b1af2b8d8 689
zhangyx 9:d03b1af2b8d8 690 client.publish_value(topic, "_upload");
zhangyx 9:d03b1af2b8d8 691 wait(0.01);
zhangyx 9:d03b1af2b8d8 692 client.publish_value(topic, buff);
zhangyx 9:d03b1af2b8d8 693 wait(0.01);
zhangyx 9:d03b1af2b8d8 694 client.publish_value(topic, "_end");
zhangyx 9:d03b1af2b8d8 695
zhangyx 9:d03b1af2b8d8 696 //ser2usb.printf("Senging data done.\r\n");
zhangyx 9:d03b1af2b8d8 697 }
zhangyx 9:d03b1af2b8d8 698 #endif // ENABLE_ESP8266
zhangyx 9:d03b1af2b8d8 699
zhangyx 9:d03b1af2b8d8 700 //===============================
zhangyx 9:d03b1af2b8d8 701 GP2Y1010::GP2Y1010(PinName led,PinName measure)
zhangyx 9:d03b1af2b8d8 702 :measurePin(measure),ledPower(led)
zhangyx 9:d03b1af2b8d8 703 {
zhangyx 9:d03b1af2b8d8 704 samplingTime = 280;
zhangyx 9:d03b1af2b8d8 705 deltaTime = 40;
zhangyx 9:d03b1af2b8d8 706 sleepTime = 9680;
zhangyx 9:d03b1af2b8d8 707
zhangyx 9:d03b1af2b8d8 708 voMeasured = 0;
zhangyx 9:d03b1af2b8d8 709 calcVoltage = 0;
zhangyx 9:d03b1af2b8d8 710 dustDensity = 0;
zhangyx 9:d03b1af2b8d8 711 }
zhangyx 9:d03b1af2b8d8 712
zhangyx 9:d03b1af2b8d8 713 float GP2Y1010::getairdata()
zhangyx 9:d03b1af2b8d8 714 {
zhangyx 9:d03b1af2b8d8 715 ledPower=1;
zhangyx 9:d03b1af2b8d8 716
zhangyx 9:d03b1af2b8d8 717 wait_us(samplingTime);
zhangyx 9:d03b1af2b8d8 718
zhangyx 9:d03b1af2b8d8 719 voMeasured = measurePin.read();
zhangyx 9:d03b1af2b8d8 720
zhangyx 9:d03b1af2b8d8 721 wait_us(deltaTime);
zhangyx 9:d03b1af2b8d8 722 ledPower=0;
zhangyx 9:d03b1af2b8d8 723 wait_us(sleepTime);
zhangyx 9:d03b1af2b8d8 724
zhangyx 9:d03b1af2b8d8 725 calcVoltage = voMeasured*5.0;
zhangyx 9:d03b1af2b8d8 726 dustDensity = 0.17*calcVoltage-0.1;
zhangyx 9:d03b1af2b8d8 727
zhangyx 9:d03b1af2b8d8 728 if ( dustDensity < 0)
zhangyx 9:d03b1af2b8d8 729 {
zhangyx 9:d03b1af2b8d8 730 dustDensity = 0.00;
zhangyx 9:d03b1af2b8d8 731 }
zhangyx 9:d03b1af2b8d8 732 return dustDensity ;
zhangyx 9:d03b1af2b8d8 733 }
zhangyx 9:d03b1af2b8d8 734
zhangyx 9:d03b1af2b8d8 735 #endif // ENABLE_SENSORS
zhangyx 9:d03b1af2b8d8 736