Andruino nano 3 отсоединения контакта если...

Jusper
Offline
Зарегистрирован: 25.08.2012

Мне нужно что бы нано проверял какой ток получает где то максимум это 14 (от аккумулятора) вольт и если ток меньше заданного числа к примеру 10.8 вольт то он отсоединит контакт (ремоут от зажигания ключа) что бы возможно было завести машину.

Адруино подключён к УСБ компа а тот к блоку питания М4-АТХ.

У меня уже подключено к нему управления кнопками руля.

вот скетч если нужно

// Для рулевых кнопок
// Задержки между нажатиями конкретных кнопок, миллисекунды
#define KEY_CH_MINUS_DELAY    (200)
#define KEY_CH_PLUS_DELAY     (200)
#define KEY_VOL_MINUS_DELAY   (150)
#define KEY_VOL_PLUS_DELAY    (150)
#define KEY_MODE_DELAY        (300)

// Значения кнопок
#define KEY_CH_MINUS    (445)
#define KEY_CH_PLUS     (640)
#define KEY_VOL_MINUS   (90)
#define KEY_VOL_PLUS    (270)
#define KEY_MODE        (805)

// Погрешность при чтении кнопок
#define KEY_DELTA       (30)

// Коды кнопок, что отсылаем в порт внешней проге
#define CH_MINUS    (1)
#define CH_PLUS     (2)
#define VOL_MINUS   (3)
#define VOL_PLUS    (4)
#define MODE        (5)
#define NONE        (0)


unsigned long LastTimeKeyPressed = millis();
int LastKeyPressed = NONE;

void setup()      
{     
Serial.begin(57600);
}      

void loop()      
{   
  ReadSteering();
  delay(50);
} 

// Читает рулевые кнопки и пишет в порт код нажатой кнопки
void ReadSteering()      
{   
  unsigned long TimeKeyPressed;
  int KeyPressed = NONE;
  int dt1 = analogRead(3);
  delay(50); 
  int dt2 = analogRead(3);
  if (abs(dt1-dt2)<=5 and dt1<900 ) //если нет дребезга и что-то есть
  { 
    // Регистрируем время нажатия кнопки
    TimeKeyPressed = millis();

    //CH_MINUS    
    if ( (dt1-KEY_DELTA <= KEY_CH_MINUS) and (dt1+KEY_DELTA >= KEY_CH_MINUS) )
    {
      if ( (LastKeyPressed != CH_MINUS) or (abs(TimeKeyPressed-LastTimeKeyPressed) >= KEY_CH_MINUS_DELAY) )
      {
        LastKeyPressed = CH_MINUS;
        KeyPressed = CH_MINUS;
        LastTimeKeyPressed = TimeKeyPressed;
      }  
    }
    //CH_PLUS
    else if ( (dt1-KEY_DELTA <= KEY_CH_PLUS) and (dt1+KEY_DELTA >=KEY_CH_PLUS) )
    {
      if ( (LastKeyPressed != CH_PLUS) or (abs(TimeKeyPressed-LastTimeKeyPressed) >= KEY_CH_PLUS_DELAY) )
      {
        LastKeyPressed = CH_PLUS;
        KeyPressed = CH_PLUS;
        LastTimeKeyPressed = TimeKeyPressed;
      }  
    }
    //VOL_MINUS
    else if ( (dt1-KEY_DELTA <= KEY_VOL_MINUS) and (dt1+KEY_DELTA >=KEY_VOL_MINUS) )
    {
      if ( (LastKeyPressed != VOL_MINUS) or (abs(TimeKeyPressed-LastTimeKeyPressed) >= KEY_VOL_MINUS_DELAY) )
      {
        LastKeyPressed = VOL_MINUS;
        KeyPressed = VOL_MINUS;
        LastTimeKeyPressed = TimeKeyPressed;
      }  
    }
    //VOL_PLUS
    else if ( (dt1-KEY_DELTA <= KEY_VOL_PLUS) and (dt1+KEY_DELTA >=KEY_VOL_PLUS) )
    {
      if ( (LastKeyPressed != VOL_PLUS) or (abs(TimeKeyPressed-LastTimeKeyPressed) >= KEY_VOL_PLUS_DELAY) )
      {
        LastKeyPressed = VOL_PLUS;
        KeyPressed = VOL_PLUS;
        LastTimeKeyPressed = TimeKeyPressed;
      }
    }
    //MODE
    else if ( (dt1-KEY_DELTA <= KEY_MODE) and (dt1+KEY_DELTA >=KEY_MODE) )
    {
      if ( (LastKeyPressed != MODE) or (abs(TimeKeyPressed-LastTimeKeyPressed) >= KEY_MODE_DELAY) )
      {
        LastKeyPressed = MODE;
        KeyPressed = MODE;
        LastTimeKeyPressed = TimeKeyPressed;
      }  
    }
    
    if (KeyPressed != NONE)
    {
      Serial.print(char(255));
      Serial.print(KeyPressed,DEC);
    }  

    //Serial.print(dt1,DEC);
    //Serial.print("   ");
    //Serial.println(dt2,DEC);
  }   
}  

