.. note::

    こんにちは、SunFounderのRaspberry Pi & Arduino & ESP32愛好家コミュニティへようこそ！Facebook上でRaspberry Pi、Arduino、ESP32についてもっと深く掘り下げ、他の愛好家と交流しましょう。

    **参加する理由は？**

    - **エキスパートサポート**：コミュニティやチームの助けを借りて、販売後の問題や技術的な課題を解決します。
    - **学び＆共有**：ヒントやチュートリアルを交換してスキルを向上させましょう。
    - **独占的なプレビュー**：新製品の発表や先行プレビューに早期アクセスしましょう。
    - **特別割引**：最新製品の独占割引をお楽しみください。
    - **祭りのプロモーションとギフト**：ギフトや祝日のプロモーションに参加しましょう。

    👉 私たちと一緒に探索し、創造する準備はできていますか？[|link_sf_facebook|]をクリックして今すぐ参加しましょう！

.. _2.2.2_thermistor:

2.2.2 サーミスタ
================

前書き
------------

フォトレジスターが光を感知できるように、サーミスターは温度に敏感な電子デバイスであり、
過熱警報装置の作成など、温度制御の機能を実現するために使用できる。

部品
----------

.. image:: media/list_2.2.2_thermistor.png


原理
---------

サーミスタは、温度のわずかな変化に比例して抵抗の予測可能な変化を正確に示す熱に敏感な抵抗器である。その抵抗がどの程度変化するかは、その独自の構成に依存する。サーミスタは、受動部品の大きなグループの一部である。また、対応するアクティブコンポーネントとは異なり、パッシブデバイスは回路に電力上昇または増幅を提供できない。

サーミスタは敏感な要素であり、負の温度係数（NTC）と正の温度係数（PTC）の2つのタイプがあり、NTCとPTCとも呼ばれる。その抵抗は温度によって大きく異なる。PTCサーミスタの抵抗は温度とともに増加するが、NTCの条件は前者とは逆である　この実験では、NTCを使用する。

.. image:: media/image325.png


その動作原理は、NTCサーミスタの抵抗が外部環境の温度とともに変化することである。環境のリアルタイム温度を検出できる。温度が高くなると、サーミスタの抵抗が減少する。次に、電圧データはA/Dアダプターによってデジタル量に変換される。摂氏または華氏の温度はプログラミングにより出力される。

この実験では、サーミスタと10kプルアップ抵抗が使用される。各サーミスタには通常の抵抗がある。ここでは、25℃で測定されると、10k ohmである。

抵抗と温度の関係は次の通りである：


R\ :sub:`T` =R\ :sub:`N` exp\ :sup:`B(1/TK – 1/TN)`

RT は温度が TK のときのNTCサーミスタの抵抗である。

RN は、定格温度 TN でのNTCサーミスタの抵抗である。ここで、 RN の数値は10kである。

TK はケルビン温度で、単位はKである。ここで、 TK の数値は273.15である。+摂氏度である。

TN は定格ケルビン温度で、単位もKである。ここで、 TN の数値は273.15 + 25である。

また、NTCサーミスタの構成要素定数である B（ベータ）は、数値3950の熱感受性指数とも呼ばれる。

exp は指数の略語で、基数eは自然数であり、約2.7に等しくなる。

この式
T\ :sub:`K`\ =1/(ln(R\ :sub:`T`/R\ :sub:`N`)/B+1/T\ :sub:`N`) を変換して、マイナス273.15が摂氏温度に相当するケルビン温度を取得する。

この関係は実験式である。温度と抵抗が有効範囲内にある場合にのみそれは正確である。

回路図
-----------------

.. image:: media/image323.png


.. image:: media/image324.png


実験手順
-----------------------

ステップ1： 回路を作る。

.. image:: media/image202.png
    :width: 800



C言語ユーザー向け
^^^^^^^^^^^^^^^^^^^^


ステップ2： コードのフォルダーに入る。

.. raw:: html

   <run></run>

.. code-block::

    cd ~/davinci-kit-for-raspberry-pi/c/2.2.2/

ステップ3： コードをコンパイルする。

.. raw:: html

   <run></run>

.. code-block::

    gcc 2.2.2_Thermistor.c -lwiringPi -lm

.. note::
    -lm はライブラリの数学をロードする。省略すると、エラーが発生する。

ステップ4： EXEファイルを実行する。

.. raw:: html

   <run></run>

