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'
というようなエラーが出たため訳がわからなくなりました・・・
回答1件
あなたの回答
tips
プレビュー