Немножко теории один аналоговый вход уже занят управлением кнопок, нужно подключить еще 2 аналоговых входа из них один сделать IN для считывания вольтажа а другой OUT что бы соединял и отсоединял ремоут зажигания.

Вопросы новичка нужно сделать все в один скетч и загрузить? или можно по отдельности? на сколько я помню то нужно все в один и загрузить в андруино.

Я не селен в программировании если можно слегка помочь в этом простом для вас вопросе.

Спасибо.

 

Jacks_d
Offline
Зарегистрирован: 31.12.2011

 делай делитель напряжения до 15-17 В чтобы на всякий случай не поднять напряжения на входи МК выше 5В.

int Vin = 5; //выберешь какой у тебя аналоговый вход
int Bat_NF = 6; //выход
float V_NF = 10.8; //напряжение выключения умноженное на 10 так проще
boolean Bat_NF_state;
void setup()
{
 pinMode(Vin, INPUT);
 pinMode(Bat_NF, OUTPUT);
 Bat_NF_state = HIGH;
void loop() {
if(analogRead(map(analogInPin(Vin),0,1023,0,15) <= V_NF)
  {
   boolean Bat_NF_state = LOW;
   delay(500); 
   }
if(analogRead(map(analogInPin(Vin),0,1023,0,15) >> V_NF) 
  {
   boolean Bat_NF_state = HIGH;
   delay(500); 
   }
}

поробуй, с делителем окуратно!

leshak
Offline
Зарегистрирован: 29.09.2011

Jacks_d пишет:

поробуй, с делителем окуратно!

А лучше поставить диод защитный на вход. С хорошим запасом. Вольт на 25 или 50-т. Что-бы если с делителем ошибетесь (или нижние плечо делителя "отпаяется"/плохой контакт) - диод "уперся" и не пустил лишний вольтаж в дуину.

Jacks_d
Offline
Зарегистрирован: 31.12.2011

чето я с просони вчера накосячил... добавил зачитный промежуток на включение после падения, чтобы не скакала по включению или выключению на пороге срабатывания

int Vin = 5; //выберешь какой у тебя аналоговый вход
int Bat_NF = 6; //выход
float V_NF = 10.8; //напряжение выключения умноженное на 10 так 
проще
//чтобы не скакало вставь вот этот промежуток по напряжению
float V = 0.2;
boolean Bat_NF_state;
void setup()
{
 pinMode(Vin, INPUT);
 pinMode(Bat_NF, OUTPUT);
 Bat_NF_state = HIGH;
void loop() {
if(map(analogRead(Vin),0,1023,0,15) <= V_NF)
  {
   boolean Bat_NF_state = LOW;
   delay(500);
   }
if(map(analogRead(Vin),0,1023,0,15) >> V_NF+V)
  {
   boolean Bat_NF_state = HIGH;
   delay(500);
   }
}