質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

4回答

822閲覧

センサーで感知すると天気予報を喋るプログラムの作り方

Ras5

総合スコア11

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2017/09/12 04:51

編集2017/09/13 06:35

###前提・実現したいこと
Raspberry piにセンサーを接続させて、天気予報を喋らせるというプログラムを実行したいのですがエラーがでて実行できませんでした。
センサーを接続させ、感知するとLEDを点灯させることはできましたが、天気予報のプログラムにセンサー感知のプログラムを組み込み方が理解できませんでした。

センサー検知でLEDつけるコードと喋るコードの組み合わせを教えていただきたいです。

###発生している問題・エラーメッセージ

Traceback (most recent call last): File "tenki5", line 5, in <module> import commands ImportError: No module named 'commands'

###該当のソースコード

#!/usr/bin/env python # -*- conding:utf-8 -*- from __future__ import print_function import socket import commands import time import RPi.GPIO as GPIO GPIO.setmode(GPIO.BCM) GPIO.setup(3, GPIO.IN) from contextlib import closing import shlex import subprocess from datetime import datetime try: import urllib.request as urllib2 except ImportError: import urllib2 import json CMD_SAY = 'jsay' def main(): say_datetime() say_weather() while True: inputValue = GPIO.input(3) if (inputValue == True): say_weather() time.sleep(10) return def say_datetime(): d = datetime.now() text = '%s月%s日、%s時%s分%s秒' % (d.month, d.day, d.hour, d.minute, d.second) text = CMD_SAY + ' ' + text print(text) proc = subprocess.Popen(shlex.split(text)) proc.communicate() return def say_weather(): city = '200010'; # Tokyo 他の地域の方は、番号を変えてください。 json_url = 'http://weather.livedoor.com/forecast/webservice/json/v1' #API URL weather_text = u'%sの天気は%sです。' temperature_text = u'%sの予想最高気温、%s度、予想最低気温、%s度です。' try: r = urllib2.urlopen('%s?city=%s' % (json_url, city) ) jsonStr = r.read().decode('utf-8') print(jsonStr) obj = json.loads( jsonStr ) print(obj) title = obj['title'] forecasts = obj['forecasts'] # TODAY cast = forecasts[0] temperature = cast['temperature'] today_w_txt = weather_text % (cast['dateLabel'], cast['telop']) # 最高、最低気温を取得。データが存在しない場合もある temp_max = "" temp_min = "" if temperature['max'] is not None: temp_max = temperature['max']['celsius'] if temperature['min'] is not None: temp_max = temperature['min']['celsius'] today_t_txt = temperature_text % (cast['dateLabel'], temp_max, temp_min) # TOMMOROW cast = forecasts[1] temperature = cast['temperature'] tommorow_w_txt = weather_text % (cast['dateLabel'], cast['telop']) # SAY weather_str = title + ' ' + today_w_txt + ' ' + today_t_txt + ' ' + tommorow_w_txt text = '''%s '%s' ''' % (CMD_SAY, weather_str) print(text) proc = subprocess.Popen(shlex.split(text)) proc.communicate() finally: r.close() return ### Execute if __name__ == "__main__": main()

####元のソースコード(天気予報を喋るソースコード)

#!/usr/bin/env python # -*- conding:utf-8 -*- import shlex import subprocess from datetime import datetime try: import urllib.request as urllib2 except ImportError: import urllib2 import json CMD_SAY = 'jsay' def main(): say_datetime() say_weather() return def say_datetime(): d = datetime.now() text = '%s月%s日、%s時%s分%s秒' % (d.month, d.day, d.hour, d.minute, d.second) text = CMD_SAY + ' ' + text print(text) proc = subprocess.Popen(shlex.split(text)) proc.communicate() return def say_weather(): city = '130010'; # Tokyo 他の地域の方は、番号を変えてください。 json_url = 'http://weather.livedoor.com/forecast/webservice/json/v1' #API URL weather_text = u'%sの天気は%sです。' temperature_text = u'%sの予想最高気温、%s度、予想最低気温、%s度です。' try: r = urllib2.urlopen('%s?city=%s' % (json_url, city) ) jsonStr = unicode(r.read()) print(jsonStr) # 確認表示 obj = json.loads( jsonStr ) print(obj) # 確認表示 title = obj['title'] forecasts = obj['forecasts'] # TODAY cast = forecasts[0] temperature = cast['temperature'] today_w_txt = weather_text % (cast['dateLabel'], cast['telop']) # 最高、最低気温を取得。データが存在しない場合もある temp_max = "" temp_min = "" if temperature['max'] is not None: temp_max = temperature['max']['celsius'] if temperature['min'] is not None: temp_max = temperature['min']['celsius'] today_t_txt = temperature_text % (cast['dateLabel'], temp_max, temp_min) # TOMMOROW cast = forecasts[1] temperature = cast['temperature'] tommorow_w_txt = weather_text % (cast['dateLabel'], cast['telop']) # SAY weather_str = title + ' ' + today_w_txt + ' ' + today_t_txt + ' ' + tommorow_w_txt text = '''%s '%s' ''' % (CMD_SAY, weather_str) print(text) proc = subprocess.Popen(shlex.split(text)) proc.communicate() finally: r.close() return ### Execute if __name__ == "__main__": main()

