BASIC4MCU | 질문게시판 | 시리얼 통신 관련 질문드립니다. ㅜ
페이지 정보
작성자 카르니코스 작성일2024-04-18 01:52 조회988회 댓글0건본문
#include <SoftwareSerial.h>
#include <Wire.h> // Wire 라이브러리 추가
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); // OLED 디스플레이 객체 생성
// 소프트웨어 시리얼 핀 설정
SoftwareSerial gpsSerial(6, 7); // RX, TX
// 스위치 핀 설정
const int switchPin = 3;
int switchState = LOW; // 스위치의 현재 상태
int lastSwitchState = LOW; // 스위치의 이전 상태
unsigned long lastDebounceTime = 0; // 마지막 디바운스 시간
unsigned long debounceDelay = 50; // 디바운스 지연 시간 (밀리초)
// 현재 속도 변수 설정
long currentBaudRate;
long baudRates[] = {1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200}; // 변경할 속도 배열에 1200을 추가함
int numBaudRates = sizeof(baudRates) / sizeof(baudRates[0]); // 속도 배열의 크기
// 스위치 입력 딜레이 설정 (밀리초)
unsigned long switchDelay = 200; // 200밀리초
// 이전 스위치 입력 시간 변수 설정
unsigned long lastSwitchTime = 0;
void setup() {
// 시리얼 통신 초기화
Serial.begin(9600);
gpsSerial.begin(baudRates[0]); // 초기 속도를 배열의 첫 번째 요소로 설정
currentBaudRate = baudRates[0]; // 초기 속도를 currentBaudRate 변수에 할당
// 스위치 핀 설정
pinMode(switchPin, INPUT);
// OLED 디스플레이 초기화
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // OLED 주소가 0x3C일 경우
Serial.println(F("SSD1306 allocation failed"));
for(;;);
}
display.display(); // 디스플레이 초기화
delay(2000); // 2초 대기
// 디스플레이 클리어
display.clearDisplay();
}
void loop() {
// 현재 시간 가져오기
unsigned long currentTime = millis();
// 스위치 입력 디바운스 처리
int reading = digitalRead(switchPin); // 스위치 읽기
if (reading != lastSwitchState) {
// 스위치 상태 변경 감지
lastDebounceTime = millis(); // 디바운스 타이머 재설정
}
// 디바운스 시간이 지난 경우 스위치 상태 업데이트
if (currentTime - lastDebounceTime > debounceDelay) {
// 실제 스위치 상태 업데이트
if (reading != switchState) {
switchState = reading;
// 스위치가 눌렸을 때만 실행
if (switchState == HIGH) {
// 현재 bps 속도를 변경
toggleBaudRate();
}
}
}
// GPS 모듈에서 데이터 수신 및 출력
while (gpsSerial.available() > 0) {
Serial.write(gpsSerial.read());
}
}
// bps 속도 변경 함수
void toggleBaudRate() {
// 다음 속도로 변경
static int index = 0; // 현재 속도 배열의 인덱스
currentBaudRate = baudRates[index];
gpsSerial.begin(currentBaudRate);
// 변경된 속도 출력
Serial.print("Changed Baud Rate to ");
Serial.println(currentBaudRate);
// OLED 디스플레이에 변경된 속도 표시
display.clearDisplay();
display.setFont();
display.setTextSize(0);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.print("Baud Rate: ");
display.println(currentBaudRate);
display.display();
// 다음 인덱스로 이동 (마지막 인덱스인 경우 처음으로 돌아감)
index = (index + 1) % numBaudRates;
}
RS-232 신호를 받아서 시리얼 모니터상에 표시도 되고
스위치 누를때마다 통신속도도 변경되고 변경된 속도가 LCD에 표시되도록 했는데... 여기까진 잘 됐습니다만..
시리얼 모니터상에 뜨는 ASCII 코드를 display.println(currentBaudRate); 라인 이후로 OLED 상에서도 표시될 수 있게 하려면 어떻게 해야 할까요...?
도움 주시면 감사하겠습니다... ㅜ
현재 상태는 시리얼 신호는 아두이노로 들어오고 있고, 시리얼 모니터 상에 표시도 잘 되고 속도조절에 따라 다른 속도의 시리얼 신호도 잘 받습니다.
그 들어오는 시리얼 신호를 OLED 에도 표시하고 싶습니다..
댓글 0
조회수 988등록된 댓글이 없습니다.