https://github.com/Rhkacl/fan_project.git
코드 QR
영상 QR
void apMain() // add servo toggle mode
{
uint8_t buttonData, prevButtonData;
DDRA = 0xff; // FND
DDRB |= (1 << PB4) | (1 << PB5);
DDRD = 0xff; // LED
// button 입력 설정 ( GPORT )
DDRG &= ~((1 << 0) | (1 << 1) | (1 << 2) | (1 << 3) | (1 << 4));
// Fan: Timer0 (8bit fast pwm, 256분주)
TCCR0 |= (1 << WGM00) | (1 << COM01) | (1 << WGM01) | (1 << CS02);
// Servo: Timer1 (16bit fast pwm, TOP -> ICR1, 64분주, 주기 = 20ms = 50Hz)
TCCR1A |= (1 << COM1A1) | (1 << WGM11);
TCCR1B |= (1 << WGM13) | (1 << WGM12) | (1 << CS11) | (1 << CS10);
ICR1 = 4999; // TOP 값 (16MHz/64 = 250kHz, 250kHz/5000 = 50Hz -> 20ms주기)
// OCR1A = 2500;
uint8_t sevo_state = 0; // 서보 모터 동작 상태 ( 0 = OFF, 1 = ON )
int sevo_count = 0; // 서보 위치 값 (PWM duty 조절용)
while (1)
{
buttonData = PING; // 현재 버튼 입력 읽기
// 서보 동작 루프
if (sevo_state == 1) // 서브모터 활성화 1, 비활성화 0
{
static int direction = 1; // 1이면 증가, -1이면 감소
if (sevo_count >= 600) // 최대 도달 시 방향 전환
direction = -1;
else if (sevo_count <= 100) // 최소 도달 시 방향 전환
direction = 1;
OCR1A = sevo_count; // 서보 모터 위치 설정
sevo_count += direction ; // 방향에 따라 증가 또는 감소 (속도 조절)
_delay_ms(10); // 10ms 대기 (서보 동작 딜레이)
}
// 버튼 1
if ((buttonData & (1 << 0)) == 0)
{
PORTA = 0x06; // 1
PORTD = 0x03;
OCR0 = 100; // 약풍
}
// 버튼 2
if ((buttonData & (1 << 1)) == 0)
{
PORTA = 0x5B; // 2
PORTD = 0x1f;
OCR0 = 178; // 중풍
}
// 버튼 3
if ((buttonData & (1 << 2)) == 0)
{
PORTA = 0x4F; // 3
PORTD = 0xff;
OCR0 = 255; // 최대속도
}
// 버튼 4 ( 선풍기 회전 : servo Toggle )
if (((prevButtonData & (1 << 3)) != 0) && ((buttonData & (1 << 3)) == 0))
{
sevo_state = !sevo_state; // 토글
}
// 버튼 5 ( 전체 정지 )
if ((buttonData & (1 << 4)) == 0)
{
PORTA = 0x00;
PORTD = 0x00;
OCR0 = 0;
sevo_state = 0;
}
prevButtonData = buttonData; // 이전 상태 저장
_delay_ms(1);
}
}