DHT11は単線シリアル通信で、LOWが50us続いた後HIGHが26-28usなら0、HIGHが70us以上続いたら1というような形式。
ここを参考にプログラム組んで試してみたのだけど信号40bit全部0しか返してこない。
マトリクスLEDにシグナルのHIGHのヒストグラムを取ってみたりしたけど見事に全部25us前後。
ぬー。
----
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
atmega8 16pu | |
matrix led controller | |
ISP | |
PC6 RESET | |
PB5 SCK | |
PB4 MISO | |
PB3 MOSI | |
USART | |
PD0 RXD | |
PD1 TXD | |
INT | |
PD2 INT0 | |
74HC138N | |
PD4 A0 | |
PD5 A1 | |
PD6 A2 | |
NJU3711 | |
PD7 DATA | |
PB1 ~STB | |
PB0 CLK | |
pB1 ~CLEAR | |
DHT11 | |
PB2 | |
*/ | |
#define F_CPU 1000000UL // Clock Speed | |
#define BAUD 9600 | |
#define MYUBRR (((F_CPU / (BAUD * 16UL))) - 1) | |
#include <avr/io.h> | |
#include <avr/interrupt.h> | |
#include <util/delay.h> | |
#include <stdio.h> | |
#include <stdlib.h> | |
#define sbi(PORT,BIT) PORT|=_BV(BIT) | |
#define cbi(PORT,BIT) PORT&=~_BV(BIT) | |
#define set(p,d) \ | |
if ((d)) { \ | |
sbi(p);\ | |
} else {\ | |
cbi(p);\ | |
} | |
#define DELAY 1600 | |
#define INTERVAL 50000 // 0.05sec | |
#define LIMIT 1000000 // 1sec | |
volatile uint32_t e; | |
volatile uint8_t m[8],b[5]; | |
void | |
display() | |
{ | |
uint8_t i,j; | |
for(i=0;i<8;i++) { | |
/* row */ | |
sbi(PORTB,PB1); | |
cbi(PORTB,PB7); | |
switch(i) { | |
case 0: | |
cbi(PORTD,PD4); | |
cbi(PORTD,PD5); | |
cbi(PORTD,PD6); | |
break; | |
case 1: | |
sbi(PORTD,PD4); | |
cbi(PORTD,PD5); | |
cbi(PORTD,PD6); | |
break; | |
case 2: | |
cbi(PORTD,PD4); | |
sbi(PORTD,PD5); | |
cbi(PORTD,PD6); | |
break; | |
case 3: | |
sbi(PORTD,PD4); | |
sbi(PORTD,PD5); | |
cbi(PORTD,PD6); | |
break; | |
case 4: | |
cbi(PORTD,PD4); | |
cbi(PORTD,PD5); | |
sbi(PORTD,PD6); | |
break; | |
case 5: | |
sbi(PORTD,PD4); | |
cbi(PORTD,PD5); | |
sbi(PORTD,PD6); | |
break; | |
case 6: | |
cbi(PORTD,PD4); | |
sbi(PORTD,PD5); | |
sbi(PORTD,PD6); | |
break; | |
case 7: | |
sbi(PORTD,PD4); | |
sbi(PORTD,PD5); | |
sbi(PORTD,PD6); | |
break; | |
} | |
for(j=0;j<8;j++) { | |
if(m[i]&(1<<j)) { | |
sbi(PORTD,PD7); | |
} else { | |
cbi(PORTD,PD7); | |
} | |
cbi(PORTB,PB0); | |
sbi(PORTB,PB0); | |
} | |
cbi(PORTB,PB1); | |
sbi(PORTB,PB7); | |
_delay_us(DELAY); | |
} | |
} | |
void | |
_display() | |
{ | |
e = 0; | |
while (e < LIMIT) { | |
display(); | |
e += DELAY * 8; | |
} | |
} | |
#define TIMEOUT (254) | |
void | |
measure() | |
{ | |
uint8_t i,j,k,t[40]; | |
m[0] = 0; | |
m[1] = 0; | |
m[2] = 0; | |
m[3] = 0; | |
m[4] = 0; | |
m[5] = 0; | |
m[6] = 0; | |
m[7] = 0; | |
b[0] = 0; | |
b[1] = 0; | |
b[2] = 0; | |
b[3] = 0; | |
b[4] = 0; | |
// send signal | |
//host--_20us_--slave | |
sbi(DDRB,PB2); | |
_delay_us(2); | |
cbi(PORTB,PB2); | |
_delay_us(20); | |
cbi(DDRB,PB2); | |
_delay_us(2); | |
// check slave response | |
// __80us__--80ms--__signal start | |
TCNT0 = 0x00; | |
// low->high check | |
loop_until_bit_is_set(PINB,PB2); | |
TCNT0 = 0x00; | |
// high->low check | |
loop_until_bit_is_clear(PINB,PB2); | |
// signal start | |
for(i=0;i<40;i++) { | |
// 0 --__50us__--26us,28us--__ | |
// 1 --__50us__--70us --__ | |
// low->high check | |
TCNT0 = 0x00; | |
loop_until_bit_is_set(PINB,PB2); | |
// high->low check | |
TCNT0 = 0x00; | |
loop_until_bit_is_clear(PINB,PB2); | |
t[i] = TCNT0; | |
} | |
sbi(DDRB,PB2); | |
_delay_us(2); | |
#if 1 | |
j = 0; | |
k = 0; | |
for(i=0;i<40;i++) { | |
if (j < 5) { | |
if (t[i] > 30) { | |
b[j] |= (1<<(7-k)); | |
} else { | |
b[j] &= ~(1<<(7-k)); | |
} | |
k++; | |
if (k==8) { | |
k = 0; | |
j++; | |
} | |
} | |
} | |
m[0] = b[0]; | |
m[1] = b[1]; | |
m[2] = b[2]; | |
m[3] = b[3]; | |
m[4] = b[4]; | |
m[5] = m[5] ? 0xff : 0xff; | |
m[6] = 0xff; | |
#else | |
for(i=0;i<40;i++) { | |
# if 1 | |
if (t[i] < 5) { | |
m[0] += 1; | |
} else if (t[i] < 10) { | |
m[1] += 1; | |
} else if (t[i] < 15) { | |
m[2] += 1; | |
} else if (t[i] < 20) { | |
m[3] += 1; | |
} else if (t[i] < 25) { | |
m[4] += 1; | |
} else if (t[i] < 30) { | |
m[5] += 1; | |
} else if (t[i] < 35) { | |
m[6] += 1; | |
} else { | |
m[7] += 1; | |
} | |
# else | |
switch(t[i]) { | |
case 21: | |
m[0] += 1; | |
break; | |
case 22: | |
m[1] += 1; | |
break; | |
case 23: | |
m[2] += 1; | |
break; | |
case 24: | |
m[3] += 1; | |
break; | |
case 25: | |
m[4] += 1; | |
break; | |
case 26: | |
m[5] += 1; | |
break; | |
case 27: | |
m[6] += 1; | |
break; | |
default: | |
m[7] += 1; | |
break; | |
} | |
# endif | |
} | |
#endif | |
} | |
int | |
main() | |
{ | |
uint8_t i; | |
// port b output setting | |
sbi(DDRB,PB0); | |
sbi(DDRB,PB1); | |
sbi(DDRB,PB2); | |
sbi(DDRB,PB7); | |
// port d output setting | |
sbi(DDRD,PD4); | |
sbi(DDRD,PD5); | |
sbi(DDRD,PD6); | |
sbi(DDRD,PD7); | |
// portc pullup | |
PORTC = 0xFF; | |
_delay_ms(1500); | |
#if 0 | |
// usart setting | |
/* Set baud rate */ | |
UBRRH = (MYUBRR>>8); | |
UBRRL = MYUBRR; | |
/* Enable receiver and transmitter */ | |
UCSRB = (1 << RXEN) | (1 << RXCIE); | |
/* Set frame format: 8 data bits, 1 stop bit */ | |
UCSRC = (1 << URSEL) | (1 << UCSZ0) | (1 << UCSZ1); | |
#endif | |
// timer0 | |
TCNT0 = 0x00; | |
TCCR0 = (0<<CS02) | (0<<CS01) | (1<<CS00); //ck/1 | |
sbi(SFIOR,PSR10); | |
/* all interrupt allow */ | |
for(i=0;i<8;i++) { | |
m[i] =0; | |
} | |
while (1) { | |
measure(); | |
_display(); | |
_delay_ms(2000); | |
} | |
return 0; | |
} |
色々試してるうちにDHT11をショートさせてしまいご臨終に。。。
![]() |
中央部が発熱して若干盛り上がったかんじに |
小刀で接合部をこじ開けたらあっさりとはずせた。
![]() |
中央の銅色のところが湿度センサっぽい |
![]() |
本体ICチップ、これが壊れたっぽい |
そのうちまた買ってリベンジしたい。
0 件のコメント:
コメントを投稿