리드 스위치를 이용하여 자전거의 속도 측정 모듈을 개발중


코드를 먼저 저장해두기 위해 글을 작성합니다.


코코아팹 커뮤니티에 있는 글을 토대로 코드를 작성했지만


2개의 리드 스위치를 사용하면서 조금 다르게 짜여져 있습니다.


1개의 리드 스위치를 사용한다면 코코아팹의 글을 보시는게 좋을 수 있습니다.




스피닝 자전거를 위한 속도 측정 모듈이라 바퀴가 뒤로 돌 때를 방지해야 합니다.


따라서 리드 스위치를 2개를 사용합니다.


* 코드 설명


- setup() : 시작될 때 시간을 저장하고 2개의 리드 스위치의 데이터를 입력받을 준비를 합니다.


- loop() : 2개의 리드 스위치 값을 입력 받을 변수를 저장.

 

  1번 리드 스위치가 자력을 감지했을 때 속도를 구하게 됩니다.

  

  여러 스위치 변수를 사용해 한바퀴 돌았을 때에 시간을 구하고

 

  이전 시간과의 차이를 통해 속도을 구하게 됩니다.


  이전 속도와 5보다 큰 차이가 나면 리드 스위치가 인식을 놓친 것으로 판단하고 거릅니다.




값은 잘 나오는 듯 하지만 아직 완성된 코드는 아니기에 조금 더 수정이 필요할 수 있습니다.






#include <Time.h>

int reed1 = 4;

int reed2 = 5;


float radius = 20; // cm

float circle = (2 * radius * 3.14) / 100;


float bySpeed = 0; // 자전거 속도

float ckTime = 0; // 리드스위치

float uckTime = 0;

float cycleTime = 0; // 리드 스위치 인식 안됐을 시간부터 인식이 됐을 때까지의 시간


int reed_count = 0;

boolean temp = 0;

boolean temp_reed2 = 0;


void setup() {

  // put your setup code here, to run once:

  Serial.begin(9600);

  uckTime = millis();

  

  pinMode(reed1, INPUT);

  pinMode(reed2, INPUT);

}


void loop() {

  // put your main code here, to run repeatedly:

  boolean check = digitalRead(reed1);

  boolean check2 = digitalRead(reed2);

  float cur_speed = 0;


  if (check == 0 && temp == 0 && temp_reed2 == 1) {

    ckTime = millis();


    cycleTime = (ckTime - uckTime) / 1000;

    cur_speed = (circle / cycleTime) * 3.6;


    if (bySpeed - cur_speed > 5)

    {

      cur_speed = bySpeed;

    }

    

    bySpeed = cur_speed;

    uckTime = ckTime;

    reed_count = 0;

    temp = 1;

    temp_reed2 = 0;

  }


  else if (check == 1 && temp == 1) {

    temp = 0;

  }


  if (check2 == 0 && temp_reed2 == 0)

  {

    temp_reed2 = 1;

  }


  if (check == 1) {

    reed_count++;

    if (reed_count > 100) {

      bySpeed = 0;

    }

  }


  Serial.print("Velocity : ");

  Serial.print(bySpeed);

  Serial.println(" km/h");

}

+ Recent posts