BLYNK TEST

Dependencies:   mbed Blynk

Committer:
lixianyu
Date:
Fri Jun 10 15:20:20 2016 +0000
Revision:
0:d8f4c441e032
Child:
2:6cd3b0947188
u8glib???????????i2c???

Who changed what in which revision?

UserRevisionLine numberNew contents of line
lixianyu 0:d8f4c441e032 1 //
lixianyu 0:d8f4c441e032 2 // AM2321 Temperature & Humidity Sensor library for Arduino
lixianyu 0:d8f4c441e032 3 //
lixianyu 0:d8f4c441e032 4 // The MIT License (MIT)
lixianyu 0:d8f4c441e032 5 //
lixianyu 0:d8f4c441e032 6 // Copyright (c) 2013 Wang Dong
lixianyu 0:d8f4c441e032 7 //
lixianyu 0:d8f4c441e032 8 // Permission is hereby granted, free of charge, to any person obtaining a copy
lixianyu 0:d8f4c441e032 9 // of this software and associated documentation files (the "Software"), to deal
lixianyu 0:d8f4c441e032 10 // in the Software without restriction, including without limitation the rights
lixianyu 0:d8f4c441e032 11 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
lixianyu 0:d8f4c441e032 12 // copies of the Software, and to permit persons to whom the Software is
lixianyu 0:d8f4c441e032 13 // furnished to do so, subject to the following conditions:
lixianyu 0:d8f4c441e032 14 //
lixianyu 0:d8f4c441e032 15 // The above copyright notice and this permission notice shall be included in
lixianyu 0:d8f4c441e032 16 // all copies or substantial portions of the Software.
lixianyu 0:d8f4c441e032 17 //
lixianyu 0:d8f4c441e032 18 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
lixianyu 0:d8f4c441e032 19 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
lixianyu 0:d8f4c441e032 20 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
lixianyu 0:d8f4c441e032 21 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
lixianyu 0:d8f4c441e032 22 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
lixianyu 0:d8f4c441e032 23 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
lixianyu 0:d8f4c441e032 24 // THE SOFTWARE.
lixianyu 0:d8f4c441e032 25 //
lixianyu 0:d8f4c441e032 26
lixianyu 0:d8f4c441e032 27 #include "AM2321.h"
lixianyu 0:d8f4c441e032 28 //#include <Wire.h>
lixianyu 0:d8f4c441e032 29 #if 0
lixianyu 0:d8f4c441e032 30 #define I2C_ADDR_AM2321 (0xB8 >> 1) //AM2321温湿度计I2C地址
lixianyu 0:d8f4c441e032 31 #define PARAM_AM2321_READ 0x03 //读寄存器命令
lixianyu 0:d8f4c441e032 32 #define REG_AM2321_HUMIDITY_MSB 0x00 //湿度寄存器高位
lixianyu 0:d8f4c441e032 33 #define REG_AM2321_HUMIDITY_LSB 0x01 //湿度寄存器低位
lixianyu 0:d8f4c441e032 34 #define REG_AM2321_TEMPERATURE_MSB 0x02 //温度寄存器高位
lixianyu 0:d8f4c441e032 35 #define REG_AM2321_TEMPERATURE_LSB 0x03 //温度寄存器低位
lixianyu 0:d8f4c441e032 36 #define REG_AM2321_DEVICE_ID_BIT_24_31 0x0B //32位设备ID高8位
lixianyu 0:d8f4c441e032 37
lixianyu 0:d8f4c441e032 38 template<int I2CADDR, int COMMAND, int REGADDR, int REGCOUNT>
lixianyu 0:d8f4c441e032 39 class DataReader {
lixianyu 0:d8f4c441e032 40 protected:
lixianyu 0:d8f4c441e032 41 enum { len = 32 };
lixianyu 0:d8f4c441e032 42 uint8_t buf[len];
lixianyu 0:d8f4c441e032 43
lixianyu 0:d8f4c441e032 44 protected:
lixianyu 0:d8f4c441e032 45 DataReader() {
lixianyu 0:d8f4c441e032 46 memset(buf, 0, len);
lixianyu 0:d8f4c441e032 47 }
lixianyu 0:d8f4c441e032 48 bool readRaw() {
lixianyu 0:d8f4c441e032 49 //
lixianyu 0:d8f4c441e032 50 // Wakeup
lixianyu 0:d8f4c441e032 51 //
lixianyu 0:d8f4c441e032 52 Wire.beginTransmission(I2CADDR);
lixianyu 0:d8f4c441e032 53 Wire.endTransmission();
lixianyu 0:d8f4c441e032 54
lixianyu 0:d8f4c441e032 55 //
lixianyu 0:d8f4c441e032 56 // Read Command
lixianyu 0:d8f4c441e032 57 //
lixianyu 0:d8f4c441e032 58 Wire.beginTransmission(I2CADDR);
lixianyu 0:d8f4c441e032 59 Wire.write(COMMAND);
lixianyu 0:d8f4c441e032 60 Wire.write(REGADDR);
lixianyu 0:d8f4c441e032 61 Wire.write(REGCOUNT);
lixianyu 0:d8f4c441e032 62 Wire.endTransmission();
lixianyu 0:d8f4c441e032 63
lixianyu 0:d8f4c441e032 64 //
lixianyu 0:d8f4c441e032 65 // Waiting
lixianyu 0:d8f4c441e032 66 //
lixianyu 0:d8f4c441e032 67 delayMicroseconds(1600); //>1.5ms
lixianyu 0:d8f4c441e032 68
lixianyu 0:d8f4c441e032 69 //
lixianyu 0:d8f4c441e032 70 // Read
lixianyu 0:d8f4c441e032 71 //
lixianyu 0:d8f4c441e032 72 Wire.requestFrom(I2CADDR, 2 + REGCOUNT + 2); // COMMAND + REGCOUNT + DATA + CRCLSB + CRCMSB
lixianyu 0:d8f4c441e032 73 int i = 0;
lixianyu 0:d8f4c441e032 74 for (; i < 2 + REGCOUNT; ++i)
lixianyu 0:d8f4c441e032 75 buf[i] = Wire.read();
lixianyu 0:d8f4c441e032 76
lixianyu 0:d8f4c441e032 77 unsigned short crc = 0;
lixianyu 0:d8f4c441e032 78 crc = Wire.read(); //CRC LSB
lixianyu 0:d8f4c441e032 79 crc |= Wire.read() << 8;//CRC MSB
lixianyu 0:d8f4c441e032 80
lixianyu 0:d8f4c441e032 81 if (crc == crc16(buf, i))
lixianyu 0:d8f4c441e032 82 return true;
lixianyu 0:d8f4c441e032 83 return false;
lixianyu 0:d8f4c441e032 84 }
lixianyu 0:d8f4c441e032 85
lixianyu 0:d8f4c441e032 86 private:
lixianyu 0:d8f4c441e032 87 unsigned short crc16(unsigned char *ptr, unsigned char len) {
lixianyu 0:d8f4c441e032 88 unsigned short crc = 0xFFFF;
lixianyu 0:d8f4c441e032 89 unsigned char i = 0;
lixianyu 0:d8f4c441e032 90 while(len--) {
lixianyu 0:d8f4c441e032 91 crc ^= *ptr++;
lixianyu 0:d8f4c441e032 92 for(i = 0 ; i < 8 ; i++) {
lixianyu 0:d8f4c441e032 93 if(crc & 0x01) {
lixianyu 0:d8f4c441e032 94 crc >>= 1;
lixianyu 0:d8f4c441e032 95 crc ^= 0xA001;
lixianyu 0:d8f4c441e032 96 }
lixianyu 0:d8f4c441e032 97 else {
lixianyu 0:d8f4c441e032 98 crc >>= 1;
lixianyu 0:d8f4c441e032 99 }
lixianyu 0:d8f4c441e032 100 }
lixianyu 0:d8f4c441e032 101 }
lixianyu 0:d8f4c441e032 102 return crc;
lixianyu 0:d8f4c441e032 103 }
lixianyu 0:d8f4c441e032 104 };
lixianyu 0:d8f4c441e032 105
lixianyu 0:d8f4c441e032 106 class UidReader : public DataReader<I2C_ADDR_AM2321, PARAM_AM2321_READ, REG_AM2321_DEVICE_ID_BIT_24_31, 4>
lixianyu 0:d8f4c441e032 107 {
lixianyu 0:d8f4c441e032 108 public:
lixianyu 0:d8f4c441e032 109 unsigned int uid;
lixianyu 0:d8f4c441e032 110 public:
lixianyu 0:d8f4c441e032 111 bool read() {
lixianyu 0:d8f4c441e032 112 if(!readRaw())
lixianyu 0:d8f4c441e032 113 return false;
lixianyu 0:d8f4c441e032 114 uid = buf[2] << 24;
lixianyu 0:d8f4c441e032 115 uid += buf[3] << 16;
lixianyu 0:d8f4c441e032 116 uid += buf[4] << 8;
lixianyu 0:d8f4c441e032 117 uid += buf[5];
lixianyu 0:d8f4c441e032 118 return true;
lixianyu 0:d8f4c441e032 119 }
lixianyu 0:d8f4c441e032 120 };
lixianyu 0:d8f4c441e032 121
lixianyu 0:d8f4c441e032 122 class AirConditionReader : public DataReader<I2C_ADDR_AM2321, PARAM_AM2321_READ, REG_AM2321_HUMIDITY_MSB, 4>
lixianyu 0:d8f4c441e032 123 {
lixianyu 0:d8f4c441e032 124 public:
lixianyu 0:d8f4c441e032 125 unsigned int humidity;
lixianyu 0:d8f4c441e032 126 int temperature;
lixianyu 0:d8f4c441e032 127 public:
lixianyu 0:d8f4c441e032 128 bool read() {
lixianyu 0:d8f4c441e032 129 if(!readRaw())
lixianyu 0:d8f4c441e032 130 return false;
lixianyu 0:d8f4c441e032 131 humidity = buf[2] << 8;
lixianyu 0:d8f4c441e032 132 humidity += buf[3];
lixianyu 0:d8f4c441e032 133 temperature = (buf[4]&0x7F) << 8;
lixianyu 0:d8f4c441e032 134 temperature += buf[5];
lixianyu 0:d8f4c441e032 135 if((buf[4]&0x80) == 0x80)
lixianyu 0:d8f4c441e032 136 temperature = -temperature;
lixianyu 0:d8f4c441e032 137 return true;
lixianyu 0:d8f4c441e032 138 }
lixianyu 0:d8f4c441e032 139 };
lixianyu 0:d8f4c441e032 140
lixianyu 0:d8f4c441e032 141
lixianyu 0:d8f4c441e032 142 AM2321::AM2321() {
lixianyu 0:d8f4c441e032 143 Wire.begin();
lixianyu 0:d8f4c441e032 144 temperature = 0;
lixianyu 0:d8f4c441e032 145 humidity = 0;
lixianyu 0:d8f4c441e032 146 }
lixianyu 0:d8f4c441e032 147
lixianyu 0:d8f4c441e032 148 uint32_t AM2321::uid() {
lixianyu 0:d8f4c441e032 149 UidReader reader;
lixianyu 0:d8f4c441e032 150 if (reader.read())
lixianyu 0:d8f4c441e032 151 return reader.uid;
lixianyu 0:d8f4c441e032 152 return -1;
lixianyu 0:d8f4c441e032 153 }
lixianyu 0:d8f4c441e032 154
lixianyu 0:d8f4c441e032 155
lixianyu 0:d8f4c441e032 156 bool AM2321::available() {
lixianyu 0:d8f4c441e032 157 return !(temperature == 0 && humidity == 0);
lixianyu 0:d8f4c441e032 158 }
lixianyu 0:d8f4c441e032 159
lixianyu 0:d8f4c441e032 160 bool AM2321::read() {
lixianyu 0:d8f4c441e032 161 AirConditionReader reader;
lixianyu 0:d8f4c441e032 162 if (reader.read()) {
lixianyu 0:d8f4c441e032 163 temperature = reader.temperature;
lixianyu 0:d8f4c441e032 164 humidity = reader.humidity;
lixianyu 0:d8f4c441e032 165 return true;
lixianyu 0:d8f4c441e032 166 }
lixianyu 0:d8f4c441e032 167 return false;
lixianyu 0:d8f4c441e032 168 }
lixianyu 0:d8f4c441e032 169 //
lixianyu 0:d8f4c441e032 170 // END OF FILE
lixianyu 0:d8f4c441e032 171 //
lixianyu 0:d8f4c441e032 172
lixianyu 0:d8f4c441e032 173 #endif