# # hello.light.45.py # # receive and display light level # # Neil Gershenfeld # CBA MIT 10/24/07 # # (c) Massachusetts Institute of Technology 2007 # Permission granted for experimental and personal use; # license for commercial sale available from MIT # # Modified by Inna Koyrakh # from Tkinter import * import serial import random # # Filtering variables # WINDOW = 600 eps = 0.1 #saveflag = 0 # # Usable sensor values # filter = 0.0 minVal = 2000.0 maxVal = 1.0 R = 100 # # Canvas positioning and dimensions # cMin_x = 0 cMin_y = 0 cMax_x = 450 cMax_y = 300 # # Canvas center # center_x = 0.5*(cMin_x+cMax_x) center_y = 0.5*(cMin_y+cMax_y) # # open serial port # ser = serial.Serial('COM13',9600) ser.setDTR() def idle(parent,canvas): global minVal, maxVal, cMax_x, cMax_y, filter, eps #saveflag # # idle routine # byte2 = 0 byte3 = 0 byte4 = 0 ser.flush() while 1: # # find framing # byte1 = byte2 byte2 = byte3 byte3 = byte4 byte4 = ord(ser.read()) if ((byte1 == 1) & (byte2 == 2) & (byte3 == 3) & (byte4 == 4)): break low = ord(ser.read()) high = ord(ser.read()) value = 256*high + low filter = (1-eps)*filter + eps*value # # learn current working range of sensor # if filter <= minVal: minVal = filter if filter >= maxVal: maxVal = filter # # GUI parameters # ## maxDir = max(center_x, center_y) ## R = random.uniform(0, maxDir) # function of intensity R = 0.5*(filter/maxVal)*cMax_x canvas.coords('circle', center_x-R, center_y-R, center_x+R, center_y+R) canvas.update() parent.after_idle(idle,parent,canvas) # # set up GUI # master = Tk() master.title('hello.light.45.py (q to exit)') master.bind('q','exit') # # Initialize canvas # canvas = Canvas(master, width=450, height=300, background='white') canvas.create_oval(center_x-10, center_y-10, center_x+10, center_y+10, tags='circle', fill='#0000b0') canvas.pack() # # start idle loop # master.after(1000,idle,master,canvas) # ms allowed for startup master.mainloop()