hadif azli
/
TEST123
BLYNK TEST
AM2321.cpp@0:d8f4c441e032, 2016-06-10 (annotated)
- 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?
User | Revision | Line number | New 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 |