### ex4-1 ### from machine import Pin, ADC import time adc_pin = Pin(36) # 36 是 ESP32 的 VP 腳位 adc = ADC(adc_pin) # 建立 ADC 物件 adc.width(ADC.WIDTH_9BIT) # 設定 ADC 範圍。9BIT 代表範圍是 0 ~ 511,可選擇 9bit、10bit、11bit 和 12bit 的解析度。 adc.atten(ADC.ATTN_11DB) # 將最大感測電壓設定成 3.6V,超過 3.6V 時會得到 ADC 最大值 511 while True: print(adc.read()) # 顯示 ADC 值 time.sleep(0.5) # 暫停 0.5 秒 ### ex4-2 ### >>> tem = input("現在溫度:") # 使用 input() 函數,將使用者輸入的字串暫存在變數 tem 中 >>> tem # 顯示變數 tem 的值 ### ex4-3 ### f = open('123.txt', 'w') # 開啟檔案 test.txt,屬性為可寫入,若無則新增一個 f.write(str(123)) # 將數值 123 轉換成字串,並寫到檔案中 f.close() # 關閉檔案 ### ex4-4 ### from machine import Pin, ADC f = open('test.txt', 'w') adc_pin = Pin(36) adc = ADC(adc_pin) adc.width(ADC.WIDTH_9BIT) adc.atten(ADC.ATTN_11DB) tem = input("請輸入現在溫度:") f.write(str(adc.read()) + ' ' + tem) # 串聯 adc.read() 與 變數的字串 f.close() ### ex4-5 ### from machine import Pin,ADC import time adc_pin = Pin(36) # 36 是 ESP32 的 VP 腳位 adc = ADC(adc_pin) # 設定 36 為輸入腳位 adc.width(ADC.WIDTH_9BIT) # 設定分辨率位元數 (解析度) adc.atten(ADC.ATTN_11DB) # 設定最大電壓 data = 0 # 資料總和 ti= 1 # 資料筆數 f = open('temperature.txt', 'w') # 開啟 txt 檔 print(adc.read()) # 先顯示一次,確認數值是否正常 while True: print('第' + str(ti) + '筆') # 顯示紀錄第幾筆 tem = input("現在溫度:") # 輸入實際溫度 if(tem == 'end'): break else: for i in range(20): # 重複 20 次 thermal = adc.read() # ADC 值 data = data + thermal # 加總至 data time.sleep(0.01) data = int(data/20) # 取平均 print("熱敏電阻:", data) print('') # 多空一行 f.write(str(data) + ' ' + tem + '\n') # data 存到檔案中 data = 0 # 總和歸 0 ti += 1 # 次數加 1 f.close() ### ex4-6 ### # 新增一個 notebook 檔,例如: temperature_model.ipynb # 匯入溫度資料 from google.colab import files uploaded = files.upload() # 匯入檔案 ### ex4-7 ### # 匯入 keras_lite_convertor 模組 uploaded = files.upload() # 匯入keras_lite_convertor # 讀取 temperature.txt import keras_lite_convertor as kc path_name = 'temperature.txt' Data_reader = kc.Data_reader(path_name, mode='regression') data, label = Data_reader.read() ### ex4-8 ### # 資料預處理 # 取資料中的 85% 當作訓練集 split_num = int(len(data) * 0.85) train_data = data[:split_num] train_label = label[:split_num] ### ex4-9 ### # 正規化 mean = train_data.mean() # 平均數 data -= mean std = train_data.std() # 標準差 data /= std label /= 100 # 將 label 範圍落在 0 ~ 1 (label 正規化) ### ex4-10 ### # 訓練集、驗證集、測試集的資料形狀 # 訓練集 print(train_data.shape) # 驗證集 validation_data = data[split_num:-5] print(validation_data.shape) validation_label = label[split_num:-5] # 測試集 test_data = data[-5:] print(test_data.shape) test_label = label[-5:] ### ex4-11 ### # 建立神經網路架構 from tensorflow.keras.models import Sequential from tensorflow.keras import layers model = Sequential() model.add(layers.Dense(20,activation = 'relu', input_shape=(1,))) # 增加一個密集層, 使用ReLU激活函數, 輸入層有1個輸入特徵 model.add(layers.Dense(20,activation = 'relu')) model.add(layers.Dense(20,activation = 'relu')) model.add(layers.Dense(1)) model.summary() # 顯示模型資訊 ### ex4-12 ### # 編譯及訓練模型 model.compile(optimizer='adam',loss='mse',metrics=['mae']) train_history = model.fit(train_data,train_label, # 測試集 validation_data=(validation_data,validation_label), # 驗證集 epochs=1000) # 訓練週期 ### ex4-13 ### # 測試模型 # 預測值 print('predict:') print(model.predict(test_data)) print() # 實際值 print('real:') print(test_label) ### ex4-14 ### # 儲存模型 kc.save(model, 'temperature_model.json') ### ex4-15 ### # 顯示正規化相關資訊 print('mean=', mean) print('std=', std) ### ex4-16 ### from machine import Pin, ADC import time from keras_lite import Model # 從 keras_lite 模組匯入 Model import ulab as np # 匯入 ulab 模組並命名為 np model = Model('temperature_model.json') # 建立模型物件 # 增加神經網路的參數與模型 mean = 170.98275862068965 # 平均值 std = 90.31162360353873 # 標準差 adc_pin = Pin(36) adc = ADC(adc_pin) adc.width(ADC.WIDTH_9BIT) adc.atten(ADC.ATTN_11DB) data = 0 while True: for i in range(20): thermal = adc.read() data = data + thermal time.sleep(0.01) data = data/20 print(int(data),end = ' ') # 顯示 ADC 值; end=''代表不換行 data = np.array([int(data)]) # 將 data 轉換成 array 格式 data = data - mean # data 減掉平均數 data = data/std # data 除以標準差 tem = model.predict(data) # 得出預測值 tem = round(tem[0]*100, 1) # 將預測值 x100 等於預測溫度 print(tem) data = 0 time.sleep(1) # 暫停 1 秒