normalerweise mache ich Programmierungen für MS Access und befasse mich jetzt neu mit Raspberry und Python.
Ein Projekt habe ich schon erfolgreich gestemmt und eine digitale Uhr für mein Haus gebaut.
Bei meinem nächsten Projekt beisse ich mir leider gerade etwas die Zähne aus und finde im Netzt leider nur sehr wenig hierzu.
Es geht um Distanzmessung mit dem TF-Mini Lidar, es gibt zwei Messstellen (also zwei Sensoren) und zusätzlich einen Erschütterungssensor.
Der Erschütterungssensor läuft absolut Problemlos und ist deshalb zu vernachlässigen.
Wenn ich mein Script starte erhalte, ich häufig die Fehlermeldung:
RESTART: /home/pi/Documents/Entwicklung Dachrinne TF-Mini/2019.03.09 Dachrinnenueberwachung.py
=========================
=========================
Unexpected error: <class 'NameError'>
Traceback (most recent call last):
File "/home/pi/Documents/Entwicklung Dachrinne TF-Mini/2019.03.09 Dachrinnenueberwachung.py", line 120, in <module>
if distance_2 <= 660:
NameError: name 'distance_2' is not defined
Ich habe bis jetzt den Fehler immer so interpretiert, dass die Variable distance_2 nicht definiert ist.
Mal tritt der Fehler mit der Variable 1 und mal mit 2 auf.
Der Code sieht wiefolgt aus:
Code: Alles auswählen
#!/usr/bin/env python
import RPi.GPIO as GPIO
import time
import serial
from email.mime.text import MIMEText
import smtplib
import sys
# Definition GPIO
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO_DigitalIn2 = 26
GPIO_AlarmOut = 21
GPIO.setup(GPIO_DigitalIn2, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
GPIO.setup(GPIO_AlarmOut, GPIO.OUT, initial=False)
# Test GPIO Ausgang
GPIO.output(GPIO_AlarmOut, False)
time.sleep(0.5)
GPIO.output(GPIO_AlarmOut, True)
time.sleep(0.5)
GPIO.output(GPIO_AlarmOut, False)
time.sleep(0.5)
GPIO.output(GPIO_AlarmOut, True)
time.sleep(0.5)
GPIO.output(GPIO_AlarmOut, False)
time.sleep(0.5)
GPIO.output(GPIO_AlarmOut, True)
time.sleep(0.5)
GPIO.output(GPIO_AlarmOut, False)
# Definition der USB-Ports
ser1 = serial.Serial("/dev/ttyUSB0", 115200)
ser2 = serial.Serial("/dev/ttyUSB1", 115200)
# Logindaten Mailversand
sender = 'XXX@XXX.de'
smtpserver = 'smtp.YYY.de'
smtpusername = 'XXX@XXX.de'
smtppassword = 'ZZZ'
usetls = True
# Modul Mailversand
def sendmail(recipient,subject,content):
msg = MIMEText(content)
msg['From'] = sender
msg['To'] = recipient
msg['Subject'] = subject
server = smtplib.SMTP(smtpserver)
if usetls:
server.starttls()
if smtpusername and smtppassword:
server.login(smtpusername,smtppassword)
server.sendmail(sender,recipient,msg.as_string())
server.quit()
# Modul Distanzsensor1
def tf_mini_1():
global distance_1
if ser1.is_open == False:
ser1.open()
try:
print('='*25)
count = ser1.in_waiting
if count > 8:
recv = ser1.read(9)
ser1.reset_input_buffer()
if recv[0] == 0x59 and recv[1] == 0x59:
distance_1 = recv[2] + recv[3] * 256
ser1.reset_input_buffer()
# print (distance_1)
except KeyboardInterrupt:
ser1.close()
# Modul Distanzsensor2
def tf_mini_2():
global distance_2
if ser2.is_open == False:
ser2.open()
try:
print('='*25)
count = ser2.in_waiting
if count > 8:
recv = ser2.read(9)
ser2.reset_input_buffer()
if recv[0] == 0x59 and recv[1] == 0x59:
distance_2 = recv[2] + recv[3] * 256
ser2.reset_input_buffer()
# print(distance_2)
except KeyboardInterrupt:
ser2.close()
# Programm / Ablauf
if __name__ == '__main__':
try:
while True:
tf_mini_1()
tf_mini_2()
GPIO.output(GPIO_AlarmOut, True)
# If-Block für Distanzsensor Garage
if distance_1 <= 340:
GPIO.output(GPIO_AlarmOut, False)
print ((time.strftime("%d.%m.%Y %H:%M:%S")+" Sensor 1 (Garage) hat ein Hindernis erkannt. Abstand ca. "+str(distance_1)+" cm"))
file = open("/home/pi/Documents/*Autostart*/Ueberwachung/"+time.strftime("%Y.%m.%d")+".txt","a")
file.write(time.strftime("%d.%m.%Y %H:%M:%S")+" Sensor 1 (Garage) Abstand ca. "+str(distance_1)+" cm"+"\n"+"\n")
file.close()
subject_kh = "Hier ist der Überwachberry mit einem Ereignis"
body_kh = "Hallo Klaus,"+"\n"+"Dein Überwachberry hat festgestellt dass der folgende Sensor wiefolgt angeschlagen hat"+"\n"+"Sensor 1 (Garage) Abstand ca. "+str(distance_1)+" cm"
sendmail('XXX@XXX.de',subject_kh,body_kh)
time.sleep(3)
GPIO.output(GPIO_AlarmOut, True)
if ser1 != None:
ser1.close()
subject_kh = None
body_kh = None
distance_1 = None
# If-Block für Distanzsensor Haus
if distance_2 <= 660:
GPIO.output(GPIO_AlarmOut, False)
print ((time.strftime("%d.%m.%Y %H:%M:%S")+" Sensor 2 (Haus) hat ein Hindernis erkannt. Abstand ca. "+str(distance_2)+" cm"))
file = open("/home/pi/Documents/*Autostart*/Ueberwachung/"+time.strftime("%Y.%m.%d")+".txt","a")
file.write(time.strftime("%d.%m.%Y %H:%M:%S")+" Sensor 2 (Haus) Abstand ca. "+str(distance_2)+" cm"+"\n"+"\n")
file.close()
subject_kh = "Hier ist der Überwachberry mit einem Ereignis"
body_kh = "Hallo Klaus,"+"\n"+"Dein Überwachberry hat festgestellt dass der folgende Sensor wiefolgt angeschlagen hat"+"\n"+"Sensor 2 (Haus) Abstand ca. "+str(distance_2)+" cm"
sendmail('XXX@XXX.de',subject_kh,body_kh)
time.sleep(3)
GPIO.output(GPIO_AlarmOut, True)
if ser2 != None:
ser2.close()
subject_kh = None
body_kh = None
distance_2 = None
# If-Block für Erschütterungssensor Dachrinne
if GPIO.input(GPIO_DigitalIn2) ==True:
GPIO.output(GPIO_AlarmOut, False)
print ((time.strftime("%d.%m.%Y %H:%M:%S")+" Sensor 3 (Dachrinne) hat ein Hindernis erkannt."))
file = open("/home/pi/Documents/*Autostart*/Ueberwachung/"+time.strftime("%Y.%m.%d")+".txt","a")
file.write(time.strftime("%d.%m.%Y %H:%M:%S")+" Sensor 3 (Dachrinne)"+"\n"+"\n")
file.close()
subject_kh = "Hier ist der Überwachberry mit einem Ereignis"
body_kh = "Hallo Klaus,"+"\n"+"Dein Überwachberry hat festgestellt dass der folgende Sensor wiefolgt angeschlagen hat"+"\n"+"Sensor 3 (Dachrinne)"
sendmail('XXX@XXX.de',subject_kh,body_kh)
time.sleep(3)
GPIO.output(GPIO_AlarmOut, True)
subject_kh = None
body_kh = None
time.sleep(0.1)
# Fehlerbehandlungsblock
except KeyboardInterrupt:
print("Abbruch durch User")
if ser1 != None:
ser1.close()
if ser2 != None:
ser2.close()
GPIO.cleanup()
subject_kh = None
body_kh = None
distance_1 = None
distance_2 = None
except IOError as e:
errno, strerror = e.args
print("I/O error({0}): {1}".format(errno,strerror))
subject_kh = "!!!Überwachberry mit einem Fehler!!!"
body_kh = "Hallo Klaus,"+"\n"+"Dein Überwachberry hat einen Fehler festgestellt"+"\n"+"I/O error({0}): {1}".str(format(errno,strerror))
sendmail('XXX@XXX.de',subject_kh,body_kh)
GPIO.cleanup()
subject_kh = None
body_kh = None
distance_1 = None
distance_2 = None
except ValueError:
print("No valid integer in line.")
GPIO.cleanup()
subject_kh = None
body_kh = None
distance_1 = None
distance_2 = None
except:
print("Unexpected error:", sys.exc_info()[0])
subject_kh = "!!!Überwachberry mit einem Fehler!!!"
body_kh = "Hallo Klaus,"+"\n"+"Dein Überwachberry hat einen Fehler festgestellt"+"\n"+str(sys.exc_info()[0])
sendmail('XXX@XXX.de',subject_kh,body_kh)
GPIO.cleanup()
subject_kh = None
body_kh = None
distance_1 = None
distance_2 = None
raise
Der TF-Mini ist über einen TTL/USB Wandler angeschlossen.
Nur die Werte bekomme ich von den Sensoren ausgelesen.
Ich hoffe, ich habe alle relevanten Information erfasst, sollte ich etwas vergessen haben, habt bitte einwenig Nachsicht, es ist mein erstes Hilfegesuch.
Gruß
Klaus