You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
88 lines
2.2 KiB
88 lines
2.2 KiB
4 years ago
|
"""
|
||
|
CLI Meter
|
||
|
====================================================================
|
||
|
Takes a reading of the light using the meter attached via to the
|
||
|
intended Raspberry PI. The reading is the sent to a server where the
|
||
|
reading is stored. The intended use for this script is to be run via
|
||
|
the command-line without the need for a G.U.I. This should be the
|
||
|
version used when the "Return to Ritherdon" project is live.
|
||
|
"""
|
||
|
|
||
|
import json
|
||
|
import RPi.GPIO as GPIO
|
||
|
import time, math
|
||
|
import requests
|
||
|
from datetime import datetime
|
||
|
import pdb
|
||
|
|
||
|
# Using BCM (Broadcom) names when referencing the GPIO pins.
|
||
|
GPIO.setmode(GPIO.BCM)
|
||
|
GPIO.setwarnings(True)
|
||
|
|
||
|
a_pin = 18 # Charges the capacitor.
|
||
|
b_pin = 23 # Discharges the capacitor.
|
||
|
|
||
|
api_url = "http://35.176.14.135/api/readings/add/1"
|
||
|
|
||
|
def discharge():
|
||
|
GPIO.setup(a_pin, GPIO.IN)
|
||
|
GPIO.setup(b_pin, GPIO.OUT)
|
||
|
GPIO.output(b_pin, False)
|
||
|
time.sleep(0.01) # 0.01 -- initial value
|
||
|
|
||
|
def charge_time():
|
||
|
GPIO.setup(b_pin, GPIO.IN)
|
||
|
GPIO.setup(a_pin, GPIO.OUT)
|
||
|
GPIO.output(a_pin, True)
|
||
|
t1 = time.time()
|
||
|
while not GPIO.input(b_pin):
|
||
|
pass
|
||
|
t2 = time.time()
|
||
|
return (t2 - t1) * 1000000
|
||
|
|
||
|
def analog_read():
|
||
|
discharge()
|
||
|
return charge_time()
|
||
|
|
||
|
def read_resistance():
|
||
|
n = 20
|
||
|
total = 0;
|
||
|
for i in range(1, n):
|
||
|
total = total + analog_read()
|
||
|
reading = total / float(n)
|
||
|
resistance = reading * 6.05 - 939
|
||
|
return resistance
|
||
|
|
||
|
def light_from_r(R):
|
||
|
return math.log(1000000.0/R) * 10.0
|
||
|
|
||
|
def get_timestamp():
|
||
|
return datetime.now().strftime(("%Y-%m-%d %H:%M:%S"))
|
||
|
|
||
|
def push_reading(lvalue):
|
||
|
time = get_timestamp()
|
||
|
headers = {"content-type": "application/json"}
|
||
|
payload = { "reading": int(lvalue), "time": time}
|
||
|
print(payload)
|
||
|
res = requests.post(api_url, data=json.dumps(payload), headers=headers)
|
||
|
|
||
|
def update_reading():
|
||
|
light = light_from_r(read_resistance())
|
||
|
reading_str = "{:.0f}".format(light)
|
||
|
print(reading_str)
|
||
|
push_reading(light)
|
||
|
|
||
|
def main():
|
||
|
try:
|
||
|
while True:
|
||
|
#pdb.set_trace()
|
||
|
update_reading()
|
||
|
except:
|
||
|
print("Error updating light reading.")
|
||
|
finally:
|
||
|
print("clean up")
|
||
|
GPIO.cleanup() # cleanup all GPIO
|
||
|
|
||
|
if __name__ == "__main__":
|
||
|
main()
|