####センサー検知でLEDをつけるソースコード

import RPi.GPIO as GPIO from time import sleep GPIO.setmode(GPIO.BCM) GPIO.setup(4, GPIO.OUT) GPIO.setup(3, GPIO.IN) try: while True: if GPIO.input(3) == GPIO.LOW: GPIO.output(4, GPIO.HIGH) else: GPIO.output(4, GPIO.LOW) except KeyboardInterrupt: pass GPIO.cleanup()

###試したこと
リンク内容
上記のサイトを参考にしてプログラムを追加してみました。
また、ほかのサイトのプログラムを実行してみたところ「import error no module named RPi」というエラーも出てきてしまい手詰まりでした。
エラーについて検索してみましたが、手がかりになるようなものがなかなか見つからなかったのでこちらに質問させていただきました。

お力をお貸しいただけると幸いです。

###追記
import commandsを削除したところ別のエラーが発生しました。
$sudo python ファイル名 で実行しています。

File line55 SyntaxErorr: Non-ASCII character '\xe' in file tenki5 on line 55, but no encoding declead; see http://pyton.org/dev/peps/pep-0263/ for details

天気予報を喋るコードとセンサー感知のコードを組み合わせるにはどうするべきだったのでしょうか。自作したソースコードが大幅に変更してもよいので教えて頂きたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ozwk

2017/09/12 05:03

センサー関係なしに天気予報を喋らせることはできているんですか?
Ras5

2017/09/12 05:08 編集

ozwk様>質問ありがとうございます。センサーは関係なしに天気予報を喋らせることはできています。
ozwk

2017/09/12 05:08

pythonで?
Ras5

2017/09/12 05:12

ozwk様>返信ありがとうございます。実行環境はpython3です。pythonで実行すると喋ってくれています。
ozwk

2017/09/12 05:16

じゃあ余計なことせずにセンサー検知でLEDつけるコードと喋るコード組み合わせれば良かったんじゃないかと思いながらも回答書きました。
ozwk

2017/09/12 05:36

センサー検知でLEDつけるコードももらえますか?
Ras5

2017/09/12 05:41

ozwk様>プログラム追加致しました。お手数おかけしてすみません。
guest

回答4

0

Python 3をお使いなのだと思われます。
というのは、commandsモジュールはpython3で削除されたからです。

commands.getoutput()などは、commandsモジュールの代わりに、subprocessモジュールを使う事で回避するようです。
36.16. commands — コマンド実行ユーティリティ(Python 2.6.13)

投稿2017/09/12 05:20

coco_bauer

総合スコア6915

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Ras5

2017/09/12 05:45

回答ありがとうございます。commandsモジュールは廃止されたのですね。勉強不足でお恥ずかしい限りです。教えていただきありがとうございます。
guest

0

commandsモジュールはPython3で消滅しました。

というか質問文のコードでcommands使ってないですよね。

投稿2017/09/12 05:13

ozwk

総合スコア13521

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Ras5

2017/09/12 05:28

回答ありがとうございます。サイトのプログラムをコピペしただけでしたのでコードの使い方を理解していませんでした。実行文から削除してみたところ、「import error no module named RPi」が出てきてしまいました。「sudo apt-get install python-rpi.gpio」を実行しましたがすでにインストール済みでした。
ozwk

2017/09/12 05:47

python3-rpi.gpioをインストールしてみてください
Ras5

2017/09/12 05:53

回答ありがとうございます。既にpython3-rpi.gpioはインストール済みです。
ozwk

2017/09/12 08:14

LEDつけるコードも 問題起きているコードも 同じようなコマンドで起動してますか?
Ras5

2017/09/13 04:50

回答ありがとうございます。 同じようなコマンドで起動させています。
guest

0

自己解決

pipモジュールを再インストールするなど様々なサイトに掲載されているコマンドを試してみました。
結果「import error no module named RPi」というエラーが表示されなくなり、「sudo python プログラム名」で実行することまでできるようになりました。

センサーで感知して天気予報を喋ってくれるコードは以下のようになりました。

