各位好
會想做這次的專案主要是車上這組蟻人霧燈有嚴重的控制問題
首先蟻人霧燈有3種狀態
這是第一種 沒開
這是第二種 近燈白光
這是第三種 近遠同時亮 黃加白
原本附的開關是這種2段式防水開關
如圖所見 原本左手開關就已經夠多了
再放一個開關的話
我的左手大拇指是沒辦法及時的控制霧燈開關
後來改變位置到右手
發現更難用
我右手根本沒辦法在催油門的同時去控制這個開關
而剛剛提到的及時控制
原因是因為在上個月梅雨季
當時大約是晚上8點下著大雨
我開著霧燈第一段在沒人的巷子裡
尊爵的本田車主就知道原廠大燈有多爛
右轉進另一條巷子
此時對面一台機車向我迎面而來
因為對方燈太暗我沒有及時的發現對方
當下我本身還帶有傾角
沒辦法空出左手看來關霧燈
等到即將擦身而過時
我看見對方的臉居然全是白的
對方被我的霧燈‘近燈’閃到沒有辦法張開眼睛
造成這麼危險的事情發生
都是因為我沒有辦法及時的切掉霧燈
好的
既然事情發生了
就來想想該如何解決吧
我第一個想到外面有在賣 7期改5期大燈控制器
但清一色是要熄火才能關燈
沒辦法用
物色了幾天都沒有看到可以買來用的模組
身為一位硬體工程師
買不到的電子產品就該自己做
我的需求是
使用遠燈的開關控制我的3段霧燈
首先隨便買一張MCU來做魔法實驗
對我來說Arduino是最便宜切通用性最好的產品了
我是做硬體的,劍士怎麼可能會魔法呢
2024年現代魔法咒語產生器
詳細的咒語我會貼在最後面
再隨便做個實驗
看來咒語產生器是真的可以啊!
google演算法很聰明的在YT推我JLCPCB的廣告
看了一下實在是跨時代的服務
再來就是隨便抓一個arduino的電路圖
去掉不要的東西
加上12V轉5V的DC-DC
加2顆Relay當做霧燈的控制開關
隨便畫一個Layout
隨便付個7美金
過4天就有隨便5張PCB到我手上了
隨便備個料
這種模組買來拆零件比去買新的零件還便宜
電阻電容就幹公司的就好
原本霧燈開關就是這種3PIN插頭
很好買到
最棒的是他其中一條線就有提供12V的電
把摩托車手把開關拆開
找到遠燈的線剝開
接線後做一個端子
像這樣稍微安裝測試看看
測試ok後想辦法做防水
我是先噴了電路板防水膠
再用袋子裝起來
背面像這樣
誒裡面是什麼混進去了
哭啊我已經包好了
裝上車再隨便固定一下
很好的藏在車手裡面
負極沒地方鎖就鎖在杯架螺絲上面
打完收工
測試影片如下
這樣我就可以直接關掉遠燈霧燈也會一起關閉
實現快速開關霧燈的功能
再也不會因為來不及切開關而閃瞎路人了
附上咒語
請幫我寫ARDUINO程式,定義D2腳名字為SIGNAL,定義D6腳名字為LOW_EN,定義D5腳名字為HIGH_EN
當SIGNAL為LOW超過1秒LOW_EN與HIGH_EN輸出low
如果SIGNAL原本是HIGH且SIGNAL在1秒內變LOW又變HIGH
LOW_EN輸出high且HIGH_EN輸出low
如果LOW_EN原本是HIGH且SIGNAL原本是HIGH且SIGNAL在1秒內變LOW又變HIGH
LOW_EN輸出low且HIGH_EN輸出high
如果HIGH_EN原本是HIGH且SIGNAL原本是HIGH且SIGNAL在1秒內變LOW又變HIGH
LOW_EN輸出low且HIGH_EN輸出low
#define SIGNAL 2
#define LOW_EN 6
#define HIGH_EN 5
unsigned long lowStartTime = 0; // 記錄 SIGNAL 開始為 LOW 的時間
bool wasHigh = true; // 記錄 SIGNAL 是否曾經為 HIGH
bool debounceState = HIGH; // 用於防彈跳的狀態
unsigned long lastDebounceTime = 0; // 用於防彈跳的時間
const unsigned long debounceDelay = 50; // 防彈跳延遲時間
int A = 0 ;
void setup() {
pinMode(SIGNAL, INPUT);
pinMode(LOW_EN, OUTPUT);
pinMode(HIGH_EN, OUTPUT);
digitalWrite(LOW_EN, LOW);
digitalWrite(HIGH_EN, LOW);
}
void loop() {
int reading = digitalRead(SIGNAL);
// 防彈跳處理
if (reading != debounceState) {
lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) > debounceDelay) {
if (reading != wasHigh) {
wasHigh = reading;
if (wasHigh == LOW) {
lowStartTime = millis(); // 記錄開始為 LOW 的時間
}
}
}
debounceState = reading;
// 如果 SIGNAL 為 LOW 且超過 1 秒
if (wasHigh == LOW && (millis() - lowStartTime > 1000)) {
digitalWrite(LOW_EN, LOW);
digitalWrite(HIGH_EN, LOW);
A=0;
}
// 如果 SIGNAL 原本是 HIGH 且在 1 秒內由 LOW 變回 HIGH
if (A==0 && wasHigh == HIGH && (millis() - lowStartTime <= 1000) && lowStartTime != 0) {
digitalWrite(LOW_EN, HIGH);
digitalWrite(HIGH_EN, LOW);
A=1;
delay(1200);
}
// 如果 LOW_EN 原本是 HIGH 且 SIGNAL 原本是 HIGH 且在 1 秒內由 HIGH 變為 LOW 再變回 HIGH
if (A==1 && digitalRead(LOW_EN) == HIGH && wasHigh == HIGH && (millis() - lowStartTime <= 1000) && lowStartTime != 0) {
digitalWrite(LOW_EN, LOW);
digitalWrite(HIGH_EN, HIGH);
A=2;
delay(1200);
}
// 如果 HIGH_EN 原本是 HIGH 且 SIGNAL 原本是 HIGH 且在 1 秒內由 HIGH 變為 LOW 再變回 HIGH
if (A==2 && digitalRead(HIGH_EN) == HIGH && wasHigh == HIGH && (millis() - lowStartTime <= 1000) && lowStartTime != 0) {
digitalWrite(LOW_EN, LOW);
digitalWrite(HIGH_EN, LOW);
A=0;
delay(1200);
}
// 重置為初始狀態
if (wasHigh == HIGH) {
lowStartTime = 0;
}
}
本文最後由 BanGenn 於 2024-6-20 08:57 編輯
|
評分
-
瀏覽全部評分總評分 :
紅利點數 +15
|