BASIC4MCU | 질문게시판 | atmega128과 dht11, lcd를 연결했는데 0도라고 뜹니다.
페이지 정보
작성자 고양이33 작성일2022-08-02 15:47 조회6,697회 댓글1건본문
#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>
#define DHT11_PIN 0
char c=0, I_RH, D_RH, I_Temp, D_Temp, CheckSum;
#include "lcd.h"
void DHT11_init(void)
{
DDRF=0xFF;
PORTF=0x0F;
}
void Request(void)
{
DDRF |=(1<<DHT11_PIN);
PORTF &= ~(1<<DHT11_PIN);
_delay_ms(18);
PORTF |=(1<<DHT11_PIN);
_delay_us(40);
}
int Response(void)
{
DDRF &=~(1<<DHT11_PIN);
_delay_us(39);
if((PINF &(1<<DHT11_PIN)))
return 1;
_delay_us(80);
if((PINF&(1<<DHT11_PIN)))
return 1;
_delay_us(80);
}
char Recieve_Data (void)
{
for(int q=0;q<8;q++)
{
while ((PINF&(1<<DHT11_PIN))==0);
_delay_us(30);
if(PINF&(1<<DHT11_PIN))
{
c=(c<<1)|(0x01);
}
else
{
c=(c<<1);
}
while(PINF&(1<<DHT11_PIN));
}
return c;
}
int DHT11(void)
{
Request();
if(Response()!=1){
I_RH=Recieve_Data();
D_RH=Recieve_Data();
I_Temp=Recieve_Data();
D_Temp=Recieve_Data();
CheckSum=Recieve_Data();
if ((I_RH+I_Temp+D_RH+D_Temp)!=CheckSum)
{
return 1;
}
}
return 0;
}
int main(void)
{
DDRC = 0xFF;
DDRA = 0xFF;
LCD_Init();
DHT11_init();
LCD_wBCommand(0x80 | 0x00);//첫번째
LCD_wString("H:");
LCD_wBCommand(0x80 | 0x40);//두번째
LCD_wString("T:");
while (1)
{
if(DHT11()<0)
{
LCD_wBCommand(0x80 | 0x00);//첫번째
LCD_wString("ERROR");
_delay_ms(500);
return 0;
}
else
{
char data_RH_I[2];
char data_RH_D;
char data_temp_I[2];
char data_temp_D;
itoa(I_RH, data_RH_I, 10);
LCD_wBCommand(0x80 | 0x03);//첫번째
LCD_wString(data_RH_I);
itoa(I_RH, &data_RH_D, 10);
LCD_wBCommand(0x80 | 0x05);//첫번째
LCD_wString(&data_RH_D);
itoa(I_Temp, data_temp_I, 10);
LCD_wBCommand(0x80 | 0x43);//두번째
LCD_wString(data_temp_I);
itoa(D_Temp, &data_temp_D, 10);
LCD_wBCommand(0x80 | 0x45);//두번째
LCD_wString(&data_temp_D);
_delay_ms(10);
}
}
return 0;
}
도와주셔서 감사합니다. atmega128에 dht11로 온 습도 값을 읽어서, lcd에 값을 나타내는 코드를 짰는데 온 습도 둘 다 0으로 뜹니다.
코드 잘 짠거 같은데 왜 이런 현상이 나타날까요. 아두이노로 dht11 물어봤는데 온 습도 값 정상적으로 나옵니다.
회로도 이상없고요...
댓글 1
조회수 6,697master님의 댓글
master 작성일
https://cafe.naver.com/circuitsmanual/106734
강좌글의 센서는 DHT-22와 동일하게 취급하는 센서입니다.
아두이노는 비전공자용 플랫폼입니다.
전문가들이 예제와 연결도를 만들어주면 복사해서 돌리기만 하면 되고, 약간의 수정하는 수준이죠
AVR을 공부한다는 것은 아두이노 사용자와는 다른 방식으로 공부해야 합니다.
전문가가 되기 위해서 공부를 해야 하죠