买了遥控器控制的ipe排气, 用了一段时间发现遥控器很不方便, 想开的时候找不见, 想关的时候也摸不着, 反正就是不方便..
后来我就在小黄鱼上搜索了一下改阀门按键到中控台按键, 价格在600~1500不等, 大致侧面打听了一下, 就是需要吧原车的中控按键+遥控器发过去, 那边改完再邮回来, 总之挺麻烦, 而且还有个问题就是这个方案其实可能并不完美, 因为按键直接控制遥控器的时候, 遥控器发出去的射频解析出错导致阀门没开/关成功怎么办? 那到底是开了还是没开呢...
所以带着这个问题我就想了一下解决方案, 总结如下
1. 将控制盒上面LED的状态实时反馈到中控按钮的状态灯上 (这样可以直观的看到阀门状态)
2. 中控按键选个按钮来开关阀门 (具体就是让他模拟遥控器按键)
3. 既然是遥控器了, 肯定要解决供电问题,
4. 中控按键状态灯貌似是5v, 电压需要一致才行 (为啥说是貌似呢, 因为我根本没去查资料...)
不知道怎么在帖子里面发视频, 我就发一些过程图片吧, 也没怎么拍照, 凑合看一下, 结合arduino源码看就懂了, 要是不懂可别乱搞... 搞坏了我可不赔哈, 我看看回头补个视频上来
材料&工具:
烙铁+焊锡+松香...
arduino nano板*1
公母头线*n
蜂鸣器*1
车载12v转5v转换电源*1
可能还需要准备绝缘胶带 (或者热塑管, 因人而异, 反正保证不短路就行了)
中控按键总成 (个人实在小黄鱼买的, 头铁的可以直接改原车的效果一样...)
5v转3.3v ams原件*1 (用于遥控器供电)
--------------------------------------------------------------
测量了电磁阀:
蓝+, 黑-,11.45v
根据观察可得如下控制盒led状态指示:
开机红1亮
开阀门绿2亮
auto黄3亮
arduino nano 源码:
/*
Name:ipeControl_arduino_nano.ino
Created:2021/6/9 5:06:12
Author:秋刀鱼
*/
#include <avr/wdt.h>
// 定义引脚
#define Btn_state13
#define Btn_CTL_on3
#define Btn_CTL_off5
#define Btn_CTL_auto4
#define _ADC_A1A1
#define light_2
#define _BUZZERA5
unsigned longg_t;
intg_OldState;
boolg_LastONorOFF;// 1 ON,2 OFF
boolg_bLongPressBeep;// 长按提醒
// the setup function runs once when you press reset or power the board
void setup () {
// 初始化串口,9600 波特率
Serial.begin (9600);
// 把按键引脚设置为输入
pinMode (Btn_state, INPUT);
// 把几个控制引脚设置为输出
pinMode (Btn_CTL_on, OUTPUT);
pinMode (Btn_CTL_off, OUTPUT);
pinMode (Btn_CTL_auto, OUTPUT);
pinMode (light_, OUTPUT);
pinMode (_ADC_A1, INPUT);
pinMode (_BUZZER, OUTPUT);
digitalWrite (_BUZZER, HIGH);
// 打印结果到串口
Serial.println ("setup end");
g_t = millis ();
g_OldState = 0;
g_LastONorOFF = false;
g_bLongPressBeep = false;
wdt_enable (WDTO_2S);
}
void buzzer_Di (unsigned long ms) {
digitalWrite (_BUZZER, LOW);
delay (ms);
digitalWrite (_BUZZER, HIGH);
}
// the loop function runs over and over again until power down or reset
void loop () {
// 读取输入引脚的值
int State = digitalRead (Btn_state);
int nPressType = 0;// 1切换, 2长按
int value = 0; //定义值为0,也可以在程序一开始定义
value = analogRead (_ADC_A1); //使模拟信号输入的值为value
float val = value * (5.0 / 1023.0); //由于模拟信号输入的值为0到1023的值,即为0到5v的值,这里可以转换一下
// Serial.println (val); //输出该点的电平是多少
// 这里根据输入电压值来判断当前是否需要亮灯 和 当前阀门状态
// 其实这里只是简单的识别了阀门 开/关, auto并没有做额外的处理
if (val > 1) {
g_LastONorOFF = true;
digitalWrite (light_, HIGH);
} else {
g_LastONorOFF = false;
digitalWrite (light_, LOW);
}
// 长按时滴一声提醒
if ( State == 1 && g_t != 0 && g_bLongPressBeep == false) {
// 比较按下的时间
if (millis () - g_t > 1000) {
g_bLongPressBeep = true;
buzzer_Di (80); // 滴一声
Serial.println ("Long Press Beep");
}
}
// 得到一次成功的按键操作
if ( State == 1 && g_t == 0) {
// 记录按下的时间
g_t = millis ();
} else if ( State == 0 && g_t != 0) {
// 记录抬起的时间
if (millis () - g_t > 1000) {
nPressType = 2;
} else {
nPressType = 1;
}
g_t = 0;
g_bLongPressBeep = false;
}
// 根据按键类型进行操作
if (nPressType != 0) {
if (nPressType == 1) {
g_LastONorOFF = !g_LastONorOFF;
if (g_LastONorOFF == true) {
Serial.println ("on");
digitalWrite (Btn_CTL_on, HIGH);
buzzer_Di (30); // 滴一声
delay (200);
digitalWrite (Btn_CTL_on, LOW);
buzzer_Di (30); // 滴一声
} else {
Serial.println ("off");
digitalWrite (Btn_CTL_off, HIGH);
delay (200);
digitalWrite (Btn_CTL_off, LOW);
buzzer_Di (30); // 滴一声
}
}
if (nPressType == 2) {
Serial.println ("auto");
digitalWrite (Btn_CTL_auto, HIGH);
buzzer_Di (30); // 滴一声
delay (200);
digitalWrite (Btn_CTL_auto, LOW);
buzzer_Di (30); // 滴一声
delay (200);
buzzer_Di (30); // 滴一声
}
}
delay (10);
wdt_reset (); //复位
}