Why i can show the final value of variable? - python

I have this code that read the Raspberry Pi RPIO pin number 24, that is connected to coin acceptor and the datasheet of it is:
0,05€ - 1 pulse
0,10€ - 2 pulse each pulse in 0,025ms
0,20€ - 4 pulse each pulse in 0,025ms
0,50€ - 10 pulse each pulse in 0,025ms
1€ - 20 pulse each pulse in 0,025ms
2€ - 40 pulse each pulse in 0,025ms
And i have this code:
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
GPIO.setup(24,GPIO.IN)
count = 0
euroCoin = 0
def coin(value):
euro = value * 5
return euro
while True:
inputValue = GPIO.input(24)
if (inputValue == True):
count = count + 1
euroCount = coin(count)
print ("Euro "+str(euroCount)+".")
time.sleep(.025)
That show, for example, for 0,20€ coin show:
0,05
0,10
0,15
0,20
I only need to show the final value, how i do that?
Thanks

If you're terminating the program with a signal, like CTRL-C (SIGINT), you'll need to write a handler to catch that signal. Otherwise, you can't capture the value you're after.
See How do I capture SIGINT in Python?

Related

Problem handling interruption with Raspberry Pi 4 with a DC Motor

I have some troubles handling interruptions with my Raspberry Pi 4, using Python.
I have a DC motor with an encoder , I would like to make a speed control of this motor. But I have some issues with reading the encoder values with my Raspberry.
Here is the code I run :
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
HallA = 5 # GPIO pin for Hall A
HallB = 6 # GPIO pin for Hall B
GPIO.setup(HallA, GPIO.IN) #set up the input
GPIO.setup(HallB, GPIO.IN)
incmot = 0 # set up the counter
def encodeur_inc(channel) : #function of the interruption
B = GPIO.input(HallB) #read the second signal
global incmot
if B == 1 :
incmot = incmot +1
else :
incmot = incmot -1
GPIO.add_event_detect(HallA, GPIO.RISING, callback = encodeur_inc) #setting up the interruption
try :
while True :
print(incmot)
except :
GPIO.cleanup()
The problem is that, for the same number of revolutions, I get a different number of pulses each time (from 480 to 650 pulses per revolution, while the manufacturer announces 690). I tried to identify where the problem could come from:
It does not come from the encoder, I displayed on an oscilloscope the signals of the two outputs of the encoder, they were indeed phase quadrature rectangle waves
The raspberry does not miss interrupts, by rising a pin high when entering the interrupt then low when leaving, I displayed on the oscilloscope the inputs and outputs of the interrupt.
GPIO.output(20, GPIO.HIGH) #at the beginning of the function
GPIO.output(20, GPIO.LOW) #at the end of the function
So I don't see where the inconsistencies I see could come from. I you have any clue that could help me don't hesitate.
Thanks for your help !
Thanks to #quamrana, I understood where the problem came from. When the program was interrupted, the time taken to execute the interrupt was variable and, going clockwise, Hall B could be at 1 or 0, instead of 1 all the time.
To get around this problem, using a D latch allows Python time to execute the interrupt and correctly read whether the engine is moving forward or backward. Hall A is the clock of the latch and Hall B is the data.

Controlling a relay using a DHT22 on raspberry pi B model

I am trying to create essentially a thermostat control using a DHT22 sensor. I would like to read the data from the sensor and using an if statement compare the sensor value to a set temperature value. If achieved the if statement would turn on a relay using a normally off outlet. Below is the code i have wrote in Geany programming to get a general idea of what i would like to do.
from time import sleep
import RPi.GPIO as GPIO
import Adafruit_DHT as dht
GPIO.setmode(GPIO.BCM)
AC_1_GPIO = 17 #sets relay to GPIO pin 17 for AC unit control
DHT_1_GPIO = 3
GPIO.setup(AC_1_GPIO, GPIO.OUT) #sets up GPIO to be on or off based on condition
#GPIO.setup(DHT_1_GPIO, GPIO.OUT) #
humdtemp = dht.read_retry(dht.DHT22, DHT_1_GPIO)
Temp_Max = 32 #this is temperature maximum value for tent
#Humd_Max = 60 #this is relative humidity maximum value for
#Humd_Min = 30 #this is relative humidity mininum value for
while True: #creates continuous loop
if humdtemp > Temp_Max: #compares sensor value to maximum
# temperature value
GPIO.output(AC_1_GPIO, GPIO.LOW) #turns on AC unit using controllable relay
elif humdtemp == Temp_Max:
print ("Achieving 72 degree temperature") #we need to select a temperature setpoint value
else:
GPIO.output(AC_1_GPIO, GPIO.HIGH) #turns 'on' normally off relay

Python, RPi + MCP3008 + 2xForce Sensitive Resistor - Square

I have a MCP3008 connected to RPi and 2 x Force Sensitive Resistor - Square connected to the MCP3008. The sensors are laying side by side horisontal on my desk and I can read and print the data (0-100) from both sensors (sensor1 and sensor2) separately. I just can't come up with any idea of python code to detect when I touch sensor1 (left) and move my finger to sensor2 (right).
In addition I need to know how many milliseconds it takes from that I touch sensor1 until I lifted from sensor2.
from time import sleep
from gpiozero import MCP3008
sensor1 = MCP3008(1) # Pin 2 on the ADC
sensor2 = MCP3008(2) # Pin 3 on the ADC
# Read data from the ADC
def getData(readSensor):
value = readSensor
rawValue = value.value
return rawValue
while True:
print('Sensor1 = {0:.0f}'.format(getData(sensor1)*100))
print('Sensor2 = {0:.0f}'.format(getData(sensor2)*100))
print('')
sleep(0.1)
You are going to need to timestamp the events and then use the time stamps to determine what action to take. Something like the below might help you.
if getData(sensor1) > TOUCH_THRESHOLD:
sensor1LastPressedAt = time.time()
Do the same for sensor2 and compare the time stamps.
(TOUCH_THRESHOLD is the value that you measure to be someone touching the button)