import RPi.GPIO as GPIO from time import sleep import time GPIO.setmode(GPIO.BCM) GPIO.setup(4, GPIO.OUT) GPIO.setup(3, GPIO.IN) try: while True: if GPIO.input(3) == GPIO.LOW: GPIO.output(4, GPIO.HIGH) #!/usr/bin/env python # -*- conding:utf-8 -*- import shlex import subprocess from datetime import datetime try: import urllib.request as urllib2 except ImportError: import urllib2 import json CMD_SAY = 'jsay' def main(): say_datetime() say_weather() return def say_datetime(): d = datetime.now() text = '%s月%s日、%s時%s分%s秒' % (d.month, d.day, d.hour, d.minute, d.second) text = CMD_SAY + ' ' + text print(text) proc = subprocess.Popen(shlex.split(text)) proc.communicate() return def say_weather(): city = '200010'; # Tokyo 他の地域の方は、番号を変えてください。 json_url = 'http://weather.livedoor.com/forecast/webservice/json/v1' #API URL weather_text = u'%sの天気は%sです。' temperature_text = u'%sの予想最高気温、%s度、予想最低気温、%s度です。' try: r = urllib2.urlopen('%s?city=%s' % (json_url, city) ) jsonStr = r.read().decode('utf-8') print(jsonStr) obj = json.loads( jsonStr ) print(obj) title = obj['title'] forecasts = obj['forecasts'] # TODAY cast = forecasts[0] temperature = cast['temperature'] today_w_txt = weather_text % (cast['dateLabel'], cast['telop']) # 最高、最低気温を取得。データが存在しない場合もある temp_max = "" temp_min = "" if temperature['max'] is not None: temp_max = temperature['max']['celsius'] if temperature['min'] is not None: temp_max = temperature['min']['celsius'] today_t_txt = temperature_text % (cast['dateLabel'], temp_max, temp_min) # TOMMOROW cast = forecasts[1] temperature = cast['temperature'] tommorow_w_txt = weather_text % (cast['dateLabel'], cast['telop']) # SAY weather_str = title + ' ' + today_w_txt + ' ' + today_t_txt + ' ' + tommorow_w_txt text = '''%s '%s' ''' % (CMD_SAY, weather_str) print(text) proc = subprocess.Popen(shlex.split(text)) proc.communicate() finally: r.close() return ### Execute if __name__ == "__main__": main() else: time.sleep(1) GPIO.output(4, GPIO.LOW) except KeyboardInterrupt: pass GPIO.cleanup()

ご協力いただきました、ozwk様、coco_bauer様、can110様
貴重なお時間を割いていただきまして本当にありがとうございました。

投稿2017/09/19 16:02

Ras5

総合スコア11

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

また、ほかのサイトのプログラムを実行してみたところ「import error no module named RPi」というエラーも出てきてしまい手詰まりでした。

以下、Rpi2(jessie)でのRPi.GPIOの動作確認手順例です。

RPi.GPIOのインストール確認(デフォルトでインストール済みのはず)
参考:RPi.GPIO Installation

pi@rpi2:~ $ sudo apt-get install python3-rpi.gpio パッケージリストを読み込んでいます... 完了 依存関係ツリーを作成しています 状態情報を読み取っています... 完了 python3-rpi.gpio はすでに最新版です。

念のためpip3でも確認

pi@rpi2:~ $ sudo apt-get install python3-pip (略) pi@rpi2:~ $ pip3 freeze -bash: pip3: コマンドが見つかりません

pip3が正常にインストールされていない場合は再インストールする
python3-pip installed but pip3 command not found?

pi@rpi2:~ $ sudo apt-get remove python3-pip; sudo apt-get install python3-pip (略)

pip3でRPi.GPIOのバージョン確認

pi@rpi2:~ $ pip3 freeze | grep RPi RPi.GPIO==0.6.3

RPi.GPIOの動作を確認

pi@rpi2:~ $ python3 Python 3.4.2 (default, Oct 19 2014, 13:31:11) [GCC 4.9.1] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import RPi.GPIO as GPIO >>> GPIO.RPI_INFO {'RAM': '1024M', 'P1_REVISION': 3, 'PROCESSOR': 'BCM2836', 'TYPE': 'Pi 2 Model B', 'REVISION': 'a01041', 'MANUFACTURER': 'Sony'}

投稿2017/09/12 06:15

can110

総合スコア38258

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Ras5

2017/09/12 07:14

回答ありがとうございます。 RPi.GPIOのインストール確認はできましたが、「$ pip3 freeze」を実行しても「-bash: pip3: コマンドが見つかりません」というのが表示されません。また、pip3でRPi.GPIOのバージョン確認のコマンドを実行しても「RPi.GPIO==0.6.3」が表示されないです。 よろしくお願いいたします。
can110

2017/09/12 07:45

「-bash: pip3: コマンドが見つかりません」→回答本文に対処法も記載してますので確認ください。
Ras5

2017/09/13 06:06

回答ありがとうございます。 今ネットワークエラーで再インストールが出来ませんのでネットワークが回復しましたら、改めて試させていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問