香港公眾假期 — 自動更新手機日曆

從前有個手機 APP 香港公眾假期很好用 , 開數次才有一個廣告, 所以都能接受 , 但近期更新後每開一次都會彈出廣告, 有時靜音廣告都還好, 一些有聲廣告在街上或公司爆大聲十分煩人, 所以果斷 uninstall.

現在手機沒有可以顯示 “香港公眾假期” 的日曆 , 上網找了一會發現可以用 “香港政府公佈的公眾假期 ical” 加入到 GOOGLE 日曆 .

網址如下 :

https://www.1823.gov.hk/tc/hong-kong-public-holidays-ical

Android 訂閱方法:

一般來說,Android 用戶可跟從以下步驟,透過 Google 日曆訂閱「香港公眾假期」iCal日曆,然後與行動裝置的行事曆同步:

  1. 經瀏覽器前往 https://calendar.google.com,以你用來同步行動裝置的 Google 用戶帳號登入 Google 日曆
  2. 在桌面版的檢視介面中,按下 Google 日曆左邊的「其他日曆」旁的”+”號
  3. 選擇「加入日曆網址」
  4. 在「日曆網址」欄位中輸入下列你所選擇的連結:
    (繁體中文 – 適用於Android用戶)
      https://www.1823.gov.hk/common/ical/gc/tc.ics
    (簡體中文 – 適用於Android用戶)
      https://www.1823.gov.hk/common/ical/gc/sc.ics
     (英文 – 適用於Android用戶)
      https://www.1823.gov.hk/common/ical/gc/en.ics
  5. 按下「新增日曆」,你便成功在 Google 日曆訂閱本iCal
  6. 在行動裝置主螢幕畫面點選「設定」
  7. 揀選進行同步的帳戶,然後「同步」
  8. 開啓行動裝置的行事曆,由於你的行動裝置可能有多於一個的行事曆,請在行事曆的設定中同步及剔選「香港公眾假期」,這些假期便會出現在你的行動裝置的行事曆上!

選擇你要的版本 ( 繁/簡/英 )

(繁體中文 – 適用於Android用戶)
  https://www.1823.gov.hk/common/ical/gc/tc.ics
(簡體中文 – 適用於Android用戶)
  https://www.1823.gov.hk/common/ical/gc/sc.ics
 (英文 – 適用於Android用戶)
  https://www.1823.gov.hk/common/ical/gc/en.ics

現在你的手機 “Google 日曆” 都會有 “香港公眾假期” , 免去了煩人的廣告

用 docker build 建立自己合適的 PHP 容器

GitHub – docker-library/php: Docker Official Image packaging for PHP

首先你選好了要什麼版本的 PHP

我選了 PHP 8.4 用 debian 12 (bookworm) 做基楚系統 , 把所有的 file download

記得下載後要把 docker-* 的5個檔案設定成可執行檔

