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

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

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

GPSは、Global Positioning Systemの略です。衛星信号を使用して受信機の地上又は空中内の居場所を特定するナビゲーションシステムです。"GPS"は受信機のことも指します。

Python 3.x

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

Raspberry Pi

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

Q&A

解決済

3回答

1232閲覧

「GPSの記録」と「人感センサでⅬチカ」の2つのプログラムを1つにまとめたい

KRSugar

総合スコア16

GPS

GPSは、Global Positioning Systemの略です。衛星信号を使用して受信機の地上又は空中内の居場所を特定するナビゲーションシステムです。"GPS"は受信機のことも指します。

Python 3.x

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

Raspberry Pi

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

0グッド

0クリップ

投稿2019/06/15 05:11

前提・実現したいこと

Pythonで、
「常にGPSモジュールからの緯度経度の情報を記録しながら、人感センサで人を検知したらLEDを点滅」
というプログラムを書いこうとしています。

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

「GPSモジュールからの緯度経度の記録」と、「センサで人を検知したらLED点滅」という2つをそれぞれ別々に書くことはできたのですが、一つのプログラムにまとめるのに、どうしたらよいのか分かりません。

下の2種類のコードを、一つにまとめて書くにはどう書けばいいのか、ご教示ください。お願いします。

該当のソースコード①

Python3

1import serial 2import micropyGPS 3import threading 4import time 5import codecs 6 7gps = micropyGPS.MicropyGPS(9, 'dd') # MicroGPSオブジェクトを生成する。 8 # 引数はタイムゾーンの時差と出力フォーマット 9 10def rungps(): # GPSモジュールを読み、GPSオブジェクトを更新する 11 s = serial.Serial('/dev/serial0', 9600, timeout=10) 12 s.readline() # 最初の1行は中途半端なデーターが読めることがあるので、捨てる 13 while True: 14 sentence = s.readline().decode('utf-8', errors='ignore') # GPSデーターを読み、文字列に変換する 15 for x in sentence: # 読んだ文字列を解析してGPSオブジェクトにデーターを追加、更新する 16 gps.update(x) 17 18gpsthread = threading.Thread(target=rungps, args=()) # 上の関数を実行するスレッドを生成 19gpsthread.daemon = True 20gpsthread.start() # スレッドを起動 21 22while True: 23 if gps.clean_sentences > 5: # ちゃんとしたデーターがある程度たまったら出力する 24 h = gps.timestamp[0] if gps.timestamp[0] < 24 else gps.timestamp[0] - 24 25 with open('gps.txt', "a", encoding='utf-8')as f: 26 print(('%2d:%02d:%04.1f' % (h, gps.timestamp[1], gps.timestamp[2])), file=f) 27 print(('海抜: %f' % (gps.altitude)), file=f) 28 print(('緯度経度: %2.8f, %2.8f' % (gps.latitude[0], gps.longitude[0])), file=f) 29 print((''), file=f) 30 time.sleep(5.0)

該当のソースコード②

import threading import RPi.GPIO as GPIO import sys import os import shutil import time from time import sleep #PIN NO SET LED1 = 16 PIR = 11 GPIO.setmode(GPIO.BOARD) GPIO.setup(LED1, GPIO.OUT) GPIO.setup(PIR, GPIO.IN) #LED ON OFF Thread def ledmain(): global stopstr1 stopstr1 = " " while True: sleep(1) if ( stopstr1 != " "): GPIO.cleanup() sys.exit() #LED ON OFF if ( GPIO.input(PIR) == GPIO.HIGH): led01() #INTERRUPT Thread def stopinput(): global stopstr1 #led01 def led01(): GPIO.output(LED1, True) time.sleep(0.5) GPIO.output(LED1, False) time.sleep(0.5) #SET Thread th=threading.Thread(target=stopinput) th.start() th2=threading.Thread(target=ledmain) th2.start()

試したこと

