2022-07-16 19:01:18 +00:00
|
|
|
|
2022-07-17 09:28:47 +00:00
|
|
|
# morse code analyser
|
2022-07-16 19:01:18 +00:00
|
|
|
from PicoAirQuality import KitronikBME688, KitronikButton, KitronikDataLogger, \
|
|
|
|
KitronikOLED, KitronikRTC, KitronikZIPLEDs,\
|
|
|
|
KitronikBuzzer
|
|
|
|
import time
|
2022-07-17 10:41:12 +00:00
|
|
|
|
|
|
|
mindex=0
|
|
|
|
morse = []
|
2022-07-16 19:01:18 +00:00
|
|
|
oled = KitronikOLED()
|
|
|
|
rtc = KitronikRTC()
|
|
|
|
zipleds = KitronikZIPLEDs(3)
|
|
|
|
rtc.setDate(16, 7, 2022)
|
|
|
|
rtc.setTime(12, 10, 0)
|
2022-07-29 20:10:44 +00:00
|
|
|
rate = 50 # 20 wpm
|
|
|
|
|
2022-08-03 16:42:23 +00:00
|
|
|
# 0=IDLE 1=KEYDN 2=DIT 3=DAH 4=SPACE
|
|
|
|
morse_state = 0
|
|
|
|
|
2022-07-29 20:10:44 +00:00
|
|
|
#sec = 0
|
2022-07-16 19:01:18 +00:00
|
|
|
#f = open(logFileName, 'a')
|
|
|
|
#f.write("# Data Logging: Date, Time, Temperature, Pressure, Humidity, AirQuality, CO2\n")
|
|
|
|
|
|
|
|
beeper = KitronikBuzzer()
|
|
|
|
buttons = KitronikButton()
|
2022-07-17 09:28:47 +00:00
|
|
|
last_pv = 0
|
2022-07-17 09:58:04 +00:00
|
|
|
last_tt = 0
|
2022-07-17 10:41:12 +00:00
|
|
|
spurious = 0 # interrupts are often repeated for the low level
|
2022-07-29 20:10:44 +00:00
|
|
|
button_state = 0 # on==1 off==0
|
2022-07-17 10:41:12 +00:00
|
|
|
|
2022-07-16 20:55:29 +00:00
|
|
|
|
2022-07-29 20:10:44 +00:00
|
|
|
def header():
|
|
|
|
global rate, oled
|
|
|
|
s = "Morse rate " + str(rate) + " mS"
|
|
|
|
oled.displayText(s,1,0)
|
2022-07-17 09:28:47 +00:00
|
|
|
|
2022-07-29 20:10:44 +00:00
|
|
|
def ButtonA_f_IRQHandler(pin):
|
|
|
|
global rate, oled
|
|
|
|
rate += 10
|
|
|
|
if rate > 100:
|
|
|
|
rate = 40
|
|
|
|
oled.clear()
|
|
|
|
header()
|
|
|
|
print (" IRQ button A" + str(rate))
|
2022-07-16 19:01:18 +00:00
|
|
|
|
|
|
|
def ButtonB_f_IRQHandler(pin):
|
2022-08-03 16:42:23 +00:00
|
|
|
global last_pv, last_tt, spurious, mindex, morse_state
|
2022-07-16 20:55:29 +00:00
|
|
|
pv = pin.value()
|
2022-07-17 09:28:47 +00:00
|
|
|
tt = time.ticks_ms()
|
2022-07-17 10:41:12 +00:00
|
|
|
#print("button B IRQ", tt, pv)
|
2022-07-17 09:28:47 +00:00
|
|
|
if last_pv == pv : # get get spurious 0 level ints
|
2022-07-17 10:41:12 +00:00
|
|
|
#print("two ints @ same level in a row",pv) # ignore
|
|
|
|
spurious += 1
|
2022-07-16 20:55:29 +00:00
|
|
|
else:
|
2022-07-17 10:41:12 +00:00
|
|
|
#b=buttonEvent(time.ticks_ms(),pv)
|
2022-07-17 09:58:04 +00:00
|
|
|
d = tt - last_tt
|
2022-08-03 16:42:23 +00:00
|
|
|
if pv: # MORSE BUTTON DOWN
|
|
|
|
|
|
|
|
if ( morse_state == 4 ):
|
|
|
|
if d > rate*7:
|
|
|
|
printm(' ')
|
|
|
|
|
2022-07-17 10:41:12 +00:00
|
|
|
#print(" duration of inter-m space ", d)
|
2022-07-17 21:00:10 +00:00
|
|
|
if d < rate*3:
|
2022-07-17 10:41:12 +00:00
|
|
|
print (" ")
|
|
|
|
else:
|
2022-07-29 20:10:44 +00:00
|
|
|
print (" ipi ")
|
2022-07-17 10:41:12 +00:00
|
|
|
mindex += 1;
|
2022-07-17 09:58:04 +00:00
|
|
|
beeper.playTone(600)
|
2022-07-29 20:10:44 +00:00
|
|
|
button_state = 1
|
2022-08-03 16:42:23 +00:00
|
|
|
morse_state = 1 # button down
|
|
|
|
else: # MORSE BUTTON RELEASED
|
2022-07-17 10:41:12 +00:00
|
|
|
#print(" duration of press ", d)
|
2022-07-17 17:13:06 +00:00
|
|
|
if d > rate*3:
|
2022-07-17 10:41:12 +00:00
|
|
|
morse.append("-");
|
2022-08-03 16:42:23 +00:00
|
|
|
#print ("DAH ms=", morse_state)
|
|
|
|
morse_state = 3
|
2022-07-17 09:58:04 +00:00
|
|
|
else:
|
2022-07-17 10:41:12 +00:00
|
|
|
morse.append(".");
|
2022-08-03 16:42:23 +00:00
|
|
|
#print ("DIT ms=", morse_state)
|
|
|
|
morse_state = 2
|
2022-07-17 09:58:04 +00:00
|
|
|
beeper.stopTone()
|
2022-07-29 20:10:44 +00:00
|
|
|
button_state = 0
|
2022-07-16 20:55:29 +00:00
|
|
|
last_pv = pv
|
2022-07-17 09:58:04 +00:00
|
|
|
last_tt = tt
|
2022-07-29 20:10:44 +00:00
|
|
|
|
|
|
|
buttons.buttonB.irq(trigger=machine.Pin.IRQ_FALLING|machine.Pin.IRQ_RISING, \
|
|
|
|
handler=ButtonB_f_IRQHandler)
|
2022-07-16 19:01:18 +00:00
|
|
|
|
2022-07-29 20:10:44 +00:00
|
|
|
buttons.buttonA.irq(trigger=machine.Pin.IRQ_RISING, handler=ButtonA_f_IRQHandler)
|
2022-07-16 19:01:18 +00:00
|
|
|
|
2022-07-17 17:13:06 +00:00
|
|
|
charbuf = []
|
|
|
|
hpm=10
|
|
|
|
vpm=2
|
|
|
|
def printm(mchar):
|
|
|
|
global hpm, oled, vpm, charbuf
|
|
|
|
charbuf.append(mchar)
|
|
|
|
chcnt = 0
|
|
|
|
oled.clear()
|
2022-07-29 20:10:44 +00:00
|
|
|
header()
|
2022-07-17 17:13:06 +00:00
|
|
|
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);
|
|
|
|
|
2022-07-17 10:41:12 +00:00
|
|
|
def decode_morse():
|
|
|
|
global morse
|
|
|
|
dm_a = [".","-"]
|
|
|
|
dm_b = ["-",".",".","."]
|
2022-07-17 10:52:01 +00:00
|
|
|
dm_c = ["-",".","-","."]
|
|
|
|
dm_d = ["-",".","."]
|
2022-07-17 10:41:12 +00:00
|
|
|
dm_e = ["."]
|
2022-07-17 10:52:01 +00:00
|
|
|
dm_f = [".",".","-","."]
|
|
|
|
dm_g = ["-","-","."]
|
|
|
|
dm_h = [".",".",".","."]
|
2022-07-17 10:41:12 +00:00
|
|
|
dm_i = [".","."]
|
2022-07-17 10:52:01 +00:00
|
|
|
dm_j = [".","-","-","-"]
|
2022-07-17 17:13:06 +00:00
|
|
|
dm_k = ["-",".","-"]
|
|
|
|
dm_l = [".","-",".","."]
|
|
|
|
dm_m = ["-","-"]
|
|
|
|
dm_n = ["-","."]
|
|
|
|
dm_o = ["-","-","-"]
|
|
|
|
dm_p = [".","-","-","."]
|
|
|
|
dm_q = ["-","-",".","-"]
|
|
|
|
dm_r = [".","-","."]
|
2022-07-17 10:41:12 +00:00
|
|
|
dm_s = [".",".","."]
|
2022-07-17 17:13:06 +00:00
|
|
|
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 = ["-","-","-","-","."]
|
2022-07-17 10:52:01 +00:00
|
|
|
#
|
2022-07-17 10:41:12 +00:00
|
|
|
if morse == dm_a:
|
2022-07-17 17:13:06 +00:00
|
|
|
return ("A")
|
2022-07-17 10:52:01 +00:00
|
|
|
if morse == dm_b:
|
2022-07-17 17:13:06 +00:00
|
|
|
return ("B")
|
2022-07-17 10:52:01 +00:00
|
|
|
if morse == dm_c:
|
2022-07-17 17:13:06 +00:00
|
|
|
return ("C")
|
2022-07-17 10:52:01 +00:00
|
|
|
if morse == dm_d:
|
2022-07-17 17:13:06 +00:00
|
|
|
return ("D")
|
2022-07-17 10:52:01 +00:00
|
|
|
if morse == dm_e:
|
2022-07-17 17:13:06 +00:00
|
|
|
return ("E")
|
2022-07-17 10:52:01 +00:00
|
|
|
if morse == dm_f:
|
2022-07-17 17:13:06 +00:00
|
|
|
return ("F")
|
2022-07-17 10:52:01 +00:00
|
|
|
if morse == dm_g:
|
2022-07-29 20:10:44 +00:00
|
|
|
return ("G")
|
2022-07-17 10:52:01 +00:00
|
|
|
if morse == dm_h:
|
2022-07-17 17:13:06 +00:00
|
|
|
return ("H")
|
2022-07-17 10:52:01 +00:00
|
|
|
if morse == dm_i:
|
2022-07-17 17:13:06 +00:00
|
|
|
return ("I")
|
2022-07-17 10:52:01 +00:00
|
|
|
if morse == dm_j:
|
2022-07-17 17:13:06 +00:00
|
|
|
return ("J")
|
|
|
|
if morse == dm_k:
|
2022-07-29 20:10:44 +00:00
|
|
|
return ("K")
|
2022-07-17 17:13:06 +00:00
|
|
|
if morse == dm_l:
|
|
|
|
return ("L")
|
|
|
|
if morse == dm_m:
|
|
|
|
return ("M")
|
|
|
|
if morse == dm_n:
|
|
|
|
return ("N")
|
2022-07-17 10:52:01 +00:00
|
|
|
if morse == dm_o:
|
2022-07-17 17:13:06 +00:00
|
|
|
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("?")
|
2022-07-17 10:41:12 +00:00
|
|
|
|
2022-08-03 16:42:23 +00:00
|
|
|
|
2022-07-17 09:28:47 +00:00
|
|
|
def process_morse():
|
2022-08-03 16:42:23 +00:00
|
|
|
global last_tt, morse, morse_state
|
2022-07-17 10:41:12 +00:00
|
|
|
tt = time.ticks_ms()
|
2022-08-03 16:42:23 +00:00
|
|
|
if ( morse_state == 2 or morse_state == 3):
|
|
|
|
if (tt - last_tt) > rate*3:
|
2022-07-29 20:10:44 +00:00
|
|
|
# morse chacter complete
|
2022-08-03 16:42:23 +00:00
|
|
|
printm(decode_morse())
|
|
|
|
morse = [] # clear for next character to rxd
|
|
|
|
morse_state = 4
|
|
|
|
|
2022-07-17 17:31:56 +00:00
|
|
|
|
2022-07-17 10:41:12 +00:00
|
|
|
|
2022-07-17 09:28:47 +00:00
|
|
|
|
|
|
|
|
|
|
|
while True:
|
2022-07-17 09:58:04 +00:00
|
|
|
process_morse()
|
2022-07-29 20:10:44 +00:00
|
|
|
|
2022-07-17 09:28:47 +00:00
|
|
|
|