안녕하세요,
모터를 제어하는 코드에서 loop 안에 delay가 있게 되는데, LCD가 시간을 나타낼 때 이 delay에 걸려버려서 그 delay 간격으로 시간이 나옵니다.
즉, delay(5000); 이면 LCD의 seconds는 5초 단위로 끊겨서 표시가 되는데, 어떻게 하면 따로 LCD 시간을 빼낼 수 있을지 궁금합니다.
여러 가지 방법을 찾던 중 '인터럽션 서비스 루틴(ISR)' 방법이 있던데, 여기 kocoafab에도 정보가 없고 다른 인터넷에도 정보가 없어 여기에 도움을 청하고자 합니다.
밑에는 제가 짠 코드입니다.
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Stepper.h>
#include <EEPROM.h>
#include <swRTC.h>
#define Fangle 360 // 스텝모터 전체 각도 360도
const int STEPS=2048;
int angle;
int Nangle; // Feedback angle (바로 이전 위치의 angle)
int Rangle; // ROM angle
int val; // angle
int val2; // Nangle
int in1Pin=8;
int in2Pin=9;
int in3Pin=10;
int in4Pin=11;
int cds=A0;
int a=800;
int b=1024;
int hiaddr=0;
int loaddr=1;
int brightness;
Stepper motor(STEPS, in4Pin, in2Pin, in3Pin, in1Pin);
LiquidCrystal_I2C lcd(0x27, 16, 2);
swRTC rtc;
void setup() {
pinMode(in1Pin,OUTPUT);
pinMode(in2Pin,OUTPUT);
pinMode(in3Pin,OUTPUT);
pinMode(in4Pin,OUTPUT);
motor.setSpeed(14);
Serial.begin(9600);
byte hiByte=EEPROM.read(hiaddr);
byte loByte=EEPROM.read(loaddr);
Rangle=word(hiByte, loByte);
motor.step(-Rangle*(STEPS/Fangle));
Serial.print("Previous angle: ");
Serial.println(-Rangle);
Serial.println("");
lcd.begin(); //LCD
lcd.backlight();
lcd.setCursor(0,0);
lcd.print("Gear up, sir.");
lcd.home();
delay(2000);
lcd.clear();
rtc.stopRTC();
rtc.setTime(19,59,50); //시,분,초 set
rtc.setDate(12,25,2016); //월,일,년 set
rtc.startRTC();
}
void loop() {
val=analogRead(cds);
angle=map(val,0,1023,0,360);
brightness=map(val,0,1023,0,100);
Serial.print("cds value= ");
Serial.print(val);
Serial.print(" angle= ");
Serial.println(angle);
if((val>a) && (val<b)){
if((val2>a) && (val2<b)){
motor.step(0);
Serial.println("stop!");
angle=Nangle;
Serial.print("angle : ");
Serial.println(angle);
Serial.print("Nangle : ");
Serial.println(Nangle);
Serial.println(" ");
lcd.setCursor(0,1); //LCD
lcd.print("B: ");
lcd.setCursor(3,1);
lcd.print(brightness);
}
else{
motor.step((angle-Nangle)*(STEPS/Fangle));
Serial.print("angle : ");
Serial.println(angle);
Serial.print("Nangle : ");
Serial.println(Nangle);
Serial.print("Shade moves! ");
Serial.print(angle-Nangle);
Serial.println(" moves");
Serial.println(" ");
lcd.setCursor(0,1);
lcd.print("B: ");
lcd.setCursor(3,1);
lcd.print(brightness);
}
}
else {
if((val2>i) && (val2<j)){
motor.step(0);
Serial.println("stop!");
angle=Nangle;
Serial.print("angle : ");
Serial.println(angle);
Serial.print("Nangle : ");
Serial.println(Nangle);
Serial.println(" ");
lcd.setCursor(0,1);
lcd.print("B: ");
lcd.setCursor(3,1);
lcd.print(brightness);
}
else{
motor.step((angle-Nangle)*(STEPS/Fangle));
Serial.print("angle : ");
Serial.println(angle);
Serial.print("Nangle : ");
Serial.println(Nangle);
Serial.print("Shade moves! ");
Serial.print(angle-Nangle);
Serial.println(" moves");
Serial.println(" ");
lcd.setCursor(0,1);
lcd.print("B: ");
lcd.setCursor(3,1);
lcd.print(brightness);
}
}
delay(5000);
val2=val;
Nangle=angle;
byte hiByte=highByte(Nangle);
byte loByte=lowByte(Nangle);
EEPROM.write(hiaddr, hiByte);
EEPROM.write(loaddr, loByte);
lcd.setCursor(0,0); //Time
lcd.print(rtc.getHours(),DEC);
lcd.setCursor(2,0);
lcd.print(":");
lcd.setCursor(3,0);
lcd.print(rtc.getMinutes(),DEC);
lcd.setCursor(5,0);
lcd.print(":");
lcd.setCursor(6,0);
lcd.print(rtc.getSeconds(),DEC);
}
즉, 모터를 제어하기 위해 delay를 무조건 써야하고, 심지어 저 숫자보다 더 큰 숫자가 필수인데, LCD가 시간을 나타낼 때 시간이 저 delay에 영향을 받아서 5초 간격으로 표시가 됩니다.
어떻게 하면 LCD의 시간표시를 독립적으로 표현할 수 있을까요??
|