Собрал коммутатор камер на базе seeduino mega 1280
Работает!!!
Итак:
Три камеры, боковые и задняя.
При включении поворотника включается левая или правая камера.
При включении заднего хода - задняя.
Кнопкой можно переключать все три камеры при движении задом.
8ми релюшный модуль для ардуино почти полностью использовал.
Три реле на питание камер, три на видео сигнал.
Еще одно реле пришлось использовать, чтобы сигнал на DVD монитор подавать, чтобы он автоматом включался на видео.
Пришлось поизголяться с кодом, так как сигнал с поворотников не постоянный, а "мигающий"...
Вот скетч, покритикуйте, может кто что-то изящнее предложит:
Код:
#include <EEPROM.h>
#include <MsTimer2.h>
//#include <avr/wdt.h>
#define DEBUG 0 // используется при отладке
//#define HandBreakPin 14 // Контакт для сигнала от ручного тормоза
//#define SmallLightPin 15 // Контакт для сигнала от габаритов
#define LeftTurnPin 36 // Контакт для сигнала от левого поворотника
#define RightTurnPin 34 // Контакт для сигнала от правого поворотника
#define RearGearPin 35 // Контакт для сигнала заднего хода
#define ButtonPin 12 // Контакт для кнопки
#define Relay_Camera1_12V_Pin 30// Контакт для реле - питание камеры 1
#define Relay_Camera2_12V_Pin 31// Контакт для реле - питание камеры 2
#define Relay_Camera3_12V_Pin 32// Контакт для реле - питание камеры 3
#define Relay_DVDCenter_12V_Pin 33// Контакт для реле - питание DVD
#define Relay_Camera1_Video_Pin 26// Контакт для реле - сигнал с камеры 1
#define Relay_Camera2_Video_Pin 27// Контакт для реле - сигнал с камеры 2
#define Relay_Camera3_Video_Pin 28// Контакт для реле - сигнал с камеры 3
void setup()
{
// wdt_enable (WDTO_8S); // сторожевой таймер от зависания
pinMode(LeftTurnPin, INPUT);// Контакт для сигнала от левого поворотника
digitalWrite(LeftTurnPin, HIGH); //внутренняя подтяжка входа +++++
pinMode(RightTurnPin, INPUT);// Контакт для сигнала от правого поворотника
digitalWrite(RightTurnPin, HIGH); //внутренняя подтяжка входа +++++
pinMode(RearGearPin , INPUT);// Контакт для сигнала от заднего хода
digitalWrite(RearGearPin , HIGH); //внутренняя подтяжка входа +++++
pinMode(ButtonPin , INPUT);// Контакт для сигнала от кнопки
digitalWrite(ButtonPin , HIGH); //внутренняя подтяжка входа +++++
pinMode(Relay_Camera1_12V_Pin, OUTPUT);
pinMode(Relay_Camera2_12V_Pin, OUTPUT);
pinMode(Relay_Camera3_12V_Pin, OUTPUT);
pinMode(Relay_DVDCenter_12V_Pin, OUTPUT);
pinMode(Relay_Camera1_Video_Pin, OUTPUT);
pinMode(Relay_Camera2_Video_Pin, OUTPUT);
pinMode(Relay_Camera3_Video_Pin, OUTPUT);
#if DEBUG
Serial.begin(115200);
#endif
}
volatile unsigned long Time_On=0;
int RearCamNum=1;
#define SignalOn 1
#define SignalOff 0
// главный цикл
void loop()
{
//wdt_reset();
int Camera_Num=0;
//boolean Start_Video=false;
if (digitalRead(RearGearPin)==SignalOff) {RearCamNum=1;} // если задняя передача выключена, то установить значение камеры задней =1
if ((digitalRead(RearGearPin)==SignalOn) && (digitalRead(ButtonPin)==SignalOff)) //если задняя передача включена и нажата кнопка, то сменить камеру
{
RearCamNum++;
if (RearCamNum>3) {RearCamNum=1;}
}
if ((digitalRead(LeftTurnPin)==SignalOn) && (digitalRead(RightTurnPin)==SignalOff)) {Camera_Num=2; Time_On=millis();}
if ((digitalRead(LeftTurnPin)==SignalOff) && (digitalRead(RightTurnPin)==SignalOn)) { Camera_Num=3; Time_On=millis();}
if (digitalRead(RearGearPin)==SignalOn) {Camera_Num=RearCamNum; Time_On=millis();}
if ((digitalRead(LeftTurnPin)==SignalOn) && (digitalRead(RightTurnPin)==SignalOn) && (digitalRead(RearGearPin)==SignalOn)) {Cameras_OFF();}
//if ((digitalRead(LeftTurnPin)==SignalOff) && (digitalRead(RightTurnPin)==SignalOff) && (digitalRead(RearGearPin)==SignalOff)){Cameras_OFF();}
#if DEBUG
Serial.println(digitalRead(LeftTurnPin));
#endif
//if ((Start_Video) && (Camera_Num>0))
//{
if ((Time_On+1000)>millis()) {Camera_ON(Camera_Num);} //если время после события (поворота или заднего хода) не болле 1 сек, то камеру включить
else {Cameras_OFF();}
//}
//if ((Time_On+1000)<millis()) {Cameras_OFF();}
delay(300);
}
void Cameras_OFF()
{
Camera_OFF(1);
Camera_OFF(2);
Camera_OFF(3);
}
void Camera_ON(int Camera_Num)
{
if (Camera_Num==1)
{
Camera_OFF(2);
Camera_OFF(3);
digitalWrite(Relay_Camera1_12V_Pin, HIGH);
digitalWrite(Relay_Camera1_Video_Pin, HIGH);
digitalWrite(Relay_DVDCenter_12V_Pin, HIGH);
}
if (Camera_Num==2)
{
Camera_OFF(1);
Camera_OFF(3);
digitalWrite(Relay_Camera2_12V_Pin, HIGH);
digitalWrite(Relay_Camera2_Video_Pin, HIGH);
digitalWrite(Relay_DVDCenter_12V_Pin, HIGH);
}
if (Camera_Num==3)
{
Camera_OFF(1);
Camera_OFF(2);
digitalWrite(Relay_Camera3_12V_Pin, HIGH);
digitalWrite(Relay_Camera3_Video_Pin, HIGH);
digitalWrite(Relay_DVDCenter_12V_Pin, HIGH);
}
}
void Camera_OFF(int Camera_Num)
{
if (Camera_Num==1)
{
digitalWrite(Relay_DVDCenter_12V_Pin, LOW);
digitalWrite(Relay_Camera1_12V_Pin, LOW);
digitalWrite(Relay_Camera1_Video_Pin, LOW);
}
if (Camera_Num==2)
{
digitalWrite(Relay_DVDCenter_12V_Pin, LOW);
digitalWrite(Relay_Camera2_12V_Pin, LOW);
digitalWrite(Relay_Camera2_Video_Pin, LOW);
}
if (Camera_Num==3)
{
digitalWrite(Relay_DVDCenter_12V_Pin, LOW);
digitalWrite(Relay_Camera3_12V_Pin, LOW);
digitalWrite(Relay_Camera3_Video_Pin, LOW);
}
}