🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python 3.x

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

Raspberry Pi

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

Q&A

解決済

1回答

1150閲覧

Pythonについて質問です

rgmk

総合スコア6

Python 3.x

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

Raspberry Pi

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

0グッド

0クリップ

投稿2019/10/30 02:59

Raspberry Pi 3で赤黄緑の三色の光が点灯、点滅したかを光センサーで検知し、
それぞれの色のLEDを光らせるということをやっています。
処理は起動から止めるまで続けていきます。

各色が点灯or点滅したとセンサーが反応したら、
反応した時間を保持させ、次に反応したときに
前回反応した時間との差が3秒以内だったら、
「異常」とみなしLEDを点滅させます。

また、前回との差が3秒以上開いていたら、
「正常」とみなしLEDを消灯させます。

この比較のさせかたができないため教えていただきたいです。

該当のソースコード

Python

1#!/usr/bin/python 2# coding: utf-8 3 4import RPi.GPIO as GPIO 5import datetime 6import time 7import os 8 9#sensor 10Red_Pin = 24 11Green_Pin = 25 12Yellow_Pin = 23 13 14#LED 15Red = 13 16Green = 18 17Yellow = 17 18 19#停止時間 20Wait = 0.25 21#前回時間 22Last_Time = [0, 0, 0] 23GPIO.setmode(GPIO.BCM) 24 25#各センサーが反応しているかどうか判断するためのリスト(0:検知 1:未検知) 26value = [1, 1, 1] 27color = ["Red","Green","Yellow"] 28 29#前回時間比較用配列 30Last_Light = [0, 0, 0] 31colorPorts = [Red, Green, Yellow] 32pinPorts = [Red_Pin, Green_Pin, Yellow_Pin] 33 34#セットアップ 35for colorPort in colorPorts: 36 GPIO.setup(colorPort, GPIO.OUT) 37for pinPort in pinPorts: 38 GPIO.setup(pinPort, GPIO.IN) 39 40#各種LEDを光らせる関数 41def RED_LED(r):#赤 42 GPIO.output(Red, r) 43 time.sleep(Wait) 44 45def GREEN_LED(g):#緑 46 GPIO.output(Green, g) 47 time.sleep(Wait) 48 49def YELLOW_LED(y):#黄 50 GPIO.output(Yellow, y) 51 time.sleep(Wait) 52 53 54#ログを取る予定のテキストファイル名を代入 55filename = "log.txt" 56#テキストファイルがないなら作成、あるなら一度削除してから再度作成 57if (os.path.isfile("/home/pi/dev/log.txt")) == False: 58 fp = open("/home/pi/dev/log.txt", "w") 59else: 60 os.remove(filename) 61 fp = open("/home/pi/dev/log.txt", "w") 62 63fp.write("-------------- Start --------------\n") 64print("Start\n" + datetime.datetime.today().strftime("%Y-%m-%d %H:%M:%S") + "\n") 65i = 0 66try: 67 while True: 68 for pinPort in pinPorts: 69 value[i] = GPIO.input(pinPort) 70 if value[0] == 0: #光を検知 71 #書き込み 72 fp.write(datetime.datetime.today().strftime("%Y-%m-%d %H:%M:%S") + ' Yellow\n') 73 #点滅 74 RED_LED(1) 75 RED_LED(0) 76 Last_Light[0] = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") 77 if Last_Time[0] == 0: 78 Last_Time[0] = Last_Light[0] 79 else: 80 Last_Time[0] = Last_Light[0] 81 value[0] = 0 82 time.sleep(Wait) 83 84 elif value[1] == 0:#光を検知 85 #書き込み 86 fp.write(datetime.datetime.today().strftime("%Y-%m-%d %H:%M:%S") + ' Red\n') 87 #点滅 88 GREEN_LED(1) 89 GREEN_LED(0) 90 Last_Light[1] = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") 91 if Last_Time[1] == 0: 92 Last_Time[1] = Last_Light[1] 93 else: 94 Last_Time[1] = Last_Light[1] 95 value[1] = 0 96 time.sleep(Wait) 97 98 elif value[2] == 0: #光を検知 99 #書き込み 100 fp.write(datetime.datetime.today().strftime("%Y-%m-%d %H:%M:%S") + ' Green\n') 101 #点滅 102 YELLOW_LED(1) 103 YELLOW_LED(0) 104 Last_Light[2] = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") 105 if Last_Time[2] == 0: 106 Last_Time[2] = Last_Light[2] 107 else: 108 Last_Time[2] = Last_Light[2] 109 value[2] = 0 110 time.sleep(Wait) 111 112 elif value[i] == 1: #光を検知してないとき 113 #書き込み 114 fp.write(datetime.datetime.today().strftime("%Y-%m-%d %H:%M:%S") + ' \n') 115 GREEN_LED(0) 116 RED_LED(0) 117 YELLOW_LED(0) 118 time.sleep(Wait) 119 Last_Time[i] = Last_Light[i] 120 i += 1 #カウントアップ 121 122 if i == 3: #3秒間に1回でもセンサが反応したかチェック 123 fp.write("-------------------------------\n") 124 i = 0 #value[]の中の値を参照するため現在の位置を最初に戻す 125 for i in range(3): #value[]の参照 126 if value[0] == 0: #value[]の中で1つでも0があったら「異常」と表示してループを抜ける 127 print("LastTime " , Last_Time[0], "\n") 128 print(datetime.datetime.today().strftime("%Y-%m-%d %H:%M:%S") + " Yellow 異常\n") 129 time.sleep(Wait) 130 break 131 elif value[1] == 0: 132 print("LastTime " , Last_Time[1], "\n") 133 print(datetime.datetime.today().strftime("%Y-%m-%d %H:%M:%S") + " Red 異常\n") 134 time.sleep(Wait) 135 break 136 elif value[2] == 0: 137 print("LastTime " , Last_Time[2], "\n") 138 print(datetime.datetime.today().strftime("%Y-%m-%d %H:%M:%S") + " Green 異常\n") 139 time.sleep(Wait) 140 break 141 elif value[i] == 1: 142 print(datetime.datetime.today().strftime("%Y-%m-%d %H:%M:%S") + " \n") 143 i += 1 144 print("--------------------------------------\n") 145 i = 0 146except KeyboardInterrupt: 147 fp.write("--------------- End ---------------\n") 148 fp.close() 149 print("End") 150finally: 151 GPIO.cleanup() 152

