2025年5月23日 星期五
Python 程式練習 8 ─ 數獨判別
2024年9月27日 星期五
2024年8月30日 星期五
Python 程式練習 7 ─ 多點XY座標距離排序
2024年8月22日 星期四
2024年5月12日 星期日
使用 Keysight U3606B 同時監測電池充電與放電
辦公桌上的 Keysight U3606B 真的很好用,這次研究不斷電指示燈,拿它來監測鎳氫電池充放電時,電池的電壓與電流變化情形。
# (C) 2024, Bridan, CC BY-SA 3.0 TW
# The program is for V and I measurement
# https://4rdp.blogspot.tw
from __future__ import division, unicode_literals, print_function, absolute_import
import pyvisa
import time
import datetime
print("VISA list:")
rm = pyvisa.ResourceManager()
print(rm.list_resources())
addr = input("Input U3606B VISA address: ")
hybrid = rm.open_resource(addr)
hybrid.read_termination = '\n'
hybrid.write_termination = '\n'
hybrid.write("*RST")
time.sleep(3)
hybrid.write("CONFIGURE:CURRENT")
hybrid.write("SOURCE:CURRENT:RANGE 0.1")
hybrid.write("OUTPUT ON")
# set data file
file = 'VI- ' + datetime.datetime.now().strftime('%Y-%m-%d %H.%M.%S') + '.csv'
w_file = open(file, 'w')
w_file.write('Time,V,I\n')
t = input("How long time would you like to measure? (sec) ")
n = int(t)
while n > 0:
t = str(datetime.datetime.now())
v = hybrid.query("SOURCE:SENSE:VOLTAGE?")
i = hybrid.query("FETCH?")
data = t[t.find(' '):] + ' , ' + v + ' , ' + i + '\n'
print(data)
w_file.write(data)
time.sleep(1)
n -= 1
w_file.close()
hybrid.write("OUTPUT OFF")
2024年4月18日 星期四
Pytest
import pytest
def test1():
b = 'Apple'
assert b != 'Hello' # PASS
a = 1
assert a == 0 # FAIL 1
print('--------') # 上一行錯誤後,從這一行開始就不會被執行
assert b != 'Apple' # FAIL 2
def test2():
b = 'Apple'
assert b != 'Hello' # PASS
a = 1
#assert a == 0 # FAIL
[pytest]
markers =
AAAonly: test cases only for AAA.
BBBonly: test cases only for BBB.
@pytest.mark.AAAonly
def test1():
b = 'Apple'
assert b != 'Hello' # PASS
a = 1
assert a == 0 # FAIL 1
print('--------') # 上一行錯誤後,從這一行開始就不會被執行
assert b != 'Apple' # FAIL 2
@pytest.mark.BBBonly
def test2():
b = 'Apple'
assert b != 'Hello' # PASS
a = 1
#assert a == 0 # FAIL
> pytest test_try.py -m "not AAAonly"
@pytest.mark.skip(reason='太累了,不想測!')
def test0():
c = 0
assert c != 0
@pytest.mark.parametrize("num", [0, 1])
def test3(num):
assert num == 0 # check number
@pytest.mark.parametrize("index, value, unit", [
( 1, 0.1, 'V'),
( 2, 1.0, 'A'),
])
def test4(index, value, unit):
print('')
print(f'Index = {index}, Set {value}{unit}')
@pytest.mark.parametrize("num", [0, 1])
@pytest.mark.parametrize("word", ['Apple', 'Hello'])
def test5(num, word):
assert num == 0 # check number
assert word != 'Hello' # check word
2024年2月10日 星期六
Python 程式練習 6 ─ 螞蟻碰撞幾次
2021年12月14日 星期二
2021年10月23日 星期六
Python 程式練習 4 ─ 堆疊檢查 暨解題系統
一列火車由 A 方向進來,往 B 方向駛去,火車站可以暫時堆疊車廂,現在寫一程式檢查火車 B 的序號是否存在?
例如,3 2 5 4 1 存在,但是 3 2 5 1 4 不存在。
題意及輸出入規範詳見 c123: 00514 - Rails。
2021年6月14日 星期一
ONLINE PYTHON 與程式自學建議
Online Python
這裡推薦一個線上 Python IDE,使用者無須安裝 Python 系統程式,只要將你自己的程式碼放在程式區,然後執行 (Run) 即可。網址在 https://www.online-python.com/
給自學 Python 者建議,分階段循序學習,通常完成一到三階段約需 200 小時:
第一階段 ─ 首先尋找網路免費教材,這裡提供兩個參考 ─ (中文) 程式語言教學誌、(英文) Automate the Boring Stuff with Python,開始學習請依照教材內容範例打程式碼,按圖施工,保證成功。一般學習程式適合的年齡,約在高中一年級之後,從小學階段開始學也不是不可以,只是小朋友不易理解邏輯概念、數學背景與程式思維,就像練武只學到招式,其氣功內力又是另一層次,兩者要相輔相成,許多工程應用程式 (計算座標、角度) 則需要有高中數學基礎才寫得出來。
第二階段 ─ 當程式範例都依據教材演練一次,有基本概念後,應嘗試寫個小題目,如果從網路搜尋不知道要寫甚麼題目,這裡有給 Python 初學者的 11 道練習題。
第三階段 ─ 當練習題都可以寫出來後,就應該自己給自己出題,看自己有甚麼需求,可以用程式解決生活、工作或學業上的問題或不便,剛開始專案規模約在 100 行左右,有經驗後擴充到 1000 行程式碼以內,進行每個主題時,就可以整合先前所學的程式知識,此時也可能發現以前所學的內容不足以應付主題設計,這時再上網搜尋解決方案或程式技巧與指令。許多人說不要重複製造輪子,處在程式學習初級階段,反而應該要重複製造輪子,這樣才會深刻了解這些功能如何被設計出來,當你已經熟知原理達到應用階段,就可以不用重複製造輪子,以前個人工作時,遭遇沒有程式庫可用時,我都是自己造輪子解決問題的。這裡有一個自學 JavaScript 設計英文聽寫網頁的例子。
第四階段 ─ 當你學會 Python 之後,如有特殊需求可以再學習其他程式語言,通常各程式語言萬變不離其宗,可以先回想 Python 指令為何,再透過網路搜尋新語言相對應的指令,這樣就可以舉一反三,新程式語言迅速上手。
2021年5月9日 星期日
2021年3月14日 星期日
給 Python 初學者的 11 道練習題
Andy 今年學測決定就讀資訊工程,他問我初學什麼程式語言比較好,我給他的建議是 Python,為什麼建議這個程式語言?因為它是最泛用的程式語言,諸多第三方開源程式庫可以使用,並且完全免費,最重要最重要最重要的原因,它是直譯型的程式語言,完全沒有程式基礎的人,可以藉由指令一行一行打,把電腦執行動作的邏輯思維慢慢建立起來,想起三十幾年前,我學會程式設計就是從 BASIC 程式語言學起。
近日剛好看到一篇文章列有 11 道練習題給程式初學者,
2021年2月22日 星期一
學習程式設計的指標
哈爸是我大約在 2015 年左右認識的網友,當時他正在推行 LASS,是一個開源環境測量的盒子,而我有 ROSA Spider,他邀集一群各類專長愛好者共筆如何把創客作品上市。近日在 FB 上看到他在網路上開始 Python 網路教學,因此留言建議,並且祝他教學成功。
我給哈爸的建議是,為每位學生紀錄一份資料,包含
學歷,以 1-16 分別表示小一到大四學識程度,因為不同年齡吸收知識會有很大差異,
以前曾接觸程式語言時間長短,大約多少小時,不分何種程式語言,可知道花多久時間學習,
曾寫過多少行程式,可以知道學生真正動腦動手的狀況,
2019年8月10日 星期六
4rdp 拼圖抽籤及計時程式
# 4rdp puzzle timer
from microbit import *
from random import randint
import utime
shapes = "TIJLOSZTIJLOSZTIJLOSZTIJLOSZTIJLOSZT "
display.show("-")
while True:
if button_a.was_pressed():
display.show(" ")
sleep(100)
ln = len(shapes)
if ln == 37:
t0 = utime.ticks_ms()
elif ln == 1:
t1 = utime.ticks_ms()
break
r = randint(0,ln-2)
display.show(shapes[r])
if r == 0:
shapes = shapes[1:]
else:
shapes = shapes[0:r] + shapes[r+1:]
display.show("=")
while not button_a.was_pressed():
sleep(1)
else:
t = (t1 - t0)//1000
m = t //60
s = t % 60
if s < 10:
s = "0"+str(s)
else:
s = str(s)
display.scroll(str(m)+":"+s,loop=True)
2019年7月29日 星期一
4rdp 拼圖抽籤程式
from microbit import *
from random import randint
shapes = "TIJLOSZTIJLOSZTIJLOSZTIJLOSZTIJLOSZT "
display.show("-")
while True:
if button_a.was_pressed():
display.show(" ")
sleep(100)
ln = len(shapes)
if ln == 1:
break
r = randint(0,ln-2)
display.show(shapes[r])
if r == 0:
shapes = shapes[1:]
else:
shapes = shapes[0:r] + shapes[r+1:]
display.show("=")
2019年7月20日 星期六
Micro:bit 韌體與 WebUSB 驅動程式更新
近日買入 Micro:bit 開始研究,第一個想設計的功能就是拼圖抽籤機,在 Micro:bit 上執行,以隨機亂數抽取拼塊,按一次 A 鍵就顯示一片拼塊,按 36 次就結束,我立即以 Python 寫個程式試看看,發現 Micro:bit 系統有 bug!! 陣列中的最後一個項目,竟然沒辦法取用!
我的直覺應該是 Micro:bit 內的韌體是舊版,須要更新,因此立即上網查詢相關資料,首先查到台灣程式教育協進會 http://k12.camdemy.com/media/18959 的影片,可從 github 下載最新韌體 https://github.com/ARMmbed/DAPLink/releases。不過更新之後仍然無法使用 DAPLink,也就是執行 Python 時可以協助除錯的功能。
所以還要再去安裝電腦端驅動程式,https://os.mbed.com/handbook/Windows-serial-configuration
可以安裝 mbed Serial Port。
2017年7月17日 星期一
儀器 Python 模組
這陣子需要寫一些 Python 程式用儀器量測訊號,因此將常用的部分模組化,下面就是程式模組,因為只用了 COM 及 USB-TMC,所以僅將這兩部分模組化。
INSTRUMENT.py
# (C) 2017, Bridan Wang, CC BY-NC-SA 3.0 TW http://4rdp.blogspot.tw/
from __future__ import division, unicode_literals, print_function, absolute_import
import serial
import visa
import time
class COM:
def __init__(self):
global inst1
inst1 = serial.Serial()
def OPEN(self, pp, rate = 9600):
global inst1
inst1.close()
inst1.port = "COM"+str(pp)
inst1.baudrate = rate
inst1.timeout = 5
inst1.open()
time.sleep(1)
self.stat = 2
def CLOSE(self):
global inst1
inst1.close()
def SEND(self, ss):
global inst1
ss = str(ss) + b"\r\n"
inst1.write(ss)
def QUERY(self, ss=""):
global inst1
if ss != "":
self.SEND(ss)
#time.sleep(1)
qqx = inst1.readline()
return qqx
def QUERY_VALUE(self, q):
a = self.QUERY(q)
return float(a)
class USB:
def __init__(self):
global usb
try:
usb = visa.get_instruments_list()
#print(usb)
except:
usb = []
def OPEN(self, sel=0):
global usb
global inst
try:
inst = visa.Instrument(usb[sel], term_chars=b"\n", timeout=5)
self.stat = 2
except:
self.stat = 0
return self.stat
def CLOSE(self):
global inst
inst.close()
def SEND(self, ss):
global inst
inst.write(ss)
def QUERY(self, ss=""):
global inst
if ss != "":
self.SEND(ss)
#time.sleep(1)
qqx = inst.read()
return qqx
def QUERY_VALUE(self, q):
a = self.QUERY(q)
return float(a)
2016年12月20日 星期二
Python 程式練習 3 ─ 月曆
這是我教小朋友第三個 Python 程式教程,寫一個月暦程式,輸入 西元年份及月份就印出該月月曆。
分下列步驟指導,
2016年10月29日 星期六
英聽練習程式 (Practice Listening)
啟動程式後,會有類似上面的畫面顯示,差異在輸入框是空白的,下方也是空白無句子文字顯示,點按 "Listen & Check",會聽到電腦講話發出聲音,此時請輸入你聽到的字,盡可能大小寫,標點符號都正確才能一百分。右上角顯示 N, M%,表示重複聽的次數與正確率,如果你開啟答案提示 (在下方滑鼠點一下,就可以秀出句子答案提示或是隱藏起來),滿分只會 90%。
如果覺得語速太快或慢,可以調整中間橫桿,偏左可以調慢,反之調快。
想新加入句子,請先在輸入欄填寫,再按 "Add" 鈕後,就會把句子加到 Sentence.csv 檔案內,
點選左上方 "<" 或 ">" 按鈕可以前一句或下一句切換,也可以直接輸入第幾句號碼。
當某句子已經練習非常熟練,可以在 Perfect 勾選,當程式結束時,這句子會從 Sentence.csv 搬移到 Sentence-Perfect.csv,下次練習就不會再出現。
後記










