見出し画像

【GASでIoT】カレンダー風お天気インジゲータ~〔解説5 最終〕ラズベリーパイへデータを渡してLEDを光らせる~

クラウド上のエクセルともいうべきGoogleスプレッドシートを活用して、ネット上の天気予報の情報にアクセスし、雨や晴れの予報をLEDの色で表示させる「お天気インジゲータ」に関する記事の続きです。

天気予報のデータは、ネット上で公開されている気象データを利用し、これをスプレッドシートに展開しています。ワークシート関数だけを使い、LEDを点灯するための文字列を作成するところまでを解説しました。

今回の記事は、ラズベリーパイに、ネット経由でこの文字列を引き渡して、LEDの点灯に反映させるところの解説で、一連の記事の最終となります。

本記事では実装コードをご紹介していますが、様々な理由により、この説明通りにいかない場合がしばしばあります。申し訳ありませんが、自己責任・自己解決でお進めくださるよう、お願いいたします。 

スプレッドシートに展開する天気予報情報は、筆者の解釈で整理したものなので、誤りやデータの欠落を含む可能性があることを予めご承知ください。

ご紹介の内容は、個人のホビーユースでの利用を想定しております。また、表示が不正確だったり、エラーを起こす可能性があり、商用での利用は想定しておりません。

シングルボードコンピュータの「ラズベリーパイ Zero WH」および、フルカラーLEDテープ「NeoPixel」の準備


この一連の記事の目的は、GASで収集したデータを、スマートフォンの画面の様な、画面を操作して確認する形ではなく、常時掲示して、だれもが好きなタイミングで確認できる形で示す事です。

実装するための手段として選んだのが、「ラズベリーパイ Zero WH」という簡易なコンピュータと「NeoPixcel」というLEDデバイスです。

ラズベリーパイは、「シングルボード・コンピュータ」と呼ばれるデバイスで、ごく小さな基盤の上に小さなチップを並べて作ったコンピュータです。

通常のコンピュータとは異なる特徴は、各種デバイスを配線して、ONーOFFのスイッチングやデータ通信による制御が出来る点です。

「ラズベリーパイ Zero WH」は、いわゆる「マイコン・チップ」ではなく、小さくてもOSを持ったコンピュータであり、OS付きのシングルボード・コンピュータで、WiーFi接続可能な商品としては、最も安価な部類に入ります。


とはいえ、もともとは20ドル足らずで販売されていた、この「ラズベリーパイ Zero WH」も、2023年現在は、昨今の半導体不足の影響を受けて、3~4倍にまで値上がりしてしまいました。


この「コンピュータ」を使うと、簡単なプログラムを書いて、ネットを介して通信し、デバイスを制御することができます。


一方、「NeoPixel」は、フルカラーLEDデバイスをテープ状につなげた商品です。


この商品が素晴らしい点は、個々のLEDがフルカラーで点灯できるだけでなく、この素子のひとつづつにマイコンが内蔵されていて、テープの端から信号を送ることにより、どの位置のLEDであっても、個別に指定して光らせる事ができる点です。

ラズベリーパイとは簡単に接続可能で、ラズベリーパイ側で簡単なプログラムを書く事で、指定したLEDを、特定の色や明るさで光らせることが用意にできます。

やや信頼性に劣るものの、最も簡単な配線では、1本の信号線をラズベリーパイに直結し、電源とアースを用意するだけで、接続が完了します。



ラズベリーパイの向きは上記です。



デバイスを準備する詳細については、以下の記事を参照ください。

今回の記事で使うデバイスで、上記と異なる点はLEDの数で、今回は20灯を以下の図の様に途中で曲げて使用します。




GASとラズベリーパイで無線通信するための仕組み


ラズベリーパイを外部から無線を介して操作する方法は色々ありますが、この記事で採用する方法は、

・GAS側がサーバ(常時稼働して、アクセスを受ける側)
・ラズベリーパイ側がクライアント(サーバのURLにアクセスする)

として稼働させる方法です。

この方法の優れている点は、サーバーがGAS側であるため、比較的安全な通信を行えることと、ラズベリーパイ側では自由なタイミングで電源のオン・オフができる事です。

ラズベリーパイ側をサーバとする通信方法もありますが、この方法には以下の様な欠点があります。

・サーバであるラズベリーパイ側は複雑なセキュリティ対策が難しいため、不正アクセスを受けやすくなる懸念があります。

・ラズベリーパイの電源をOFFにすると、クライアント側でアクセスエラーを起こすので、その対策を織り込んでおく必要があります。

GAS側と、ラズベリーパイ側のプログラムの準備


この記事で紹介するシステムは、スプレッドシートでLED点灯用のデータを用意した後は、以下で紹介するものと殆ど同じです。

