def init(): print("初始化開始") init_hz = [] # 欲存放初始頻率的空 list motor = PWM(Pin(25), duty=0) # 建立運轉馬達的 PWM 物件 for i in range(10): # 執行代表數字'0'~'9'的速度 motor.duty(400 + 50 * i) time.sleep(1) # 穩定轉速 fft = FFT(64, 4000, 34) # 採樣數 64、採樣頻率4000、指定腳位34 peak = fft.major_peak() # 判斷該數字對應速度的聲音頻率為何 print(peak) # 將初始頻率顯示出來, 判斷是否初始化成功 init_hz.append(peak) # 將初始頻率加入 list 內 motor.duty(0) # 暫停運轉 time.sleep(1) # 穩定停止 motor.deinit() # 停止運轉馬達的 PWM 功能 threshold = [] # 欲存放閾值的空 list for j in range(9): conti_ave = (init_hz[j] + init_hz[j + 1]) / 2 # 相鄰兩項相加的平均 threshold.append(conti_ave) # 加入閾值串列內 threshold.append(init_hz[9] + 100) # 數字'9'的頻率 + 100 print("初始化結束") return threshold # 回傳閾值陣列
def run_judge(ascii_unm, threshold): # 主程式中重複執行的部分 laser = PWM(Pin(25), freq=0) laser.freq(10 * ascii_unm) # ascii碼 個別數字運轉 time.sleep(0.1) fft = FFT(64, 4000, 34) # 採樣數 128、採樣頻率4000、指定腳位36 peak = fft.major_peak() # 判斷該數字對應速度的聲音頻率為何 laser.deinit() for i in range(127): if peak < threshold[i]: # 判斷落在哪一閾值內, 對應之索引便是該數字 print(i, end='') # 將判斷的數字印出 break # 停止迴圈
def run_judge(ascii_unm, threshold): # 主程式中重複執行的部分 motor = PWM(Pin(25), duty=0) motor.duty(400 + 50 * ascii_unm) # ascii碼 個別數字運轉 time.sleep(1) # 穩定轉速 fft = FFT(64, 4000, 34) # 採樣數 128、採樣頻率4000、指定腳位34 peak = fft.major_peak() # 判斷該數字對應速度的聲音頻率為何 motor.duty(0) # 停止運轉 motor.deinit() time.sleep(1) # 穩定停止 for i in range(10): if peak < threshold[i]: # 判斷落在哪一閾值內, 對應之索引便是該數字 print(i, end='') # 將判斷的數字印出 break # 停止迴圈
def init(): print("初始化開始") init_hz = [] # 欲存放初始頻率的空 list laser = PWM(Pin(25), freq=0) # 建立 pwm 物件 for i in range(127): # 執行代表 ASCII 碼 0 ~ 126 的頻率 laser.freq(10 * i) time.sleep(0.1) # 設定一點延遲時間, 防止錯誤 fft = FFT(64, 4000, 34) # 採樣數 64、採樣頻率4000、指定腳位34 peak = fft.major_peak() # 判斷該數字對應速度的聲音頻率為何 print(peak) # 將初始頻率顯示出來, 判斷是否初始化成功 init_hz.append(peak) # 將初始頻率加入 list 內 laser.deinit() threshold = [] # 欲存放閾值的空 list for j in range(126): loss = (init_hz[j] + init_hz[j + 1]) / 2 # 相鄰兩項相加的平均 threshold.append(loss) threshold.append(init_hz[126] + 100) # ASCII碼 126 初始頻率 +100 print("初始化結束") return threshold
from flag_fft import FFT import time while True: fft = FFT(64, 4000, 34) # 建立 FFT 物件 peak = fft.major_peak() # 判斷主頻率 print(peak) time.sleep(0.1) # 等候 0.1 秒
from machine import Pin from flag_pwm import PWM from flag_fft import FFT import time while True: motor = PWM(Pin(25),duty=0) # 建立運轉馬達的 PWM 物件 speed = int(input("指定 duty 為:")) print("開始運轉") motor.duty(speed) # 運轉指定 duty 值的速度 time.sleep(1) # 持續 1 秒 fft = FFT(64,4000,34) peak = fft.major_peak() #輸出整體主頻率 print(peak) motor.deinit() # 停止運轉馬達的 PWM 功能 print("結束運轉, 待馬達完全停止再繼續輸入")