# 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) 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 < 600: print (" ") else: print (" interval ") mindex += 1; beeper.playTone(600) else: #print(" duration of press ", d) if d > 300: 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) 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_s = [".",".","."] dm_o = ["-","-","-"] # if morse == dm_a: print ("A") if morse == dm_b: print ("B") if morse == dm_c: print ("C") if morse == dm_d: print ("D") if morse == dm_e: print ("E") if morse == dm_f: print ("F") if morse == dm_g: print ("G") if morse == dm_h: print ("H") if morse == dm_i: print ("I") if morse == dm_j: print ("J") if morse == dm_s: print ("S") if morse == dm_o: print ("O") def process_morse(): global last_tt, morse tt = time.ticks_ms() if (tt - last_tt) > 600: # morse chacter complete if (len(morse) > 0): print(morse) decode_morse() morse = [] oled.clear() oled.displayText(rtc.readDateString(), 1, 25) oled.displayText(rtc.readTimeString(), 2, 33) #oled.displayText(str(mcount), 4, 33) oled.show() 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)