A library for the use of AM2303 (a.k.a. DHT22), a temperature and humidity sensor.

Dependents:   AM2303_Hello_World

Fork of DHT11 by Shigenori Inoue

AM2303.h

Committer:
s_inoue_mbed
Date:
2014-10-13
Revision:
12:1ad0612823e9
Parent:
DHT11.h@ 10:f0d789f49df7

File content as of revision 12:1ad0612823e9:

/* Copyright (c) 2014 Shigenori Inoue, MIT License
 *
 * 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.
 */

#ifndef __AM2303__
#define __AM2303__
#include "mbed.h"

/**  Example:
 * @code
 * #include "mbed.h"
 * #include "AM2303.h"
 *
 * AM2303 d;
 *
 * main()
 * {
 *     int s;
 *     s = h.readData();
 *     if (s != AM2303::OK) {
 *         printf("Error!\r\n");
 *     }
 *     else {
 *         printf("T:%f, H:%f\r\n", h.readTemperature(), h.readHumidity());
 *     }
 * }
 * @endcode
 */

class AM2303
{
public:
    /** Create a AM2303 interface
     * @param pin 1-wire-like serial I/O port of AM2303
     */
    AM2303(PinName pin);
    ~AM2303();

    /** Reading the data from the AM2303
     * @return Error code
     *     0: OK.
     *     1: Reading the data too often.
     *     2: 1-wire bus is busy.
     *     3: AM2303 does not respond.
     *     4: AM2303 is not ready.
     *     5: Checksum is incorrect.
     *     6: Timeout.
     */
    int readData(void);

    /** Reading the humidity from the data
     * @return Humidity in %,
     * regardless of the error from readData()
     */
    float readHumidity(void);

    /** Reading the temperature from the data
     * @return Temperature in Celcius,
     * regardless of the error from readData()
     */
    float readTemperature(void);

    enum ErrorAM2303 {
        OK = 0,
        READ_TOO_OFTEN = 1,
        BUS_BUSY = 2,
        NOT_PRESENT = 3,
        NOT_READY = 4,
        CHKSUM_ERR = 5,
        WATCHDOG_ERR = 6,
    };
    uint64_t data;
    
private:
    DigitalInOut io;
    InterruptIn io_irq;
    Timer t;
    uint32_t t_pulse_us;
    const static int t_tol_start;
    const static int t_tol_pulse;
    bool first_time;
    /* uint64_t data; */
    uint32_t chksum;
    uint32_t cnt;
    uint32_t wdt;
    bool eod;
    void init(void);
    void pos_edge(void);
    void neg_edge(void);
};

#endif