0

DHT11 温度センサーのプログラムを実行しています。 私はArduino IDEを使用して、プログラムをアップロードして実行し、シリアルモニターで出力を確認しています。 これが私が使用しているコードです。温度を読み取れない理由がわかりません。 出力は常に 0 で、湿度の出力も間違っていると思います。 私を助けてください。

#include <avr/io.h>
#include <util/delay.h>

#define DHT_PIN            PD2

#define DHT_ERR_OK         (0)
#define DHT_ERR_TIMEOUT    (-1)

#define DHT_PIN_INPUT()    (DDRD &= ~_BV(DHT_PIN))
#define DHT_PIN_OUTPUT()   (DDRD |= _BV(DHT_PIN))
#define DHT_PIN_LOW()      (PORTD &= ~_BV(DHT_PIN))
#define DHT_PIN_HIGH()     (PORTD |= _BV(DHT_PIN))
#define DHT_PIN_READ()     (PIND & _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)
{
  Serial.begin(9600);
  
    uint8_t temperature, humidity;

    /* setup */
    dht_init();

    /* loop */
    while (1) {
        dht_read(&temperature, &humidity);
        Serial.println(humidity);
        Serial.println(temperature);
        _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);
        }
    }

    *humidity = data[0];
    *temperature = data[2];

    return DHT_ERR_OK;
}

3

  • Arduino は通常 C++ でプログラムされていることに注意してください。 たとえば、コードでは、 Serial C++ クラスのインスタンスです。

    1時間前

  • あなたの問題については、しようとしましたか デバッグ コード? ハードウェアやセンサ​​ーの初期化は正しいですか? センソスのマニュアル通りに読んでいますか?

    1時間前

  • 私は常にシリアル モニタを使用して Arduino で C プログラムを実行していますが、プログラムには影響しません。 コードがどこにあるのか特定できない問題だと思います。

    1時間前

あなたの答え

ゲストとして投稿する

必須ですが表示されません


「回答を投稿する」をクリックすることにより、あなたは私たちの 利用規約プライバシーポリシークッキーポリシー

タグ付けされた他の質問を閲覧する c avr また 自分の質問をする.