from os import system import curses import time import datetime import os import random from sense_hat import SenseHat from time import sleep import numpy as np import RPi.GPIO as GPIO GPIO.setmode(GPIO.BCM) GPIO.setup(11,GPIO.OUT) #led Red GPIO.setup(9,GPIO.OUT) #led Green GPIO.setup(10,GPIO.OUT) #led Yellow GPIO.output(11, GPIO.HIGH) GPIO.output(9, GPIO.HIGH) GPIO.output(10, GPIO.HIGH) sense = SenseHat() os.environ["NCURSES_NO_UTF8_ACS"] = "1" curses.initscr() curses.halfdelay(3) curses.start_color() curses.init_pair(1, curses.COLOR_BLACK, curses.COLOR_WHITE) curses.init_pair(2, curses.COLOR_WHITE, curses.COLOR_BLUE) curses.init_pair(3, curses.COLOR_BLACK, curses.COLOR_YELLOW) curses.init_pair(4, curses.COLOR_BLUE, curses.COLOR_WHITE) start_time = time.time() start_hour = time.time() # get CPU temperature def get_cpu_temp(): res = os.popen("vcgencmd measure_temp").readline() t = float(res.replace("temp=","").replace("'C\n","")) return(t) # use moving average to smooth readings def get_smooth(x): if not hasattr(get_smooth, "t"): get_smooth.t = [x,x,x] get_smooth.t[2] = get_smooth.t[1] get_smooth.t[1] = get_smooth.t[0] get_smooth.t[0] = x xs = (get_smooth.t[0]+get_smooth.t[1]+get_smooth.t[2])/3 return(xs) # calculates the real temperature compesating CPU heating def get_temp(): t1 = sense.get_temperature_from_humidity() t2 = sense.get_temperature_from_pressure() t_cpu = get_cpu_temp() h = sense.get_humidity() p = sense.get_pressure() t = (t1+t2)/2 t_corr = t - ((t_cpu-t)/1.25) t_corr = get_smooth(t_corr) f_corr = round(((t_corr * 9)/5)+32,1) return(f_corr) def sendlog(): os.system("mpack -s picorder -a /home/pi/picordlog.txt d10d3.email@gmail.com") def logfile(logstring): global start_time global start_hour current_time=time.time() if current_time>start_time+180: x = datetime.datetime.now() tstamp = datetime.datetime(x.year,x.month,x.day,x.hour,x.minute) #local_time=time.ctime(current_time) f= open("/home/pi/picordlog.txt","a+") logstring=str(tstamp)+","+logstring f.write(logstring+"\r\n") f.close() start_time = time.time() if current_time>start_hour+3600: start_hour = time.time() sendlog() def BlinkinLights(): grid = [] for i in range(0,64): n = random.randint(0, 4) if n == 0: r = random.randint(0,100) b = random.randint(0,100) g = random.randint(0,100) grid.append ([r,g,b]) else: grid.append ([0,0,0]) sense.set_pixels(grid) def GetTemp_old(): t = sense.get_temperature() t = round(t, 1) fconv = ((t * 9)/5)+32 f = round(fconv,1) sleep (0.5) return f def display(): k = 0 #background Window bgw = curses.newwin(12,37,0,0) bgw.border(0) bgw.attron(curses.color_pair(4)) for x in range(0,37): for y in range(0,12): try: bgw.addch(y,x," ") except curses.error: pass bgw.refresh() #Disply loop while (k != ord('q')): BlinkinLights() #Temperature t = get_temp() win_t = curses.newwin(3, 32, 0, 2) win_t.attron(curses.color_pair(1)) win_t.border(0) rangex = (30 / float(120)) * t pos = int(rangex) if pos<1: pos = 0 display = ' ' if pos != 0: win_t.addstr(1, 1, "{}".format(display*pos),curses.color_pair(3)) win_t.addstr(0,2,"Temp(f): " + str(t)) win_t.refresh() #Pressure p = sense.get_pressure() p = round(p, 1) win_p = curses.newwin(3, 32, 3, 2) win_p.attron(curses.color_pair(1)) win_p.border(0) rangex = (30 / float(1260)) * p pos = int(rangex) display = ' ' if pos != 0: win_p.addstr(1, 1, "{}".format(display*pos),curses.color_pair(3)) win_p.addstr(0,2,"Pressure(mb): " + str(p)) win_p.refresh() #Humidity h = sense.get_humidity() h = round(h, 1) win_h = curses.newwin(3, 32, 6, 2) win_h.attron(curses.color_pair(1)) win_h.border(0) rangex = (30 / float(100)) * h pos = int(rangex) display = ' ' if pos != 0: win_h.addstr(1, 1, "{}".format(display*pos),curses.color_pair(3)) win_h.addstr(0,2,"Humidity(%): " + str(h)) win_h.refresh() #Magnetics raw = sense.get_compass_raw() mx = round(raw["x"],5) my = round(raw["y"],5) mz = round(raw["z"],5) m_av = round((mx+my+mz)/3,2) win_m = curses.newwin(3, 32, 9, 2) win_m.attron(curses.color_pair(1)) win_m.border(0) rangex = (30 / float(800)) * (h+600) pos = int(rangex) display = ' ' if pos != 0: win_m.addstr(1, 1, "{}".format(display*pos),curses.color_pair(3)) win_m.addstr(0,2,"Ave. Magnetic Flux(uT): " + str(m_av)) win_m.refresh() #logging logstring =str(t)+","+str(p)+","+str(h)+","+str(m_av) logfile(logstring) k = win_t.getch() sleep(5) def menu(): k = 0 #background Window win = curses.newwin(12,37,0,0) win.border(0) win.attron(curses.color_pair(4)) while (k != ord('q')): for x in range(0,37): for y in range(0,12): try: win.addch(y,x," ") except curses.error: pass win.addstr(3,3,"T: Display Temperature",curses.color_pair(2)) win.addstr(4,3,"Q: Quit",curses.color_pair(2)) win.refresh() k = win.getch() if k == ord('t'): temp_graph() try: display() except curses.error: pass #Close down curses properly, inc turn echo back on! curses.nocbreak(); curses.echo() curses.endwin() GPIO.cleanup() # cleanup all GPIO