.. code-block::

    sudo ./a.out

コードを実行すると、サーミスタは周囲温度を検出する。周囲温度は、プログラムの計算が終了すると画面に出力される。

**コード**

.. code-block:: c

    #include <wiringPi.h>
    #include <stdio.h>
    #include <math.h>

    typedef unsigned char uchar;
    typedef unsigned int uint;

    #define     ADC_CS    0
    #define     ADC_CLK   1
    #define     ADC_DIO   2

    uchar get_ADC_Result(uint channel)
    {
        uchar i;
        uchar dat1=0, dat2=0;
        int sel = channel > 1 & 1;
        int odd = channel & 1;

        digitalWrite(ADC_CLK, 1);
        delayMicroseconds(2);
        digitalWrite(ADC_CLK, 0);
        delayMicroseconds(2);

        pinMode(ADC_DIO, OUTPUT);
        digitalWrite(ADC_CS, 0);
        // Start bit
        digitalWrite(ADC_CLK,0);
        digitalWrite(ADC_DIO,1);    delayMicroseconds(2);
        digitalWrite(ADC_CLK,1);    delayMicroseconds(2);
        //Single End mode
        digitalWrite(ADC_CLK,0);
        digitalWrite(ADC_DIO,1);    delayMicroseconds(2);
        digitalWrite(ADC_CLK,1);    delayMicroseconds(2);
        // ODD
        digitalWrite(ADC_CLK,0);
        digitalWrite(ADC_DIO,odd);  delayMicroseconds(2);
        digitalWrite(ADC_CLK,1);    delayMicroseconds(2);
        //Select
        digitalWrite(ADC_CLK,0);
        digitalWrite(ADC_DIO,sel);    delayMicroseconds(2);
        digitalWrite(ADC_CLK,1);

        digitalWrite(ADC_DIO,1);    delayMicroseconds(2);
        digitalWrite(ADC_CLK,0);
        digitalWrite(ADC_DIO,1);    delayMicroseconds(2);

        for(i=0;i<8;i++)
        {
            digitalWrite(ADC_CLK,1);    delayMicroseconds(2);
            digitalWrite(ADC_CLK,0);    delayMicroseconds(2);

            pinMode(ADC_DIO, INPUT);
            dat1=dat1<<1 | digitalRead(ADC_DIO);
        }

        for(i=0;i<8;i++)
        {
            dat2 = dat2 | ((uchar)(digitalRead(ADC_DIO))<<i);
            digitalWrite(ADC_CLK,1);    delayMicroseconds(2);
            digitalWrite(ADC_CLK,0);    delayMicroseconds(2);
        }

        digitalWrite(ADC_CS,1);
        pinMode(ADC_DIO, OUTPUT);
        return(dat1==dat2) ? dat1 : 0;
    }

    int main(void)
    {
        unsigned char analogVal;
        double Vr, Rt, temp, cel, Fah;
        if(wiringPiSetup() == -1){ //when initialize wiring failed,print messageto screen
            printf("setup wiringPi failed !");
            return 1;
        }
        pinMode(ADC_CS,  OUTPUT);
        pinMode(ADC_CLK, OUTPUT);

        while(1){
            analogVal = get_ADC_Result(0);
            Vr = 5 * (double)(analogVal) / 255;
            Rt = 10000 * (double)(Vr) / (5 - (double)(Vr));
            temp = 1 / (((log(Rt/10000)) / 3950)+(1 / (273.15 + 25)));
            cel = temp - 273.15;
            Fah = cel * 1.8 +32;
            printf("Celsius: %.2f C  Fahrenheit: %.2f F\n", cel, Fah);
            delay(100);
        }
        return 0;
    }

**コードの説明**

.. code-block:: c

    #include <math.h>

一般的な数学的操作と変換を計算する一連の関数を宣言するC数値ライブラリがある。

.. code-block:: c

    analogVal = get_ADC_Result(0);

この関数はサーミスタの値を読み取るために使用される。

.. code-block:: c

    Vr = 5 * (double)(analogVal) / 255;
    Rt = 10000 * (double)(Vr) / (5 - (double)(Vr));
    temp = 1 / (((log(Rt/10000)) / 3950)+(1 / (273.15 + 25)));
    cel = temp - 273.15;
    Fah = cel * 1.8 +32;
    printf("Celsius: %.2f C  Fahrenheit: %.2f F\n", cel, Fah);

