# morse code analyser from PicoAirQuality import KitronikBME688, KitronikButton, KitronikDataLogger, \ KitronikOLED, KitronikRTC, KitronikZIPLEDs,\ KitronikBuzzer import time #from datetime import datetime logFileName = "atmosphere_log.txt" mindex=0 morse = [] #bme688 = KitronikBME688() oled = KitronikOLED() rtc = KitronikRTC() zipleds = KitronikZIPLEDs(3) # Python u arse hole sec = Integer() rtc.setDate(16, 7, 2022) rtc.setTime(12, 10, 0) rate = 60 # 20 wpm #bme688.setupGasSensor() #bme688.calcBaselines() sec = 0 #f = open(logFileName, 'a') #f.write("# Data Logging: Date, Time, Temperature, Pressure, Humidity, AirQuality, CO2\n") beeper = KitronikBuzzer() buttons = KitronikButton() last_pv = 0 last_tt = 0 spurious = 0 # interrupts are often repeated for the low level # make this array size 20. A morse char of 5 dots|dashes # would take up 10 slots max. # class buttonEvent: #mstimestamp = 0 #pinstate = 0 def __init__(self, mststamp, pinst): buttonEvent.mstimestamp = mststamp buttonEvent.pinstate = pinst #def str(self): #return "mstimestamp:",str(mstimestamp), "pinst ",str(pinstate) #def ButtonB_r_IRQHandler(pin): # global buttonB # buttonB = 2*60 # print("button B pressed", buttonB) def ButtonB_f_IRQHandler(pin): global last_pv, last_tt, spurious, mindex pv = pin.value() tt = time.ticks_ms() #print("button B IRQ", tt, pv) if last_pv == pv : # get get spurious 0 level ints #print("two ints @ same level in a row",pv) # ignore spurious += 1 else: #b=buttonEvent(time.ticks_ms(),pv) d = tt - last_tt if pv: #print(" duration of inter-m space ", d) if d < rate*3: print (" ") else: print (" interval ") mindex += 1; beeper.playTone(600) else: #print(" duration of press ", d) if d > rate*3: morse.append("-"); print ("DAH") else: morse.append("."); print ("DIT") beeper.stopTone() last_pv = pv last_tt = tt # FALLING DOES NOT WORK AND IRQ_LOW_LEVEL not recognised buttons.buttonB.irq(trigger=machine.Pin.IRQ_FALLING|machine.Pin.IRQ_RISING, handler=ButtonB_f_IRQHandler) #buttons.buttonB.irq(trigger=machine.Pin.IRQ_RISING, handler=ButtonB_r_IRQHandler) charbuf = [] hpm=10 vpm=2 def printm(mchar): global hpm, oled, vpm, charbuf charbuf.append(mchar) chcnt = 0 oled.clear() oled.displayText("Morse rxd",1,2) while len(charbuf) > (4*20): charbuf.pop(0) # get rid of old morse for i in range(2,6): for j in range (0,20): chcnt += 1 if len(charbuf) > chcnt: oled.displayText(charbuf[chcnt], i, j*6) else: oled.displayText(' ', i, j*6) oled.show() print(mchar); def decode_morse(): global morse dm_a = [".","-"] dm_b = ["-",".",".","."] dm_c = ["-",".","-","."] dm_d = ["-",".","."] dm_e = ["."] dm_f = [".",".","-","."] dm_g = ["-","-","."] dm_h = [".",".",".","."] dm_i = [".","."] dm_j = [".","-","-","-"] dm_k = ["-",".","-"] dm_l = [".","-",".","."] dm_m = ["-","-"] dm_n = ["-","."] dm_o = ["-","-","-"] dm_p = [".","-","-","."] dm_q = ["-","-",".","-"] dm_r = [".","-","."] dm_s = [".",".","."] dm_t = ["-"] dm_u = [".",".","-"] dm_v = [".",".",".","-"] dm_w = [".","-","-"] dm_x = ["-",".",".","-"] dm_y = ["-",".","-","-"] dm_z = ["-","-",".","."] # dm_0 = ["-","-","-","-","-"] dm_1 = [".","-","-","-","-"] dm_2 = [".",".","-","-","-"] dm_3 = [".",".",".","-","-"] dm_4 = [".",".",".",".","-"] dm_5 = [".",".",".",".","."] dm_6 = ["-",".",".",".","."] dm_7 = ["-","-",".",".","."] dm_8 = ["-","-","-",".","."] dm_9 = ["-","-","-","-","."] # if morse == dm_a: return ("A") if morse == dm_b: return ("B") if morse == dm_c: return ("C") if morse == dm_d: return ("D") if morse == dm_e: return ("E") if morse == dm_f: return ("F") if morse == dm_g: print ("G") if morse == dm_h: return ("H") if morse == dm_i: return ("I") if morse == dm_j: return ("J") if morse == dm_k: print ("K") if morse == dm_l: return ("L") if morse == dm_m: return ("M") if morse == dm_n: return ("N") if morse == dm_o: return ("O") if morse == dm_p: return ("P") if morse == dm_q: return ("Q") if morse == dm_r: return ("R") if morse == dm_s: return ("S") if morse == dm_t: return ("T") if morse == dm_u: return ("U") if morse == dm_v: return ("V") if morse == dm_w: return ("W") if morse == dm_x: return ("X") if morse == dm_y: return ("Y") if morse == dm_z: return ("Z") if morse == dm_0: return ("0") if morse == dm_1: return ("1") if morse == dm_2: return ("2") if morse == dm_3: return ("3") if morse == dm_4: return ("4") if morse == dm_5: return ("5") if morse == dm_6: return ("6") if morse == dm_7: return ("7") if morse == dm_8: return ("8") if morse == dm_9: return ("9") return("?") last_was_space = 0 last_sp = 0 def process_morse(): global last_tt, morse, last_was_space, last_sp tt = time.ticks_ms() if (tt - last_tt) > rate*6: # morse chacter complete if (len(morse) > 0): #print(morse) printm(decode_morse()) morse = [] last_was_space = 0 last_sp = last_tt #oled.clear() #oled.displayText(rtc.readDateString(), 1, 25) #oled.displayText(rtc.readTimeString(), 2, 33) #oled.displayText(str(mcount), 4, 33) #oled.show() if (tt - last_sp) > rate*22 : # and last_not_space == 0: if last_was_space == 0: printm(" "); last_was_space = 1 # dont keep repeating inter word spaces while True: # maybe a function can have a global ref, yeah maybe the main cont. another wanky aspect ogf pythion process_morse() ##process_morse2() #time.sleep(1.0)