BASIC4MCU | 질문게시판 | ATMEGA128 블루투스로 앱인벤터를 이용해서 초음파 센서값 받기
페이지 정보
작성자 17전자 작성일2021-12-14 22:02 조회1,308회 댓글1건본문
앱인벤터를 통해서 atmega128 보드로 받은 초음파 센서값 ( distance) 를 보내서 앱인벤터 내부의 온습도값 이라는 레이블에 받고싶습니다.
일단 블루투스 센서를 제외하고는 거리에따라 if else문 안의 명령이 정상적으로 수행됩니다.
일단 초음파센서 (HC-SR04) 는 트리거 에코 순으로 PE 6,7번핀
블루투스는 RXD0/TXD0에 해당하는 PE0,1번핀 에도 꼽아보고 .)
RXD1/TXD1에 해당하는 PD2,3에도 꼽아보았습니다. (이경우에는 소스 수정으로 초음파센서를 PE6,7으로 자리를 옮겼습니다)
블루투스는 정상적으로 연결되지만 앱으로 아예 값이 전달되지 않아서 해결하고싶습니다.
tx_char(distance); //블루투스로 값 보내기 를 while(1)문에 넣거나 if문에 넣어도 작동하지않습니다.
https://hubbleconstant.tistory.com/32
이예제를 그대로 사용하여도 A라는 문자열이 보내지지 않습니다.
(예제)
#define F_CPU 16000000UL // 외부 크리스탈 16MHz
#include <avr/io.h>
#include <util/delay.h>
char rx_char(void)
{
while(!(UCSR1A & 0x80));
return UDR1;
}
void tx_char(uint8_t bData)
{
while((UCSR1A&0x20) == 0)
UDR1 = bData;
}
int main(void)
{
uint8_t bData = 'A';
UCSR1A=0x00; //flag 레지스터를 사용하지 않음
UCSR1B=0x18; //수신 enable, 송신 enable, 전송비트 8bit
UCSR1C=0x06; //비동기식 통신
UBRR1H=0;
UBRR1L=103; //9600bps
/* Replace with your application code */
while (1)
{
tx_char(bData);
_delay_ms(2000);
}
return 0;
}
//////// 진짜 소스///////////
#include <avr/io.h>
#define F_CPU 16000000UL
#include <util/delay.h>
#define TRIG 6
#define ECHO 7
#define SOUND_VELOCITY 340UL
//블루투스 소스
char rx_char(void)
{
while(!(UCSR1A & 0x80));
return UDR1;
}
void tx_char(int bData)
{
while((UCSR1A&0x20) == 0)
UDR1 = bData;
}
//블루투스 소스
int main(void)
{
//블루투스 소스
int bData = distance;
UCSR1A=0x00; //flag 레지스터를 사용하지 않음
UCSR1B=0x18; //수신 enable, 송신 enable, 전송비트 8bit
UCSR1C=0x06; //비동기식 통신
UBRR1H=0;
UBRR1L=103; //9600bps
//블루투스 소스
int i;
unsigned int distance;
DDRB=0x10;
DDRC=0x10;
DDRF=0x10;
DDRD=((DDRD|(1<<TRIG))& ~(1<<ECHO));
while(1)
{
tx_char(distance); //블루투스로 값 보내기
TCCR1B=0x03;
PORTD &= ~(1<<TRIG);
_delay_us(10);
PORTD|=(1<<TRIG);
_delay_us(10);
PORTD &= ~(1<<TRIG);
while(!(PIND & (1<<ECHO)))
;
TCNT1 = 0x0000;
while(PIND & (1<<ECHO))
;
TCCR1B = 0x00;
distance = (unsigned int)(SOUND_VELOCITY * (TCNT1 * 4/2)/1000);
if(distance<1)
{ }
else if (distance<100)
{
tx_char(distance); //블루투스로 값 보내기
for(i=0; i<5; i++)
{
PORTB = 0x10;
PORTC =0x10;
_delay_ms(5);
PORTB = 0x00;
_delay_ms(5);
}
}
else if (distance<300)
{
for(i=0; i<50; i++)
{
PORTB = 0x10;
PORTF=0x10;
_delay_ms(1);
PORTB = 0x00;
_delay_ms(1);
}
_delay_ms(100);
}
else if (distance<500)
{
for(i=0; i<150; i++)
{
PORTB = 0x10;
PORTF=0x10;
_delay_ms(1);
PORTB = 0x00;
_delay_ms(1);
}
_delay_ms(150);
}
else if (distance < 700)
{
for(i=0; i<250; i++)
{
PORTB = 0x10;
PORTF=0x10;
_delay_ms(1);
PORTB = 0x00;
_delay_ms(1);
}
_delay_ms(300);
}
else
PORTB=0x00;
PORTF=0x00;
PORTC=0x00; }
}
댓글 1
조회수 1,308master님의 댓글
master 작성일
https://cafe.naver.com/circuitsmanual/112652
앱인벤터 대신 시리얼모니터링 프로그램으로 체크하세요
퓨즈비트의 클럭설정을 제대로 하지 않으면 보레이트가 맞지 않습니다.
또한, 클럭설정이 제대로 되지 않으면 먹통이 될 수 있습니다.
프로그램을 굽기 전에 반드시 퓨즈비트를 공부하셔야 합니다.