정보나눔

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

아두이노 리셋 관련 코딩 질문
라니유리 | 2017-04-25
다른 분이 하신 오픈소스로 자전거 속도계를 구현하고 있는데요.

현재 리셋기능이 정상적으로 동작하질 않습니다 ㅠ 

누적거리가 잘 올라가다가 버튼을 누르지 않아도 갑자기 저절로 0이 됩니다.

현재 빵판에 저항과 버튼을 달고 점퍼선으로 아두이노 A1부분에 연결해놓은 상태입니다.

제가 구현하려는 것은 버튼을 눌렀을 때 누적거리가 0이 되는 것입니다.


  if(digitalRead(A1) == 0){  // 버튼을 누르면 누적거리를 0으로 초기화 합니다.
    distance = 0;
  }

아무래도 이부분이 문제 인것 같은데 잘 아시는 분 있으면 도움 부탁드립니다 ㅠㅠ






#include <Time.h>
#include <LiquidCrystal.h>

float radius = 20; // 바퀴당 이동 거리를 확인 하기 위해 자전거 바퀴의 반지름을 입력해 줍니다.(Cm 단위)
float circle = (2 * radius * 3.14) / 100;  // 자전거 바퀴의 둘레를 계산(단위를 m로 바꿔주기 위해 100을 나눕니다.)

float bySpeed = 0; // 자전거의 속도
float ckTime = 0;  // 리드스위치가 
float uckTime = 0; // Unckecked
float cycleTime = 0;  // 리드스위치가 인식이 안됬을 시간 부터 인식됬을 때까지의 시간
float distance = 0; // 자전거의 누적 이동 거리
float lcdDis = 0; // 자전거의 이동 거리를 LCD출력에 맞게 바꿔즌 값.(단위 수정 or 소숫점 제거)

int count = 0;  // 리드스위치의 노이즈를 제거하기 위해 카운트를 넣어줍니다.
boolean temp = 0;  // 리드 스위치가 닫혔는지 확인하는 변수

LiquidCrystal lcd(12,11,5,4,3,2);   //RS 핀, E핀, 데이터 핀 4개

void setup(){
  Serial.begin(9600);  // 측정된 값을 시리얼 모니터로 확인하기 위해 bps를 설정해 줍니다.
  
  lcd.begin(16,2); // LCD 크기 지정, 2줄 16칸
  lcd.clear();     // 화면 초기화
}

void loop(){
  boolean check = digitalRead(A0); // 리드스위치의 상태를 확인합니다.
  
  if(check == 1 && temp == 0){  // 리드 스위치가 열릴 때(닫힘 -> 열림)
    ckTime = millis();  // 시간을 확인해서 저장합니다.
    temp = 1;  // temp값을 1로 바꿔줍니다.(리드스위치가 열려있는 상태값 저장)
  }
  
  else if(check == 0 && temp == 1 && count > 5){  // 리드 스위치가 닫히고(열림 -> 닫힘), 노이즈 방지 카운트가 5이상일때
    uckTime = millis();  // 시간을 확인해서 저장합니다.
      
    cycleTime = (uckTime - ckTime) / 1000;
    // 열릴 때 시각과 닫힐 때 시각의 차를 이용하여 바퀴가 한바퀴 돌때 걸린 시간을 계산합니다.
    bySpeed = (circle / cycleTime) * 3.6; // 바퀴가 한바퀴 돌때의 거리와 시간을 가지고 속도를 구해줍니다.(단위는 Km/h입니다.)
    temp = 0; 
    count = 0; 
    distance += circle;  // 한바퀴 돌았으면 이동거리를 누적 이동거리에 더해줍니다.
  }
  
  if(check == 1){  // 리드 스위치가 열려있으면 카운트를 1씩 증가 시켜 줍니다.
    count++;
    if(count > 150){ // 카운트가 150이 넘어가면(자전거가 멈췄을 때) 속도를 0으로 바꿔줍니다.
      bySpeed = 0;
    }
  }
  
  if(digitalRead(A1) == 0){  // 버튼을 누르면 누적거리를 0으로 초기화 합니다.
    distance = 0;
  }


  lcd.setCursor(0,0);          //커서를 0,0에 지정
  lcd.print("Speed: "); 
  if(bySpeed < 10){            // 속도가 한자리라면 앞에 0을 붙여 줍니다.
    lcd.print('0');
  }
  lcd.print(bySpeed);               
  lcd.print("Km/h");           // 속도를 lcd에 출력합니다.("Speed: xx.xxKm/h");
  
  lcdDis = distance / 1000;  
  lcd.setCursor(0,1);          // 커서를 0,1에 지정
  lcd.print("Distance: ");  
  if(lcdDis >= 100){           // 이동거리가 100Km가 넘어가면 소숫점을 지워줍니다.
    lcd.print((int)lcdDis);
  }
  else{
    lcd.print(lcdDis);               
  }            
  lcd.print("Km");             // 이동거리를 lcd에 출력합니다.("Distance: xx.xxKm")
  
  lcd.print("               ");        //전 글씨 삭제
  Serial.print("Speed : ");
  Serial.print(bySpeed);
  Serial.println(" km/h");             // 시리얼 모니터를 이용하여 속도를 확인합니다.
}
이전글   |    블루투스연결이 안됩니다. 2017-04-25
다음글   |    DHT11 온습도센서 포트 2017-04-26