임계치 판정을 위한 임계값을 만들어 보았다

3027 단어 CArduinoESP32
농업용 IoT 시스템에서 자신이 지정한 값이 되었을 때 라인을 전송하기 위해 임계값 판정을 위한 임계값을 만들어 보았습니다.

임계 값은 문턱, 문턱입니다.
구체적으로는 온도가 x℃가 되었을 때에 경보를 발신한다고 했을 때의 x라고 하는 값이라고 생각해 주세요.

임계 값과 함께 히스테리시스라는 생각이 있습니다.
히스테리시스는 물질 상태가 현재 상태뿐만 아니라 과거 경로의 영향을 받는 것입니다.
조금 이해하기 어려울지도 모릅니다만, threshold를 판단할 때의 폭(여유)이라고 생각해 주세요.

구체적으로는 x℃라는 문턱값을 취할 때 판단하는 폭을 2y로 하면,
판단할 때의 상한값은 x+y, 하한값은 x-y가 됩니다.

즉 x + y를 초과했을 때 상한을 초과했다는 판단
x-y를 밑돌았을 때 하한값을 밑돌았다는 판단을 하도록 합니다.

실제로 c 언어로 구현해 보았습니다.
스레숄드보다 온도가 올라갈 때와 온도가 내려갈 때 경고를 발신하는 프로그램입니다.
그대로 프로그램을 쓰면,
같은 상태에서 여러 번 경고를 발신하기 때문에,
프로그램에 상태를 갖게 합니다.

역치보다 저온 상태일 때 역치를 넘었을 때와,
임계값보다 고온 상태일 때 임계값 아래로 떨어졌을 때 경고를 보내도록 하고 있습니다.
또한. 임계값 근처에서 자주 경고를 보내지 않도록 임계값을 지정합니다.
/*アラートを送信するためのスレッショルドの作成テスト
スレッショルドとヒステリシスは最初に設定する*/

#include<stdio.h>

//statusを定義する
enum status {
    high,
    low
};



int main(void) {

    int     value_th;           //スレッショルドの値
    float   hys;                //ヒステリシス
    float   th_higher;          //ヒステリシスの上限値
    float   th_lower;           //ヒステリシスの下限値

    //入力された値を判断する
    float value;

    //テストで使用するときは値を手入力する
    //value_thを入力する
    printf("input threshold: ");
    (void)scanf_s("%d", &value_th);
    //hysを入力する
    printf("input hysteris: ");
    (void)scanf_s("%f", &hys);

    th_higher = value_th + hys;
    th_lower = value_th - hys;

    //確認用の表示
    printf("th_higher is %F\n", th_higher);
    printf("th_lower is %F\n", th_lower);


    //閾値よりも低い状態からスタートすると仮定する
    int status = low;


    //ヒステリシスを含めた値と同じになった場合はlowerのほうに含めることにする
    //テストのために10回好きな値を入力できるようにする
    for (int i = 0; i < 10; i++) {

        printf("input value: ");
        (void)scanf_s("%f", &value);

        //statusがlowの時に閾値を超えた場合
        if (status == low && th_higher < value) {

            //alertを出す
            printf("this is High\n");
            //statusをhighにする
            status = high;
        }

        //siatusがhighの時に閾値を超えた場合
        else if (status == high && th_higher < value) {

            //特に何もしない


        }

        //statusがhighの時に閾値を下回る
        //statusがlowの時に閾値を下回る場合
        if (status == low && th_lower >= value) {

            //特に何もしない

        }

        //statusがhighの時に閾値を下回る
         else if (status == high && th_lower >= value) {

            //alertを発火する
            printf("this is law\n");
            //statusをlowにする
            status = low;

        }
    }   

    return 0;

}



테스트를 시도하고 예상대로 결과가 나왔으므로

조금 개조해, 농업용 IoT 시스템의 경고 발신 판단 부분에 실장했습니다.

지금은 좋은 느낌으로 사용할 수 있습니다.

좋은 웹페이지 즐겨찾기