BASIC4MCU | 질문게시판 | 서보모터 각도 멈춤 ㅠㅠ
페이지 정보
작성자 kikik 작성일2022-12-03 00:37 조회161회 댓글0건본문
안녕하세요 저희가 습도가 50 이상이면 각도가 90이되 문이 열리고 50 이하면 각도가 0이되어 문이 닫히는 부분이 안됩니다..
나머지 부분은 다되는데 서보모터 부분이 어렵습니다 ㅠㅠ
저희가 쓰는 모터는 mg996r로 360도 회전되는 모터긴 합니다ㅠ
습도가 50 이상이면 멈추고 50 이하면 계속 돌아갑니다 ㅠ 제발 도와주세요 ㅠㅠ
#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 "LCD.h"
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <stdio.h>
static char str1[12], str2[12], str3[12], str4[12];
void get_dht11();
void request();
int response();
char receive_data();
char DHT11_data = 0,hum_int,hum_dec,tem_int,tem_dec,parity;
int main(void)
{
MCU_Init();
LCDInit();
while(1)
{
DDRB=0x20;
DDRF=0xFF;
TCCR1A=0x82; TCCR1B=0x1A; TCNT1H = 0x00; TCNT1L = 0x00; OCR1A=3999; ICR1=39999;
get_dht11();
if ((hum_int + hum_dec + tem_int + tem_dec) == parity)
{
sprintf(str1,"%d",hum_int);
sprintf(str2,".%d",hum_dec);
sprintf(str3,"%d",tem_int);
sprintf(str4,".%d",tem_dec);
LCDMove(0,0);
LCDPuts("HUM :");
LCDMove(0,6);
LCDPuts(str1);
LCDMove(0,9);
LCDPuts(str2);
LCDMove(1,0);
LCDPuts("TEM :");
LCDMove(1,6);
LCDPuts(str3);
LCDMove(1,9);
LCDPuts(str4);
if(hum_int>=50)
{
OCR1A = 2999;
}
else
{
OCR1A = 3999;
}
if(tem_int<20)
{
PORTF=0xff;
}
else
{
PORTF=0x00;
}
}
else
{
LCDPuts("error!!");
}
_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;
}
댓글 0
조회수 161등록된 댓글이 없습니다.