Greetings fellow python programmers. I am building a raspberry pi project that is designed to use moisture sensors in my garden. I have the program designed to take readings for thirty seconds and then average them all into one number. It uses four sensors and runs off of python3.5 The sensors all work just fine, but I'm having a problem getting python to do the math to average the inputs. I think it is adding the variables, but it doesn't seem to be dividing them. Here is the code:
TEST_SOIL()
outpuT = str(output)
print("Moisture:", outpuT)
GPIO.output(buzzer,GPIO.HIGH)
sleep(0.1) # Delay in seconds
GPIO.output(buzzer,GPIO.LOW)
sleep(0.1)
GPIO.output(buzzer,GPIO.HIGH)
sleep(0.1) # Delay in seconds
GPIO.output(buzzer,GPIO.LOW)
print("TESTING SOIL")
o1 = (output + output2 + output3 + output4/4)
sleep(1)
TEST_SOIL()
o2 = (output + output2 + output3 + output4/4)
sleep(1)
TEST_SOIL()
o3 = (output + output2 + output3 + output4/4)
sleep(1)
TEST_SOIL()
o4 = (output + output2 + output3 + output4/4)
sleep(1)
TEST_SOIL()
o5 = (output + output2 + output3 + output4/4)
sleep(1)
TEST_SOIL()
o6 = (output + output2 + output3 + output4/4)
sleep(1)
TEST_SOIL()
o7 = (output + output2 + output3 + output4/4)
sleep(1)
TEST_SOIL()
o8 = (output + output2 + output3 + output4/4)
sleep(1)
TEST_SOIL()
o9 = (output + output2 + output3 + output4/4)
sleep(1)
TEST_SOIL()
o10 = (output + output2 + output3 + output4/4)
sleep(1)
TEST_SOIL()
o11 = (output + output2 + output3 + output4/4)
sleep(1)
TEST_SOIL()
o12 = (output + output2 + output3 + output4/4)
sleep(1)
TEST_SOIL()
o13 = (output + output2 + output3 + output4/4)
sleep(1)
TEST_SOIL()
o14 = (output + output2 + output3 + output4/4)
sleep(1)
TEST_SOIL()
o15 = (output + output2 + output3 + output4/4)
sleep(1)
TEST_SOIL()
o16 = (output + output2 + output3 + output4/4)
sleep(1)
TEST_SOIL()
o17 = (output + output2 + output3 + output4/4)
sleep(1)
TEST_SOIL()
o18 = (output + output2 + output3 + output4/4)
sleep(1)
TEST_SOIL()
o19 = (output + output2 + output3 + output4/4)
sleep(1)
TEST_SOIL()
o20 = (output + output2 + output3 + output4/4)
sleep(1)
TEST_SOIL()
o21 = (output + output2 + output3 + output4/4)
sleep(1)
TEST_SOIL()
o22 = (output + output2 + output3 + output4/4)
sleep(1)
TEST_SOIL()
o23 = (output + output2 + output3 + output4/4)
sleep(1)
TEST_SOIL()
o24 = (output + output2 + output3 + output4/4)
sleep(1)
TEST_SOIL()
o25 = (output + output2 + output3 + output4/4)
sleep(1)
TEST_SOIL()
o26 = (output + output2 + output3 + output4/4)
sleep(1)
TEST_SOIL()
o27 = (output + output2 + output3 + output4/4)
sleep(1)
TEST_SOIL()
o28 = (output + output2 + output3 + output4/4)
sleep(1)
TEST_SOIL()
o29 = (output + output2 + output3 + output4/4)
sleep(1)
TEST_SOIL()
o30 = (output + output2 + output3 + output4/4)
sleep(1)
o = (o1 + o2 + o3 + o4 + o5 + o6 + o7 + o8 + o9 + o10 + o11 + o12 + o13 + o14 + o15 + o16 + o17 + o18 + o19 + o20 + o21 + o22 + o23 + o24 + o25 + o26 + o27 + o28 + o29 + o30)
o = (o/30)
If anyone is wondering what "TEST_SOIL()" is, that is my own function I created earlier in the program. It is defined here:
def TEST_SOIL():
output = analogInput(0) # Reading from CH0
output = interp(output, [0, 1023], [100, 0])
output = int(output)
output = (output - 12.5)
output2 = analogInput(1) # Reading from CH0
output2 = interp(output2, [1, 1023], [100, 1])
output2 = int(output2)
output2 = (output2 - 12.5)
output3 = analogInput(2) # Reading from CH0
output3 = interp(output3, [2, 1023], [100, 2])
output3 = int(output3)
output3 = (output3 - 12.5)
output4 = analogInput(3) # Reading from CH0
output4 = interp(output4, [3, 1023], [100, 3])
output4 = int(output4)
output4 = (output4 - 12.5)
I need to metion that this code also controls a small buzzer to clear up any confusion with the "GPIO.output(buzzer,high/low)" text. If anyone can tell me how to fix this code that would be great.
:)
I took the liberty of refactoring your code a bit.
I assume the 4 different analog reads need to be as such and didn't touch them, but otherwise...
test_soil
now returns a 4-tuple of the readings.average_output()
takes any iterable of numbers to average over.beep()
beeps the buzzer.main
calls the above bits in a loop, gathering values into an array, which it then finally averages.def TEST_SOIL():
output = analogInput(0) # Reading from CH0
output = interp(output, [0, 1023], [100, 0])
output = int(output)
output = output - 12.5
output2 = analogInput(1) # Reading from CH0
output2 = interp(output2, [1, 1023], [100, 1])
output2 = int(output2)
output2 = output2 - 12.5
output3 = analogInput(2) # Reading from CH0
output3 = interp(output3, [2, 1023], [100, 2])
output3 = int(output3)
output3 = output3 - 12.5
output4 = analogInput(3) # Reading from CH0
output4 = interp(output4, [3, 1023], [100, 3])
output4 = int(output4)
output4 = output4 - 12.5
return (output, output2, output3, output4)
def average_output(o):
return sum(o) / len(o)
def beep():
GPIO.output(buzzer, GPIO.HIGH)
sleep(0.1) # Delay in seconds
GPIO.output(buzzer, GPIO.LOW)
def main():
ao = average_output(TEST_SOIL())
print("Initial Moisture:", ao)
beep()
beep()
print("TESTING SOIL")
values = []
for x in range(30):
values.append(average_output(TEST_SOIL()))
sleep(1)
final_average = average_output(values)
print("Final Moisture:", final_average )