.. note:: 

    こんにちは、FacebookのSunFounder Raspberry Pi & Arduino & ESP32愛好者コミュニティへようこそ！Raspberry Pi、Arduino、ESP32について、他の愛好者と一緒に深く学びましょう。

    **参加する理由**

    - **専門家のサポート**: 購入後の問題や技術的な課題を、コミュニティやチームのサポートを受けて解決できます。
    - **学び・共有**: ヒントやチュートリアルを交換して、スキルを向上させましょう。
    - **限定プレビュー**: 新製品の発表や先行公開情報をいち早く手に入れましょう。
    - **特別割引**: 新製品に対する特別割引を楽しめます。
    - **祝祭キャンペーンやプレゼント**: プレゼントキャンペーンやシーズンプロモーションに参加できます。

    👉 一緒に探求し、創造的な活動をしてみませんか？[|link_sf_facebook|]をクリックして、今すぐ参加しましょう！

.. _py_room_temp:

7.2 室温計の作成
============================================================

このプロジェクトでは、サーミスターとI2C LCD1602ディスプレイを使って **室温計** を作成します。このシンプルで実用的なデバイスは、周囲の温度を測定し、その結果をLCDスクリーンに表示することで、環境の温度をリアルタイムで表示します。

**必要なもの**

このプロジェクトには、以下のコンポーネントが必要です。 

キットを購入するのが便利です。以下のリンクからご確認いただけます：

.. list-table::
    :widths: 20 20 20
    :header-rows: 1

    *   - 名前	
        - このキットに含まれるアイテム
        - リンク
    *   - Newton Lab Kit	
        - 450+
        - |link_newton_lab_kit|

以下のリンクから個別に購入することも可能です。


.. list-table::
    :widths: 5 20 5 20
    :header-rows: 1

    *   - 番号
        - コンポーネント	
        - 数量
        - リンク

    *   - 1
        - :ref:`cpn_pico_2`
        - 1
        - |link_pico2_buy|
    *   - 2
        - Micro USBケーブル
        - 1
        - 
    *   - 3
        - :ref:`cpn_breadboard`
        - 1
        - |link_breadboard_buy|
    *   - 4
        - :ref:`cpn_wire`
        - 複数
        - |link_wires_buy|
    *   - 5
        - :ref:`cpn_resistor`
        - 1(10KΩ)
        - |link_resistor_buy|
    *   - 6
        - :ref:`cpn_thermistor`
        - 1
        - |link_thermistor_buy|
    *   - 7
        - :ref:`cpn_i2c_lcd`
        - 1
        - |link_i2clcd1602_buy|



**コンポーネントの理解**

* **サーミスター**: 温度に応じて抵抗が大きく変化する抵抗器の一種です。ここでは、温度が上がると抵抗が減少する負の温度係数（NTC）のサーミスターを使用します。
* **電圧分割回路**: サーミスターと定値抵抗を組み合わせることで、温度に応じた電圧の変化を測定できる電圧分割回路を作成します。
* **I2C LCD1602ディスプレイ**: I2Cインターフェースを搭載した16x2文字LCDディスプレイで、SDAとSCLの2本のデータ線を使用することで配線とコードを簡素化します。

**回路図**

|sch_room_temp|


**配線図**

|wiring_room_temp|


**コードの作成**

サーミスターから温度を読み取り、LCDに表示するMicroPythonプログラムを作成します。

.. note::

    * ``newton-lab-kit/micropython`` から ``7.2_room_temperature_meter.py`` を開くか、コードをThonnyにコピーして、「実行」ボタンをクリックするか、F5キーを押して実行します。
    * 正しいインタープリターが選択されていることを確認してください：MicroPython (Raspberry Pi Pico).COMxx。
    * ``lcd1602.py`` というライブラリを使用する必要があります。Picoにアップロードされているか確認してください。詳細なチュートリアルは :ref:`add_libraries_py` を参照してください。


.. code-block:: python

    from lcd1602 import LCD
    from machine import I2C, Pin, ADC
    import utime
    import math

    # サーミスターの初期化（ピン28のADC）
    thermistor = ADC(28)  # サーミスターからのアナログ入力

    # LCD1602ディスプレイ用のI2C通信の初期化
    i2c = I2C(1, scl=Pin(7), sda=Pin(6), freq=400000)

    # LCD1602ディスプレイを操作するためのLCDオブジェクトを作成
    lcd = LCD(i2c)

    # ステインハート・ハート方程式の定数
    BETA = 3950  # サーミスターのベータ係数
    R0 = 10000   # 25度Cのときの抵抗値
    T0 = 298.15  # 基準温度（25℃）のケルビン温度

    def read_temperature():
        # サーミスターから生のADC値を読み取る
        adc_value = thermistor.read_u16()

        # ADC値を電圧に変換
        voltage = adc_value * 3.3 / 65535

        # サーミスターの抵抗値を計算
        Rt = (voltage * R0) / (3.3 - voltage)

        # ステインハート・ハート方程式を使用して温度をケルビンで計算
        tempK = 1 / ((1 / T0) + (1 / BETA) * math.log(Rt / R0))

        # ケルビン温度を摂氏に変換
        tempC = tempK - 273.15

        return tempC

    def main():
        while True:
            temperature = read_temperature()
            # 温度を小数点以下2桁にフォーマット
            temp_str = "{:.2f} C".format(temperature)

            # LCDに温度を表示
            lcd.clear()
            lcd.write(0, 0, "Room Temp:")
            lcd.write(4, 1, temp_str)

            # オプション：温度をコンソールに表示
            print("Temperature:", temp_str)

            utime.sleep(1)

    if __name__ == "__main__":
        main()

