BASIC4MCU | 질문게시판 | 소프트웨어 시리얼로 RTC값 송수신하는 방법..
페이지 정보
작성자 hktsakura 작성일2019-01-25 16:11 조회3,221회 댓글0건본문
계속 LED잔상 아날로그 시계를 만들고 있는데여.
소프트웨어 시리얼 샘플 프로그램으로 어떻게 연결하는지는 알았지만
RTC에 저장된 시간 데이터가 수신측에서 제대로 수신하지 못하고 있는 상황인데여...
송신측 수신측 소스코드가 맞는 지 알수있을까여...
수신측 소스는 지난번 소스로 하지않고 다른 방법으로 구현했습니다.
일단 소스코드는 아래와 같습니다.
송신측
#include <SoftwareSerial.h>
SoftwareSerial mySerial(A0, A1);
//
#include "RTClib.h"
#include <Wire.h>
RTC_DS1307 RTC;
int y, m, d, hour_clock = 0, minute_clock = 0, secand_clock = 0, RXdata = 0;
char buf[50];
//
void setup() {
Serial.begin(9600);
mySerial.begin(9600);
Wire.begin();
RTC.begin();
RTC.adjust(DateTime(__DATE__, __TIME__));
}
//
void loop() {
if (mySerial.available()) {
char r = mySerial.read();
mySerial.listen();
Serial.write(r);
DateTime now = RTC.now();
hour_clock = now.hour();
minute_clock = now.minute();
secand_clock = now.second();
}
if (!RTC.isrunning()) {
Serial.println("RTC is NOT running!");
}
else {
DateTime now = RTC.now();
y = now.year();
m = now.month();
d = now.day();
hour_clock = now.hour();
minute_clock = now.minute();
secand_clock = now.second();
sprintf(buf, "%04d%02d%02d%02d%02d%02d\n", y, m, d, hour_clock, minute_clock, secand_clock);
Serial.print(buf);
}
delay(1000);
}
수신측
#include <SoftwareSerial.h>
SoftwareSerial mySerial(A0, A1); // RX, TX
#define PBS1 16
double sri, ko;
unsigned int abc[120];
double i, timer, timer0, timer1, timer__;
int second_hand; //초침
int hour_hand; //시침
int minute_hand; //분침
int secand_clock; //초
int hour_clock; //분
int minute_clock; //시
int next, back1, back2, n;
double clock_;
int start;
int second_needle_D = B00001110;
int second_needle_B = B000000;
int minute_needle_D = B11111110;
int minute_needle_B = B000000;
int hour_needle_D = B11111110;
int hour_needle_B = B000111;
int first_PORTD;
int first_PORTB;
int second_PORTD;
int second_PORTB;
int third_PORTD;
int third_PORTB;
int n_second_PORTD;
int n_second_PORTB;
void setup() {
mySerial.begin(9600);
secand_clock=0;
hour_clock=30;
minute_clock=15;
next = 0;
clock_ = 0;
start = 1;
DDRD = B11111111;
DDRB = B001111;
PORTD = B11111111;
PORTB = B001111;
delay(10000);
PORTD = B00000000;
PORTB = B001111;
delay(1000);
PORTD = B11111111;
PORTB = B001111;
sri = digitalRead(PBS1);
for (; sri == 1;) { // 0의 위치확인
sri = digitalRead(PBS1);
}
for (; sri == 0;) { // 1의 위치확인
sri = digitalRead(PBS1);
}
for (i = 0; sri == 1; i++) { //0이될때까지 계측
sri = digitalRead(PBS1);
delayMicroseconds(100);
}
for (; sri == 0; i++) { //1이 될때까지 계측
sri = digitalRead(PBS1);
delayMicroseconds(100);
}
i = i + 82;
timer = i / 60;
second_hand = secand_clock * timer;
hour_hand = hour_clock * timer;
minute_hand = minute_clock * timer;
//timer = timer * 100;
// timer = timer - 1;
//-----------------------------------
//--------------------------------------
}
//int diff = 0;
int count = 0;
void loop() {
if (mySerial.available())
{
byte r = mySerial.read();
if (r == '\n') {
hour_clock++;
minute_clock++;
secand_clock++;
}
}
sri = digitalRead(PBS1);
for (; sri == 1;) { // 1의 위치확인
sri = digitalRead(PBS1);
}
for (; sri == 0;) { // 0의 위치 확인
sri = digitalRead(PBS1);
}
//900 + diff;
delayMicroseconds(850);
// PORTD = B00001110;
// PORTB = B000000;
delayMicroseconds(100);
PORTD = B11111110;
PORTB = B001111;
clock_ = clock_ + i; //
if (clock_ > 11750) { //초침이 움직이는 간격
secand_clock++;
clock_ = 0;
}
//-------------------------------------
if (count == 0) {
//-------------------------------------
if (secand_clock == 60) { //60초
secand_clock = 0;
minute_clock++;
//hour_clock++;
}
// second_hand = secand_clock * timer;
//------------------------------
} else if (count == 1) {
//-------------------------------------
if (minute_clock == 60) { //60분
minute_clock = 0;
hour_clock++;
}
// hour_hand = hour_clock * timer;
//------------------------------
} else if (count == 2) {
//-------------------------------------
if (hour_clock == 60) { //12시
hour_clock = 0;
clock_ = 0;
minute_clock = minute_clock + 5;
}
// minute_hand = minute_clock * timer;
//------------------------------
}
if (secand_clock > hour_clock) {
next = hour_clock;
first_PORTD = hour_needle_D;
first_PORTB = hour_needle_B;
back1 = secand_clock;
second_PORTD = second_needle_D;
second_PORTB = second_needle_B;
} else {
next = secand_clock;
first_PORTD = second_needle_D;
first_PORTB = second_needle_B;
back1 = hour_clock;
second_PORTD = hour_needle_D;
second_PORTB = hour_needle_B;
}
if (next > minute_clock) {
back2 = next;
third_PORTD = first_PORTD;
third_PORTB = first_PORTB;
next = minute_clock;
first_PORTD = minute_needle_D;
first_PORTB = minute_needle_B;
} else {
next = next;
first_PORTD = first_PORTD;
first_PORTB = first_PORTB;
back2 = minute_clock;
third_PORTD = minute_needle_D;
third_PORTB = minute_needle_B;
}
if (back1 > back2) {
n = back1;
n_second_PORTD = second_PORTD;
n_second_PORTB = second_PORTB;
back1 = back2;
second_PORTD = third_PORTD;
second_PORTB = third_PORTB;
back2 = n;
third_PORTD = n_second_PORTD;
third_PORTB = n_second_PORTB;
} else {
back1 = back1;
second_PORTD = second_PORTD;
second_PORTB = second_PORTB;
back2 = back2;
third_PORTD = third_PORTD;
third_PORTB = third_PORTB;
}
back2 = back2 - back1;
back1 = back1 - next;
next = next * timer;
back1 = back1 * timer;
back2 = back2 * timer;
//----------------------------
myDelay(next);
PORTD = first_PORTD;
PORTB = first_PORTB;
delayMicroseconds(100);
PORTD = B11111110;
PORTB = B001111;
myDelay(back1);
PORTD = second_PORTD;
PORTB = second_PORTB;
delayMicroseconds(100);
PORTD = B11111110;
PORTB = B001111;
myDelay(back2);
PORTD = third_PORTD;
PORTB = third_PORTB;
delayMicroseconds(100);
PORTD = B11111110;
PORTB = B001111;
count++;
if (count > 3) count = 0;
//--------------------------------------
}
void myDelay(int t) { // 시계바늘이 움직이는 간격 조정부분
for (int i = 0; i < t; i++) {
delayMicroseconds(98);
}
}
댓글 0
조회수 3,221등록된 댓글이 없습니다.