サーバ側(GAS):スプレッドシートで用意したデータをレスポンスするプログラムの用意。

クライアント側(ラズパイ):GASにアクセスして、LED点灯用のデータを受け取り、LEDを点灯させる。

このテーマの一連の記事がだいぶ長くなりましたので、細かい手順は上の記事を読んで頂き、この記事ではプログラムに絞ってご紹介します。

LEDを光らせる装置のメイキング等もいずれ記事にしようと考えておりますが、今回は割愛させて頂きます。

GASのプログラムの用意(サーバ側の用意)


GAS側のプログラムは、単純に、スプレッドシートの特定のセルの値をレスポンスするだけなので、とても短いです。

Googleドライブ上で、GASのプロジェクトを新規作成し、コードエディタから以下のコードを入力します。

スプレッドシートIDを書き換える部分が一箇所あります。この部分はご自身のスプレッドシートのものを記述ください。

//-----------------------------------------
//----ラズパイで週間天気をLED色表示-----------------
//----レスポンス LEDの点灯色--------
//---著作:Particlemethod-2023年01月08日-----
//---無断複製・転載・配布を禁じます-------------
//-----------------------------------------
function doGet(e) {

  //アプリケーションを取得|★スプレッドシートID★は各自のものを記入
  var myApp = SpreadsheetApp.openById('★スプレッドシートID★');

  //対象シートをシートの名前を指定して取得|シート名は「ラズパイ表示」
  var mySheet = myApp.getSheetByName('ラズパイ表示');
  
  //A2セルの値をレスポンスとして返す
  return ContentService.createTextOutput(mySheet.getRange(2,2).getValue());


}

下記の一文で、LED点灯情報を載せたテキストをレスポンスしています。
return ContentService.createTextOutput()

テンプレートは今回ありませんので、プログラムを保存したらデプロイし、アクセスのためのURLを控えておきます。

このあたりの手順を知りたい方は、この記事の最後に掲示する資料をご参照ください。

ラズベリーパイ側のプログラムの用意(クライアント側の用意)


ラズベリーパイ側は、OSをインストールすると標準で搭載されているPython(パイソン)という言語でプログラムします。

はじめての方は、ラズベリーパイ側の調達から、OSのインストール、およびPC側にリモート接続して操作するまでを記載した、以下の記事をご参照ください。

以下は記事の後半のプログラムの部分を参照ください。

その他、NeoPixelを操作するライブラリの導入をします。本件は、以下の記事に書いております。

今回のラズベリーパイ側のプログラムは以下となります。
色々コメントがあるのは、ベースにしたNeoPixelのサンプルプログラムのものです。

GASのデプロイIDを書き換える部分が一箇所あります。この部分はご自身がデプロイした時のURLから記述ください。


# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries
# SPDX-License-Identifier: MIT #ーーーーーーーー利用モジュールの引用 ----------
#---WEBにリクエストを投じるためのモジュール
import requests
import sys

import time
import board
import neopixel


# On CircuitPlayground Express, and boards with built in status NeoPixel -> board.NEOPIXEL
# Otherwise choose an open pin connected to the Data In of the NeoPixel strip, i.e. board.D1
pixel_pin = board.D18 #board .NEOPIXEL

# On a Raspberry pi, use this instead, not all pins are supported
# pixel_pin = board.D18

# The number of NeoPixels
num_pixels = 20 #10 

# The order of the pixel colors - RGB or GRB. Some NeoPixels have red and green reversed!
# For RGBW NeoPixels, simply change the ORDER to RGBW or GRBW.
ORDER = neopixel.GRB

pixels = neopixel.NeoPixel(
    pixel_pin, num_pixels, brightness=0.02, auto_write=False, pixel_order=ORDER
)
 #ーーーーーーーーwhile文で無限ループーーーーーーーー 
#---ループに入る

