iT邦幫忙

2024 iThome 鐵人賽

DAY 6
1
Python

使用 WiFiBoy Python 玩學機來學物聯網應用 系列 第 6

06. MicroPython 基礎語法簡介(中)

  • 分享至 

  • xImage
  •  

記憶體與檔案管理類程式

# 05_05. 查看機器基本資訊
import machine
import gc
import os

# 查看 CPU 運行速率(Hz)
cpu_freq = machine.freq() / 1000 / 1000  # 轉換為 MHz

# 查看記憶體使用狀況
gc.collect()  # 手動垃圾回收,獲取準確的記憶體使用狀況
free_memory = gc.mem_free() / 1024  # 可用記憶體,轉換為 KB
allocated_memory = gc.mem_alloc() / 1024  # 已分配記憶體,轉換為 KB

# 查看 Flash 空間大小
fs_stat = os.statvfs('/')
total_flash = fs_stat[0] * fs_stat[2] / 1024 / 1024  # 總共的 Flash 空間,轉換為 MB
free_flash = fs_stat[0] * fs_stat[3] / 1024  / 1024  # 可用的 Flash 空間,轉換為 MB

# 獲取機器的 UID
uid = machine.unique_id()
# 將 UID 轉換為十六進位表示並格式化為字符串
uid_str = ':'.join(f'{b:02x}' for b in uid)

print(f"CPU 運算頻率: {cpu_freq:.2f} MHz")
print(f"可用記憶體: {free_memory:.2f} KB")
print(f"已分配的記憶體: {allocated_memory:.2f} KB")
print(f"全部 Flash 空間: {total_flash:.2f} MB")
print(f"可用 Flash 空間: {free_flash:.2f} MB")
print(f"機器的 UID: {uid_str}")

常用數學函數

# 05_06. 隨機產生 0 ~ 100 的整數,計算全距、平均值、眾數、標準差與四分位數。
import random
import math

# 生成 0 到 100 之間的 100 個隨機整數
data = [random.randint(0, 100) for _ in range(100)]

# 計算全距(Range)
range_value = max(data) - min(data)

# 計算平均值(Mean)
def mean(data):
    return sum(data) / len(data)

mean_value = mean(data)

# 計算眾數(Mode)
def mode(data):
    frequency = {}
    for item in data:
        if item in frequency:
            frequency[item] += 1
        else:
            frequency[item] = 1
    max_freq = max(frequency.values())
    modes = [key for key, value in frequency.items() if value == max_freq]
    return modes

mode_values = mode(data)

# 計算標準差(Standard Deviation)
def stdev(data, mean_value):
    variance = sum((x - mean_value) ** 2 for x in data) / (len(data) - 1)
    return math.sqrt(variance)

std_dev = stdev(data, mean_value)

# 計算四分位數(Quartiles)
def quantiles(data, n):
    sorted_data = sorted(data)
    k = len(sorted_data)
    return [sorted_data[int(i * k / n)] for i in range(1, n)]

q1, q3 = quantiles(data, 4)[0], quantiles(data, 4)[2]

# 印出所有隨機數據
print("Random Data: " + ", ".join(map(str, data)))
print(f"Data Range: {range_value}")
print(f"Mean: {mean_value:.2f}")
print(f"Mode: {', '.join(map(str, mode_values))}")
print(f"Standard Deviation: {std_dev:.2f}")
print(f"First Quartile (Q1): {q1:.2f}")
print(f"Third Quartile (Q3): {q3:.2f}")

計時器使用

設計一個程式,使用第一個計時器,每 10 秒來取得現在時間

# 05_07. 計時器範例
from machine import Timer, Pin
from time import localtime

# 設置內建LED
led = Pin(16, Pin.OUT)

# 初始化 LED 狀態
led_state = False
runtime = 0  # 用於計算運行時間的變數
wb.cls()
wb.str('Program Start!', 2, 64, 2, 2)

# 定義第一個計時器的中斷處理函數,用於每 10 秒印出時間
def print_time(timer):
    current_time = localtime()  # 取得當前時間
    H = str(f"{current_time[3]:02}")
    M = str(f"{current_time[4]:02}")
    S = str(f"{current_time[5]:02}")
    wb.cls()
    wb.str("Current Time: ", 2, 64, 2, 2)
    wb.str(H + " : " + M + " : " + S, 2, 80, 2, 2)
# 定義第二個計時器的中斷處理函數,用於每 5 秒切換LED
def toggle_led(timer):
    global led_state
    led_state = not led_state
    led.value(led_state)

# 定義第三個計時器的中斷處理函數,用於計算總運行時間並結束程式
def check_runtime(timer):
    global runtime
    runtime += 1
    if runtime >= 120:  # 如果運行時間超過120秒(2分鐘)
        print("Program finished running for 2 minutes.")
        wb.str('Program End!', 2, 64, 2, 2)
        timer1.deinit()
        timer2.deinit()
        timer3.deinit()

# 創建第一個計時器,每 10 秒觸發一次
timer1 = Timer(0)
timer1.init(period=10000, mode=Timer.PERIODIC, callback=print_time)

# 創建第二個計時器,每 5 秒觸發一次
timer2 = Timer(1)
timer2.init(period=5000, mode=Timer.PERIODIC, callback=toggle_led)

# 創建第三個計時器,每 1 秒更新一次運行時間
timer3 = Timer(2)
timer3.init(period=1000, mode=Timer.PERIODIC, callback=check_runtime)

參考資料

  1. MicroPython machine 模組文件
  2. MicroPython math 模組文件
  3. MicroPython Timer 文件(ESP32)

上一篇
05. MicroPython 基礎語法簡介(上)
下一篇
07. MicroPython 基礎語法簡介(下)
系列文
使用 WiFiBoy Python 玩學機來學物聯網應用 30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言