[ad_1]
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
[ad_2]
Source link
Arduino は通常 C++ でプログラムされていることに注意してください。 たとえば、コードでは、
Serial
C++ クラスのインスタンスです。– どっかのプログラマー
1時間前
あなたの問題については、しようとしましたか デバッグ コード? ハードウェアやセンサーの初期化は正しいですか? センソスのマニュアル通りに読んでいますか?
– どっかのプログラマー
1時間前
私は常にシリアル モニタを使用して Arduino で C プログラムを実行していますが、プログラムには影響しません。 コードがどこにあるのか特定できない問題だと思います。
– ジャック
1時間前
| |