;

スポンサーサイト

0

    一定期間更新がないため広告を表示しています

    • 2019.10.15 Tuesday
    • -
    • -
    • -
    • by スポンサードリンク

    Raspberry Pi3 でペット監視システムをつくってみる(その6)

    0

      前回までは、twitterでつぶやくためのスクリプトの作成を行いました。

      これまでの作業で、各パーツはそろったので、これらを繋ぐためのメインプログラムを書いていきます。

       

      メインプログラムとはいっても、一からつくり上げるわけではありません。(面倒くさいので)

      第二回のところで、使用したライブラリ(htu21dflib)のテストプログラムが、無限ループで温度・湿度を標準出力に表示しつづけるというものでしたので、これに各条件分岐やスクリプト呼び出しなどの肉付けをすることで、機能を実現していきます。

       

       

      htu21dflib.c を改良

       

      #ifdef HTU21DFTEST 以降の行(main関数の入っている範囲)を修正していきます。

       

      
      static const char I2CDEV[] = "/dev/i2c-1";  // raspberry pi
      static const uint8_t I2CADDR = 0x40;        // htu21df i2c address
      #define INTERVAL_HTU_GET_SEC 60 // 60 second
      #define INTERVAL_TWEET_SEC 3600 // 1 hours
      #define INTERVAL_EMARGENCY_EVENT_TIMES 15 // 15 times 
      enum {
        E_GREEN = 0,
        E_YELLOW,
        E_RED,
      
        E_COLOR_NUM
      };
      
      static const char* const str_color[E_COLOR_NUM] = {
        "green",
        "yellow",
        "red",
      };
      /* 温度湿度を3段階で判定。
         0:green(快適), 1:yellow(注意), 2:red(危険) */
      static int judgementEnv(float temperature, float humidity)
      {
        if ((temperature > 18.0) && (temperature < 28.0) &&
            (humidity > 40) && (humidity < 70)) {
          /* うさぎの場合、温度は18-25度、湿度は40-60%がベスト */
          return E_GREEN;
        }
        else if ((temperature > 30) || (temperature < 16)) {
          return E_RED;
        }
        else if ((humidity < 35) || (humidity > 80)) {
          return E_RED;
        }
        else {
          return E_YELLOW;
        }
      }
      
      static int reg_tweet_flg[24] = {0,0,0,0,1,1, /*  0, 1, 2, 3, 4, 5時 */
      				1,1,1,1,1,1, /*  6, 7, 8, 9,10,11時 */
      				1,1,1,1,1,1, /* 12,13,14,15,16,17時 */
      				1,1,1,1,1,1  /* 18,19,20,21,22,23時 */};
      int main(int argc, char *argv[])
      {
          int rc;     // return code
          int i2cfd;  // i2c file descriptor
          int color;
          float temperature, humidity;
          char *i2c_devname;
          char buff[128] = {'¥0'};
          char media_name[128] = {'¥0'};
          time_t timer;
          struct tm *local;
          struct timeval myTime;
          int hour, min, sec;
          int ignore_rest = 0;
          
          i2c_devname = I2CDEV;
          if (argc > 1) {
              i2c_devname = argv[1];
          }
      
          printf("opening %s¥n", i2c_devname);
          i2cfd = i2c_open(i2c_devname);
          if (i2cfd < 0) {
              printf("i2c_open(%s) failed %d¥n", i2c_devname, i2cfd);
              return -1;
          }
      
          rc = htu21df_init(i2cfd, I2CADDR);
          if (rc < 0) {
              printf("i2c_init failed %d¥n", rc);
              return -2;
          }
      
          min = 0;
          while(1) {
            /* 時刻を取得 */
            timer = time(NULL);
            local = localtime(&timer);
            min = local->tm_min;
            hour = local->tm_hour;
            sec = local->tm_sec;
      
            /* 温度湿度読み出し(I2C) */
            rc = htu21df_read_temperature(i2cfd, &temperature);
            if (rc < 0) {
      	printf("i2c_read_temperature failed %d¥n", rc);
      	return -3;
            }
            rc = htu21df_read_humidity(i2cfd, &humidity);
            if (rc < 0) {
      	printf("i2c_read_humidity failed %d¥n", rc);
      	return -4;
            }
      
            /* 緊急発信の残りが1以上の場合は、カウントダウン */
            if (ignore_rest >= 1) {
      	ignore_rest--;
            }
            /* 温度、湿度の判定 */
            color = judgementEnv(temperature, humidity);
      	
            printf("[htu21dlib]%02d:%02d:%02d temp=%.1f humi=%.1f (color=%s, rest=%d)¥n"
      	     , hour, min, sec, temperature, humidity, str_color[color], ignore_rest);
      
            /* 定時発信 */
            if (min == 1) {
      	/* ファイル名生成(motion.confによる) */
      	sprintf(media_name, "/home/pi/rabbit/motion/%4d%02d%02d%02d0000-snapshot.jpg",
      		local->tm_year + 1900, local->tm_mon + 1, local->tm_mday, local->tm_hour);
      	
      	/* フラグが有効な時間のみツイート */
      	if (reg_tweet_flg[hour]) {
      	  printf("[htu21dlib]%4d-%02d-%02d-%2d:%02d:%02d Regulary Transmission.¥n",
      		 local->tm_year + 1900, local->tm_mon + 1, local->tm_mday,
                       local->tm_hour, local->tm_min, local->tm_sec);
      	  /* メディア付きツイート。*/
      	  sprintf(buff, "python ../../twython/twitter_media.py %.1f %.1f %s",
                        temperature, humidity, media_name);
      	  rc = system(buff);
      	  if (rc < 0) {
      	    printf("[htu21dlib]internal error(%s,%d)¥n", __FILE__, __LINE__);
      	  }
      	}
      	
      	/* 内部ファイル削除 */
      	rc = remove(media_name);
      	if(rc < 0) {
      	  printf("[htu21dlib]media remove error %d, %s", rc, media_name);
      	}
            }
            /* 緊急発信(color がyellow, red かつ 前回から所要分が経過した場合) */
            else if ((color != E_GREEN) && (ignore_rest <= 0)) {
      	  sprintf(buff, "python ../../twython/twitter_emergency.py %.1f %.1f %d",
                        temperature, humidity, color);
      	  rc = system(buff);
      	  if (rc < 0) {
      	    printf("[htu21dlib]internal error(%s,%d)¥n", __FILE__, __LINE__);
      	  }
      	  /* カウント設定(緊急発信を連続ツイートさせないため一定間隔を設定する) */
      	  ignore_rest = INTERVAL_EMARGENCY_EVENT_TIMES;
            }
            else {
      	/* do nothing */
            }
      
            /* 7-segment 表示 (各2桁ずつ使用のため int に丸め込み)*/
            sprintf(buff, "python ../../7-seg/7segment_2arg.py %d %d",(int)temperature, (int)humidity);
            rc = system(buff);
            if (rc < 0) {
      	printf("[htu21dlib]internal error(%s,%d)¥n", __FILE__, __LINE__);
            }
            
            /* 時刻再取得 */
            gettimeofday(&myTime, NULL);
            local = localtime(&myTime.tv_sec);
            sleep (INTERVAL_HTU_GET_SEC - local->tm_sec -1);
            usleep (1000000 - myTime.tv_usec);
      
          } /* infinity loop */
      
      	
            
          rc = i2c_close(i2cfd);
          if (rc < 0) {
              printf("i2c_close failed %d¥n", rc);
              return -5;
          }
          return 0;
      }
      
      

       

       

       

       

       

       

      プログラムのポイント

       

      • 温度湿度の判定

       judgementEnv関数で、3段階(0:green(快適), 1:yellow(注意), 2:red(危険))で評価するようにしました。

      値は決め打ちなので、設定を変える場合は再コンパイルが必要です。

       

      • メインループの時刻管理

      whileは1分間隔(長すぎず短すぎずの調度良い間隔かなと)で回すようにしました。

      定時ツイート(1時間に1回)の処理があるので、ループの最初で時刻を取得する必要が有ります。

      ループの終わりでは、sleepで1分待つのも良いですが、より正確にどうささせるため、次の分までの残り秒数をマイクロ秒単位で待つようにしました。

       

      • 定時ツイート(1時間に1回)の処理

      motionでのスナップショットが毎時0分0秒に保存されるので、ツイートは毎時1分0秒に処理をするようにしました。

      スナップショットのファイル名は、同じくmotionの設定に合わせて、sprintfで生成します。(初歩的なところですが0埋めに注意しましょう)

      コマンドは、buff 配列に入れて、system関数で呼び出すようにします。

      system関数の使用については賛否あると思いますが、今回の程度のスクリプトを実行するような場合は簡単なので採用しました。

       

      また、夜中など、ツイートさせたくない時間帯を指定できるように、reg_tweet_flg配列のフラグをチェックするようにしています。変更したい場合には再コンパイルが必要です。

       

      • 緊急ツイート(随時)の処理

      温度や湿度がyellowやred になった場合に随時ツイートさせるための処理です。

      sprintfでコマンド文字列を作成してsystem関数で実行するという大まかな流れは定時ツイートの処理と同様です。

       

      考慮すべき点は、1分間隔の監視なので、温度や湿度が規定に収まらない場合、1分ごとに連続ツイートしてしまうという問題です。

      連続ツイートを避けるため、一度緊急ツイートをした場合は15分間(INTERVAL_EMARGENCY_EVENT_TIMES)は再ツイートさせないようにカウンタ(ignore_rest)を入れました。

       

       

      最後に

       

       コーディングはこのレベルでいいのか、と思うところが多々あります(多分、バグもあります)が、「まずは動くものを、最短経路で作る」という目標はおおよそ達成できたと思います。

       

       ハードの調達からソフト実装までを含めると、一つ一つは大したことないレベルかもしれませんが、なかなか大変でした。

       それでも試行錯誤しながらモノを作っていくのは楽しいですし、目指すモノができたときの喜びは他には代えがたいです。

       

       

       

       


      Raspberry Pi3 でペット監視システムをつくってみる(その5)

      0

        前回までは、motionの設定を行いました。

        今回は、プログラム内からツイッターでつぶやくためのTwitter Application Managementの導入と、そのスクリプトの作成です。

         

         

        Twitter Application Management

         

        こちらの記事を参考にさせていただきました。

        Twitterと他のプログラムやサービスを連携させるには、この設定が必須です。

         

        Apprication Setting, Your Access Token の内容は、特に重要になるので必ず控えておきましょう。

        特に、以下の4つのパラメータはプログラム上で必要となるため、重要です。

         

        • Consumer Key (API Key)
        • Consumer Secret (API Secret)
        • Access Token
        • Access Token Secret

         

         

        必要ソフトのインストール

         

        twitter + python = twython なのでしょうか。

        その名の通り、python用の twitter操作ライブラリです。

        sudo pip3 install twython

         

        実装プログラム

         

        1.写真なしツイート

         

        写真を添付しないツイートプログラムです。

        今回のシステムでは、温度や湿度が危険範囲に達した時にその値だけをツイートしたいので、まずはこれを作成します。

        • auth.py

        # ' ' 内にApplication Management で表示された文字列を入れる

        consumer_key  = ''
        consumer_secret = ''
        access_token = ''
        access_token_secret = ''

        • twitter_emergency.py

        #!/usr/bin/env python                                                           
        # -*- coding: utf-8 -*- 

                                                                

        from twython import Twython
        from auth import (
            consumer_key,
            consumer_secret,
            access_token,
            access_token_secret
        )
        import sys

         

        twitter = Twython(
            consumer_key,
            consumer_secret,
            access_token,
            access_token_secret
        )

         

        args = sys.argv
        argc = len(args)

         

        if argc != 4:
          sys.exit(1)

         

        temp = args[1]
        humi = args[2]
        color = args[3]

         

        if color == '1':
          msg = '早めに対処してください。'
        elif color == '2':
          msg = 'すぐに対処してください。'
        else:
          sys.exit(0)

         

        message = "【緊急発信】気温"+temp+"℃、湿度"+humi+"%です。"+msg
        twitter.update_status(status=message)

         

        スクリプトの内容は、第一引数で気温、第二引数で湿度、第三引数で緊急度を受け取って、それをつぶやくというものです。

         

        実行結果は以下です。

         

        # python twitter_emergency.py 20.9 38.3 1

         

         

        2.写真付きツイート

         

         

        写真を添付する場合のツイートプログラムです。

        twython APIを使用する方法がわからなかったので、やや複雑な記述となってしまいました。(今後のリファクタリング課題です・・・)

         

        • oauth.py (注:auth.py と同階層におくこと)

        from requests_oauthlib import OAuth1Session
        from auth import (
            consumer_key,
            consumer_secret,
            access_token,
            access_token_secret
        )

        def CreateOAuthSession():
            return OAuth1Session(consumer_key,consumer_secret,access_token,access_token_secret)

        • twitter_media.py

        #!/usr/bin/env python                                                           
        # coding: utf-8  

                                                                       

        import sys
        import json
        import oauth
        from requests_oauthlib import OAuth1Session

         

        url_media = "https://upload.twitter.com/1.1/media/upload.json"
        url_text = "https://api.twitter.com/1.1/statuses/update.json"

         

        args = sys.argv
        argc = len(args)

         

        if argc != 4:
          sys.exit(1)

         

        temp = args[1]
        humi = args[2]
        fname = args[3]

         

        # OAuth認証 セッションを開始                                                    
        twitter = oauth.CreateOAuthSession()

         

        # 画像投稿                                                                      
        files = {"media" : open(fname, 'rb')}
        req_media = twitter.post(url_media, files = files)

         

        # レスポンスを確認                                                              
        if req_media.status_code != 200:
            print ("画像アップデート失敗: %s", req_media.text)
            exit(2)

         

        # Media ID を取得                                                               
        media_id = json.loads(req_media.text)['media_id']
        print ("Media ID: %d" % media_id)

         

        # Media ID を付加してテキストを投稿                                             
        params = {'status': "現在の気温は"+temp+"℃、湿度は"+humi+"%です。", "media_ids": [media_id]}
        req_media = twitter.post(url_text, params = params)

         

        # 再びレスポンスを確認
        if req_media.status_code != 200:
            print ("テキストアップデート失敗: %s", req_text.text)
            exit(2)

         

        print ("OK")

         

        スクリプトの内容は、第一引数で気温、第二引数で湿度、第三引数でファイルパスを受け取って、それをつぶやくというものです。

         

        実行結果は以下です。

        # python twitter_media.py 25.8 54.3 test.jpg

         

         

         

        3.まとめ

         

        実は私、twitter をやったことがなかったので、アカウントを登録するところからはじめました(笑)

        当然ながら Application Management も初めて使いましたが、なるほど世間のtwitterのボットはこういうのを使って実装されているんだろうな、と勉強になりました。

         

        次回はいよいよ最終編。

        htu21lib (第2回で動作確認した温度・湿度の監視ライブラリ)のメインルーチンに手を加えながら、最終的な監視プログラムを作っていきます。

         


        Raspberry Pi3 でペット監視システムをつくってみる(その4)

        0

          前回、温度・湿度センサーと7セグLEDまでのハードウェアが準備出来たので、

          ここからはソフトウェアということで、Webカメラと接続するためのソフト(motion)を準備していきます。

           

          motion

           

          ラズパイで監視カメラといえば、motionです。

          このブログでも扱ったことがありますし、導入事例はWeb上にもたくさん公開されているので、設定ファイルのみ記載しておきます。

           

          1./etc/motion/motion.conf

           

          • Daemon(デーモンの設定)

          daemon on

          • Capture device option (WEBカメラの設定)

          # キャプチャ画像の幅と高さを好みに応じて設定する

          width 640

          height 480

          • Image File Output (画像出力の設定)

          # 動き検知時の画像出力は、今回不要なので無効にする

          output_pictures off

          • Snapshots (スナップショット。今回主に使う機能)

          # スナップショットを撮るインターバル。3600とすることで、一時間に一回(毎時0分0秒)にスナップショットが保存される

          snapshot_interval 3600

          • Target Directories and filenames For Images And Films (保存するディレクトリ・ファイル名等の設定) 

          #画像保存先を/var/lib/motionから好みに応じて変更。

          #変更する場合は、変更先ディレクトリの権限にも注意。

          target_dir /home/pi/rabbit/motion 

           

          #スナップショットのファイル名を好みに応じて変更。 

          snapshot_filename %Y%m%d%H%M%S-snapshot

          ここで指定するディレクトリ名とファイル名は、後で作成するプログラムで使用します。

           

           

           

           

          2./etc/default/motion

          start_motion_deamon=yes

           

          3.今回使う機能について

           

          motion は、設定ファイルから様々なカスタマイズができます。

          今回実現したいのは、「ツイッターでペットの状態を定期ツイートするときの画像を保存すること」なので、これが容易にできるスナップショット機能を使用します。

          ディレクトリやファイル名を自在に変えることができる点も非常に使い勝手が良いですね。

           

          次回は、プログラム内からツイッターでつぶやくためのTwitter Application Managementの導入と、そのスクリプトの作成です。


          Raspberry Pi3 でペット監視システムをつくってみる(その3)

          0

            前回、温度・湿度センサーの動作確認までできたので、

            今回は、その値を出力するための7セグLEDの調達と実装、動作確認までを書きます。

             

            7セグLED

             

             

            Adafruit I2C通信の7セグメント4桁ディスプレイ (赤色)(スイッチサイエンス) を使用します。

            温度・湿度センサー同様、I2C(アドレスは0x70から0x77の間)を使用して通信を行います。

             

             

            1.ピンヘッダとBackpack 基板(4箇所)、Backpack基板とディスプレイ(14箇所)をはんだ付けする。

             

             はんだ付けの手順等は、チュートリアルが参考になります。

             

             

            2.Raspberry pi と センサーをブレッドボード等で接続。

             

             Raspberry pi の 3.3V, GND, SDA, SCL のそれぞれの端子を、基板の + , - , D, C

             に対応するようにつなぎます。

             

             前回記事の HTU21D-F と合わせると、以下のような接続になります。

             

             

              

             

            3.アドレス確認

             

             

             i2cdetect コマンドで見ると、アドレス0x70 が表示されます。

             0x40 は前回のHTU21D-F のものです。

             $ i2cdetect -y 1

                 0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
            00:          -- -- -- -- -- -- -- -- -- -- -- -- --
            10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
            20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
            30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
            40: 40 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
            50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
            60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
            70: 70 -- -- -- -- -- -- --    
                               

             アドレスは0x70から0x77までが使用できるようですが、衝突していなければ変える必要はないと思います。

             今回は、このままでいきます。

             

            4.ライブラリのダウンロード、セットアップ

             

             https://github.com/adafruit/Adafruit_Python_LED_Backpack からダウンロードします。

             

             ダウンロードしたファイルを解凍し、セットアップを行います。

             

            $ unzip master.zip

            $ sudo python setup.py install

             必要ソフトをインストールします。

            $ sudo apt-get install -y git build-essential python-dev python-smbus python-imaging python-pip python-pil

             

            5.動作確認

             

             現在の時刻を表示させる python のサンプルプログラムを実行してみます。

            $ cd examples/
            $ sudo python ex_7segment_clock.py

             

             4桁のLEDが光って、時刻が表示されれば完璧です!

             

             

             また、ライブラリのセットアップ〜使用方法は、Adafruitのページが参考になります。

             

             

            6.プログラム改造(表示させる数値を引数で渡す)

             

             ライブラリを使って動作を確認するだけ・・・では終わりません。

             ex_7segment_clock.py をベースにして、2つの引数を渡してその値を上位2桁、下位2桁にそれぞれ表示させるプログラムを書いてみます。

             

            • 7segment-2arg.py

            #!/usr/bin/python

             

            import time
            import datetime
            import sys
            from Adafruit_LED_Backpack import SevenSegment

             

            # ===========================================================================
            # Clock Example
            # ===========================================================================
            segment = SevenSegment.SevenSegment(address=0x70)

             

            # Initialize the display. Must be called once before using the display.
            segment.begin()

             

            args = sys.argv
            argc = len(args)

             

            if argc != 3:
              sys.exit(1)
            #else:
            #  print('argment:'+args[1]+' '+args[2])

             

            left = int(args[1])
            right = int(args[2])

             

            if left > 99:
              left = 99
                
            if right > 99:
              right = 99

             

            segment.clear()
            # args[1]
            segment.set_digit(0, left / 10)     # Tens
            segment.set_digit(1, left % 10)     # Ones
            # args[2]
            segment.set_digit(2, right / 10)   # Tens
            segment.set_digit(3, right % 10)   # Ones
            segment.set_colon(1)

             

            segment.write_display()

            • 実行

            $ sudo python 7segment_2arg.py 24 55

             引数で渡した 24 と 55 が表示されればOKです。

             

             あとは、前回の温度湿度センサーのプログラム内部から、センサで読み取った値を引数にしてコマンドを実行するだけ。

             これで温度湿度計はほぼ完成になります。

             

             次回は、Webカメラの監視ソフト(motion)のセットアップを行います。

             


            Raspberry Pi3 でペット監視システムをつくってみる(その2)

            0

              まずはじめに、ハードウェアの調達、実装から行います。

               

              必要となるのは、

              • 温度・湿度センサー
              • 7セグメントLED
              • Webカメラ

              の3つ。Webカメラについては、一般的なものでよいので割愛します。

               

              以前にラズパイでI2Cを使った経験があるので、今回もI2Cを使ってみたいと思います。

               

              I2Cを使うために

               

              Raspberry Pi の設定を変更しておく必要があります。

              $ sudo raspi-config
              

              コンフィグが開くので、Interfacing Options -> I2C -> enable に設定。finish で再起動。

               

               

              温度センサー

               

              Adafruit HTU21D-F 温度/湿度センサ(I2C通信)(スイッチサイエンス)を使用します。

              I2C接続が可能です。

               

              1.ピンと基板をはんだ付けする。

               

               やけどしないようにしましょう!

               

              2.Raspberry pi と センサーをブレッドボード等で接続。

               

               ピン配置は以下になります。

              Raspberry Pi HTU21D-F
              3.3V(1) Vin
              GND(6) GND
              SDA(3) SDA
              SCL(5) SCL

               

              3.アドレス確認

               $ i2cdetect -y 1

                   0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
              00:          -- -- -- -- -- -- -- -- -- -- -- -- --
              10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
              20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
              30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
              40: 40 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
              50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
              60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
              70: -- -- -- -- -- -- -- --    
                                   

               

               アドレスは、0x40ということが分かります。

               

               

              4.ライブラリのインストールとビルド

               

               GitHubに公開されているものがあるので、これをダウンロード・解凍して、ビルドします。

              $ wget https://guihub.com/bbx10/htu21dflib/archive/master.zip
              $ unzip master.zip
              $ ./build.sh

               

               多少warning がでますが、htu21dflib という実行ファイルができれば成功です。

               

              5. 実行

               

               htu21lib を実行してみると・・・

              $ ./htu21dflib
              opening /dev/i2c-1
              27.6 57.0
              27.6 58.1
              27.6 58.4
              27.6 58.2
              27.6 58.0
              27.6 57.8
                 :
                 :

               1秒間隔で、センサから取得した温度と湿度を表示します。

               もしエラーになる場合は、先述のI2Cアドレスが取得できているかどうか、ピンの接続は正しいか、確認しましょう。

               

               

              6. まとめ

               

              今回は、温度湿度センサーをラズパイにつないで、動作を確認しました。

              動作確認といっても、ライブラリをビルドして実行しただけですが、目的の値を取得できると楽しくなります。

               

              このライブラリは、ソースコードは c で書かれており、main関数の入っている htu21dflib.c に手を加えていくと色々なことが実現できそうです。

              7セグの表示や、ツイッターとの連携も、このプログラムを起点に行っていく予定です。

               

              次回は、7セグLEDの調達と実装を行っていきます。

               

               

               


              Raspberry Pi3 でペット監視システムをつくってみる(その1)

              0

                最近、自宅でペットとしてうさぎを飼い始めました。

                 

                とてもかわいく初心者にとっても飼いやすいですが、暑さに弱いので、温湿度の管理には注意が必要なのだそうです。

                (夏場は24時間エアコン稼働です。)

                 

                そこで、定番であるが、Raspberry Pi3 でこれら条件とついでにペットの様子が監視できないかと思い、作ってみることにしました。

                 

                ざっくりとした要望は、以下。

                 

                • 温度・湿度をセンサーから取得して、7segment LED 上に表示させたい(温度・湿度計としての役割)
                • Webカメラを繋いで、LANネットワーク内でペットの映像が見れると嬉しい(※インターネットには公開しない)
                • 自宅外にいるときにペットの様子がわかるよう、温度・湿度とカメラのスナップショットをツイッターで定期的につぶやくようにしたい。
                • また、危険な温度・湿度となったときには定期的なつぶやきとは別に、ツイートするようにしたい。

                 

                 

                写真1)システム外観

                 

                写真2) 気温・湿度をツイートする。

                 

                 

                 

                基本的なスタンスは、

                 

                「不要な労力はかけず、あるもの(ライブラリ等)は最大限活用する」

                 

                個人的な事情として、私自身IT業界から離れて2年以上経つため、完璧なものを作る自信はありませんが、まずは動かすところまでを目指してつくっていきます。

                 

                #細かいコードの記述等、ツッコみどころもあるかもしれませんが、ご容赦を。

                 

                まずは次回、ハードウェア(温度・湿度センサ、7seg-LED)の調達、実装から。

                 


                読書記録[2016.1]

                0
                  2016年1月の読書メーター
                  読んだ本の数:7冊
                  読んだページ数:2920ページ
                  ナイス数:245ナイス

                  決戦!大坂城決戦!大坂城感想
                  真田幸村や豊臣秀頼などの大阪の陣のキャラクターたちを豪華作家陣が描く「決戦」シリーズ第2弾。今回は有名どころを王道で描くというよりは、マイナーな人物にフォーカスを当てたり、奇をてらった内容のものが多いように感じた。「日本一の兵」はかなり斬新な切り口になるので、スタンダードな真田幸村像を期待している人にとっては期待外れかもしれない。全体的に家康が悪役のものが多いので、もう少し家康寄りの視点で描いた作品があったらよかったなと。冲方丁(豊臣秀頼)と伊藤潤(福島正守)が特によかった。
                  読了日:1月31日 著者:葉室麟,冲方丁,伊東潤,天野純希,富樫倫太郎,乾緑郎,木下昌輝
                  ローマ法王に米を食べさせた男  過疎の村を救ったスーパー公務員は何をしたか?ローマ法王に米を食べさせた男 過疎の村を救ったスーパー公務員は何をしたか?感想
                  「可能性の無視は最大の悪策」をモットーに過疎集落を救ったスーパー公務員がいる。マイナスをプラスに変える発想力、失敗を恐れずやってみようとする行動力、人を巻き込む求心力、何もかもがすごい!住民に反対されても、味方が少なくても、首尾一貫した姿勢を持ち続けることは並大抵のことではないはず。公務員とはいえ異色の経歴を持つ人なので、すべての人が高野さんと同じようにはいかないけれど、出る杭を打たずに支えることならできるはず。公務員かどうかに関わらず読む価値のある、本当に面白い一冊だと感じた。
                  読了日:1月25日 著者:高野誠鮮
                  アルジャーノンに花束を〔新版〕(ハヤカワ文庫NV)アルジャーノンに花束を〔新版〕(ハヤカワ文庫NV)感想
                  "知能"と"愛情"とは車の両輪で、どちらか一方だけを備えていればよいというものではない。手術によって知能を手に入れたチャーリーは、皮肉にもその頭脳ゆえに周りから疎まれてしまい、人間の本質に気づいてしまう。そんな周囲の状況の変化にも挫けず、やがて退行していく知能にも目を背けず、人に対する思いやりの心を忘れないチャーリーの姿にただ心を打たれた。後半は読み進めるのも辛くなってくるけれど、最後の一行のチャーリーらしい一言に救われる。不朽の名作と呼ぶに相応しい、本当に素晴らしい作品。
                  読了日:1月17日 著者:ダニエル・キイス
                  たったひとつの冴えたやりかた (ハヤカワ文庫SF)たったひとつの冴えたやりかた (ハヤカワ文庫SF)感想
                  タイトルが印象的な言わずと知れた名作。ある問題を解決するための方法は一つしないけれど、それがどうしようもなく大きな犠牲を伴うとしたら…誕生日プレゼントにもらった宇宙船で一人宇宙に飛び出した少女・コーティーは、旅路の果てに大きな選択を迫られることになる。自分がコーティーと同じ状況に立たされたら、同じように決断できるだろうかと、読み終えてからも暫く考えてしまった。読みやすさとインパクトでは表題作が抜きんでているが、感動作のダークホースは「衝突」かもしれない。3作とも心して読むべし。
                  読了日:1月16日 著者:ジェイムズ・ティプトリー・ジュニア
                  虚構推理 (講談社文庫)虚構推理 (講談社文庫)感想
                  深夜に現われ鉄骨で人を襲う亡霊「鋼人七瀬」。事件のターゲットが得体の知れない怪物なら、その解決方法も"虚構"の論理を持って立ち向かうという斬新なミステリとなっている。奇抜な設定や個性的なキャラクターと、それに比肩する精緻な論理構成や推理劇が素晴らしく、両者をさらりと融合してしまうあたりに作者の手腕を感じる。「本格ミステリ」とするには賛否が分かれそうではあるが、個人的にはこういう挑戦的なものをどんどん創ってほしいと思う。コミックス原作だけでなく、小説方面での活躍をもっとしてほしい。
                  読了日:1月11日 著者:城平京
                  真田三代 下 (文春文庫)真田三代 下 (文春文庫)感想
                  「表裏比興の者」昌幸とその息子信之、そして「天下一の兵」幸村。乱世を生き抜くためにそれぞれが選んだ道が異なったとしても、親兄弟が敵味方に分かれて戦うことになったとしても、真田家の誇りを守ろうとする共通した想いがある。そんな父子三人の別れのシーンには思わず涙が出そうになった。大坂の陣で父親譲りの戦法で徳川軍を苦しめた幸村はもちろんのこと、昌幸・幸村の助命を家康に懇願し真田家を存続させた信之の人生にも興味が湧いた。大河ドラマではこの兄弟がどう描かれるのか注目してみたい。
                  読了日:1月5日 著者:火坂雅志
                  真田三代 上 (文春文庫)真田三代 上 (文春文庫)感想
                  幸隆、昌幸、幸村、三代にわたりその名を戦国史に刻んだ真田家。乱世を生き抜くための知略と決断力、弱者としての矜持など、群雄割拠の時代をどのように渡り歩いたかが良く描かれている。勝頼の代で大きく傾く武田とは対照的に、幸隆から昌幸、昌幸から幸村、親から子へと引き継がれる才気にこそ、真田家の強さがあるのだと思う。人質に出され離れて暮らしていても追ってしまうのが親の背中なのか、毛嫌いしていた父・幸隆にだんだん似ていく昌幸も面白かった。その昌幸を見て幸村がどのような人生を歩んでいくのか、下巻が楽しみ。
                  読了日:1月4日 著者:火坂雅志

                  読書メーター

                  読書記録[2015.12]

                  0

                    2015年12月の読書メーター
                    読んだ本の数:6冊
                    読んだページ数:2031ページ
                    ナイス数:285ナイス

                    本能寺遊戯 (創元推理文庫)本能寺遊戯 (創元推理文庫)感想
                    表紙に惹かれて手に取ったものの、予想外の本格的な歴史考察に大苦戦。 表題作や「大奥番外編」は時代的についていけたけれど、「女帝大作戦」は完全に流し読み…歴史と一口にいっても色々あるんだなと、自分の知識の偏狭さを痛感した。ヒメのように史実を追求するのもよし、アサのように自由に妄想するもよし、ナスチャのようにゲームやアニメから入るのもよし、歴史の楽しみ方は人それぞれだと思う。考え方の違いはあるにせよ、こんな風に歴史談義できる仲間がいるというのは羨ましいですね。
                    読了日:12月26日 著者:高井忍
                    ちょっと今から仕事やめてくる (メディアワークス文庫)ちょっと今から仕事やめてくる (メディアワークス文庫)感想
                    さくっと読めて面白かった。こういうタイトルの本が売れるということは、それだけ多くの人が仕事で悩みを抱えながら生きているということなんだろう。仕事だから思い通りにいかないことや辛いこともあるけれど、我慢し過ぎて自分を失ってしまうのはよくない。生きることが本当に辛くなったら環境を変えてみたっていい。それは決して逃げることではなくて、新しいことへの挑戦だ。ヤマモトや隆の母親のように、悩んでいる誰かの背中を押せるような人になりたいなと思う。
                    読了日:12月20日 著者:北川恵海
                    孤独の価値 (幻冬舎新書)孤独の価値 (幻冬舎新書)感想
                    飲み会は絶対一次会で帰るし、一人旅も平気でできる、自分もどちらかというと孤独が好きなタイプの人間なので、こういうテーマの本を読むと自分の思考が間違いじゃないんだなと安心する。孤独でいるときの「寂しさ」よりも複数人でいるときに感じる「寂しさ」のほうが辛いと思うし、自分のためにする読書や勉強は一人じゃないとできない。一人の時間と人と会う時間をうまくバランスとりながら、孤独とうまく付き合っていけるような大人になりたいと思う。
                    読了日:12月20日 著者:森博嗣
                    死ぬまで仕事に困らないために20代で出逢っておきたい100の言葉死ぬまで仕事に困らないために20代で出逢っておきたい100の言葉感想
                    仕事、時間、勉強、友情、恋愛など、生きる上で重要な要素を10個のカテゴリに分け、仕事に"困らない"ためのエッセンスを凝縮した本。群れから離れることの大切さとか、社会人にとっての勉強の意味とか、どれも共感できるものばかり。こういうことは上司や先輩から直接教わることではないと思うし、本という媒体だからこそ心の中にスッと入ってくるのかもしれない。個人的ベストは「遠回りの蓄積こそあなたの財産」。背中を押してくれるような言葉に出会うと、自分の人生が少しだけ誇らしく思えてくる。
                    読了日:12月17日 著者:千田琢哉
                    きいろいゾウ (小学館文庫)きいろいゾウ (小学館文庫)感想
                    スローライフな夫婦生活と子供っぽい関係に違和感を覚えつつ、読むのに少し手間取りながらもなんとか読了。独りが寂しいからと依存するような関係にはなりたくないけれど、互いを理解して欠点を埋め合わせていけるようなムコさんツマさんのような関係は、すごく素敵だと思う。何かを捨てて大切なものを手に入れるという「きいろいゾウ」の取り入れ方も巧く、単調な物語に良いアクセントになっている。西加奈子さんは初めて読んだけれど、他の作品も読んでみたくなった。
                    読了日:12月15日 著者:西加奈子
                    神様のカルテ 3 (小学館文庫)神様のカルテ 3 (小学館文庫)感想
                    本とは不思議なもので、ときどき出会う時期が運命付けられているように感じることがある。自分は医者ではないけれど、仕事で少し悩んで一つ大きな決断をしたタイミングで、この本を開いた。医師としての覚悟が足りているのか、自分の進む道は本当に正しいのか、悩む栗原一止の姿は、そっくりそのまま自分の状況に投影される。兎角生きづらい人の世だけど、そんな中で前に進み続けることの大切さを教えてくれる素晴らしい作品。大きな決断をした一止の今後も気になるので、続編に期待!
                    読了日:12月7日 著者:夏川草介

                    読書メーター

                    読書記録[2015.11]

                    0
                      冊数は少ないけど、その分印象に残る本が多かった。
                      4冊全部捨てがたいけれど、ベストを挙げるなら「ペンギン・ハイウェイ」。
                      森見さん=京都+阿呆大学生という印象が強いけど、色々な意味で裏切られた。
                      感動の結末に思わず涙。

                      2015年は目標の100冊は達成できなさそう。
                      一冊でも多く読めるよう、12月は頑張って読む!

                      ★  ★  ★

                      2015年11月の読書メーター
                      読んだ本の数:4冊
                      読んだページ数:1501ページ
                      ナイス数:203ナイス

                      ペンギン・ハイウェイ (角川文庫)ペンギン・ハイウェイ (角川文庫)感想
                      一日一日、ぼくは世界について学んで、昨日の自分を上回る― 小学生のアオヤマ君の日常は、テーマを見つけては研究に勤しんだり、歯科医院のお姉さんとのおしゃべりをしたりと大忙し。突然町に現れたペンギン、お姉さんの不思議な能力、未知の物体<海>の登場など、さまざまな謎を仲間とともに追いかけていく中で見つけ出した真実とは?それは子どもが味わうには少し苦いブラックコーヒーのようではあるが、失意を乗り越えたアオヤマ君の決意に感動した。森見さんのユーモアと魅力が詰まった素敵な作品。
                      読了日:11月29日 著者:森見登美彦
                      ジャイロスコープ (新潮文庫)ジャイロスコープ (新潮文庫)感想
                      「一人では無理がある」は"鉄板"の面白さ。ファンタジーとリアルを巧く調和させた世界観がすばらしい。「彗星さんたち」は新幹線の清掃員を描いたお仕事小説かと思いきや、意外な方向へ持っていかかれ最後のオチにやられる。様々な切り口(角度)ながらも安定感を持たせた7つの物語は、まさにおもちゃの"地球ゴマ"のよう。巻末のインタビューでは、伊坂さん自身も読者を楽しませるために模索しながら書いているんだなと感じた。「らしさ」を求めず、変な固定観念を持たず、今後の作品にも期待したい。
                      読了日:11月28日 著者:伊坂幸太郎
                      ノエル: -a story of stories- (新潮文庫)ノエル: -a story of stories- (新潮文庫)感想
                      「光の箱」は Story Seller で既読だったけれど、こういう優しさを感じさせるミスリードはすごく好み。絵本作家が作った物語は少女や老人の人生に影響を与え、そして作家自身も知らず知らずのうちに影響を受けている…3つの短編をそれぞれリンクさせたエピローグも感動的。登場人物それぞれが作中の物語に救われるのと同じように、読者もまたノエルという名の祈りに救われる。生きる上でなぜ物語が必要なのか、その答えを教えてくれる素敵な本ではないでしょうか。
                      読了日:11月24日 著者:道尾秀介
                      剣と紅 戦国の女領主・井伊直虎 (文春文庫)剣と紅 戦国の女領主・井伊直虎 (文春文庫)感想
                      井伊家と言えば徳川四天王として名高い井伊直政を真っ先にイメージするが、本作は直政の養母・直虎を主人公に描いた物語。男が主役の戦国時代に"女城主"としてあらゆる苦労を一身に背負い、井伊家を断絶の危機から守ろうとする姿は、まさに名将そのもの。主人公が悪い未来を予知する能力を持っているというファンタジックな設定も、物語として全く違和感がなく、斬新なテイストの歴史小説として仕上がっている。再来年の大河ドラマは柴崎コウ主演の「おんな城主直虎」。地元浜松が舞台ということで今から楽しみ。
                      読了日:11月15日 著者:高殿円

                      読書メーター

                      Raspberry Pi + Durio Sound でハイレゾ再生環境を作る(その2)

                      0

                        Durio Sound を接続したはいいものの、音を出すには I2S を使わないといけない。
                        Raspbian ではカーネルの再構築が必要でハードルが高いので、色々調べて便利そうな Volumio を使うことにした。

                        Volumio のインストール

                        1) イメージの焼き込み
                        Raspbian のときと同じ。micro SD を用意して、イメージを焼きこむ。
                        このページを参考にするといい。

                        2) 起動
                        ネットワークケーブルを繋いで、電源 ON。
                        volumio で名前解決してくれるので、 IP アドレスを意識する必要がない。
                        webサーバや samba など各種サービスもデフォルトで動いているので、何も設定しなくても以下ができる。
                        • エクスプローラから samba 共有フォルダの閲覧
                        • ssh 接続 (ユーザ名:root , パスワード:volumio)
                        • http://volumio で GUI にアクセス


                        ssh でログインも "volumio" で。
                        ロゴはちょっとダサい(笑)

                        Volumio で音楽を再生するまで

                        3) 音楽を再生するための設定
                        http://volumio でアクセスして、ライブラリの設定や DAC の設定をしていく。

                        3-1) ライブラリの設定
                        音楽ファイルがないことには再生しようがないのでその準備。
                        Menu > Library から、DB を作成します。
                        USB でもできますが、私は Ubuntu サーバーに音楽ファイルを置いているので、NAS mounts を選択。

                        [SAVE MOUNT] で、設定を保存。
                        [UPDATE LIBRARY] で ライブラリ(DB) が生成される。


                        Browse タブから NAS を掘っていくと、再生したいファイルが見える。
                        # ちなみに再生するのは Kalafina の ハイレゾ音源です。

                        3-2) Audio 設定
                        DAC (Durio Sound Basic) から音を出したいので設定をする。
                        設定は、Menu > Playback から。
                        Audio Output を sndrpihifiberry に設定します。



                        Mixer Type を software にすると VOLUMIOからボリューム制御をができるようです。
                        ただ、but affects audio quality とあるので、微妙かもしれません。

                        3-3) 聴いてみる!
                        ライブラリから再生したいファイルを選んで、いざ再生。
                        Durio Sound から音が出れば成功。




                        無線ネットワークにつなげば、スマホからも制御可能。当たり前だけど、ちょっと感動。
                        # スマホ標準のブラウザだと表示が崩れたので、firefox を使いました。

                        まとめ

                        ◇VOLUMIO について

                        samba や web サーバーがはじめから動いているし、もはや IP アドレスも設定する必要はないという親切設計。
                        Raspberry PI で音楽を再生させるなら VOLUMIO 一択と言っても過言ではないほど、素晴らしいです。
                        (Linux を勉強しようとする人には不向きですが...)

                        ◇ハイレゾについて

                        以前の記事で、普通の音源と変わんないなーとか書いてしまったことを全力で後悔。
                        今回の環境で聴いてみると、「明らかに音が違う!」と感じました。
                        ハイレゾ対応プレーヤーが欲しいと思っている方は、Raspberry Pi を使ってみてはどうでしょうか。
                        Raspberry Pi + Durio Sound の場合は1万2000円程度。コストに見合う満足感はあると思います!

                         

                        | 1/8PAGES | >>

                        PR

                        calendar

                        S M T W T F S
                        1234567
                        891011121314
                        15161718192021
                        22232425262728
                        293031    
                        << March 2020 >>

                        counter

                        ブログパーツUL5

                        books

                        ひろの最近読んだ本

                        selected entries

                        categories

                        archives

                        recent comment

                        links

                        profile

                        search this site.

                        others

                        mobile

                        qrcode

                        powered

                        無料ブログ作成サービス JUGEM