BASIC4MCU | 질문게시판 | 우노 하드웨어 시리얼 전환
페이지 정보
작성자 면지지 작성일2022-06-06 23:32 조회1,579회 댓글7건본문
현재 코드에서 블루투스 SoftwareSerial BTserial(2,3); // Tx2 Rx3 을 0 1번 하드웨어 시리얼로 바꾸고 싶은데 어떻게 해야할지 모르겠습니다 ㅠㅠ
하드웨어 시리얼을 잘 안쓰는지 확실하게 이거다 할 정보도 없고요
#include <Keypad.h>
#include <Servo.h> // 서보모터를 위한 Servo.h 라이브러리를 포함한다.
#include <SoftwareSerial.h> // SoftwareSerial을 통해 블루투스와 데이터 전송
#include <Wire.h>
#include <Adafruit_MLX90614.h>
#include "Arduino.h"
#include <DFRobotDFPlayerMini.h>
DFRobotDFPlayerMini myDFPlayer;
Adafruit_MLX90614 mlx = Adafruit_MLX90614();
SoftwareSerial BTserial(2,3); // Tx2 Rx3
SoftwareSerial MP3Module(11, 12); // RX, TX
Servo myservo;
//
#define Sensing_pin A2 // 센서 신호선 핀 설정입니다.
#define UVC A3 // UVC 핀 설정입니다.
//
float temperature = 0;
const int sensor = A0;
int state; // 0의 신호가 출력되면 close, 1의 신호가 출력되면 open 되는 스위치 입니다.
char PW[]={"2222"}; //비밀번호
String str_data="";
const byte ROWS=4;
const byte COLS=3;
byte rowPins[ROWS]={10,9,8,7};
byte colPins[COLS]={6,5,4};
char keys[ROWS][COLS]={
{'1','2','3'},
{'4','5','6'},
{'7','8','9'},
{'*','0','#'}
};
int num=10000;
int b=0;
int tru=0; // 비밀번호가 맞는지 확인
int count=0;
int led_cnt=0;
//
Keypad keypad=Keypad( makeKeymap(keys),rowPins,colPins,ROWS,COLS );
//
void setup(){
myservo.attach(A1); // A1번핀에 서보모터 연결
Serial.begin(9600);
BTserial.begin(9600); // 9600 속도로 블루투스시리얼(소프트웨어시리얼)통신을 시작한다
digitalWrite(A3,1); // UVC ON
pinMode (sensor, INPUT_PULLUP); //센서 핀을 입력핀으로 지정합니다.
Serial.begin(9600);
Serial.println("Check temperature");
mlx.begin();
MP3Module.begin(9600);
if (!myDFPlayer.begin(MP3Module)) { // MP3 모듈을 초기화합니다. 초기화에 실패하면 오류를 발생시킵니다.
Serial.println(F("Unable to begin:"));
Serial.println(F("1.Please recheck the connection!"));
Serial.println(F("2.Please insert the SD card!"));
while (true);
}
delay(1);
myDFPlayer.volume(10); // 볼륨을 조절합니다. 0~30까지 설정이 가능합니다.
}
//
void loop(){
if(led_cnt){
if(--led_cnt==0){
digitalWrite(A3,1); // UVC ON
}
}
else{
if(++num>=100){ num=0; // 100ms 마다 실행
if(digitalRead(Sensing_pin)==HIGH){
BTserial.println("블루투스감지됨"); // 움직임이 감지됐어요!
Serial.println("감지되었습니다");
digitalWrite(A3,0); //UVC OFF
led_cnt=8000;
}
}
}
//
if(BTserial.available()){ // 블루투스를 통해 수신된 데이터가 있으면
str_data=getStringdata();
Serial.println(str_data);
if(str_data==PW){ myservo.write(180); Serial.println("open "); BTserial.print('o'); delay(15); }
else { myservo.write( 0); Serial.println("close"); BTserial.print('x'); }
}
//
char key=keypad.getKey(); // 키패드 입력받는 부분
if(key){
Serial.println(key);
if(key==PW[count]){ tru++; } //입력번호와 비밀번호가 맞을시 tru++
count++;
//
if(count==4){ //count개수가 비밀번호 개수와 같을 시
if(tru==4)Su();//성공함수
else Fa();//실패함수
tru=0; count=0;
}
}
//
delay(1);
Serial.print("C 체온 : ");
temperature = mlx.readObjectTempC();
temperature = temperature - 8;
Serial.print(temperature);
Serial.println("C");
delay(2000);
if ( temperature >= 37.5 ) {//temperature
Serial.println("HIGH");
myDFPlayer.play(1); //Play 1 mp3
delay(1000);
}
state = digitalRead(sensor); //센서핀을 디지털 입력신호로 받습니다.
if (state == HIGH){ //만약 State 신호가 HIGH일시
delay(10000);
myDFPlayer.play(3);
delay(10000);
myDFPlayer.pause();
}
else if (state == LOW){
myDFPlayer.pause();
}
}
//
String getStringdata(){
String str=""; // str 를 String(문자열형)으로 선언
while(BTserial.available()){ // 블루투스가 실행되는 동안
str +=(char)BTserial.read(); // 블루투스에서 읽어드리는값을 char 형으로 변환 하면서 str에 합치기
delay(5);
}
return str; // 합쳐진 문자열형 반환
}
//
void Su(){ myservo.write(180); Serial.println("open the door "); } // 성공했을시 모터를 돌려주며 성공메세지 보내기
void Fa(){ myservo.write( 0); Serial.println("close the door"); } // 실패했을시 모터를 돌려주며 실패메세지 보내기
댓글 7
조회수 1,579master님의 댓글
master 작성일
0번RX핀<------1K저항<------블루투스TX
1번TX핀----------------------->블루투스RX
고장나지 않으려면 1K 저항을 사용해야 합니다.
//
시리얼 모니터를 사용하면 안됩니다.
Serial.begin(9600);
Serial.print() 함수 등을 모두 삭제합니다.
//
SoftwareSerial BTserial(2,3); // Tx2 Rx3
이 라인을 삭제하고
아래의0 BTserial을 Serial로 변경합니다.
면지지님의 댓글
면지지
혹시 블루투스를 하드웨어 시리얼로 전환하면 앱인벤터로 만든 앱은 못쓰나요? 시도중인데 앱이 동작을 안합니다
master님의 댓글
master
뭔가 실수했겟죠
앱인벤터가 동작을 안 할 이유는 없습니다.
면지지님의 댓글
면지지
BTserial을 Serial변경
이 과정에서
void setup 부분에서 BTserial.begin(9600); 이 Serial.begin(9600); 으로 바뀌는데 그러면 Serial.begin(9600);
Serial.print() 함수 등을 모두 삭제합니다. 이거에 해당되니까 똑같이 삭제하는게 맞는건가요?
master님의 댓글
master
순서대로 하면 되는데요?
앞뒤 수순을 섞어서 하면 안됩니다.
master님의 댓글
master 작성일
1번 수순
0번RX핀<------1K저항<------블루투스TX
1K 저항을 사용
//
2번 수순
시리얼 모니터를 사용하면 안됩니다.
//
3번 수순
Serial.begin(9600); Serial.print() 함수 등 기존 시리얼을 모두 삭제
//
4번 수순
SoftwareSerial BTserial(2,3); // Tx2 Rx3 삭제
BTserial을 Serial로 변경
master님의 댓글
master 작성일
코드부분만 정리하면
1. 기존 Serial을 모두 삭제 (시리얼모니터에 출력하던 코드 모두 삭제)
2. 기존 BTserial을 Serial로 변경 (블루투스를 Serial로 변경)