극한의 아두이노 DIY생활 - 곡률측정기7

in kr-dev 커뮤니티3 years ago

안녕하세요 Jimae입니다.

로터리 스위치는 저번에 설명을 적은대로 하면될것같구요.

오늘은 풍속센서에 대해서 써볼까합니다.

문제는 그때당시 무엇을 사용했는지 모르겠네요.

ADC 기반으로 데이터를 읽어서 처리를 했었는대 데이터가 정확하게 들어오지 않아서 데이터 시트에 나온 그래프를 참고하며 보정을 해서 사용했었습니다.

되게 조그만한 센서였는대 현재 찾아보니

image.png

이런거 밖에 안나오는군요.

사실 그때당시 사용한 센서도 정확도가 떨어져서 사용하기에 애를먹었던 제품입니다.

정밀제어를 위해 현재 이런센서들만 남아있는것 같아요.

#define PIN_ANALOG_IN A0
#define CORRECTION_DATE (0.5 - 0.41)
#define WINDSENSORFILITER 1

double WindSensorRead(void)
{
  long adcvalue = 0;;
  int num = 0;
  double calvalue = 0;
  double bufferData = 0;
  double middleData = 0;
  double averdate = 0;
  int averCount = 0;

  for(num = 0; num < 5000; num++) 
  {
   // Check the envelope input
    adcvalue = analogRead(PIN_ANALOG_IN);
    calvalue += FlowRateCalculator(adcvalue);
    averCount++;
  }

  middleData = calvalue / averCount;

  adcvalue = 0;
  averCount = 0;
  calvalue = 0;
  
  for(num = 0; num < 5000; num++) 
  {
   // Check the envelope input
    adcvalue = analogRead(PIN_ANALOG_IN);
    bufferData = FlowRateCalculator(adcvalue);
    
    if(middleData + WINDSENSORFILITER > bufferData && middleData - WINDSENSORFILITER < bufferData)
    {
      calvalue += bufferData;
      averCount++;
      bufferData = 0;
    }
  }

  averdate = calvalue / averCount;

  return averdate; 
}

double FlowRateCalculator(int value) 
{
  double V = 0;
  double calculdate = 0;   

  V = value * 0.0048828125;
  
 // Serial.print("V = ");
 // Serial.println(V);
 
  if(V <= 0.5 - CORRECTION_DATE) 
  {
    return 0;
  }
  else if(V >= 3 - CORRECTION_DATE)
  {
   return 10;
  }
  
  if(V > 0.5 - CORRECTION_DATE  && V <= 1.5 - CORRECTION_DATE)  
  {
    calculdate =  (double) (V - (0.5 - CORRECTION_DATE)) * 2 * 1.25;
  }
  else if(V > 1.5 - CORRECTION_DATE && V <= 2 - CORRECTION_DATE) 
  {
    calculdate =  (double) ((V - (1.5 - CORRECTION_DATE))  * 4 * 1.25) + 2;
  }
  else if(V > 2 - CORRECTION_DATE && V <= 3 - CORRECTION_DATE) 
  {
    calculdate = (double) ((V - (2 - CORRECTION_DATE)) * 6 * 1.25) + 4;
  }

  if(calculdate >= 20) calculdate = 20;

  return calculdate ;
}

풍속센서에 관한 프로그램입니다.

double FlowRateCalculator(int value) 
{
  double V = 0;
  double calculdate = 0;   

  V = value * 0.0048828125;
  
 // Serial.print("V = ");
 // Serial.println(V);
 
  if(V <= 0.5 - CORRECTION_DATE) 
  {
    return 0;
  }
  else if(V >= 3 - CORRECTION_DATE)
  {
   return 10;
  }
  
  if(V > 0.5 - CORRECTION_DATE  && V <= 1.5 - CORRECTION_DATE)  
  {
    calculdate =  (double) (V - (0.5 - CORRECTION_DATE)) * 2 * 1.25;
  }
  else if(V > 1.5 - CORRECTION_DATE && V <= 2 - CORRECTION_DATE) 
  {
    calculdate =  (double) ((V - (1.5 - CORRECTION_DATE))  * 4 * 1.25) + 2;
  }
  else if(V > 2 - CORRECTION_DATE && V <= 3 - CORRECTION_DATE) 
  {
    calculdate = (double) ((V - (2 - CORRECTION_DATE)) * 6 * 1.25) + 4;
  }

  if(calculdate >= 20) calculdate = 20;

  return calculdate ;
}

이 부분이 보정을 하는 부분인대요.

image.png

데이터시트라는 자료를 살펴봐야합니다.

각 모듈 제조업체에서 이런것을 제공해주는대 위의 사진은 다른 센서의 그래프를 가져온것입니다.

그래프를 추정하여 FlowRateCalculator 함수를 구현한것입니다.

그래프에 임의의 점을찍은후 그기준으로 2점사이에 보정값을 구해서 값이 들어올때마다 어느위치의 보정값을 각각 넣어준 것입니다.

약간 번거롭지만 수학을 잘한다면 위의 방법대신 공식을 구해서 구현을 할수있습니다.

이때당시 급하게 구현하느라 야메로 구현한것도 있습니다.

이런식으로 데이터시트를 참고하여 프로그램을 구현하던 시절이 있었내요.

오늘은 여기까지 다들 좋은하루 되세요.

극한의 아두이노 DIY생활 - 곡률측정기1
극한의 아두이노 DIY생활 - 곡률측정기2
극한의 아두이노 DIY생활 - 곡률측정기3
극한의 아두이노 DIY생활 - 곡률측정기4
극한의 아두이노 DIY생활 - 곡률측정기5
극한의 아두이노 DIY생활 - 곡률측정기6

Sort:  
 3 years ago 

[광고] STEEM 개발자 커뮤니티에 참여 하시면, 다양한 혜택을 받을 수 있습니다.

Coin Marketplace

STEEM 0.09
TRX 0.32
JST 0.032
BTC 109200.05
ETH 4023.26
USDT 1.00
SBD 0.61