코코아팹은 누구나 창의적 아이디어를 현실로 만들어 낼 수 있도록
만들고, 공유하고, 배울 수 있는 터전이
되고자 합니다.
아이디와 비밀번호를 잊으셨나요?아이디 / 비밀번호 찾기
코코아팹 회원이 아니신가요? 회원가입
아두이노 리셋 관련 코딩 질문
라니유리 | 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 |