.. note::

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

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

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

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

2. @CheerLightsに参加する
=======================================

これはロマンチックなプロジェクトで、 |link_cheerlights| LEDのカラーチェンジングコミュニティに参加するものです。このコミュニティでは、世界中のLEDが同時に色を変えることができます。

オフィスの隅に置いて、「自分は一人ではない」と感じるためのリマインダーとしても使用できます。

@cheerlightsにツイートを送り、そのツイート内に色の名前を含めると、世界中のLEDが指定した色に変わります。

**必要な部品**

このプロジェクトで必要な部品は以下の通りです。

一式をまとめて購入するのが便利ですが、その場合のリンクはこちらです。

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

    *   - 名前	
        - このキットの内容
        - リンク
    *   - ケプラーキット
        - 450以上
        - |link_kepler_kit|

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

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

    *   - SN
        - 部品	
        - 数量
        - リンク

    *   - 1
        - :ref:`cpn_pico_w`
        - 1
        - |link_picow_buy|
    *   - 2
        - マイクロUSBケーブル
        - 1
        - 
    *   - 3
        - :ref:`cpn_breadboard`
        - 1
        - |link_breadboard_buy|
    *   - 4
        - :ref:`cpn_wire`
        - 数本
        - |link_wires_buy|
    *   - 5
        - :ref:`cpn_ws2812`
        - 1
        - |link_ws2812_buy|
    *   - 6
        - :ref:`cpn_lipo_charger`
        - 1
        -  
    *   - 7
        - 18650バッテリー
        - 1
        -  
    *   - 8
        - バッテリーホルダー
        - 1
        -  

**手順**

1. 回路を組み立てます。

    ここで使用するLi-po Charger Module（リチウムポリマー充電モジュール）は、USBケーブルを切断して、プロジェクトを他の場所で遊ぶために回路に電力を供給します。

    .. warning:: 
        
        Li-po Charger Moduleが図に示されているように接続されていることを確認してください。それ以外の場合、ショートする可能性があり、バッテリーと回路が損傷する可能性があります。

    .. image:: img/wiring/2.cheerlights_bb.png
        :width: 800

2. 以前に `コードパッケージ <https://github.com/sunfounder/kepler-kit/archive/refs/heads/main.zip>`_ をダウンロードしたフォルダにパスを切り替え、「kepler-kit-main/iot」のパスの下で ``2_cheer_light.py`` ファイルを開きます。

3. スクリプトを実行するには、 **Run current script（現在のスクリプトを実行）** ボタンをクリックするか、F5キーを押します。その後、Shellに接続プロンプト、IP、色（0xff0000は赤）が表示されます。

    .. note::

        コードを実行する前に、Pico Wに ``do_connect.py`` と ``secrets.py`` のスクリプトがあることを確認してください。もし無ければ、 :ref:`iot_access` を参照してそれらを作成してください。

    .. image:: img/2_cheerlight1.png

4. スクリプトが実行された後、WS2812 RGBストリップは色を表示しますが、時抗その色は変わります。

5. 起動時にこのスクリプトを実行する場合、以下の手順に従ってRaspberry Pi Pico Wに ``main.py`` として保存する必要があります。

    * スクリプトの実行を停止し、 **File（ファイル）** -> **Save as（名前を付けて保存）** をクリックします。

        .. image:: img/2_cheerlight2.png

    * ポップアップウィンドウで **Raspberry Pi Pico** を選択します。

        .. image:: img/2_cheerlight3.png

    * ファイル名を ``main.py`` に設定します。同じファイルがすでにPico Wに存在する場合は、プロンプトが表示されます。

        .. image:: img/2_cheerlight4.png
    
    * USBケーブルを抜いて、Li-po Charger ModuleでRaspberry Pi Pico Wに電力を供給することができます。角に置いておけば、自動的に動作します。

**仕組み**

Raspberry Pi Pico Wは、 :ref:`iot_access` で説明されているように、インターネットに接続する必要があります。このプロジェクトでは、そのまま使用します。

.. code-block:: python

    from do_connect import *
    do_connect()

WS2812 RGBストリップの設定については、 :ref:`py_neopixel` を参照してください。

.. code-block:: python

    import machine
    from ws2812 import WS2812
    ws = WS2812(machine.Pin(18), 8)

次に、@CheerLightsの色を取得する方法が必要です。Twitterから色の変更を受け取るバックエンドシステムがあり、その情報をJSON形式で URL http://api.thingspeak.com/channels/1417/field/2/last.json に投稿します。

このURLをブラウザで直接開くと、以下のようなものが表示されます。必要なのは ``field2`` データで、16進数でエンコードされた色情報です。

.. code-block:: 

    {"created_at":"2022-08-16T06:12:44Z","entry_id":870488,"field2":"#ff00ff"}

このデータを取得するために ``urequests`` モジュールを使用し、 ``json`` モジュールを使用してこの文字をPythonの辞書に変換します。
次のコードは、URLから最新の@CheerLightsの色を取得し、WS2812で使用できる色値を返します。

.. code-block:: python

    def get_colour():
        url = "http://api.thingspeak.com/channels/1417/field/2/last.json"
        try:
            r = urequests.get(url)
            if r.status_code > 199 and r.status_code < 300:
                cheerlights = json.loads(r.content.decode('utf-8'))
                print(cheerlights['field2'])
                colour = int('0x'+cheerlights['field2'][1:7])#Convert from String to Integer
                r.close()
                return colour
            else:
                return None
        except Exception as e:
            print(e)
            return None

最後に、1分ごとにws2812が動作するようにループを使用します。

.. code-block:: python

    while True:
        colour = get_colour()
        if colour is not None:
            ws.write_all(colour)
        time.sleep(60)

