Автоматическое включение фар автомобиля

Самоходная платформа, розетка, управляемая по СМС – это все хорошо, но только розетка сейчас может принести какую-либо практическую пользу в быту, но и ей, в данный момент, нет применения. Это будет небольшой проект, который будет использоваться гораздо чаще других. В этот раз мы реализуем систему “автоматическое включение фар” на автомобиле при недостаточной освещенности. При этом я буду использовать непривычный для себя контроллер Digispark на AtTiny 85.

Для реализации этого проекта были приобретены следующие компоненты:

  • Контроллер Digispark ATtiny 85
  • Датчик света TEMP6000
  • Стандартная кнопка в машину, которая сможет отключать и включать функцию автоматического освещения
  • Реле.
Общие принципы и описание

Принцип не сложный.

  1. Контроллер будет получать питание только после включения зажигания, чтобы попусту не тратить энергию.
  2. Далее будем выдерживать небольшую паузу, в районе 15 секунд, чтобы успеть завести машину, перед включением фар.
  3. Чтобы фары не выключались при малейшем попадании света на датчик и не включались при попадании в темное место на короткий промежуток времени– контроллер будет принимать решение о включении или выключении фар по показаниям датчика, собранным в течении последних 3-5 секунд (возможно время будет скорректировано).
  4. Если среднее значение освещения, собранное за 3-5 секунд меньше порога для включения фар – замыкаем реле, которое включит фары.
  5. Так же будет установлен выключатель автоматики, чтобы оставить включение фар водителю.
  6. Т.к. слежение за фарами – единственная задача контроллера – мы может смело использовать функцию delay(time).
Тестовый стенд 1 и получение значения для включения фар

Перед сборкой – нам нужно понять, при каком освещении можно включить или выключить фары. Для этого я соберу стенд с небольшим экраном, на котором будет отображаться текущее значение датчика света, на ардуино нано. Поставим все это в машину, а вечером запомним значение, которое выдал датчик, в тот момент, когда нужно включить фары включить фары. Во время тестирования буем использовать привычную нам Arduino Nano.

Плюс, мы попробуем поработать с LCD дисплеем. Я приобрел экран на 16 символов и 2 строки с адаптером I2C интерфейса.

Нюансы работы с дисплеем:

  • Для работы с экраном, у которого есть адаптер I2C, нужна библиотека LiquidCrystal_I2C. Если у экрана нет адаптера – то библиотека LiquidCrystal.
  • У адаптера экрана есть регулировка контраста сзади. Если вы написали скетч, а на экране ничего нет- нужно попробовать подкрутить контраст.

Дисплей подключается посредствам 4 контактов:

  • VCC – питание (5V на ардуино)
  • GND – земля (GND)
  • SDA – A4
  • SCL – A5

Адрес дисплея по умолчанию 0х27 – он понадобится для его инициализации.

Датчик света я буду использовать TEMT6000. Он маленький и простой, имеет всего 3 пина (питание, масса, и сигнал). Сигнал (помечен как out) подключаем к любому аналоговому пину на ардуино. Датчик выдает значение от 0 до 1023. Чем больше освещение – тем больше значение.

Скетч для тестового стенда:

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C LCD(0x27,16,2);

void setup() {
   pinMode(A3, INPUT);
   LCD.init();
   LCD.backlight();
   LCD.setCursor(1, 0);
}

void loop() {
  delay(1000); 
  LCD.clear();
  LCD.setCursor(1, 0);
  LCD.print((String)analogRead(A3));
}
Рисунок 1. Тестовый стенд. Получение значения для включения фар.

Проехавшись по городу, я понял, что значение датчика, при котором нужно включить фары равно примерно 90.

Тестовый стенд 2 – включаем диод

Теперь соберем второй стенд, он будет похож на готовое устройство. Будет работать на Digispark, и включать диод, когда становится темно.

Реализация

При поступлении питания на контроллер – мы сразу начинам анализировать данные с датчика, но включим фары после запуска только через ~15 секунд. 

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

Будем собирать данные с датчика каждые 100 миллисекунд и записывать их в массив, следовательно, нам понадобится массив на 30 элементов типа integer. При получении нового значения нам нужно сдвигать данные, которые уже есть в массиве, на один элемент вперед – чтобы у нас всегда были актуальные данные за последние 3 секунды. При сдвиге самое старое значение будет пропадать, т.к. оно нам больше не нужно.

Далее мы берем сумму всех данных в массиве и делим на 30 (количество измерений). И далее уже на основании полученного значения принимаем решение о включении фар. Включение будем производить, если среднее значение меньше 90, а выключать, если больше 100.

С общим алгоритмом определились, теперь приступим к написанию скетча. Работать будем с контроллером Digispark ATTiny 85. Инструкцию по установке драйвера и заливке скетча не буду приводить здесь, информации об этом более чем достаточно.

Получившийся скетч:

#define RELAY_PIN 0 
#define SENSOR_PIN A2 
#define ARRAY_SIZE 30
#define TURN_ON 90
#define TURN_OFF 100

