""" 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 KeyboardInterrupt: print("Keyboard Interrupt: quitting program.") except: print("Error updating light reading...") finally: print("Cleaning up GPIO before closing...") GPIO.cleanup() if __name__ == "__main__": main()