晨起無聊寄,明兒 同樂會,亦悲亦是喜,喜大家鵬程萬里,悲今後或難再遇。須謹記,破 坎突 險,還是有賴志 友與道 朋。當懷念,同 學共 習之情誼。莫期望 ,倚靠 幸 運。《 》 文說︰
幸,所以驚人也。从大从 。一曰大聲也。凡幸之屬皆从幸。一曰讀若瓠。一曰俗語以盜不止爲幸,幸讀若籋。
運,迻徙也。从辵軍聲。
或應知, 幸,古義枷鎖也。得脫鐐銬,何其有幸! 運,本講遷軍。若能安泰!運何能不好?皆因不祥事耶!!??
西諺講︰幸運女神衷情準備好了的人,莫要與之擦身而過;當上帝來敲門時,記得開門。
派︰如是想來,理性和感情的交融,確叫人 ZONK ?!
《改不改??變不變!!》︰
教育的宗旨是
『改』正思維的『誤謬』,『變』化習性之『偏差』。
一九六三年美國 NBC 電視台初次公演了由 Jay Stewart 和 Monty Hall 主持的『Let’s Make a Deal』成交約定遊戲。它有多種版本,典型的遊戲是︰
主持人向遊戲者展示了三扇門,其中一扇門之後是『樂透獎』,另外兩扇門之後是『安慰獎』。當然主持人事先就知道哪扇門背後有什麼獎品,遊戲過程分為三個階段︰
一、遊戲者先選擇一扇門,
二、主持人打開遊戲者未選之兩扇門中的某一扇安慰獎之門,
三.、主持人詢問著遊戲者是否仍堅持『原選之門』,還是願意改變選擇『另一扇未開的門』 ?這個『費疑猜』令人疲憊之 zonk 時刻已然到來!
人到底是該
『換,還是不換』的好呢??
一位『理性的』思考者也許會這樣論證︰
最初之時,每扇門後有『樂透獎』的機會都是 ,所以『選中』的機會是 ,『未選中』的機會是 。然而現在主持人打開了一扇沒有『樂透獎』的門,這個『資訊』將使得未選中之『僅存之門』的機會成了 。因此當然是『換的好』的了!
另一位『感性的』幸運者也許會這樣感覺︰
如果『會中』一選就中,如果『不會中』改選『也沒用』,所以還是維持原案『不換的好』的吧!
在『機會』的現象裡,人們因多次重複得到的某種『大數機率』,如果將之運用到『這一次』的選擇之時,那個『實際發生』的事實究竟是能不能『論斷』的呢?如果能,人們又為什麼會相信『莫非定律』是真的呢??
……
,只能悉聽尊便!?
生︰就此補足安裝環境溫度感測器方法︰
# /boot/config.txt 檔案底部加入一行︰
dtoverlay=w1-gpio
# 安裝派生三環境溫度感測器程式庫
sudo apt-get install python3-pip
sudo pip-3.2 install w1thermsensor
碼︰無 習。明日息習。
☿ 行習︰以及 TuxIOme V0.1 版,參考原始碼︰
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import math
import operator
import string
import threading
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
開 = 亮 = 低 = 0
關 = 滅 = 高 = 1
from time import sleep
import tpg
if tpg.__python__ == 3:
operator.div = operator.truediv
raw_input = input
def make_op(op):
return {
'加' : operator.add,
'減' : operator.sub,
'乘' : operator.mul,
'除' : operator.div,
'剩' : operator.mod,
'^' : lambda x,y:x**y,
'**' : lambda x,y:x**y,
'餘弦' : math.cos,
'正弦' : math.sin,
'切弦' : math.tan,
'acos': math.acos,
'asin': math.asin,
'atan': math.atan,
'平方' : lambda x:x*x,
'根號': math.sqrt,
'正值' : abs,
'norm': lambda x,y:math.sqrt(x*x+y*y),
}[op]
數碼賦值 = [(滅, 亮, 亮, 滅, 滅, 滅, 亮, 滅), (滅, 滅, 滅, 滅, 亮, 亮, 亮, 滅), (滅, 亮, 亮, 滅, 滅, 滅, 亮, 滅), (滅, 滅, 滅, 滅, 亮, 亮, 亮, 滅)
]
遲延 = 0.012
# 數碼管
四位數碼管位選一 = 17
四位數碼管位選二 = 27
四位數碼管位選三 = 22
四位數碼管位選四 = 10
LEDA = 21
LEDB = 16
LEDC = 19
LEDD = 6
LEDE = 5
LEDF = 20
LEDG = 26
LEDH = 13
# 初始態
GPIO.setup(四位數碼管位選一, GPIO.OUT, initial=關)
GPIO.setup(四位數碼管位選二, GPIO.OUT, initial=關)
GPIO.setup(四位數碼管位選三, GPIO.OUT, initial=關)
GPIO.setup(四位數碼管位選四, GPIO.OUT, initial=關)
GPIO.setup(LEDA, GPIO.OUT, initial=滅)
GPIO.setup(LEDB, GPIO.OUT, initial=滅)
GPIO.setup(LEDC, GPIO.OUT, initial=滅)
GPIO.setup(LEDD, GPIO.OUT, initial=滅)
GPIO.setup(LEDE, GPIO.OUT, initial=滅)
GPIO.setup(LEDF, GPIO.OUT, initial=滅)
GPIO.setup(LEDG, GPIO.OUT, initial=滅)
GPIO.setup(LEDH, GPIO.OUT, initial=滅)
def 數碼管執行緒():
global 數碼賦值
global 遲延
數碼管 = [LEDA, LEDB, LEDC, LEDD, LEDE, LEDF, LEDG, LEDH]
while True :
for 單元 in range(0,4):
if 單元 == 0 :
GPIO.output(四位數碼管位選一, 開)
GPIO.output(數碼管, 數碼賦值[單元])
sleep(0.002)
GPIO.output(四位數碼管位選一, 關)
if 單元 == 1 :
GPIO.output(四位數碼管位選二, 開)
GPIO.output(數碼管, 數碼賦值[單元])
sleep(0.002)
GPIO.output(四位數碼管位選二, 關)
if 單元 == 2 :
GPIO.output(四位數碼管位選三, 開)
GPIO.output(數碼管, 數碼賦值[單元])
sleep(0.002)
GPIO.output(四位數碼管位選三, 關)
if 單元 == 3 :
GPIO.output(四位數碼管位選四, 開)
GPIO.output(數碼管, 數碼賦值[單元])
sleep(0.002)
GPIO.output(四位數碼管位選四, 關)
sleep(遲延)
數碼緒 = threading.Thread(name="數碼", target=數碼管執行緒)
數碼緒.daemon = True
數碼緒.start()
數碼管輸出字典 = { "0" : (亮, 亮, 亮, 亮, 亮, 亮, 滅, 滅) ,
"1" : (滅, 亮, 亮, 滅, 滅, 滅, 滅, 滅) ,
"2" : (亮, 亮, 滅, 亮, 亮, 滅, 亮, 滅) ,
"3" : (亮, 亮, 亮, 亮, 滅, 滅, 亮, 滅) ,
"4" : (滅, 亮, 亮, 滅, 滅, 亮, 亮, 滅) ,
"5" : (亮, 滅, 亮, 亮, 滅, 亮, 亮, 滅) ,
"6" : (亮, 滅, 亮, 亮, 亮, 亮, 亮, 滅) ,
"7" : (亮, 亮, 亮, 滅, 滅, 滅, 滅, 滅) ,
"8" : (亮, 亮, 亮, 亮, 亮, 亮, 亮, 滅) ,
"9" : (亮, 亮, 亮, 亮, 滅, 亮, 亮, 滅) ,
}
def 輸出數碼管(數據) :
global 數碼賦值
global 數碼管輸出字典
if 數據 > 999.9 :
return "數值超過 999.9"
else:
字符串 = "%05.1f" %數據
for 單元 in range(0,5):
if 單元 == 0 :
數碼賦值[單元] = 數碼管輸出字典[字符串[單元]]
elif 單元 == 1 :
數碼賦值[單元] = 數碼管輸出字典[字符串[單元]]
elif 單元 == 2 :
暫列 = list(數碼管輸出字典[字符串[單元]])
暫列[7] = 亮
數碼賦值[單元] = tuple(暫列)
elif 單元 == 3 :
continue
else:
數碼賦值[單元 - 1] = 數碼管輸出字典[字符串[單元]]
return "完成"
GPIO.setup(11, GPIO.OUT, initial=GPIO.HIGH)
小哨子 = GPIO.PWM(11, 130.8)
def 啟動蜂鳴器():
小哨子.start(100)
return "蜂鳴器已啟動"
def 響聲控制(頻率):
小哨子.ChangeFrequency(頻率)
小哨子.start(50)
return 頻率
def 噤聲控制(頻率):
小哨子.ChangeFrequency(頻率)
小哨子.start(100)
return "噤聲"
def 控制蜂鳴器(op):
return {
'響聲' : 響聲控制,
'禁音' : 噤聲控制,
}[op]
def 輸入符碼(針碼):
return GPIO.input(針碼)
def 輸出符碼(針碼, 賦值):
GPIO.output(針碼, 賦值)
return "輸出" + str(賦值)
def 出入定義(針碼, 入出):
if 入出 == "出" :
GPIO.setup(針碼, GPIO.OUT, initial = GPIO.HIGH)
else:
GPIO.setup(針碼, GPIO.IN, pull_up_down = GPIO.PUD_UP)
return "定義完成"
def 出針定義(針碼):
GPIO.setup(針碼, GPIO.OUT, initial = GPIO.HIGH)
return "定義輸出完成"
def 入針定義(針碼):
GPIO.setup(針碼, GPIO.IN, pull_up_down = GPIO.PUD_UP)
return "定義輸入完成"
def 入出針定義(op):
return {
'入針' : 入針定義,
'出針' : 出針定義,
}[op]
import subprocess
重複次數 = 1
def 紅外線輸出(字碼):
global 重複次數
subprocess.call(['irsend', 'SEND_ONCE', 'tuxiome', 字碼,"--count=" +str(重複次數) ])
return "已送出"
傳送重複 = 3
訊息編碼表 = {"0" : "KEY_0", "1" : "KEY_1", "2" : "KEY_2", "3" : "KEY_3", "4" : "KEY_4",
"5" : "KEY_5", "6" : "KEY_6", "7" : "KEY_7", "8" : "KEY_8", "9" : "KEY_9",
}
訊息解碼表 = {"0" : "0", "1" : "1", "2" : "2", "3" : "3", "4" : "4",
"5" : "5", "6" : "6", "7" : "7", "8" : "8", "9" : "9",
"SETUP" : "S", "ENTER" : "-", "BACK" : "E",
}
def 紅外線發訊(四位數):
global 傳送重複
訊息串 = str(四位數)
if len(訊息串) != 4 :
return "訊息必須四位數"
subprocess.call(['irsend', 'SEND_ONCE', 'tuxiome', "KEY_SETUP","--count=" +str(傳送重複) ])
for 字碼 in 訊息串 :
subprocess.call(['irsend', 'SEND_ONCE', 'tuxiome', 訊息編碼表[字碼],"--count=" +str(傳送重複) ])
subprocess.call(['irsend', 'SEND_ONCE', 'tuxiome', "KEY_ENTER","--count=" +str(傳送重複) ])
subprocess.call(['irsend', 'SEND_ONCE', 'tuxiome', "KEY_BACK","--count=" +str(傳送重複) ])
return "已發訊"
import lirc
sockid = lirc.init("TuxIOme", blocking=False)
def 紅外線輸入():
return lirc.nextcode()
def 紅外線收訊():
空碼 = 0
狀態 = 0
字串 = ""
while True:
字碼 = 紅外線輸入()
if 字碼 == [] :
空碼 += 1
if 空碼 < 10 :
continue
else:
狀態 = 1
break
空碼 = 0
字串 = 字串 + 訊息解碼表[字碼[0]]
if 狀態 == 1 :
return 字串
else:
return "錯誤"
def 讀取系統溫度():
t = subprocess.check_output(['vcgencmd', 'measure_temp'])
T = t.decode('utf-8')
Tb = T.find('=')
Te = T.find("'")
return float(T[Tb + 1 : Te])
from w1thermsensor import W1ThermSensor
sensor = W1ThermSensor()
def 讀取環境溫度():
return sensor.get_temperature()
import random
class 實習機板(tpg.Parser, dict):
r"""
此為實習基板入出針語言 TuxIOme 0.1,自 Calc.py 擴充而來。由於使用中文之故,
不能使用預設的 NamedGroupLexer 。
文法定義如下 ::
set lexer = CacheLexer
separator space '\s+' ;
token 指數運算 '\^|\*\*' 入出針定義
token 聲音控制 '(響聲|禁音)\b' make_op
token 乘除運算 '[乘|除|剩]' make_op
token 函數二 '(norm)\b' float
token integer '\d+' e=self.記憶()
| VarId/v '=' Expr/e e=出入定義(p, '出')
# | '定義' Expr/p '入' e=op(p)
| '讀入' Expr/p e=輸出符碼(p, 0)
| '寫出' Expr/p '關' e=啟動蜂鳴器()
| "蜂鳴器" 聲音控制/op Expr/p e = 輸出數碼管(p)
| "IRTX" VarId/s e = 紅外線輸入()
| "系統溫度" self["周遭溫度"] = e = 讀取環境溫度()
| "發訊" Expr/p e = 紅外線收訊()
;
Var/ -> VarId/v ;
Expr/e -> Term/e ( 加減運算/op Term/t t=op(t,f)
)*
;
Fact/f ->
加減運算/op Fact/f f=op(f,e)
)?
;
Atom/a ->
real/a
| integer/a
| Function/a
| Var/a
| ''
| Random/a
;
Function/y ->
函數一/f '' y = f(x1,x2)
;
Random/x -> "四位亂數" sudo ./TuxIOme
Calc (TPG example)
:系統溫度
50.8
:環境溫度
36.875
:變元
CPU溫度 = 50.8
一藍 = 5
七黃 = 7
三藍 = 13
二藍 = 6
五綠 = 0
八紅 = 8
六綠 = 1
周遭溫度 = 36.875
四藍 = 19
按鍵一 = 23
按鍵二 = 18
撥碼一 = 24
撥碼二 = 25
:顯示 CPU溫度
完成
:顯示 周遭溫度
完成
:四位亂數
6398
:四位亂數
5724
:發訊 5200
已發訊
:收訊
S55--22--0-E
:發訊 1314
已發訊
:收訊
S11--33--11--4-EE
:
,以為臨別珍重
訊︰☿ 曾同學共習之回憶。
系統溫度
環境溫度