Using DYP-ME007Y-PWM Ultrasonic sensor

I actually want to use this waterproof ultrasonic sensor DYP-ME007Y-PWM (http://hanjindata.lgnas.com:10000/myweb/P0400/P0400.pdf) on my raspberry PI Compute Module on a classic Raspbian OS. It has 4 pin's (gnd,Trig,Echo and 5V).
Here is my schematic:
Raspberry Pi | Sensor
GND | GND
5V | 5V
22 | Trig
23 | Echo
I've found some tutorials that explain how ultrasonic sensors works and mannage to have good results with other kind of ultrasonic sensors like this one for exemple (http://www.micropik.com/PDF/HCSR04.pdf)
Here is my code :
# Import required Python libraries
import time
import RPi.GPIO as GPIO
# Use BCM GPIO references
# instead of physical pin numbers
GPIO.setmode(GPIO.BCM)
# Define GPIO to use on Pi
GPIO_TRIGGER = 22
GPIO_ECHO = 23
print "Ultrasonic Measurement"
# Set pins as output and input
GPIO.setup(GPIO_TRIGGER,GPIO.OUT) # Trigger
GPIO.setup(GPIO_ECHO,GPIO.IN) # Echo
# Set trigger to False (Low)
GPIO.output(GPIO_TRIGGER, False)
# Allow module to settle
time.sleep(0.5)
# Send 10us pulse to trigger
while True:
GPIO.output(GPIO_TRIGGER, True)
time.sleep(0.00001)
GPIO.output(GPIO_TRIGGER, False)
start = time.time()
while GPIO.input(GPIO_ECHO)==0:
start = time.time()
while GPIO.input(GPIO_ECHO)==1:
stop = time.time()
# Calculate pulse length
elapsed = stop-start
# Distance pulse travelled in that time is time
# multiplied by the speed of sound (cm/s)
# That was the distance there and back so halve the value
distance = (elapsed * 34000)/2
print "Distance : %.1f" % distance
time.sleep(0.05)
# Reset GPIO settings
GPIO.cleanup()
I doesn't work, i obtain always the same output whatever i do with my sensor
Does anybody has alreeady play with this sensor ? As you can see, the datasheet is pretty ligth, so maybe you will see something my poor electronics skills have missed
Greetings !
You are expecting GPIO_ECHO to be 1 from the start. According to the documentation it is first 0, then 1, and then back to
1.
Maybe
while GPIO.input(GPIO_ECHO)==0:
# some short sleep might be better
pass
start = time.time()
while GPIO.input(GPIO_ECHO)==1:
pass
while GPIO.input(GPIO_ECHO)==0:
pass
stop = time.time()
There are methods available for detecting rising edge and falling edge, see for example raspi.tv arcticle. It might be better to use those methods.
According to:
https://forum.arduino.cc/index.php?topic=153700.30
the sensor is quite sensitive to getting enough power - Check that your 5V doesn't drop too much.
Also the Raspberry Pi GPIO pins are 3V3 - They might not like the output from the sensor (which presumably is 5V), and the sensor might not trigger on the 3V3 output from the Raspberry pi.

recurring notification statement after checking a condition in python

I am working on a small proof of concept and using python to illustrate the idea. The idea is the program will run in a loop and will check for input. Now if the input falls under a threshold then it sends a notification. But I am trying to restrict the notification at an interval of 4 sec. And thats where I am loosing either with the logic or with some syntax. Either way It is doing some unexpected things
1: keep on entering 0 and it will display the below threshold message until it reaches a 4 sec mark and then it just prints out the message 4 times in a single line. I want them to show after every 4 seconds. The idea is (A)the input might change in that 4 sec and the notification switches. (B)I want the notification to play out as a reminder with a recurrence of 4 sec every time the script hits the condition if weightIn < 0.5..if it is true then the notification goes out after 4 sec from the first time it was sent
Sorry if I tried over explaining it. I am pretty new to python
import threading
def main():
while True:
weightIn = float(input("Get value: "))
threshold = .5
def operation():
if weightIn < 0.5:
#send notification at an interval of 4 sec
threading.Timer(4.0, operation).start()
print("Below weight threshhold...send notification")
else:
print("You are good")
if threshold is not None:
operation()
main()
First avoid declaring functions in a loop. Then ask yourself, if an object would not be appropriate, because it properly encloses state attributes.
But for the algorithmic part, it is simple (if I have correctly understood the problem ...). Store the timestamp of last notification and send a new one if more the 4 seconds have elapsed. In pseudo-code :
last_notification_time = 0
threshold = 0.5
loop:
weighIn = get_new_value()
if weightIn < threshold:
time = get_time_in_seconds()
if (time > last_notification_time + 4):
last_notification_time = time
send_notification()
# actual processing
In Python, it could look like :
#import time
def main():
last_notification_time = 0
threshold = 0.5
while True:
weighIn = float(input("Get value: "))
if weightIn < threshold:
cur_time = time.time()
if (cur_time > last_notification_time + 4):
last_notification_time = time
print("Below weight threshhold...send notification")
# actual processing
main()

Categories

Resources