一方のコードにもう一方を無理やりぶち込んだりしましたが、案の定うまくいきませんでした……

補足情報(FW/ツールのバージョンなど)

Raspberry Pi zero w の、Python3.5.3です。よろしくお願いします。

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

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

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

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

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

guest

回答3

0

python3

1while True: 2 A 3 sleep 1

python3

1while True: 2 B 3 sleep 0.5

python3

1while True: 2 B 3 sleep 0.5 4 A 5 sleep 0.5 6 B

とすればよいです。
さらにもうすこし工夫すれば、A, B の実行間隔をもっと汎用的にすることもできます。
(スレッドをつかって A, B をそれぞれ別のスレッド並列実行するのがベターです。
でも while で回す上の方法でも工夫次第で複数の処理を別々のインターバルでそれなりに実行させることはできます)

投稿2019/06/16 00:00

katoy

総合スコア22324

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

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

0

ベストアンサー

それぞれのwhile trueのナカミを関数にしてしまって、その2つの関数をwhile trueでループさせればいいだけです。
がんばってやってみましょう。やった上でなにか不具合が起きたなら、またここで質問してくれればいいかと

投稿2019/06/15 09:16

y_waiwai

総合スコア87774

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

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

KRSugar

2019/06/15 23:28

できました! 言われた方法になっているか分かりませんが、以下の通りやったらできました ``` import threading import RPi.GPIO as GPIO import sys import os import shutil import time from time import sleep import serial import micropyGPS import threading import codecs LED1 = 16 PIR = 11 GPIO.setmode(GPIO.BOARD) GPIO.setup(LED1, GPIO.OUT) GPIO.setup(PIR, GPIO.IN) gps = micropyGPS.MicropyGPS(9, 'dd') def gpspython(): while True: rungps() gps() ledmain() def rungps(): # GPSモジュールを読み、GPSオブジェクトを更新する s = serial.Serial('/dev/serial0', 9600, timeout=10) s.readline() # 最初の1行は中途半端なデーターが読めることがあるので、捨てる while True: sentence = s.readline().decode('utf-8', errors='ignore') # GPSデーターを読み、文字列に変換する for x in sentence: # 読んだ文字列を解析してGPSオブジェクトにデーターを追加、更新する gps.update(x) gpsthread = threading.Thread(target=rungps, args=()) # 上の関数を実行するスレッドを生成 gpsthread.daemon = True gpsthread.start() # スレッドを起動 def ledmain(): global stopstr1 stopstr1 = " " led() def led(): while True: sleep(1) if ( stopstr1 != " "): GPIO.cleanup() sys.exit() #LED ON OFF if ( GPIO.input(PIR) == GPIO.HIGH): led01() #INTERRUPT Thread def stopinput(): global stopstr1 #led01 def led01(): GPIO.output(LED1, True) time.sleep(0.5) GPIO.output(LED1, False) time.sleep(0.5) #SET Thread th=threading.Thread(target=stopinput) th.start() th2=threading.Thread(target=ledmain) th2.start() while True: if gps.clean_sentences > 5: # ちゃんとしたデーターがある程度たまったら出力する h = gps.timestamp[0] if gps.timestamp[0] < 24 else gps.timestamp[0] - 24 with open('gps.txt', "a", encoding='utf-8')as f: print(('%2d:%02d:%04.1f' % (h, gps.timestamp[1], gps.timestamp[2])), file=f) print(('海抜: %f' % (gps.altitude)), file=f) print(('緯度経度: %2.8f, %2.8f' % (gps.latitude[0], gps.longitude[0])), file=f) print((''), file=f) time.sleep(5.0) ``` 「もっとココこうしたほうがいい」等ありましたら、よろしくお願いします。
guest

0

上のコードのwhile True:以下も関数にまとめてスレッドとして実行するようにして、あとひとつにまとめちゃえば良いんじゃないですかね。

投稿2019/06/15 08:20

hayataka2049

総合スコア30933

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問