Главная » Микроконтроллеры » ATtiny13 — чтение температуры и влажности с датчика DHT11

ATtiny13 — чтение температуры и влажности с датчика DHT11

В этой статье показано, как с помощью ATtiny13 считывать температуру и влажность с датчика DHT11 и регистрировать эту информацию с помощью программного UART.

Вам нужно подключить вывод DATA DHT11 к PB0, а вывод RX USB последовательного адаптера — к PB3 ATtiny13. Также необходимо подключить датчик к источнику питания (3,3 В или 5 В).

А также, после небольшой модификации кода, Attiny13 может выводить эту информацию на дисплей (например, TM1637 или MAX7219). Полный код находится на GitHub здесь.

Необходимые детали

  • ATtiny13 – плата разработки
  • Датчик DHT11
  • USB-последовательный адаптер

Программное обеспечение

Этот код написан на языке C и может быть скомпилирован с помощью avr-gcc. Подробно о том, как скомпилировать код, можно посмотреть здесь.

/**
 * using software uart (19200/8N1).
 *
 * Settings:
 *  FUSE_L=0x6A
 *  FUSE_H=0xFF
 *  F_CPU=1200000
 */
#include <avr/io.h>
#include <util/delay.h>
#include "uart.h"
#define DHT_PIN            PB0
#define DHT_ERR_OK         (0)
#define DHT_ERR_TIMEOUT    (-1)
#define DHT_PIN_INPUT()    (DDRB &= ~_BV(DHT_PIN))
#define DHT_PIN_OUTPUT()   (DDRB |= _BV(DHT_PIN))
#define DHT_PIN_LOW()      (PORTB &= ~_BV(DHT_PIN))
#define DHT_PIN_HIGH()     (PORTB |= _BV(DHT_PIN))
#define DHT_PIN_READ()     (PINB & _BV(DHT_PIN))
#define DHT_TIMEOUT        (10)
 static void dht_init(void);
int8_t dht_read(uint8_t *temperature, uint8_t *humidity);
 int
main(void)
{
    uint8_t temperature, humidity;
     /* setup */
    dht_init();
     /* loop */
    while (1) {
        dht_read(&temperature, &humidity);
        uart_puts("T:");
        uart_putu(temperature);
        uart_puts("st.C, H:");
        uart_putu(humidity);
        uart_puts("%\n");
        _delay_ms(1000);
    }
}
 void
dht_init(void)
{
     DHT_PIN_INPUT();
    DHT_PIN_HIGH();
}
 static int8_t
dht_await_state(uint8_t state)
{
    uint8_t counter = 0;
    while ((!DHT_PIN_READ() == state) && (++counter < DHT_TIMEOUT)) { _delay_us(1); };
    return counter;
}
 int8_t
dht_read(uint8_t *temperature, uint8_t *humidity)
{
    uint8_t i, j, data[5] = {0, 0, 0, 0, 0};
     /* send start sequence */
    DHT_PIN_OUTPUT();
    DHT_PIN_LOW();
    _delay_ms(20);
    DHT_PIN_INPUT();
    DHT_PIN_HIGH();
     /* read response sequence */
    if (dht_await_state(0) < 0 || dht_await_state(1) < 0 || dht_await_state(0) < 0) {
        return DHT_ERR_TIMEOUT;
    }
     /* read data */
    for (i = 0; i < 5; ++i) {
        for (j = 0; j < 8; ++j) {
            data[i] <<= 1;
            data[i] |= !!(dht_await_state(1) > 0 && dht_await_state(0) > 1);
        }
    }
     *temperature = data[2];
    *humidity = data[0];
     return DHT_ERR_OK;
}

Источник

Оставить комментарий

Ваш email нигде не будет показан. Обязательные для заполнения поля помечены *

*