정보나눔

오픈소스하드웨어 프로젝트에 대한 다양한 정보를 나누는 공간입니다.

LCD에 시간 표시할 때, delay를 포함하는 문제점 질문드립니다.
김동한 | 2016-12-04

안녕하세요,

 

모터를 제어하는 코드에서 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의 시간표시를 독립적으로 표현할 수 있을까요??

이전글   |    WiFi Shield JSN270 사용해보신 분! 2016-12-04
다음글   |    브레드 보드 -버스, +버스 활용법 2016-12-04