Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Diff: AM2321.cpp
- Revision:
- 5:8a3cf73d7ed3
- Parent:
- 4:e5018e5ba340
--- a/AM2321.cpp Thu Jun 16 08:12:33 2016 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,202 +0,0 @@
-//
-// AM2321 Temperature & Humidity Sensor library for Arduino
-//
-// The MIT License (MIT)
-//
-// Copyright (c) 2013 Wang Dong
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-// THE SOFTWARE.
-//
-
-#include "AM2321.h"
-#include "mbed.h"
-extern I2C g_i2c;
-extern Serial pc;
-
-#define I2C_ADDR_AM2321 (0xB8 >> 1) //AM2321温湿度计I2C地址
-#define PARAM_AM2321_READ 0x03 //读寄存器命令
-#define REG_AM2321_HUMIDITY_MSB 0x00 //湿度寄存器高位
-#define REG_AM2321_HUMIDITY_LSB 0x01 //湿度寄存器低位
-#define REG_AM2321_TEMPERATURE_MSB 0x02 //温度寄存器高位
-#define REG_AM2321_TEMPERATURE_LSB 0x03 //温度寄存器低位
-#define REG_AM2321_DEVICE_ID_BIT_24_31 0x0B //32位设备ID高8位
-
-template<int I2CADDR, int COMMAND, int REGADDR, int REGCOUNT>
-class DataReader
-{
-protected:
- enum { len = 32 };
- uint8_t buf[len];
-
-protected:
- DataReader() {
- memset(buf, 0, len);
- }
- bool readRaw() {
- //
- // Wakeup
- //
- //Wire.beginTransmission(I2CADDR);
- //Wire.endTransmission();
- g_i2c.write(I2CADDR<<1, (char*)&buf[0], 1);
-
- //
- // Read Command
- //
-#if 0
- Wire.beginTransmission(I2CADDR);
- Wire.write(COMMAND);
- Wire.write(REGADDR);
- Wire.write(REGCOUNT);
- Wire.endTransmission();
-#else
- char bu[3] = {COMMAND, REGADDR, REGCOUNT};
- g_i2c.write(I2CADDR<<1, bu, 3);
-#endif
-
- //
- // Waiting
- //
- //delayMicroseconds(1600); //>1.5ms
- wait_ms(1.6);
-
- //
- // Read
- //
-#if 0
- Wire.requestFrom(I2CADDR, 2 + REGCOUNT + 2); // COMMAND + REGCOUNT + DATA + CRCLSB + CRCMSB
- int i = 0;
- for (; i < 2 + REGCOUNT; ++i)
- buf[i] = Wire.read();
-
- unsigned short crc = 0;
- crc = Wire.read(); //CRC LSB
- crc |= Wire.read() << 8;//CRC MSB
-
- if (crc == crc16(buf, i))
- return true;
- return false;
-#else
- uint8_t realAddr = (I2CADDR << 1) | 0x01;
- //pc.printf("realAddr = 0x%x\r\n", realAddr);
- g_i2c.read(realAddr, (char*)buf, 2 + REGCOUNT + 2);
- unsigned short crc = 0;
- crc = buf[2+REGCOUNT]; //CRC LSB
- crc |= buf[2+REGCOUNT+1] << 8;//CRC MSB
-#if 0
- for (int i = 0; i < 2 + REGCOUNT + 2; i++) {
- pc.printf("0x%X ", buf[i]);
- }
- pc.printf("\r\n");
-#endif
- if (crc == crc16(buf, 2 + REGCOUNT))
- return true;
- return false;
-#endif
- }
-
-private:
- unsigned short crc16(unsigned char *ptr, unsigned char len) {
- unsigned short crc = 0xFFFF;
- unsigned char i = 0;
- while(len--) {
- crc ^= *ptr++;
- for(i = 0 ; i < 8 ; i++) {
- if(crc & 0x01) {
- crc >>= 1;
- crc ^= 0xA001;
- } else {
- crc >>= 1;
- }
- }
- }
- return crc;
- }
-};
-
-class UidReader : public DataReader<I2C_ADDR_AM2321, PARAM_AM2321_READ, REG_AM2321_DEVICE_ID_BIT_24_31, 4>
-{
-public:
- unsigned int uid;
-public:
- bool read() {
- if(!readRaw())
- return false;
- uid = buf[2] << 24;
- uid += buf[3] << 16;
- uid += buf[4] << 8;
- uid += buf[5];
- return true;
- }
-};
-
-class AirConditionReader : public DataReader<I2C_ADDR_AM2321, PARAM_AM2321_READ, REG_AM2321_HUMIDITY_MSB, 4>
-{
-public:
- unsigned int humidity;
- int temperature;
-public:
- bool read() {
- if(!readRaw())
- return false;
- humidity = buf[2] << 8;
- humidity += buf[3];
- temperature = (buf[4]&0x7F) << 8;
- temperature += buf[5];
- if((buf[4]&0x80) == 0x80)
- temperature = -temperature;
- return true;
- }
-};
-
-
-AM2321::AM2321()
-{
- //Wire.begin();
- temperature = 0;
- humidity = 0;
-}
-
-unsigned long AM2321::uid()
-{
- UidReader reader;
- if (reader.read())
- return reader.uid;
- return -1;
-}
-
-
-bool AM2321::available()
-{
- return !(temperature == 0 && humidity == 0);
-}
-
-bool AM2321::read()
-{
- AirConditionReader reader;
- if (reader.read()) {
- temperature = reader.temperature;
- humidity = reader.humidity;
- return true;
- }
- return false;
-}
-//
-// END OF FILE
-//