コードを実行すると、LCDには現在の室温が摂氏で表示されます。
LCDが表示されない場合は、背面のポテンショメーターでコントラストを調整してください。
Thonnyのコンソールにも温度が表示されます。

**コードの理解**

#. インポートと初期化:

   * ``lcd1602.LCD``: LCDディスプレイを制御するため。
   * ``machine.ADC``: サーミスターからのアナログ値を読み取るため。
   * ``math``: 温度変換に必要な対数計算のため。

#. 変数:

   * **BETA**: サーミスターに特有のベータ係数（一般的に3950）。
   * **R0**: 基準温度でのサーミスターの抵抗値（通常は25℃で10kΩ）。
   * **T0**: 基準温度（25℃ + 273.15）のケルビン温度。

   .. code-block:: python

        BETA = 3950  # サーミスターのベータ係数
        R0 = 10000   # 25度Cのときの抵抗値
        T0 = 298.15  # 基準温度（25℃）のケルビン温度
    
#. 温度の読み取り（ ``read_temperature Function`` ）:

   * **ADC読み取り**: サーミスターからのアナログ値をキャプチャ。
   * **電圧計算**: ADC値を実際の電圧に変換。
   * **抵抗計算（Rt）**: 電圧分割回路を使用してサーミスターの抵抗値を計算。
   * **ステインハート・ハート方程式**: サーミスターの抵抗と温度を関連付ける数学モデル。
   * **摂氏への変換**: ケルビン温度を摂氏に変換。

   .. code-block:: python

        def read_temperature():
                # サーミスターから生のADC値を読み取る
                adc_value = thermistor.read_u16()

                # ADC値を電圧に変換
                voltage = adc_value * 3.3 / 65535

                # サーミスターの抵抗値を計算
                Rt = (voltage * R0) / (3.3 - voltage)

                # ステインハート・ハート方程式を使用して温度をケルビンで計算
                tempK = 1 / ((1 / T0) + (1 / BETA) * math.log(Rt / R0))

                # ケルビン温度を摂氏に変換
                tempC = tempK - 273.15

                return tempC

#. メインループ（main関数）:

   * 温度を継続的に読み取る。
   * 温度をフォーマットしてLCDに表示。
   * オプションで、コンソールに温度を表示（デバッグ用）。
   * 1秒待機して繰り返す。

   .. code-block:: python

        def main():
            while True:
                temperature = read_temperature()
                # 温度を小数点以下2桁にフォーマット
                temp_str = "{:.2f} C".format(temperature)

                # LCDに温度を表示
                lcd.clear()
                lcd.write(0, 0, "Room Temp:")
                lcd.write(4, 1, temp_str)

                # オプション：温度をコンソールに表示
                print("Temperature:", temp_str)

                utime.sleep(1)

**トラブルシューティング**


* LCDがテキストを表示しない場合:

  * SDAとSCLの接続（GP6、GP7）を確認。
  * LCDの電源が正しく接続されているか確認。
  * LCDモジュールの背面のコントラストポテンショメーターを調整。

* 温度の読み取りが正しくない場合:

  * サーミスターと抵抗が正しく接続されているか確認。
  * 抵抗値が正しいかダブルチェック。
  * BETA値がサーミスターの仕様と一致しているか確認。

* プログラムのエラー:

  * 必要なライブラリがPicoに正しくアップロードされていることを確認。
  * コードにタイポやインデントエラーがないか確認。

**更なる実験**

* 摂氏を華氏に変換して表示する:

  ``read_temperature`` 関数を修正して、摂氏から華氏に変換: ``tempF = (tempC * 9 / 5) + 32`` 。

* 湿度測定を追加:

  DHT11またはDHT22センサーを統合して、温度と一緒に湿度も表示。

* データロギング:

  時間経過に伴う温度読み取り値をPicoのファイルに保存。パソコンでデータをプロットして分析。

* ビジュアルアラート:

  温度が特定の閾値を超えたときにLEDやブザーでアラートを発生させる。

**科学的な理解**

* サーミスターと温度測定:

  * サーミスターは温度変化に非常に敏感で、精密な測定に最適です。
  * 電圧分割回路は、抵抗の変化を電圧の変化に変換し、PicoのADCで読み取ることができます。

* ステインハート・ハート方程式:

  * 簡単な線形近似よりも正確な温度計算を提供します。
  * 精密な温度読み取りが必要なアプリケーションに不可欠です。

**結論**

おめでとうございます！Raspberry Pi Pico 2を使って、機能的な室温計を作成しました。このプロジェクトは、アナログセンサーとI2Cデバイスのインターフェース方法を示すだけでなく、温度測定と表示技術の実践的な経験も提供します。

新しい機能を追加したり、他のセンサーを統合して温度計をカスタマイズしてみましょう。このプロジェクトは、環境モニタリングや制御システムを探求するための強力な基盤となります。