while True: #Comment  this line out if you have RGBW/GRBW NeoPixels

    #---赤で全点灯(輝度を20段階で次第に上げる)
    for i in range(20):
        pixels.fill((i*10, 0, 0))
        pixels.show()
        time.sleep(0.07)
        pixels.fill((0, 0, 0))
        
    #---緑で全点灯(輝度を20段階で次第に上げる)
    for i in range(20):
        pixels.fill((0, i*10, 0))
        pixels.show()
        time.sleep(0.07)
        pixels.fill((0, 0, 0))

    #---青で全点灯(輝度を20段階で次第に上げる)
    for i in range(20):
        pixels.fill((0, 0, i*10))
        pixels.show()
        time.sleep(0.07)
        pixels.fill((0, 0, 0))
        
    #---赤で1灯ずつLEDの位置を変えて点灯(毎回全消灯)
    for i in range(20):
        pixels.fill((0, 0, 0))
        pixels[i]=(50, 0, 0)
        pixels.show()
        time.sleep(0.1)
        pixels.fill((0, 0, 0))

                   
    #---緑で1灯ずつLEDの位置を変えて点灯(消灯しないで追加点灯)
    for i in range(20):
        pixels[i]=(0, 50, 0)
        pixels.show()
        time.sleep(0.1)

    #---全消灯
    pixels.fill((0, 0, 0))

    

    #---URLにアクセス★デプロイID★は各自打ち替え
    r=""
    while True:
        r = requests.get('https://script.google.com/macros/s/★デプロイID★/exec')
        time.sleep(0.2)
        if r.text[0] == 'D':
            break

    #print (r.text)

    pixels.fill((0, 0, 0))
    for i in range(20):
 
        if r.text[i+1] == '0':
            pixels[i]=(0, 0, 0)
            pixels.show()
            #print (r.text[i+1])
            
        elif r.text[i+1] == '1':
            pixels[i]=(0, 0, 100)
            pixels.show()
            #print (r.text[i+1])
            
        elif r.text[i+1] == '2':
            pixels[i]=(0, 50, 50)
            pixels.show()
            #print (r.text[i+1])
            
        elif r.text[i+1] == '3':
            pixels[i]=(50, 50, 0)
            pixels.show()
            #print (r.text[i+1])

        elif r.text[i+1] == '4':
            pixels[i]=(50, 0, 0)
            pixels.show()
            #print (r.text[i+1])


        else:
            pixels[i]=(0, 0, 0)
            pixels.show()
            #print (r.text[i+1])
           
            
    time.sleep(60*60)
    #pixels .fill((0, 0, 0))

NeoPixelを稼働させるためのご注意


ラズベリーパイで、NeoPixelを稼働させる場合は、コンソール画面(ラズベリーパイ側のトップ画面の上にある真っ黒い画面のアイコンを押すと表示されます)から、以下のコマンドを打って実行させる必要があります。

sudo python3 /home/pi/★Pythonのプログラムファイル名★.py

sudoというコマンドは、スーパーユーザ(ルート権限者とも言います)として実行する、という意味です。

python3はPythonの実行プログラムですが、導入したバージョンによって最後の数字は調整ください。

/home/pi/★Pythonのプログラムファイル名★.pyは、保存したプログラムコードのファイルです。パスや、★~★部分は各自のものを打ち替えください。


Pythonの開発環境から実行指示を出しても動きませんのでご注意ください。

毎回コマンドを打つのは面倒ですので、起動時に自動実行させたい場合は、rc.localというファイルに記述しておきます。

このファイルの記述もスーパーユーザーとして行う必要があります。コンソールから以下のコマンドを打って、nano というエディタを起動させます。

sudo nano /etc/rc.local

ファイルの最後の方、exit 0 の直前に、以下を打ち込み保存します。

sudo python3 /home/pi/★Pythonのプログラムファイル名★.py&
exit 0

次回起動時からは、自動的にプログラムが稼働します。プログラムを修正した際は、再起動させると実行結果を確認できます。

最後は駆け足となりましたが、以上、お天気デバイスのご紹介でした!



以下は、はじめてGASに触れる方への参考資料のご紹介です。


GASでWEBアプリを実装する手順を、以下の本にまとめました。手順を通しでご確認したい方はご参考にどうぞ。

手間賃程度の値段を付けさせて頂いておりますが、アマゾン読み放題(Amazon UnLimited) のサービス加入中の方は無料で読めます。
コードの解説はこちらです。
本書で実装する、表計算シートをそのまま映し出す「テーブル形式フォーム」(自称している呼称です)は、Googleフォームなどの単票形式のフォームと違った、多様に応用がきく便利なフォームです。そのコードの内容を解説しています。



コードのダウンロードが上手くできないご指摘があり(デバイスによる様です)、別途のダウンロード先も追加しました。

なお、日本語についての個人的な思いから、IT関連の本ではめずらしい、縦書きにしています。目次は以下をご参照ください。


Google Apps Script(GAS)でWEBアプリを作る事で、日常のちょっとした効率化が可能です。
サーバレスかつ無料のサービスですので、アマチュアでも手軽に始められます。
用例の一つとして、スケジュール調整アプリの様な意見集約にうってつけかと思い、以下を本にしてみました。

チームの意見集約を、メールに代わってWEBアプリでやってみませんか、というご提案です。



こちらは、テーブル形式フォームを進化させ、エクセル風テーブルにしたWEBアプリの解説です。スマートフォンなどからまるでエクセルが使える感動を是非!

宜しければどうぞ。


アマゾン読み放題(Amazon UnLimited) のサービス加入中の方は無料で読めるはずです。

この記事が気に入ったらサポートをしてみませんか?