開始製作自己客製 PHP 容器 ( php8.4-fpm 是製作後的 image name , 因為是我的第一版本可以設定 v1.0 做 tag

完成後, 可以用以下 command 看看 image 是否成功

我們運行這個容器是否正常 , 是不是提供了 PHP 服務 ( 其中 phptest 是給這個容器名稱 )

那麼現在基本的 PHP-FPM 已經完成 , 我們進入這個容器客製我們所需要的其他 module

進入容器後看看有什麼 module 可以新增到 php 內使用

可以安裝的有很多, 選擇你需要的來安裝

Possible values for ext-name:
bcmath bz2 calendar ctype curl dba dl_test dom enchant exif ffi fileinfo filter ftp gd gettext gmp hash iconv intl json ldap mbstring mysqli odbc opcache pcntl pdo pdo_dblib pdo_firebird pdo_mysql pdo_odbc pdo_pgsql pdo_sqlite pgsql phar posix random readline reflection session shmop simplexml snmp soap sockets sodium spl standard sysvmsg sysvsem sysvshm tidy tokenizer xml xmlreader xmlwriter xsl zend_test zip

因為我需要 supply ldap , 所以我先安裝 ldap module

那時你會發現安裝程式告訴你缺失了 ldap.h , 你就要先安裝好編譯時需要的 library

輸入 php -m 後你可以看到現在 php 是否已支持 ldap 了

docker commit 命令用於將容器的當前狀態保存為一個新的 Docker 映像 , 先找出該容器的 container id : 在命令行 input # docker ps

把現在的容器狀態打包成另一版本 , 例如 : php8.4-fpm tag 2.0

你可以把這個 tar file 分發給同你一樣需求的用家使用

如何 LOAD 這個 tar file 成 docker 其中一個 image

你會發現新的容器的 SIZE 同基礎 image 有增長

在虛擬伺服器 VPS 安裝 ArchLinux

好多提供 VPS SERVER 的公司, 一般都沒有 ArchLinux 選擇 , 但有另一方法做到間接安裝 ArchLinux , 好吧 ! 現在開始動手做

前提你的SERVER 最少有2G Ram 才可以用這方法 , 因為會用 RAM DISK 來做 BOOT UP 太少 RAM 不能把 ArchLinux 臨時系統方上去

Grml安装

Grml 是一個基於 Debian 的可引導即時系統 (Live-CD),Grml 內置很多適用於系統管理員的 GNU/Linux 軟體,Grml 特別適合於安裝、部署和系統救援等管理任務,而 grml-rescueboot 可以幫你輕鬆完成 GRUB 引導 ISO 的配置,方便隨時引導 Grml Live Linux.

伺服器需要先安裝 Debian 系統,在 VPS control panel 選擇 Debian12 安裝, 重新安裝 , 如果沒有 Debain 12 可以用 11 , 10 都可以 !

登入後安裝 grml-rescueboot

# 可以使用如下命令自動下載最新的 grml iso, 但是這個只能下載 full 版本的 iso update-grml-rescueboot

# 如果機器內存較小, 我們可以手動下載並使用 small 版本的 iso ( 如果你想用最新版本可以瀏覽 https://mirror-hk.koddos.net/grml/ )

編輯設定檔, 在這個設定檔裡面我們需要設定 boot live-cd ssh 密碼等一些資訊

vi /etc/default/grml-rescueboot

對於原系統是 debian 的, 並且使用 ifupdown 來管理網路的機器, 可以在啟動選項裡面使用 debnet, 這樣 grml 就會自動將原系統內的 interfaces 設定檔複製到 grml 內使用

修改 CUSTOM_BOOTOPTIONS 內容 ( 選擇合適的情況 ) 記住你 set 的 ssh password 一陣可以用 ssh 做後期設置 !

CUSTOM_BOOTOPTIONS="ssh=password lang=us keyboard=us tz=Asia/Hong_Kong debnet toram"

如果原系統的閘道 ip 不在同一網段, grml 將無法新增預設路由, 在啟動選項裡面加入 services=networking 即可解決

CUSTOM_BOOTOPTIONS="ssh=password lang=us keyboard=us tz=Asia/Hong_Kong services=networking debnet toram"

如果原系統不是 debian, 但只要網路支援 dhcp, 你還可以使用下面的配置

CUSTOM_BOOTOPTIONS="ssh=password lang=us keyboard=us tz=Asia/Hong_Kong toram"

還可以配置使用靜態位址

CUSTOM_BOOTOPTIONS="ssh=password lang=us keyboard=us tz=Asia/Hong_Kong toram ip=192.168.1.100::192.168.1.1:255.255.255.0:myhostname:eth0:off dns=8.8.8.8,8.8.4.4"

更新 grub 配置

update-grub

讓 SERVER 下一次啟動的時候引導 grml

# 使用 full iso 的使用如下命令

grub-reboot "Grml Rescue System (grml-full-2025.08-amd64.iso)" 

# 使用 small iso 的使用如下命令

grub-reboot "Grml Rescue System (grml-small-2025.08-amd64.iso)"

完成後 REBOOT , 最好用 VPS 供應商的 VNC CONSOLE , 可以觀察 BOOT 機情況 , 有時因為其他因數SSH 未別能成功啟動

見到這個畫面你可以按 e 修改 network 訊息

當你完成了這步驟可以試試向外 ping 下, 例如: ping yahoo.com 如果成功的話就可以用 SSH 連接了

Arch安裝

  1. 下面的所有操作步驟都是在 Grml live 系統裡面完成, 確保上述的配置完成, 首先下載 archlinux-bootstrap 並解壓

由於整個 grml live 系統運行在記憶體裡, 解壓完成後務必刪掉壓縮包, 保證記憶體空間充足 ( 所以選擇 small iso 會好一點 )

剛下載的 file 放在 tmp folder , 在 tmp folder 解壓 , 除即 delete 該壓縮檔騰出寶貴的空間做接下來的設定

修改 ArchLinux Source 配置檔

請選擇你的 VPS 所在地國家 , 這樣軟件 update 會快一點 例如: 在香港可選以下的 source , 把開頭的 # 去除

## Hong Kong

Server = https://asia.mirror.pkgbuild.com/$repo/os/$arch
#Server = http://mirror-hk.koddos.net/archlinux/$repo/os/$arch
#Server = https://mirror-hk.koddos.net/archlinux/$repo/os/$arch
#Server = http://hkg.mirror.rackspace.com/archlinux/$repo/os/$arch
#Server = https://hkg.mirror.rackspace.com/archlinux/$repo/os/$arch
#Server = https://arch-mirror.wtako.net/$repo/os/$arch
#Server = http://mirror.xtom.com.hk/archlinux/$repo/os/$arch
#Server = https://mirror.xtom.com.hk/archlinux/$repo/os/$arch

避免 chroot 後提示硬碟空間不足 , 所以用 small image 會穩妥一點

chroot

初始化key

更新系統並安裝分區需要用到的工具

分區 , 我的 VPS SERVER 是 bios 引導 ,所以我會用 # bios 的分割硬碟

# 首先將磁碟轉換為 gpt 類型, 這裡假設比如你想安裝的磁碟名稱為 vda, 如果你使用 NVME 的固態硬碟, 你看到的磁碟名稱可能為 nvme0n1
lsblk # 顯示分區情況 找到你想安裝的磁碟名稱
parted /dev/vda # 執行 parted,進入互動式命令行,進行磁碟類型變更
(parted)mktable # 輸入 mktable
New disk label type? gpt # 輸入 gpt 將磁碟類型轉換為 gpt 如磁碟有數據會警告, 輸入 yes 即可
quit # 最後 quit 退出 parted 命令列互動
cfdisk /dev/vda # 來執行分區操作, 分配各個分區大小, 類型
# bios 引導需要分 BIOS boot, Linux Swap, Linux filesystem
# uefi 引導需要分 EFI System, Linux Swap, Linux filesystem
fdisk -l # 分區結束後, 复查磁碟情況

記得要 type 修改每個分區的 format , 頭 1M 是 bios 引導用 , 2G 是 swap , 其他是系統空間

格式化 , 如果不是 UEFI 引導就不用理會那些註明 uefi 的

mkfs.ext4 /dev/vda3 # 格式化根目錄
mkfs.vfat /dev/vda1 # 格式化 efi 分區, 僅 uefi 引導需要mkswap /dev/vda2 # 初始化 swap 分區
mount /dev/vda3 /mnt # 挂載分區
swapon /dev/vda2 # 啟用 swap
# 僅 uefi 分區需要
mount --mkdir /dev/vda1 /mnt/efi

安裝基本套件

生成 fstab 設定檔

執行 退出 chroot 環境

重新進入 chroot , 現在的 chroot 是指向剛格式化及安裝了基本套件的硬碟

時區配置

設定語言環境, 放開 en_US. UTF-8 所在行以及 zh_HK. UTF-8 所在行的註釋符號

用如下命令生成locale

向 /etc/locale.conf 導入內容

設置主機名

# 加入你想為主機取的主機名,例如: ArchLinux
vim /etc/hostname

# 同時在 /etc/hosts 設置與其匹配的條目
vim /etc/hosts

# 加入如下内容
127.0.0.1 localhost
::1 localhost
127.0.1.1 ArchLinux

設置網路, ip 位址可使用 列出當前ip資訊作參考 ip addr

沒有 ipv6 的就把 ipv6 address and route delete

[Match]
Name=eth0

[Network]
Address=xx.xx.xx.xx/24
Address=xxx:xxx:xxx:xxx:xxx:xxx:xxx:xxx/80
IPv6AcceptRA=no

[Route]
Gateway=x.xx.xx.1
GatewayOnLink=yes

[Route]
Gateway=xxx:xxx:xxx::1/80
GatewayOnLink=yes

如果網路支援dhcp, systemd-networkd的 dhcp 配置可如下配置

[Match]
Name=eth0

[Network]
DHCP=yes

設置 systemd-networkd 開機自啟

配置 dns

nameserver 8.8.8.8
nameserver 1.1.1.1
nameserver 8.8.4.4
nameserver 1.1.4.4

設置 root 用戶名密碼

設置 ssh 服務

PermitRootLogin yes  #允許root用戶使用密碼登錄

設置sshd開機自啟

安裝 grub

用 bios 引導的如下

pacman -S grub
grub-install --target=i386-pc /dev/vda

用 UEFI 引導的如下

pacman -S grub
如果使用 uefi 引導, 則還需要安裝 efibootmgr
pacman -S efibootmgr
# 然後使用下面的命令安裝 grub
grub-install --target=x86_64-efi --efi-directory=/efi --bootloader-id=GRUB

編輯grub配置檔案

去掉 GRUB_CMDLINE_LINUX_DEFAULT 參數的 quit# 添加 net.ifnames=0(避免機器重啟後, 網卡介面名稱無法與 systemd-networkd 內配置的介面名稱相匹配, 從而導致機器失聯)

重新生成grub主配置檔案

退出 chroot 環境並重啟

完成後 , 你就擁有一個滾動更新的LINUX系統

參考網址
https://zhuanlan.zhihu.com/p/641219412
https://pomeluce.github.io/docs/develop/linux/syserver/syserver002.html

Wubuntu

睇個名大家想到了什麼呢?

windows + ubuntu , 底層是 ubuntu linux , 個UI 做到 windows 11 咁樣

那個 linux 整合了 WINE 系統 , 即是可以運行一些 windows 軟件 某些 exe , msi

大家可以看看 youtube 看看個畫面

安裝完時 已經內建了 Copilot, Edge, Teams, PowerShell, Skype  等windows 軟件

同時可以運行 Android 軟件

大家可以用 virtulbox 玩吓 , 下載網址 https://www.wubuntu.org/index.php/get/wubuntu

用python每日更新追蹤香港covid-19確診或到訪大廈名單

過了農曆新年, 全港疫情大爆發, 好多香港人都會每日上網看看”衛生署”的確診名單 https://www.chp.gov.hk/files/pdf/building_list_chi.pdf

所以我寫了一個小程式來追蹤指定大廈是否在確診名單內, 尤其對做物管及做公司ADMIN朋友 , 某程度上有少許幫助 , 但間中最好抽查

本身我寫的程式在 LINUX 運行 , 每天會自動執行一次再電郵給我 , 但好多人公司或家用電腦都是行 windows 所以我修改程式適合在 windows 行及輸出檔案是 EXCEL FILE

設計該程式概念 : 先下載衛生署 PDF 名單 , 轉換成文字檔方便程式讀取 , 之後程式核對 自定名單同衛生署名單有沒有匹配 , 記錄你要找的數據 , 把文字檔轉換成 EXCEL FILE

步驟一:

先安裝 windows 版 OPENJDK 下載網址: https://docs.microsoft.com/zh-tw/java/openjdk/download

64bit windows 下載64bit版, 32bit windows 下載32bit版

下載完直接安裝

步驟二:

安裝 Python 程式語言 , 下載網址: https://www.python.org/downloads/release/python-3102/

下載完直接安裝

完成後要裝程序需要的python模組

按 “win key” + R , 執行 “CMD”

升級 python pip 下載器 , 在 “命令提示字元” 內 輸入 :

pip install –upgrade pip

注意: –upgrade 前是兩個 – 減號

安裝python模組, 在 “命令提示字元” 內 輸入 :

pip3 install requests tabula-py Workbook datetime openpyxl

步驟三:

如果你的電腦已經有軟件可以開啟 UTF8 FILE可以 忽略這個

安裝 notepad++ 軟件 , 免費好用 ! 下載網址: https://notepad-plus-plus.org/downloads/

步驟四:

我編寫的程式 : Download

解壓後內有3個FILE , “run.cmd” “main.py” “udata.csv”

值得注意的是 , 有些朋友會 “不經意” 把繁簡字混亂使用 , 例子: “厦” 及 “廈” 前者簡體 後者繁體 ! 對系統來說這是不同的字 , 如果你輸入的 “某某大厦” 是會找不到的, 應該”某某大廈”才能找到 , 所以我建議不要用全名, 用 “某某”

用 notepadd++ 修改 udata.csv , 編碼 utf-8

run.cmd 內容如下所示

double click “run.cmd” 會執行程式, 如下圖

同時會有5個FILE 產生 , “building_list_chi.pdf” 是從衛生署下載的名單 , “data.csv” 是從PDF轉換成文字檔, “email.csv” 是輸出文字備用EMAIL, “record.csv” 是記錄你找到的記錄, “checklist.xlsx” 是可以用 EXCEL 開啟的記錄

備註: 所有 CSV 檔案都是 UTF8 編碼, 用 EXCEL 開會亂碼 , 如果真的要開用 NOTEPAD++ 或者用 libreoffice 都可以正常顯示中文字

如有疑問可電郵至 info@kenng.hk

ORANGEPI + “MOS場效應管” 控制風扇開關

我平時試程式或其他Linux service , 都會用 orange pi zore 安裝 armbian 作為 server , 但這板子有點燙 , 所以我就想用板上的 GPIO 上的 5V , 推動5V風扇用作散熱

把風扇直接接上 pin4 正極 及 pin6 接地 , 風扇就會轉動 , 但在家中安靜時風扇的噪音有點大

所以我就想用温度控制風扇的開關 , 減少噪音的時間, 但兩腳的風扇開關只能用通電及斷電來控制 .

我可以選擇 “三極管” 或 “MOS管” 來作開關 , 我手頭上有些 A2SHB N-MOS , 所以我今次用 MOS管 做示範 .

以我所理解 MOS管用電壓來控制開關 , 三極管用電流控制開關 . 如果想詳細了解可以上網找相關內容, 我提供一個給大家參考

URL = 用理论告诉你 三极管和MOS管的区别在哪-KIA MOS管 (kiaic.com)

今次我用的 MOS 是 SI2302 印有 A2SHB 字樣 (好細粒)

想了解一吓 MOS 管原理, 所以看看以下 youtube 視頻

我的構想圖如下:

不是每款MOS管的 vgs(th) 都是 1.2V , 我手上的 SI2302 的 vgs(th) 是1.2V 就能打開MOS管, 其他型號你要上網找找 vgs(th) 參數

好了我們開始實作吧 , 先把細小的 A2SHB 焊在電路板固定 , MOS管D極焊同風扇負極接上 , MOS管S極同 GPIO (GND) 焊上 , MOS管G極同GPIO控制端口接上(我用了pin7 作為控制端口)

記住 orangepi zero pin 4 正極 , pin 6 負極 , 我用 pin 7 控制風扇

把風扇控制板與 orangepi zero 連接後, 以下就來寫控制風扇的程序了 !

我的 orangepi 是行 armbian linux , 所以我的程序會用 python 3.x 所寫 , 先用 python 的安裝程式 pip , 裝上 OPi.GPIO library

https://pypi.org/project/OPi.GPIO/

下載 onoff_fan.zip 內有 onoff_fan.py 程序

稍微講解程序內一些段落

def get_temp():
         with open(‘/sys/class/thermal/thermal_zone0/temp’) as fp: 
                   return int(fp.read()) // 1000

這一段定義 get_temp()  function  , 內容是讀取系統內CPU溫度的數據 , 之後 result 時把數據   / 1000  , 就會得出我們平時多少  XX 度了

#循環開始
        while True: 

#CALL function 讀取溫度數據 
            cputemp = get_temp() 

#判斷溫度是否低於我們設定風扇停轉的數值, 如果 “TRUE” 就把 pin7 輸出設定為低電壓, MOS 管截止 , 風扇迴路成為開路, 沒有電流流過而停轉
            if cputemp < stop_temp_value:
                 GPIO.output(FAN_PIN, GPIO.LOW) 

#判斷溫度是否高於我們設定風扇開啟的數值, 如果 “TRUE” 就把 pin7 輸出設定為高電壓, MOS 管導通 , 風扇迴路成為閉路, 有電流流過而轉動
            elif cputemp > start_temp_value:
                GPIO.output(FAN_PIN, GPIO.HIGH)

#程序暫停10秒才進入下一個循環
             time.sleep(10) 

 

用Arduino 控制全彩LED(紅,綠,藍) 三原色調配顏色

我們先準備一些材料 , arduino nano , 紅綠藍LED各一, 一粒全彩LED, 3個按鈕,3粒10KΩ電阻(按鈕用) , 6粒150Ω(保護LED用) . 注意我的圖片是用了470Ω , 因為我找不到150Ω

先看看以下是我的材料圖片

我用了模擬器製作了一個接線圖給大家參考

首先我們先了解一下, 脈波寬度調變(英語:Pulse-width modulation,縮寫:PWM)參考網址 : https://zh.wikipedia.org/wiki/脈衝寬度調變 , https://a091234765.pixnet.net/blog/post/399625162-%5B筆記%5Darduino實驗五%3Apwm調控

我嚐試去表達一下自己的理解 , 如果不正確請不要駡我, 只是我個人的理解能力有限 !

首先我們假設10秒是一個周期 , 我們有個水桶 , 有一個水龍頭 . 例子1: 打開水龍頭, 水桶開始注水 , 10 秒周期水龍頭都是開著的,水桶就滿了 . 例子2 : 打開水龍頭, 10 秒周期裏水龍頭只開了9秒, 那水桶就只有90%滿 , 例子3 : 打開水龍頭, 10 秒周期裏水龍頭只開了8秒, 那水桶就只有80%滿 以此類推 .

PWM 用上述例子解釋 , 占空比= 水龍頭開 , 水龍頭開=5V , 水龍頭關=0V , 如果周期內占空比滿戴 , 結果就是 5V , 如果占空比只有75% , 那麼結果是3.75V , 如果占空比只20%, 那麼結果是1V 了 ! 說白了就是控制占空比 , 控制輸出的電壓來控制LED亮度 , 這就是我們今次的目的 , 得出三原色不同亮度的組合來合成各種顏色

講完構思, 現在實作吧 ! 開始 …… LED 燈加上限流電阻來保護

按鈕部分 , 一端接 GND , 一端接5V+10K電阻作為 Arduino 輸入訊號端. 平時不按下去 Arduino 輸入訊號端 會是高電壓 , 按下去的時候接地道通, Arduino 輸入訊號端 會是低壓 ! 高低電壓的輸入就會控制 Arduino 程序的流向

以下是 Arduino 的程序代碼 , 如有興趣的朋友可以下載來玩玩 下載

以下是本人寫的代碼 , 不是寫得好好 ! 請見諒 :

int redled = 15; // 紅色LED接腳
int greenled = 16; // 綠色LED接腳
int blueled = 17; // 藍色LED接腳
int rled = 3; // 全彩LED紅色接腳 PWM
int gled = 5; // 全彩LED綠色接腳 PWM
int bled = 6; // 全彩LED藍色接腳 PWM
int ranum =0; // 全彩LED紅色亮度參數 0 – 255
int ganum =0; // 全彩LED綠色亮度參數 0 – 255
int banum=0; // 全彩LED藍色亮度參數 0 – 255
int rgbbutt=14; // 轉換”紅綠藍”燈按鈕接腳
int upbutt=7; // 增加亮度按鈕接腳
int downbutt=8; // 減少亮度按鈕接腳
int val=0; // 儲存紅綠藍按鈕狀態
int valup=0; // 儲存增加亮度按鈕狀態
int valdown=0; // 儲存減少亮度按鈕狀態
int ledstat=0; // 儲存 “紅綠藍” 當前參數,全滅=0, 紅色=1 , 綠色=2, 藍色=3

void setup() {
// put your setup code here, to run once:
Serial.begin(9600);

pinMode (redled, OUTPUT); // 設定為輸出狀態
pinMode (greenled, OUTPUT); // 設定為輸出狀態
pinMode (blueled, OUTPUT); // 設定為輸出狀態
pinMode (rled, OUTPUT); // 設定為輸出狀態
pinMode (gled, OUTPUT); // 設定為輸出狀態
pinMode (bled, OUTPUT); // 設定為輸出狀態
pinMode (rgbbutt, INPUT); // 設定為輸入狀態
pinMode (upbutt, INPUT); // 設定為輸入狀態
pinMode (downbutt, INPUT); // 設定為輸入狀態
}

void loop() {
// put your main code here, to run repeatedly:
val = digitalRead(rgbbutt);
delay(50);
// Serial.println (val);

if (val == LOW) {
val = digitalRead(rgbbutt);
if (val == HIGH){
ledstat=ledstat+1;

        if (ledstat == 1) {
          digitalWrite(redled,1);
          digitalWrite(greenled,0);
          digitalWrite(blueled,0);
        }
        else if (ledstat == 2) {
          digitalWrite(redled,0);
          digitalWrite(greenled,1);
          digitalWrite(blueled,0);  
        }
        else if (ledstat == 3) {
          digitalWrite(redled,0);
          digitalWrite(greenled,0);
          digitalWrite(blueled,1);  
        }
        else {
          digitalWrite(redled,0);
          digitalWrite(greenled,0);
          digitalWrite(blueled,0);
          ledstat=0;
        }
}

}

Serial.println (ledstat);
if (ledstat == 1 ) {
valup = digitalRead(upbutt);
valdown = digitalRead(downbutt);
delay(20);
if (valup == LOW) {
if (ranum < 255 ){ ranum = ranum+1; Serial.println (“紅色”+String(ranum)); } } if (valdown == LOW) { if (ranum > 0 ){
ranum = ranum-1;
}
}
analogWrite(rled,ranum);
}

else if (ledstat == 2) {
valup = digitalRead(upbutt);
valdown = digitalRead(downbutt);
delay(20);
if (valup == LOW) {
if (ganum < 255 ){ ganum = ganum+1; } } if (valdown == LOW) { if (ganum > 0 ){
ganum = ganum-1;
}
}
analogWrite(gled,ganum);
}
else if (ledstat == 3) {
valup = digitalRead(upbutt);
valdown = digitalRead(downbutt);
delay(20);
if (valup == LOW) {
if (banum < 255 ){ banum = banum+1; } } if (valdown == LOW) { if (banum > 0 ){
banum = banum-1;
}
}
analogWrite(bled,banum);
}

Serial.println (String(ranum)+”:”+String(ganum)+”:”+String(banum));
}

以下是我自己完成後做的 DEMO 視頻

理論上可以實現全彩 , 但因為 LED 各色的參數是不一樣 红2.1v,绿2.8v,蓝2.8v,白3.1v ! 我的 DEMO 不能完全的全彩

ARDUINO 模擬器

近期健伍試用一款模擬器 , 等我介紹一下比大家看看, 我都是初學不是太熟識

我用的是 AUTODESK TINKERCARD , 網圵 : https://www.tinkercad.com

我們來CREATE 一個新電路玩玩

新增了一個試驗板 , 加了 6 顆不同顏色 LED , 在每顆發光二極管加上一個150Ω 電阻(我自己會加大一點點, 我會用470Ω 電阻) , 為什麼要加上電阻? 因為可以防止LED承受過大電壓而燒壞

如何計算電阻阻值

LED限流電阻計算公式:限流電阻Ω = (電源電壓V – LED正向穩壓電壓V) / 限流電流A

設紅色LED正向穩壓電壓2V,電流20mA,電源電壓5V,代入公式就是(5V-2V) / 0.02A = 150Ω

你們可以參考以下網址 : https://www.gushiciku.cn/dc_news/digital_ZgNU

用圖塊的方式製作, 就好像積木一樣 , 一顆一顆的接著發亮又關燈

ARDUINO NANO 不能寫入 , 有什麼方法重設成出廠狀態呢?

應該有不少朋友會遇到玩死了 自己的 NANO , 原因例如有 : 寫 program 入NANO 時 arduino java error 跳出了 , 當機了都有可能使 arduino nano 出現錯誤不能再寫入 !

本來諗住要放進垃圾桶內, 但心想上網找找有沒有人同我一樣玩死了 NANO , 找了一會原來可以試吓重新燒錄 bootloader !

紅色麵包板 NANO 是用來當作燒錄器, 綠色麵包板是不能寫入程序的 NANO

我們今次會用 ICSP 來重新寫入 bootloader , ICSP 是什麼 ?

“ICSP 代表電路串行程式設計,這是可用於程式設計 Arduino 板的幾種方法之一。通常,Arduino 引導載入程式用於程式設計Arduino板,但如果引導載入器丟失或損壞,則可以使用ICSP。ICSP 可用於恢復遺失或損壞的引導載入器。”

用杜邦線連上 被燒錄NANO 的 ICSP , 被燒錄的 ICSP RST 腳連接燒錄器上的 D10 腳 , 如下圖 :

如果你用作燒錄器的板子不是 NANO , 那你找出 SPI 的引腳連接就是了 .

另一種接法就是用板子 SPI , 像以下圖片

完成了接線後, 我們先把作為燒錄器的 NANO 連接上 PC

打開 Arduino — > File —> Examples —> 11.ArduinoISP

然後到 Tools 選擇你自己用作 “燒錄器” 的板子 , 我的是 Board: “Arduino Nano” —> Processor: “ATmega328P (Old Bootloader)” —> 我的電腦連接是 Port: “COM12” ( 你的電腦可能是別的 COM PORT )

如果你用作燒錄器板子是別的型號 , 就要選上正確型號: 例如UNO , 就選UNO

按 “箭頭” 把 Arduino ISP 程序寫入燒錄器板子

成功寫入如下圖 :

凖備工作好了 , 現在開始重寫 bootloader 了 , 我們再次選擇要被燒 bootloader 的板子了 , “Arduino Nano” —> “ATmega328p (Old Bootlooder” , 如果要燒的是 UNO 就選 UNO 板子.

再選擇 Programmer : “Arduino as ISP”

之後就可以 Burn Bootloader

如果成功了, 就會出現 “Done burning bootloader. “

完成後可以找一些範例 , 寫一次入去重新燒錄bootloader 的板子了 !