BASIC4MCU | 질문게시판 | 답변 : 소프트웨어 시리얼로 RTC값 송수신하는 방법..
페이지 정보
작성자 master 작성일2019-01-25 17:17 조회18,576회 댓글9건본문
// MCU BASIC: https://www.basic4mcu.com// DateTime : 2019-01-25 오후 5:23:21// by Ok-Hyun Park////---------------------------------------------송신측#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//unsigned int abc[120];double sri,ko;double i,timer,timer0,timer1,timer__;double clock_;int second_hand,hour_hand,minute_hand; //초침 //시침 //분침int secand_clock,hour_clock,minute_clock; //초 //분 //시int next,back1,back2,n,start;int second_needle_D=B00001110,second_needle_B=B000000;int minute_needle_D=B11111110,minute_needle_B=B000000;int hour_needle_D =B11111110,hour_needle_B =B000111;int first_PORTD,second_PORTD,third_PORTD,n_second_PORTD;int first_PORTB,second_PORTB,third_PORTB,n_second_PORTB;//void setup(){mySerial.begin(9600);secand_clock=0; hour_clock=30; minute_clock=15;next=0; clock_=0; start=1;DDRB =B00001111; DDRD =B11111111;PORTB=B00001111; PORTD=B11111111; delay(10000);PORTD=B00000000; PORTB=B00001111; delay( 1000);PORTD=B11111111; PORTB=B00001111;sri=digitalRead(PBS1);for( ;sri==1; ){ sri=digitalRead(PBS1); } // 0의 위치확인for( ;sri==0; ){ sri=digitalRead(PBS1); } // 1의 위치확인for(i=0;sri==1;i++){ sri=digitalRead(PBS1); delayMicroseconds(100); } //0이될때까지 계측for( ;sri==0;i++){ sri=digitalRead(PBS1); delayMicroseconds(100); } //1이 될때까지 계측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;//char rx_cnt=0,rx_buf[30];//void loop(){if(mySerial.available()){char r=mySerial.read();if(r=='\n'){ //sprintf(buf,"%04d%02d%02d%02d%02d%02d\n",y,m,d,hour_clock,minute_clock,secand_clock);hour_clock =rx_buf[ 8]*10+rx_buf[9];minute_clock=rx_buf[10]*10+rx_buf[11];secand_clock=rx_buf[12]*10+rx_buf[13];}else{rx_buf[rx_cnt++]=r&0x0F;}}//sri=digitalRead(PBS1);//for(; sri==1;){ sri=digitalRead(PBS1); } // 1의 위치확인//for(;sri==0;){ sri=digitalRead(PBS1); } // 0의 위치 확인////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){ secand_clock=0; minute_clock++; } //hour_clock++; //60초// second_hand=secand_clock*timer;}else if(count==1){if(minute_clock==60){ minute_clock=0; hour_clock++; } //60분// hour_hand=hour_clock*timer;}else if(count==2){if(hour_clock==60){ hour_clock=0; clock_=0; minute_clock=minute_clock+5; } //12시// 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=B00001111; myDelay(back1);PORTD=second_PORTD; PORTB=second_PORTB; delayMicroseconds(100);PORTD=B11111110; PORTB=B00001111; myDelay(back2);PORTD=third_PORTD; PORTB=third_PORTB; delayMicroseconds(100);PORTD=B11111110; PORTB=B00001111;if(++count>3)count=0;//--------------------------------------}//void myDelay(int t){ // 시계바늘이 움직이는 간격 조정부분for(int i=0; i<t; i++)delayMicroseconds(98);}
댓글 9
조회수 18,576hktsakura님의 댓글
hktsakura 작성일
secand_clock=0;
hour_clock=30;
minute_clock=15;
이 부분은 RTC측에서 수신받는거라 제거하고 했습니다만...
RTC에 시간보존이 안되고 있네여.. pc에서 시간 불러오기도 안되는 상황인데다...
RTC배선이 거꾸로되서 바르게 배선했지만...
master님의 댓글
master
RTC모듈이 고장난 것이 아닌지 체크해보세요
hktsakura님의 댓글
hktsakura 작성일RTC 동작 체크를 해봤는데 시간유지 등등 잘 되고 있네여. 그럼 소프트웨어 시리얼 작동이 안되고 있는건데...
master님의 댓글
master
소프트웨어 시리얼만 체크 해보세요
void loop(){
if(mySerial.available()){
char r=mySerial.read();
if(r=='\n'){ ;
hour_clock =rx_buf[ 8]*10+rx_buf[9];
minute_clock=rx_buf[10]*10+rx_buf[11];
secand_clock=rx_buf[12]*10+rx_buf[13];
Serial.print("hour="); Serial.println(hour_clock); // <------- 추가
Serial.print("minute="); Serial.println(minute_clock); // <------- 추가
Serial.print("sec="); Serial.println(secand_clock); // <------- 추가
}
else{
rx_buf[rx_cnt++]=r&0x0F;
}
}
hktsakura님의 댓글
hktsakura
수신측에서 시리얼통신이 되지않네여. 추가문 넣었는데 아무것도
뜨지않습니다...
master님의 댓글
master 작성일
void loop(){
if(mySerial.available()){
char r=mySerial.read();
Serial.print("rx="); Serial.println(r); // <------- 추가
}
이 한개의 라인만 넣어서 무엇이 전송되는지 체크해보세요
hktsakura님의 댓글
hktsakura
송신측과 수신측 코드를 이렇게 바꿔서 해봤습니다.
<송신측>
void loop() {
now = RTC.now(); <- Datatime now는 글로벌 변수로 선언했습니다.
hour_clock = now.hour();
minute_clock = now.minute();
secand_clock = now.second();
mySerial.listen();
mySerial.write(hour_clock);
mySerial.write(minute_clock);
mySerial.write(secand_clock);
if (!RTC.isrunning()) {
Serial.println("RTC is NOT running!");
}
else {
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.println(buf);
}
delay(1000);
}
<수신측>
if (mySerial.available()) {
r1 = (byte)mySerial.read();
r2 = (byte)mySerial.read();
r3 = (byte)mySerial.read();
if (r1 == 12) {
r1 = 0;
}
else if (r1 == 13) {
r1 = 1;
}
else if (r1 == 14) {
r1 = 2;
}
else if (r1 == 15) {
r1 = 3;
}
else if (r1 == 16) {
r1 = 4;
}
else if (r1 == 17) {
r1 = 5;
}
else if (r1 == 18) {
r1 = 6;
}
else if (r1 == 19) {
r1 = 7;
}
else if (r1 == 20) {
r1 = 8;
}
else if (r1 == 21) {
r1 = 9;
}
else if (r1 == 22) {
r1 = 10;
}
else if (r1 == 23) {
r1 = 11;
}
if (r1 == ) {
mySerial.end();
}
if (r2 == ) {
mySerial.end();
}
if (r3 == ) {
mySerial.end();
}
}
hour_clock = r1 * 5; <- 각 시 데이터에 곱하기 5를 합니다.
minute_clock = r2;
secand_clock = r3;
}
이렇게 하니 1초간격으로 송신측에서 시,분,초 데이터가 수신측으로 오더군여.
근데 이거를 수신측에서 한번만 받아서 시계를 돌리게 하고싶은데
한번만 수신하게 할수있는 방법도 있나여??
master님의 댓글
master
처음 전원넣고 1회만 받고
그 다음부터는 자체로 시간을 증가하려는 건가요?
hktsakura님의 댓글
hktsakura
네. 수신측에서 15초 대기하다가 시계를 띄우는데 전원넣고 1회만 받고 그 이후엔 자체로 시간 증가를 하려고 합니다.