RaspberryPiで温度・湿度・気圧データを音声出力をしてみる。
01_準備物
| 本体 | RaspberryPi3 | |
| 音声合成ソフト | Aquestalkpi | |
| センサー | BME280 | 秋月電子通商 |
| 小さいブレッドボード | BB-601(白) | 秋月電子通商 |
| ジャンプワイヤー(メスーオス) | 秋月電子通商 | |
| タクトスイッチ | DTS | 秋月電子通商 |
| ヘッドフォン | なんでもOK |
GPIO(BCM)の24とGNDのあいだにタクトスイッチを付けただけ。

BME280はここの接続通り。
タクトスイッチONでイヤフォンジャックから時刻と環境観測データを出力する。

02_RaspberryPiの設定
ディスプレイをつなぐとHDMI経由の音声になってしまう?ので音声出力をイヤフォンジャックからとするための設定
$ sudo raspi-config
7 Advanced Options → A4 Audio → 1Force 3.5mm ('headphone') jack

$ sudo raspi-config numid=3,iface=MIXER,name='PCM Playback Route' ; type=INTEGER,access=rw------,values=1,min=0,max=2,step=0 : values=1
03_AquesTalkPi
ダウンロードサイトからtarを取得して
/usr/local/binで解凍したのみ 04_Pythonスクリプトでも絶対パスで
/usr/local/bin/aquestalkpi/AquesTalkPiとしています。これだけで音声合成が出来る事がすごい。ライセンスについてはこちらに詳細有りです。
04_Pythonのスクリプト
000_enviroment_voice.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
#BME280の観測データをしゃべらせる
#2017/01/09
import RPi.GPIO as GPIO
from time import sleep
#SHELLの取り込みを可能にする
import subprocess as proc
import datetime
# BCMで初期化=GPIO番号を用いる
GPIO.setmode(GPIO.BCM)
#プルアップに設定
GPIO.setup(24,GPIO.IN, pull_up_down=GPIO.PUD_UP)
try:
while True:
if GPIO.input(24) == GPIO.LOW:
#print "switch on"
print "============================================"
#現在時刻の取得
dt=datetime.datetime.now()
#時刻をファイルにWrite
f = open("/usr/local/bin/001_datetime.txt", "w")
tstr=dt.strftime("%H時%M分%S秒です。温度は")
f.write(tstr)
f.close()
#print dt
#PythonからSHELLの呼び出し
#BME280温度を取得し002_temp.txtに書き込み
proc.call("/usr/local/bin/getBME -t | sed s/C//g > /usr/local/bin/002_temp.txt", shell=True)
proc.call("/usr/local/bin/getBME -h | sed s/%//g > /usr/local/bin/002_humd.txt", shell=True)
#proc.call("/usr/local/bin/getBME -p | sed s/Pa//g > /usr/local/bin/002_pres.txt", shell=True)
proc.call("echo \(`/usr/local/bin/getBME -p | sed s/Pa//g`\) / 100 | bc > /usr/local/bin/002_pres.txt", shell=True)
#単位付け
proc.call("echo '度。湿度は、' >> /usr/local/bin/002_temp.txt", shell=True)
proc.call("echo '%。気圧は、' >> /usr/local/bin/002_humd.txt", shell=True)
proc.call("echo 'ヘクトパスカルです。' >> /usr/local/bin/002_pres.txt", shell=True)
#時刻と観測データの結合
proc.call("cat /usr/local/bin/001_datetime.txt /usr/local/bin/002_temp.txt /usr/local/bin/002_humd.txt /usr/local/bin/002_pres.txt > /usr/local/bin/003_union.txt", shell=True)
#結合したファイルの改行を除去
proc.call("tr -d '\n' < /usr/local/bin/003_union.txt > /usr/local/bin/004_union.txt", shell=True)
# ファイルの読み込み
f = open('/usr/local/bin/004_union.txt', 'r')
for row in f:
print row
f.close()
# s:speed v:voicekind g:volume
proc.call("/usr/local/bin/aquestalkpi/AquesTalkPi -s 100 -v f1 -g 100 -f /usr/local/bin/004_union.txt | aplay >/dev/null 2>&1", shell=True)
sleep(0.01)
#CTRL+C処理
except KeyboardInterrupt:
pass
GPIO.cleanup()
getBMEは失念しましたが、Webから頂戴いたしました。感謝!
python 000_enviroment_voice.pyで起動後タクトスイッチ押下でしゃべります。
CTRL+CでPGの中止をします。



コメント
はじめまして石伏です。
ラズベリーパイで色々事を試していたら電子計算の操縦桿にたどり着きました
さっそく、温度、湿度などのおしゃべりを Aquestalkpiで試しているのですが
getBME のところでつまずいています。
なんとなくですが getBMEは bme280のデータをここへ取り込んで、
テキストへ書き込んでるなとまでは理解できたのですが その動作をどのように
したら良いかわからず他のサイトを見ても理解出来ないのです。
もしよろしければ、getBMEについて教えて頂けまいでしょうか
よろしくお願いいたします。
石伏
こんにちは石伏さん。
しゃべらせる前にターミナルで温湿度気圧が表示できるかを確認されると構築の近道になります。
getBMEはCQ出版社のトランジスタ技術2016年08月号
http://toragi.cqpub.co.jp/tabid/776/Default.aspx
http://toragi.cqpub.co.jp/Portals/0/backnumber/2016/08/p121.pdf
に詳しく掲載されています。ご興味があるようでしたらバックナンバーを取り寄せるといいと思います。
PaspberryPiに接続するIoT実験基板のApplePiには、表示器・I/O・DAC・BME280等が搭載されておりそれらを動かすプログラムソースは上記CQ出版社のダウンロードサイトから取得いたしました。
コンパイル後に出来るgetBMEを使ってPythonのスクリプトを作りました。
ApplePiを製作し動かしましたが、温湿度についてはRaspberryPiのCPUで炙られて+5℃位を指していました。同じBOSCH製センサチップを使っている秋月電子通商のBME280をGPIOから引き出してこちらのソースで動かしました。
頑張って完成するといいですね!
早速の回答、有り難う御座います。
2本のプログラムを動かしそこでできたコンパイル?からデータをとるのですね
チャレンジしてみます。
まずは自分で頑張ってみます。
それとラズパイを知るきっかけになったトランジスタ技術の11月号の
PICASOも同様に5度程度違っていて設定がおかしいのかと思っていましたが
同様ですね
ほぼシロウトなので不明なところが出てきましたらよろしくお願い致します。
石伏
連絡が遅くなりましたが
色々試してうまく動かすことができました
ブログを楽しく拝見しています
ありがとうございました