# morse code analyser from PicoAirQuality import KitronikBME688, KitronikButton, KitronikDataLogger, \ KitronikOLED, KitronikRTC, KitronikZIPLEDs,\ KitronikBuzzer import time mindex=0 morse = [] oled = KitronikOLED() rtc = KitronikRTC() zipleds = KitronikZIPLEDs(3) rtc.setDate(16, 7, 2022) rtc.setTime(12, 10, 0) rate = 50 # 20 wpm # 0=IDLE 1=KEYDN 2=DIT 3=DAH 4=SPACE morse_state = 0 #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 button_state = 0 # on==1 off==0 def header(): global rate, oled s = "Morse rate " + str(rate) + " mS" oled.displayText(s,1,0) def ButtonA_f_IRQHandler(pin): global rate, oled rate += 10 if rate > 100: rate = 40 oled.clear() header() print (" IRQ button A" + str(rate)) def ButtonB_f_IRQHandler(pin): global last_pv, last_tt, spurious, mindex, morse_state 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: # MORSE BUTTON DOWN if ( morse_state == 4 ): if d > rate*7: printm(' ') #print(" duration of inter-m space ", d) if d < rate*3: print (" ") else: print (" ipi ") mindex += 1; beeper.playTone(600) button_state = 1 morse_state = 1 # button down else: # MORSE BUTTON RELEASED #print(" duration of press ", d) if d > rate*3: morse.append("-"); #print ("DAH ms=", morse_state) morse_state = 3 else: morse.append("."); #print ("DIT ms=", morse_state) morse_state = 2 beeper.stopTone() button_state = 0 last_pv = pv last_tt = tt buttons.buttonB.irq(trigger=machine.Pin.IRQ_FALLING|machine.Pin.IRQ_RISING, \ handler=ButtonB_f_IRQHandler) buttons.buttonA.irq(trigger=machine.Pin.IRQ_RISING, handler=ButtonA_f_IRQHandler) charbuf = [] hpm=10 vpm=2 def printm(mchar): global hpm, oled, vpm, charbuf charbuf.append(mchar) chcnt = 0 oled.clear() header() 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: return ("G") if morse == dm_h: return ("H") if morse == dm_i: return ("I") if morse == dm_j: return ("J") if morse == dm_k: return ("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("?") def process_morse(): global last_tt, morse, morse_state tt = time.ticks_ms() if ( morse_state == 2 or morse_state == 3): if (tt - last_tt) > rate*3: # morse chacter complete printm(decode_morse()) morse = [] # clear for next character to rxd morse_state = 4 while True: process_morse()