Trouble with python script for ultrasonic mudule HC-SR04
i’ve got some problems with my script (don’t know, where i found it).
In principle, it works, but after 1 or 2 days, the monitor switches no longer on or off.
This means that the script is in an undefined state.
With the logging I wanted to see where it hangs, but that does not really work either.
Who can help me and optimize the script?
#Bibliotheken einbinden / Import libs from subprocess import call import RPi.GPIO as GPIO import time import logging #Einstellungen für das Logging / settings for log options logging.basicConfig(level=logging.INFO, format='%(message)s', datefmt='%m-%d %H:%M', filename='PIR.log', filemode='w') # define a Handler which writes INFO messages or higher to the sys.stderr console = logging.StreamHandler() console.setLevel(logging.INFO) # set a format which is simpler for console use formatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s') # tell the handler to use this format console.setFormatter(formatter) # add the handler to the root logger logging.getLogger('').addHandler(console) #GPIO Modus (BOARD / BCM) GPIO.setmode(GPIO.BCM) #GPIO Pins zuweisen / set GPIO pins GPIO_TRIGGER = 23 GPIO_ECHO = 24 Monitor_State = 0 Counter = 0 TVSERVICE = '/opt/vc/bin/tvservice' #Richtung der GPIO-Pins festlegen (IN / OUT) / direction for Pins (in/out) GPIO.setup(GPIO_TRIGGER, GPIO.OUT) GPIO.setup(GPIO_ECHO, GPIO.IN) Text = (time.strftime("%d.%m.%Y %H:%M:%S")) + (" Messung vom User gestartet") logging.info('Gestartet') logging.info(Text) logging.info('ENDE') # Bildschirm erst einmal ausschalten :-) / switch off monitor first :-) call([TVSERVICE, '-o']) def distanz(): # setze Trigger auf HIGH / set trigger to HIGH GPIO.output(GPIO_TRIGGER, True) # setze Trigger nach 0.01ms aus LOW / set trigger after 0.01ms low time.sleep(0.00001) GPIO.output(GPIO_TRIGGER, False) StartZeit = time.time() StopZeit = time.time() # speichere Startzeit / remember starttime while GPIO.input(GPIO_ECHO) == 0: StartZeit = time.time() # speichere Ankunftszeit / remember 2'nd time while GPIO.input(GPIO_ECHO) == 1: StopZeit = time.time() # Zeit Differenz zwischen Start und Ankunft / calc difference TimeElapsed = StopZeit - StartZeit # mit der Schallgeschwindigkeit (34300 cm/s) multiplizieren # und durch 2 teilen, da hin und zurueck distanz = (TimeElapsed * 34300) / 2 return distanz if __name__ == '__main__': try: while True: abstand = distanz() if abstand < 120 and Monitor_State == 0: logging.info('Monitor gestartet') Monitor_State=1 Counter = 0 call([TVSERVICE, '-p']) elif abstand < 120 and Monitor_State == 1: Ausgabe = " Counter reset " + (" - %.1f cm" % abstand) logging.info(Ausgabe) Counter = 0 elif abstand >= 120 and Monitor_State == 1 and Counter = 100 and Counter >= 11: Monitor_State=0 Counter = 0 call([TVSERVICE, '-o']) time.sleep(1) # Beim Abbruch durch STRG+C resetten / reset after STRG+C except KeyboardInterrupt: GPIO.cleanup()
@mymirror What is your log saying? I am not that fluent in Python, but in the last
100. The seems not right.
Its an Ultrasonic sensor, so do you still hear the clicking noise after 1 or 2 days?
@idoodler Thanks for your Reply.
There is no clicking noise … as i haven’t got any sound device connected.
But you’re right … the 100 seems to be the problem.
I didn’t “saw” it … damn.
I’ll correct this and test it again.
@mymirror Funny story. Last Thursday I found the same issue in the production code of a project I am working on in my real live job, which lead to an really wired issue.
That was the biggest facepalm ever
And the ultra sonic sensor is clicking itself. The sensor is just a speaker and an microphone. The speaker is clicking constantly and the microphone is picking up the clicking. I am pretty jung, it would drive me crazy if I have to sleep, or stay here the sensor for a long time. But with increasing age humans won’t hear it anymore. But I think animals like cats, dogs, birds, … do hear it better.
The more you know