現: 2023-04-13 (木) 10:41:25 yuji ソース
Deleted an attach file: sensor.py at 2023-04-13 (木) 11:27:12, Deleted an attach file: RPZ-IR-Sensor.png at 2023-04-13 (木) 13:38:11, Deleted an attach file: tsl2561.py at 2023-04-18 (火) 05:30:27, Deleted an attach file: bme280i2c.py at 2023-04-22 (土) 09:30:46 at 2023-04-22 (土) 09:34:00 at 2023-04-22 (土) 09:34:12 at 2023-04-22 (土) 10:23:32 at 2023-04-22 (土) 10:56:56 at 2023-05-04 (木) 17:50:37 at 2023-05-04 (木) 18:01:25
Line 1: Line 1:
 +* 温度・湿度などの計測 [#n087cf3f]
 +部屋の温度・湿度等をRaspberry Pi/RPZ-IR-Sensorで計測して,データをDBに保存して可視化するシステムを作成する。~
 +使用するのはRaspberry Pi Zero Wで,RPZ-IR-Sensorをスタックしてもピッタリ。~
 +
 +** RPZ-IR-Sensor [#s8f5632c]
 +#ref(../WEBリモコン/学習リモコンを作る/RPZ-IR-Sensor.png,,50%)
 +[[RPZ-IR-Sensor>https://www.indoorcorgielec.com/products/rpz-ir-sensor/]]は[[Indoor Corgi>https://www.indoorcorgielec.com/]]社が販売しているRaspberry Pi/Zero用の拡張ボードで,温度・湿度・気圧・照度の計測機能と赤外線リモコン機能が搭載されている。以前,[[Amazonから>https://amzn.to/3H1Spwc]]5000円ぐらいで購入した。~
 +Raspberry Piの40pin拡張コネクタにスタック装着して使用する。~
 +- BME280(温度・湿度・気圧センサー)搭載~
 +温度・湿度・気圧を測定するセンサーでA/Dコンバーター内蔵している。~
 +スタックして使用するのでRaspberry Piの発熱の影響を受けてしまう。~
 +インターフェースはI2C。I2C拡張コネクターがあるので付属しているBME280搭載の拡張ボードを接続できる。これを使うとRaspberry Piの発熱の影響をあまり受けずに計測できる。~
 +- TSL2561 光(照度)センサー搭載~
 +周囲の明るさを計測するための光(照度)センサー。~
 +センサーはA/Dコンバータを内蔵している。インターフェースはI2C。~
 +- 赤外線送受信機能~
 +赤外線送信および赤外線受信機能を搭載。~
 +赤外線送信用のLEDは,チップLEDを3個搭載して広範囲に送信できるようになっている。~
 +この機能を使って[[学習リモコン>../WEBリモコン/学習リモコンを作る]]を作っている。~
 +- LED,スイッチ搭載~
 +LEDは4色(緑,黄,青,白)の4個のLED,スイッチは小型タクトスイッチを2個搭載している。~
 +
 +** データ保存用のDBを用意する [#w5fa2e5c]
 +自前のサーバーでMariaDBを使用しているので,そこにRaspberry Piで計測データを保存するDBを作成することにした。~
 + DB:      envdb
 + TABLE:  iot
 + COLUM:  id            int auto inc
 +         rooms          varchar(50)
 +         time          datetime
 +         temperrature  float
 +         humidity      float
 +         pressure      float
 +         illuminance    float
 +カラムは,id,rooms(部屋の名前), time(日付時間),temperrature(温度),humidity(湿度),pressure(気圧),illuminance(照度)で作成した。~
 +
 +*** DBの作成 [#o06bdaae]
 +以下のコマンドでDB envdbを作成する。~
 + $ mysql -u root -p
 + MariaDB[(none)]> create database envdb;
 + MariaDB[(none)]> grant all privileges on envdb.* to  yuji@"%" identified by 'zzzzzzzz' with grant option;
 + MariaDB[(none)]> flush privileges;
 +
 +テーブルiotを作成する。
 + MariaDB[(none)]> use envdb;
 + MariaDB[(envdb)]> create table iot (id int not null auto_increment,rooms varchar(50), time datetime, temperature float, humidity float, pressure float, illuminance float,primary key (id)) auto_increment=1;
 +
 +テーブルの確認をする。~
 + MariaDB[(envdb)]> show tables;
 + +-----------------+
 + | Tables_in_envdb |
 + +-----------------+
 + | iot            |
 + +-----------------+
 + 
 + MariaDB[(envdb)]> show columns from iot;
 + +-------------+-------------+------+-----+---------+----------------+
 + | Field      | Type        | Null | Key | Default | Extra          |
 + +-------------+-------------+------+-----+---------+----------------+
 + | id          | int(11)    | NO  | PRI | NULL    | auto_increment |
 + | rooms      | varchar(50) | YES  |    | NULL    |                |
 + | time        | datetime    | YES  |    | NULL    |                |
 + | temperature | float      | YES  |    | NULL    |                |
 + | humidity    | float      | YES  |    | NULL    |                |
 + | pressure    | float      | YES  |    | NULL    |                |
 + | illuminance | float      | YES  |    | NULL    |                |
 + +-------------+-------------+------+-----+---------+----------------+
 +これで計測データを保存するDBが作成出来た。~
 +
 +** Raspberry Piのソフトウェア [#af88bc7c]
 +Raspberry Pi Zero WのプログラムはPythonで作成した。~
 +
 +*** Pi Zero Wのデバイスドライバー [#p8acb4ca]
 +Raspberry Pi Zero W(Raspbian buster)でI2Cインターフェースを使用できるように,デバイスドライバーをDevice Treeを使ってロード出来るようにする。~
 +''[[/boot/config.txt>https://www.raspberrypi.com/documentation/computers/configuration.html#part3.1]]''に以下を追加する。~
 + dtparam=i2c_arm=on
 +//これで1個目(I2C-1)のI2Cバスが使えるようになる。~
 +
 +''/etc/modules''に以下を追加する。~
 + i2c-dev
 +
 +Raspberry Pi Zero Wを再起動した後,デバイスドライバーがロードされているのとデバイスファイルが作成されているのを確認しておく。~
 + # lsmod | grep i2c
 + i2c_bcm2835            7818  0
 + i2c_dev                7171  0
 + # ls -la /dev/i2c*
 + crw-rw---- 1 root i2c 89, 1  4月 13 04:05 /dev/i2c-1
 +
 +I2Cインターフェースに接続されているデバイスを確認してみる。~
 + $ i2cdetect -l
 + i2c-1  i2c            bcm2835 I2C adapter                    I2C adapter
 + $ i2cdetect -y 1
 +     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
 + 00:          -- -- -- -- -- -- -- -- -- -- -- -- --
 + 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
 + 20: -- -- -- -- -- -- -- -- -- 29 -- -- -- -- -- --
 + 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
 + 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
 + 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
 + 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
 + 70: -- -- -- -- -- -- 76 77
 +RPZ-IR-SensorのBME280(0x76,0x77)とTSL2561(0x29)が接続されているのが確認できる。~
 +
 +i2cdetectコマンドが無い場合は,
 + # apt install i2c-tools
 +でインストールする。
 +
 +*** BME280とTSL2561用のPythonパッケージ [#u0bc12f2]
 +BME280とTSL2561用のPythonパッケージは,[[RPZ-IR-Sensor>https://www.indoorcorgielec.com/products/rpz-ir-sensor/]]のサンプルプログラムに入っていたものを少し修正して使用している。~
 +
 +BME280で温度・湿度・気圧を計測する時に使用するパッケージは''bme280i2c.py''。温度が高く検出されるため修正した。~
 +#code(python,nonumber,bme280i2c.py)
 +
 +TSL2561で照度を計測するパッケージは''tsl2561.py''。照度が0luxの時にdevide by zeroエラーが出るbugを修正した。~
 +#code(python,nonumber,tsl2561.py)
 +
 +*** 温度・湿度・気圧・照度の計測とDB保存プログラム [#p0ba838a]
 +Raspberry Piで計測して計測したデータを,[[Ambient>https://ambidata.io/]]に送信するのと,ローカルのDBに保存するプログラム。~
 +
 +Ambientにデータを送信するためPythonのambientパッケージをインストールした。~
 + $ pip3 install git+https://github.com/AmbientDataInc/ambient-python-lib.git
 +
 +ローカルのDB(MariaDB)と接続するために,PythonのPyMySQLパッケージをインストールした。~
 + $ pip3 install PyMySQL
 +
 +部屋の温度・湿度・気圧・照度を計測してDBへの記録するプログラム''sensor.py''を作成した。~
 +センサーは拡張ボードのBME280を使っている。~
 +#code(python,nonumber,sensor.py)
 +
 +cronで10分ごとにsensor.pyを起動するようにしている。~
 + 0-59/10 * * * *      /home/yuji/work/homesensor/sensor.py -a 2>&1
 +
 +これで10分毎に計測して,計測したデータを[[Ambient>https://ambidata.io/]]に送信し,同時に上記のローカルDBに保存している。~
 +
 +* 計測データの可視化 [#sd9947dd]
 +上記のように計測したデータは[[Ambient>https://ambidata.io/]]とローカルサーバーのDBに保存している。~
 +
 +これで[[Ambient>https://ambidata.io/]]にアクセスして,データをグラフで表示できるようになった。~
 +
 +** Ambientで計測データを見る [#u56ac36c]
 +[[Ambient>https://ambidata.io/]]はIoTデータを可視化するCloud WEBサービスで,無料で使用することが出来る :D ~
 +
 +- [[Ambient>https://ambidata.io/]]からユーザー登録でアカウントを作成する。~
 +- ログインする。~
 +- チャンネルを作成。~
 +「リビングルーム」というチャンネル名で作成した。~
 +チャンネルを作成すると,データ送受信のためのキーが発行されるのでメモする。~
 +- データをAmbientに送信する。~
 +上記のプログラム(発行されたキーを埋め込む)で,Raspberry Pi Zero Wからデータを定期的にAmbientに送信する。~
 +- データをグラフで確認。~
 +データを送信した後は,WEBブラウザでチャンネルを開くとすでにグラフ表示されている。~
 +表示はいろいろカスタマイズ出来るので,好みに設定する。~
 +-- チャンネルの設定~
 +チャンネル情報や場所,色をカスタマイズできる。~
 +場所を表示するようにすると,Google Mapで場所を表示できるようになる。~
 +-- チャートの設定~
 +表示されているグラフの設定アイコンをクリックすると,グラフ表示のカスタマイズが出来る。~
 +サイズを変更したり,一つのグラフにいくつかのデータを同時に表示するようにも出来る。~
 +
 +このようにして,WEBブラウザでチャンネルを表示するとグラフでデータを確認できるようになった。~
 +#ref(ambient.png,,30%)
 +
 +いつでもいろいろな端末から,WEBアクセスすることで計測データを見ることが出来る。~
 +
 +無料でこれだけの機能を提供してもらえるので,1年間のデータ保存期間(2023/05/01から4ヶ月)はしょうがないと思う。
 +- 1チャンネルで8種類のデータに対応。~
 +- 最大8チャンネル作成できる。~
 +- 1チャンネルあたり最大3000データ/1日(約30sに1回)まで使用できる。~
 +- 1チャンネル8個までのチャート表示が可能。~
 +- データーの保存期間は1年間(2023/05/01から4ヶ月)。
 +
 +** Grafanaで計測データを見る [#rdefebd8]
 +Ambientは無料で便利に利用していたのだが,規約が変更になりデータ保存期間が2023/05/01から4ヶ月になってしまう。~
 +そこでローカルDB保存してあるデータを直接グラフ表示することにした。~
 +
 +いろいろ探してみると,[[Grafana>https://grafana.com/grafana/]]というGrafana Labsがオープンソースで開発しているマルチプラットフォームで動作するログ・データ可視化ツールを見つけた。~
 +
 +GrafanaはDBにクエリ問い合わせをして取得したデータを,グラフ等に表示することも出来るようだ。~
 +表示する期間や時間帯を変えたり,パーツ毎に特定のノードだけのデータを表示したり,インタラクティブに可視化を操作することが出来る。~
 +
 +対応しているデータソースやDBは数多くある。データソースプラグインを作成することも出来る。~
 +- [[Graphite>https://graphiteapp.org/]]~
 +- [[Prometheus>https://prometheus.io/]]~
 +- [[Elasticsearch>https://www.elastic.co/jp/elasticsearch/]]~
 +- [[Grafana Loki>https://grafana.com/oss/loki/]]~
 +- [[AWS Cloudwatch>https://aws.amazon.com/jp/cloudwatch/]]~
 +- [[Google Cloud Monitoring>https://cloud.google.com/monitoring?hl=ja]]~
 +- [[Azure Monitor>https://learn.microsoft.com/ja-jp/azure/azure-monitor/overview]]~
 +- [[Zabbix>https://www.zabbix.com/jp]]~
 +- [[OpenTSDB>http://opentsdb.net/]]~
 +- [[InfluxDB>https://www.influxdata.com/]]~
 +- [[MySQL>https://www.mysql.com/jp/]]~
 +- [[PostgreSQL>https://www.postgresql.org/]]~
 +- [[MS SQL Server>https://www.microsoft.com/ja-jp/sql-server/sql-server-downloads]]~
 +
 +これ以外にもいろいろ対応しているようだ。~
 +
 +** Grafanaのインストール [#w858894e]
 +インストールは[[公式サイト>https://grafana.com/docs/grafana/latest/setup-grafana/installation/]]に説明がある。~
 +自前のローカルサーバー(CentOS 7.9)に以下のようにしてインストールした。~
 +
 +Grafanaリポジトリを追加する。~
 +''/etc/yum.repos.d/grafana.repo''を作成する。~
 + [grafana]
 + name=grafana
 + baseurl=https://rpm.grafana.com
 + repo_gpgcheck=1
 + enabled=1
 + gpgcheck=1
 + gpgkey=https://rpm.grafana.com/gpg.key
 + sslverify=1
 + sslcacert=/etc/pki/tls/certs/ca-bundle.crt
 + exclude=*beta*
 +
 +パッケージ管理ツールで,Grafanaをインストールする。~
 + # yum check-update
 + # yum install grafana
 +
 +インストール後にいくつか設定を行った。~
 +Apache経由でアクセスできるようにするため,''/etc/httpd/conf.d/grafana.conf''ファイルを新規作成する。~
 +#code(text,nonumber){{
 +<IfModule mod_proxy.c>
 +  ProxyPreserveHost On
 +  ProxyPass /iot http://xxxx.xxx.xxx.xxx:3000
 +  ProxyPassReverse  /iot http://xxx.xxx.xxx.xxx:3000
 +</IfModule>
 +}}
 +
 +Grafanaの設定ファイル''/etc/grafana/grafana.ini''を編集する。~
 +  :
 + protocol = http
 + http_adr = 192.168.XXX.YYY
 + domain = yueno.net
 + root_url = https://xxxx.xxx/iot
 +  :
 +
 +Apacheを再起動する。~
 + # systemctl restart httpd
 +
 +Grafanaの自動起動を有効にして,起動する。~
 + # systemctl enable grafana-server
 + # systemctl start grafana-server
 + # systemctl status grafana-server
 +
 +** Grafanaでデータを可視化出来るように設定 [#n14ab038]
 +Grafanaで可視化する場合は,Dashboardを作成してDashboard毎に可視化パーツを設定していく。~
 +- Dashboardを作成~
 +- Panelを追加~
 +- データ取得のクエリをセット~
 +
 +全てGrafanaに管理者でログインしてWEBで設定できる。~
 +作成・設定したDashboardは保存出来て,設定をJson形式でexportしてバックアップも出来る。~
 +
 +*** Grafanaにログインする [#va66a2a5]
 +GrafanaへWEBブラウザでURLに https://xxxxxx.xxxx/iot としてアクセスする。~
 +ログイン画面が表示されるので,最初は管理者ユーザーでログインする。~
 + user: admin
 + password: admin
 +でログイン出来る。ログイン後パスワードを変更するように促されるので変更する。~
 +
 +*** 新規のユーザーを作成する [#fba598fc]
 +configuration → users → inviteをクリックして,必要事項を入力する。~
 +ユーザー追加は招待形式みたいだ。メールで招待を通知することも可能。~
 +
 +*** チームを作成する [#u53c531c]
 +Grafanaはユーザーをチームというユーザーグループで管理している。~
 +チーム別にトップ画面を変更することが出来るみたい。~
 +
 +Teams → New teamをクリックして,チーム名を入力した後にCreateでチームを作成できる。~
 +
 +チームを作成したらユーザーを追加する。~
 +Add member → Add to teamでユーザーを追加出来る。~
 +
 +Teamsで作成したチームをクリックするとチームの設定ができる。~
 +Settings → Home dashboardでデフォルトのダッシュボードを設定できる。(前もって☆マークを付けておく必要がある。)
 +
 +*** GrafanaでDBにアクセスする [#l2d18b56]
 +GrafanaでサーバーのDBにアクセスするための設定を行う。~
 +- 画面左のメニューバーの歯車マークのConfigulation → Data sourcesを選択する。~
 +- Add data sourceをクリック~
 +下の方へスクロールしてMySQLを選択して,DBへの接続設定を行う。~
 + Host: DBのIP Address:3306
 + Database: envdb
 + User: yuji
 + Password: ZZZZZZZZ
 +
 +これでGrafanaからMariaDBに接続できるようになる。~
 +
 +*** 新しいダッシュボードの作成 [#r7984afe]
 +Grafanaに新規に作成したユーザーでログインするとデフォルトのダッシュボードが表示されるので,データをグラフ表示するダッシュボードを作成する。~
 +
 +- 画面の左にあるメニューバーのCreateからDashboardを選択して新しいダッシュボードを作成する画面に移る。~
 +- パネル(グラフのこと)を追加する。~
 +新しいダッシュボードにはまだ何も配置されていないため,パネルを作成してグラフを表示させる。~
 +Add panelボタンをクリックしてAdd a new panelを選択すると,パネル設定画面が開きグラフの種類やパラメータが設定できる。~
 +デフォルトパネルは''Time Series''で,横軸が時間でデータをグラフ化出来る。~
 +- 画面下部にDBからデータを読み込む設定をするところがある。この画面のToggle text edit modeをクリックする。~
 +DBからデータを読み込むためのSQLコマンドを編集する画面になるので,以下のように編集した。~
 + SELECT
 +   CONVERT_TZ(time, '+00:00', '-09:00') AS "time",
 +   temperature 温度,humidity 湿度
 + FROM
 +   envdb.iot
 + WHERE
 +   $__timeFilter(time)
 + ORDER BY time
 +ダッシュボード上で表示している時間のデータのみを表示させる場合,そのテーブルにdatetime型のカラムがあればクエリ入力項目のWHERE句に「$__timeFilter(<datetime 型のカラム>)」を設定することで,ダッシュボード上の表示時間と連動するようになる。~
 +- Title設定
 +右上のPanel optionsのTitleに「温度・湿度」と入力し,画面上中央部の時計印のセルをLast 24 hoursに変更して右上のApplyをクリックする。~
 +- 同様にして,気圧と照度も単独のグラフが表示されるようにパネルを作成する。~
 +- ダッシュボードに表示されているパネルは大きさや位置などをマウスで修正できる。~
 +
 +これでダッシュボード画面に戻ると温度・湿度,気圧,照度のデータを表示するグラフが作成できた。~
 +Grafanaでグラフ化できるデータは,「時間の要素を持つ数値データ」のみのようだ。~
 +
 +画面右上の丸い矢印アイコンのRefresh dashboardをクリックすると,アイコンの右にドロップダウンメニューが表示されるため,5sを選択するとグラフが5秒おきに更新されるみたいだ。~
 +最後に,新しく作成したダッシュボードをSave dashboardをクリックして保存する。~
 +
 +これで,計測したデータを可視化出来るように出来た。~
 +#ref(grafana.png,,40%)
 +
 +* I2C通信ポートを別のGPIOを使って行う方法 [#f6300ab2]
 +Raspberry Pi Zero WとRPZ-IR-SensorのBME280とTSL2561との通信はI2Cバスを使用している。~
 +このため,GPIOコネクタの3pinにスイッチ等は接続できない。~
 +
 +Raspbianでは,RPZ-IR-Sensorを改造するなどしてI2Cバスを別のGPIOを使ってソフトウェア的にI2C通信できるようにDevice Treeのoverlay機能にi2c-gpio(デバイスドライバー)が用意されている。~
 +
 +例えば,GPIO5(29pin)とGPIO6(31pin)をI2Cバスとして使いたい場合は,''/boot/config.txt''に以下のように追加する。~
 + dtoverlay=i2c-gpio,bus=2,i2c_gpio_sda=5,i2c_gpio_scl=6,i2c_gpio_delay_us=2
 +i2c_gpio_delay_us=2にすることで,通信速度が通常のI2Cバスと同じ100kbpsになる。~
 +この時,GPIO5とGPIO6の回路にプルアップ抵抗10kΩを実装する必要がある。~
 +
 +GPIO0(27pin)とGPIO1(28pin)は1.8kΩでプルアップされているため,ここを使う場合はハードウェア追加は必要ないと思われる。~
 +  dtoverlay=i2c-gpio,bus=2,i2c_gpio_sda=0,i2c_gpio_scl=1,i2c_gpio_delay_us=2
  

  • PC/RaspberryPi/温度・湿度などの計測 のバックアップ差分(No. All)
    • 現: 2023-04-13 (木) 10:41:25 yuji
      • Deleted an attach file: sensor.py at 2023-04-13 (木) 11:27:12, Deleted an attach file: RPZ-IR-Sensor.png at 2023-04-13 (木) 13:38:11, Deleted an attach file: tsl2561.py at 2023-04-18 (火) 05:30:27, Deleted an attach file: bme280i2c.py at 2023-04-22 (土) 09:30:46 at 2023-04-22 (土) 09:34:00 at 2023-04-22 (土) 09:34:12 at 2023-04-22 (土) 10:23:32 at 2023-04-22 (土) 10:56:56 at 2023-05-04 (木) 17:50:37 at 2023-05-04 (木) 18:01:25

トップ   差分 バックアップ 複製 名前変更 リロード   ページ新規作成 全ページ一覧 単語検索 最新ページの一覧   ヘルプ   最新ページのRSS 1.0 最新ページのRSS 2.0 最新ページのRSS Atom
Counter: 927, today: 2, yesterday: 2