BASIC4MCU | 질문게시판 | atmega128 dht11 온도 센서 데이터출력
페이지 정보
작성자 재효김 작성일2023-12-13 20:12 조회6,214회 댓글4건본문
atmega128에서 dht11 온도센서 모델을 통해 데이터를 입력받아 서보모터를 제어하려고 일단 데이터를 tera term 화면에 출력시켜 확인하고 싶어 코드를 찾아서 돌려보았습니다.
#define F_CPU 16000000UL
#define sbi(PORTX,bitX) PORTX|=(1<<bitX)
#define cbi(PORTX,bitX) PORTX&=~(1<<bitX)
#define tbi(PORTX,bitX) PORTX^=(1<<bitX)
#include <avr/io.h>
#include <util/delay.h>
void get_dht11();
void request();
int response();
char receive_data();
void uart1_tx(char data);
void uart1_tx_int(int intdata);
char DHT11_data = 0,hum_int,hum_dec,tem_int,tem_dec,parity;
int main(void)
{
//UART
UCSR1B = (1<<TXEN1);
UCSR1C = (1<<UCSZ11)|(1<<UCSZ10);
UBRR1H = 0;
UBRR1L = 103; //9600bps
while(1)
{
get_dht11();
if ((hum_int + hum_dec + tem_int + tem_dec) != parity)
{
uart1_tx('e');
}
else
{
uart1_tx('$');
uart1_tx(',');
uart1_tx_int(tem_int);
uart1_tx('.');
uart1_tx_int(tem_dec);
uart1_tx(',');
uart1_tx_int(hum_int);
uart1_tx('.');
uart1_tx_int(hum_dec);
uart1_tx(',');
}
_delay_ms(400);
}
}
void get_dht11()
{
request(); //Host send a start signal
if(response() != 1) //DHT11 response
{
hum_int = receive_data(); //Humidity integer
hum_dec = receive_data(); //Humidity decimal
tem_int = receive_data(); //Temporature integer
tem_dec = receive_data(); //Temporature decimal
parity = receive_data(); //parity
}
else //DHT11 response error
{
//do something
}
}
void request()
{
sbi(DDRD,7); //output
cbi(PORTD,7); //low
_delay_ms(20); //more than 18ms
sbi(PORTD,7); //high
}
int response()
{
cbi(DDRD,7); //input
_delay_us(39); //pulled wait 20~40us
if((PIND & (1<<7))) //response signal check
return 1;
_delay_us(80); //wait 80us
if(!(PIND & (1<<7))) //pulled ready output check
return 1;
_delay_us(80); //wait 80us
}
char receive_data()
{
for (int q=0; q<8; q++)
{
while((PIND & (1<<7)) == 0); //50us signal wait
_delay_us(30);
if(PIND & (1<<7)) //greater than 30ms -> HIGH
DHT11_data = (DHT11_data<<1)|(0x01);
else //less than 30ms -> LOW
DHT11_data = (DHT11_data<<1);
while(PIND & (1<<7));
}
return DHT11_data;
}
void uart1_tx(char data)
{
while(!(UCSR1A&(1<<UDRE1)));
UDR1 = data;
}
void uart1_tx_int(int intdata)
{
int temp_intdata = 0;
temp_intdata = intdata/10;
uart1_tx(temp_intdata+48);
temp_intdata = intdata%10;
uart1_tx(temp_intdata+48);
}
현재 쓰고 있는 atmega128모듈은 uart port1을 사용하고
tera term 화면에는 $,00.00,00.00만 반복해서 나옵니다.
뭐가 문제인지 모르겠습니다.
댓글 4
조회수 6,214master님의 댓글
master 작성일
I2C 통신이 정상으로 보이지 않습니다.
https://www.google.com/search?q=atmega128+dht11&oq=atmega128+dht11&gs_lcrp=EgZjaHJvbWUyBggAEEUYOTIHCAEQABiABDIGCAIQRRg90gEIMjgwNmowajeoAgCwAgA&sourceid=chrome&ie=UTF-8
다행히 웹검색 결과가 많으니 좋은 예제를 잘 골라서 만들어보세요
재효김님의 댓글
재효김
i2c 통신이 정상적이지 않다는건 뭐가 문제인건가요? 어떤 예제를 골라야할지 모르겠어서
master님의 댓글
master
sht11로 착각했습니다.
UART나 I2C SPI가 아닌
포트를 사용한 임의 규격의 시리얼통신이 맞습니다.
우선은 딜레이 400ms를 1000ms로 늘려서 돌려보고
그래도 안되면 웹검색 결과 중에서 믿을만한 것을 골라서 동일하게 만들어보세요
https://cafe.naver.com/circuitsmanual/106764
DHT22는 예제를 만들었는데 DHT11은 만져보진 않았습니다.
재효김님의 댓글
재효김
delay도 4000ms까지 늘려봤지만 계속 00만 출력됩니다ㅠ