int measurement[30];
int counter;
int average;
void setup() {

  pinMode(RELAY_PIN, OUTPUT);
  pinMode(SENSOR_PIN, INPUT);

  for(int i = 0; i < ARRAY_SIZE; i++){
    measurement[i] = 0;
  }
  counter = 0;
  average = 0;

}

void loop() {

  delay(150);
  for(int i = ARRAY_SIZE-1; i >= 1; i--){
    measurement[i] = measurement[i-1];

  }
  measurement[0] = analogRead(SENSOR_PIN);

  if(counter >= 75){
    for(int i = 0; i < ARRAY_SIZE; i++){
      average += measurement[i];
    }
    average /= ARRAY_SIZE;
    if(average < TURN_ON) digitalWrite(RELAY_PIN, HIGH);
    else if(average > TURN_OFF) digitalWrite(RELAY_PIN, LOW);
    counter = 160;
  }
  counter++;
  
}

После сборки датчик света был приклеен на лобовое стекло. Контроллер, с висящим на нем диодом, был включен в ЮСБ и спрятан в бардачке. Диод выведен наружу.

Рисунок 2. Тестовый стенд для включения диода.

После небольшого выезда вечером, я посмотрел, как загорается диод и не мигает ли когда едешь среди фонарей. К сожалению, видео или фото, того, как работала схема у меня нет. Но результат меня вполне устроил.

Реализация готового устройства

В предыдущем примере я включал один диод, но в машине нам нужно будет включить габариты и фары. Поэтому нам понадобится не одно реле, а два. Включать мы их будем не одновременно, а с задержкой 100 мс.

Немного отредактировал скетч. Добавил второе реле и его включение через 100мс после первого.

Готовый скетч:

#define RELAY_PIN_1 0 
#define RELAY_PIN_2 1
#define SENSOR_PIN A2 
#define ARRAY_SIZE 30
#define TURN_ON 90
#define TURN_OFF 100

int measurement[30];
int counter;
int average;
void setup() {

  pinMode(RELAY_PIN_1, OUTPUT);
  pinMode(RELAY_PIN_2, OUTPUT);
  pinMode(SENSOR_PIN, INPUT);

  for(int i = 0; i < ARRAY_SIZE; i++){
    measurement[i] = 0;
  }
  counter = 0;
  average = 0;

}

void loop() {

  delay(150);
  for(int i = ARRAY_SIZE-1; i >= 1; i--){
    measurement[i] = measurement[i-1];

  }
  measurement[0] = analogRead(SENSOR_PIN);

  if(counter >= 75){
    for(int i = 0; i < ARRAY_SIZE; i++){
      average += measurement[i];
    }
    average /= ARRAY_SIZE;
    if(average < TURN_ON){ 
      digitalWrite(RELAY_PIN_1, HIGH);
      delay(100);
      digitalWrite(RELAY_PIN_2, HIGH);
    }
    else if(average > TURN_OFF){
      digitalWrite(RELAY_PIN_1, LOW);
      delay(100);
      digitalWrite(RELAY_PIN_2, LOW);
    }
    counter = 160;
  }
  counter++;
  
}

Контроллер и реле поместил в небольшую распаечную коробку, купленную в обычном магазине электроприборов. В коробке просверлил небольшое отверстие, которое вывел на проводе датчик света, а также косу с штекером для питания и выводами реле.  Работа реле была проверена с помощью настольной лампы.

Рисунок 3. Схема готового устройства.
Рисунок 4. Готовое устройство.
Рисунок 5. Готовое устройство.
Подключение к проводке автомобиля

Чтобы устройство заработало на своем месте. Нам нужно внедрить его в проводку автомобиля.

Для этого нужно:

  1. Определить провода, с помощью которых включаются габариты;
  2. Определить провода, с помощью которых включаются фары;
  3. Сделать необходимую проводку и подключиться к проводам, определенным в предыдущих пунктах.
  4. Предусмотреть выключатель системы, а также предохранитель.

С определением не возникло больших проблем. Была найдена распиновка фишки, подключаемой к подрулевым выключателям. Далее я вытащил фишку из блока выключателей и попробовал замкнуть указанные провода. Фары и габариты загорелись. Автомобиль Toyota corolla fielder 141.

Рисунок 6. Распиновка фишки подрулевых переключателей.
Рисунок 7. Ближний свет
Рисунок 8. Габариты.

Теперь нужно припаять (или скрутить) провода к фишке, которая будет подключаться к устройству. Как я уже говорил, из нашего устройства выходи кабель со штекером. На нем уже есть питание (красный и рядом с ним черный провода) их мы подключаем выводам зажигания, и две пары проводов – выводы реле, их мы подключаем к габаритам и фарам. В разрыв провода питания вставить предохранитель и кнопку (для отключения автоматики).

Выводы

В этом небольшом проекте мы изучили новый микроконтроллер, и сделали небольшую разработку, которая позволит владельцам стареньких автомобилей (или просто автомобилей, не оснащенных функцией “автоматическое включение фар”) модернизировать свой автомобиль.

Предыдущий проект: 3D-принтер своими руками

Оставьте комментарий