試したこと

比較させるためにこんな感じの文を書いてみましたが
(value[0] == 0) & (Last_Light[0] - Last_Time[0]) < 3:

unsupported operand type(s) for -: 'str' and 'str'
というようなエラーが出たため訳がわからなくなりました・・・

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

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

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

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

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

coco_bauer

2019/10/30 04:37

「unsupported operand type(s) for -: 'str' and 'str'」というエラーは、質問に書かれているコードの何処で発生するのですか?
rgmk

2019/10/30 06:30

このコードには書いていませんが、前回反応した時間と 新しく反応した時間の差を比較する文を (value[0] == 0) & (Last_Light[0] - Last_Time[0]) < 3: と書いて実行してみたときに出てきたエラーです
guest

回答1

0

ベストアンサー

Last_LightとLast_Timeはどういう変数なのか、なにを入れるべきなのかということをはっきりさせる必要があります

数値を入れたかと思えば文字列を入れてたりして混乱していますね

文字列が入ってると、引き算はできません(エラーはそれを指摘してます)

投稿2019/10/30 03:16

y_waiwai

総合スコア88040

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

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

rgmk

2019/10/30 04:11

Last_Lightは新しく反応した時間を一時的に時間を格納しておくための変数で、 Last_Timeは前回反応した時間を格納しておくための変数です。 なので(Last_Light[0] - Last_Time[0]) < 3 という比較をしていました。 エラー文の意味はなんとなくはわかりましたが、 そこから、取得した「時間」を文字から数値に変換させる ということが思い浮かばなかったです。
y_waiwai

2019/10/30 04:21

> Last_Light[0] = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") 現在日時をわざわざ文字列にして代入してますね datetimeにしたいなら以下ですが、差分を求めるのはまた別の処理が必要になります Last_Light[0] = datetime.datetime.now() 「python datetime 差分」でぐぐるとやりかたでてきます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問