2014年2月11日火曜日

温湿度センサDHT11(1)

秋月で買った温湿度センサDHT11で遊んでみた。

DHT11は単線シリアル通信で、LOWが50us続いた後HIGHが26-28usなら0、HIGHが70us以上続いたら1というような形式。

ここを参考にプログラム組んで試してみたのだけど信号40bit全部0しか返してこない。

マトリクスLEDにシグナルのHIGHのヒストグラムを取ってみたりしたけど見事に全部25us前後。

ぬー。

----
/*
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;
}
view raw dht11.c hosted with ❤ by GitHub
----

色々試してるうちにDHT11をショートさせてしまいご臨終に。。。


中央部が発熱して若干盛り上がったかんじに
せっかくなので分解してみた。

小刀で接合部をこじ開けたらあっさりとはずせた。

中央の銅色のところが湿度センサっぽい

本体ICチップ、これが壊れたっぽい
湿度センサははずしたらまた使えそうな気もするがまあ放置。

そのうちまた買ってリベンジしたい。

0 件のコメント:

amazonアソシエイト