これらの計算により、サーミスタ値が摂氏値に変換される。

.. code-block:: c

    Vr = 5 * (double)(analogVal) / 255;
    Rt = 10000 * (double)(Vr) / (5 - (double)(Vr));

Rt（サーミスタの抵抗）を取得するために、これらの2行のコードは読み取り値アナログを使って電圧分布を計算している。

.. code-block:: c

    temp = 1 / (((log(Rt/10000)) / 3950)+(1 / (273.15 + 25)));

このコードは、Rtを式 TK=1/(ln(RT/RN)/B+1/TN) に挿入してケルビン温度を取得することを意味する。

.. code-block:: c

    temp = temp - 273.15;

ケルビン温度を摂氏に変換する。

.. code-block:: c

    Fah = cel * 1.8 +32;

摂氏を華氏に変換する。
    
.. code-block:: c

    printf("Celsius: %.2f C  Fahrenheit: %.2f F\n", cel, Fah);

ディスプレイに摂氏度、華氏度とそれらの単位を表示する。

Python言語ユーザー向け
^^^^^^^^^^^^^^^^^^^^^^^^^

ステップ2： コードのフォルダーに入る。

.. raw:: html

   <run></run>

.. code-block::

    cd ~/davinci-kit-for-raspberry-pi/python/

ステップ3： EXEファイルを実行する。

.. raw:: html

   <run></run>

.. code-block::

    sudo python3 2.2.2_Thermistor.py

コードを実行すると、サーミスタは周囲温度を検出する。周囲温度は、プログラムの計算が終了すると画面に出力される。

**コード**

.. note::

   以下のコードを **変更/リセット/コピー/実行/停止** できます。 ただし、その前に、 ``davinci-kit-for-raspberry-pi/python`` のようなソースコードパスに移動する必要があります。 
   
.. raw:: html

    <run></run>

.. code-block:: python

    import RPi.GPIO as GPIO
    import ADC0834
    import time
    import math

    def init():
        ADC0834.setup()

    def loop():
        while True:
            analogVal = ADC0834.getResult()
            Vr = 5 * float(analogVal) / 255
            Rt = 10000 * Vr / (5 - Vr)
            temp = 1/(((math.log(Rt / 10000)) / 3950) + (1 / (273.15+25)))
            Cel = temp - 273.15
            Fah = Cel * 1.8 + 32
            print ('Celsius: %.2f C  Fahrenheit: %.2f F' % (Cel, Fah))
            time.sleep(0.2)

    if __name__ == '__main__':
        init()
        try:
            loop()
        except KeyboardInterrupt:
            ADC0834.destroy()

**コードの説明**

.. code-block:: python

    import math

一般的な数学的操作と変換を計算する一連の関数を宣言するC数値ライブラリがある。

.. code-block:: python

    analogVal = ADC0834.getResult()

この関数はサーミスタの値を読み取るために使用される。

.. code-block:: python

    Vr = 5 * float(analogVal) / 255
    Rt = 10000 * Vr / (5 - Vr)
    temp = 1/(((math.log(Rt / 10000)) / 3950) + (1 / (273.15+25)))
    Cel = temp - 273.15
    Fah = Cel * 1.8 + 32
    print ('Celsius: %.2f °C  Fahrenheit: %.2f ℉' % (Cel, Fah))

これらの計算はサーミスタの値を摂氏度と華氏度に変換する。

.. code-block:: python

    Vr = 5 * float(analogVal) / 255
    Rt = 10000 * Vr / (5 - Vr)

Rt（サーミスタの抵抗）を取得するために、これらの2行のコードは読み取り値アナログを使って電圧分布を計算している。

.. code-block:: python

    temp = 1/(((math.log(Rt / 10000)) / 3950) + (1 / (273.15+25)))

このコードは、Rtを式 TK=1/(ln(RT/RN)/B+1/TN) に挿入してケルビン温度を取得することを意味する。

.. code-block:: python

    temp = temp - 273.15

ケルビン温度を摂氏に変換する。

.. code-block:: python

    Fah = Cel * 1.8 + 32

摂氏を華氏に変換する。

.. code-block:: python

    print ('Celsius: %.2f °C  Fahrenheit: %.2f ℉' % (Cel, Fah))

ディスプレイに摂氏度、華氏度とそれらの単位を表示する。

現象画像
------------------

.. image:: media/image203.jpeg