GP2Y0A21YK0F IRsensor 用ライブラリ

Dependents:   NHK2019_mae_v6 NHK2019_main_v6 NHK2019_usiro_v6 NHK2019_mae_v6 ... more

IRsensor.cpp

Committer:
skouki
Date:
2019-09-11
Revision:
7:790cd18896a8
Parent:
4:004bdb88ab3e

File content as of revision 7:790cd18896a8:

#include "IRsensor.h"

IRsensor::IRsensor(PinName pin):
    a_in(pin)
{
    thread_get_distance.start(callback(this, &IRsensor::threadloop_get_distance));
}

void IRsensor::threadloop_get_distance()
{
    while(true){
        compute_distance();
    }
}

void IRsensor::compute_distance(){
    getInputvoltage();
    originaldistance = changeVtoD(voltage);
}

void IRsensor::getInputvoltage(){
    voltage = a_in.read()*3.3f;
}

float IRsensor::changeVtoD(float voltage_)
{
    float distance_;
    
    if (voltage_ > 2.28f) {
        distance_ = 0.00f;
    } else if (voltage_ > 1.64f) {
        distance_ = -7.81f * voltage_ + 27.85f;
    } else if (voltage_ > 1.30f) {
        distance_ = -14.70f * voltage_ + 39.19f;
    } else if (voltage_ > 1.08f) {
        distance_ = -22.2f * voltage_ + 49.00f;
    } else if (voltage_ > 0.92f) {
        distance_ = -32.89f * voltage_ + 60.52f;
    } else if (voltage_ > 0.83f) {
        distance_ = -53.76f * voltage_ + 79.89f;
    } else if (voltage_ > 0.73f) {
        distance_ = -51.02f * voltage_ + 77.60f;
    } else if (voltage_ > 0.67f) {
        distance_ = -78.12f * voltage_ + 97.57f;
    } else if (voltage_ > 0.60f) {
        distance_ = -76.92f * voltage_ + 96.76f;
    } else if (voltage_ > 0.56f) {
        distance_ = -108.69f * voltage_ + 116.08f;
    } else if (voltage_ > 0.51f) {
        distance_ = -106.38f * voltage_ + 114.78f;
    } else if (voltage_ > 0.47f) {
        distance_ = -121.95f * voltage_ + 122.80f;
    } else if (voltage_ > 0.44f) {
        distance_ = -185.18f * voltage_ + 152.77f;
    } else if (voltage_ > 0.43f) {
        distance_ = -333.33f * voltage_ + 219.00f;
    } else {
        distance_ = 99.99f;
    }
    return distance_;
}

void IRsensor::startAveraging(uint8_t averaging_range)
{
    bufferSize = averaging_range;
    data = new float[bufferSize];
    thread_averaging_distance.start(callback(this, &IRsensor::threadloop_averaging_distance));
}
void IRsensor::threadloop_averaging_distance()
{
    while(true){
        computeaverage();
    }    
}
void IRsensor::computeaverage()
{
    bufferpoint++;
    getInputvoltage();
    data[bufferpoint % bufferSize] = voltage;
    voltage_sum = 0;
    for(int i = 0;i<bufferSize;i++)
        voltage_sum += data[i];
    voltage_average = voltage_sum / bufferSize;
    distance_average = changeVtoD(voltage_average);
    
}
float IRsensor::getDistance()
{
    return originaldistance;   
}
float IRsensor::get_Averagingdistance()
{
    return distance_average;    
}

float IRsensor::getVoltage()
{
    return voltage;    
}