So far we have been making quite a few boards in the past 5 months. For this week, I will be working on the thermistor, which is the input board I made in week 11. I would have loved to write an application programme for the phototransistor as well, but there was problem with the phototransistor board I made. I believe the board was short-circuited over time. So I tried doing a reflow, and in the course of that, the copper pad under the phototransistor fell out, rendering the board useless. I didn't have time to re-mill the board so I can only make do with using the thermistor board.
Tkinter: I spent Thursday and Friday watching a Lydia tutorial, entitled "Python GUI Development with Tkinter", which greatly helped my learning of the syntax of Tkinter. Because the tutorial was conducted in Python 3, I have upgraded my Python 2.7 to 3.4. Minor syntax change applies.
from tkinter import * // in Python 2, use capital T in "from Tkinter import *" from numpy import log from tkinter import ttk import serialI added 2 variable to hold celcius and Fahrenheit values, and call a function to check my radio button selection.
ctemp = filter ftemp = (ctemp*9.0)/5.0+32 # Celcius to Fahrenheit display_temp()
def display_temp(): if rbVar.get() == 2: # display Fahrenheit text2 = "°F" canvas.itemconfigure("text2",text="%s"%text2) canvas.itemconfigure("text",text="%.2f"%ftemp) else: # display Celcius text2 = "°C" canvas.itemconfigure("text2",text="%s"%text2) canvas.itemconfigure("text",text="%.2f"%ctemp)Radio buttons to be placed on the canvas
rb1 = ttk.Radiobutton(root, text='Celcius °C ', variable=rbVar, value=1, command=display_temp).place(x=220,y=10) rb2 = ttk.Radiobutton(root, text='Fahrenheit °F', variable=rbVar, value=2, command=display_temp).place(x=320,y=10)
matplotlib: I used another 1.5 days trying to understand matplotlib and how to plot a graph from live data. The website and youtube tutorial by Paul McWhorter has been most helpful to explain some of the concepts and purposes behind the syntaxes of matplotlib.
matplotlib is a python 2D plotting library which produces publication quality figures in a variety of hardcopy formats and interactive environments across platforms. To install matplotlib, I will execute "pip install matplotlib" at command prompt. I will also need drawnow, which can be installed by executing "pip install drawnow" at command prompt. I was using IDLE and/or sublime text as the platform for writing the codes.
import matplotlib.pyplot as plt from numpy import log from drawnow import * import serial #plt.ion() # interactive mode to plot live data tempV=[] filter = 0.0 eps = 0.5 cnt = 0 SerialData = serial.Serial('COM9',9600) def makeGraph(): # a function that makes desire plot plt.ylim(22,32) # y axis limiter plt.title('Live Temperature Sensor') plt.grid(True) plt.ylabel('Temperature (Celcius)') plt.xlabel('time') plt.plot(tempV, "bo-", label='Temperature') # blue round dot plt.legend(loc='upper left') while True: byte2 = 0 byte3 = 0 byte4 = 0 SerialData.flush() while 1: # # find framing # byte1 = byte2 byte2 = byte3 byte3 = byte4 byte4 = ord(SerialData.read()) if ((byte1 == 1) & (byte2 == 2) & (byte3 == 3) & (byte4 == 4)): break low = ord(SerialData.read()) high = ord(SerialData.read()) print(low) print(high) value = 256*high + low if (value > 511): value -= 1024 # value = value - 1024 V = 2.5 - value*5.0/(20.0*512.0) # Voltage out (Vo) = R / (R + 10K) * Vcc = 2.5 R = 10000.0/(5.0/V-1.0) B = 3950.0 R25 = 10000.0 T = 1.0/(log(R/R25)/B+(1/(25.0+273.15))) - 273.15 filter = (1-eps)*filter + eps*T temp = float(filter) tempV.append("%.2f" % temp) # Build our array by appending temperature readings print("%.2f" % temp) drawnow(makeGraph) # call drawnow to draw live graph plt.pause (.0001) cnt=cnt+1 if(cnt>30): # delete the first item from the array tempV.pop(0) # this allows us to just see the last 30 data points
As for matplotlib, the outcome of the plotting is not returning the values which I was expecting. I couldn't understand what went wrong with my codes and why the serial input was not able to respond according to the temperature change. I spent 2 days troubleshooting this problem and was not able to solve it. The serial data generated from the hello.temp.45.py changes in response to temperature. But when I run the display_temperature.py, the serial data was "consistent" and does not respond to temperature change. Since everything on the board was constant (I didn't even change the c code on the microcontroller), the problem must have to do with the python coding of my matplotlib programme. 2nd half of the youtube video records the problem with the data.
I really enjoyed this week's assignment because programming engaged my mind throughout the entire week, as I was thinking through the syntax and logic of the codes. It was fun exploring new languages and greatly satisfying when the programme was able to perform in the way I wanted it to. (And it can be rather frustrating, trying over and over again, just to get it right).