Самоходная платформа, розетка, управляемая по СМС – это все хорошо, но только розетка сейчас может принести какую-либо практическую пользу в быту, но и ей, в данный момент, нет применения. Это будет небольшой проект, который будет использоваться гораздо чаще других. В этот раз мы реализуем систему “автоматическое включение фар” на автомобиле при недостаточной освещенности. При этом я буду использовать непривычный для себя контроллер Digispark на AtTiny 85.
Для реализации этого проекта были приобретены следующие компоненты:
- Контроллер Digispark ATtiny 85
- Датчик света TEMP6000
- Стандартная кнопка в машину, которая сможет отключать и включать функцию автоматического освещения
- Реле.
Общие принципы и описание
Принцип не сложный.
- Контроллер будет получать питание только после включения зажигания, чтобы попусту не тратить энергию.
- Далее будем выдерживать небольшую паузу, в районе 15 секунд, чтобы успеть завести машину, перед включением фар.
- Чтобы фары не выключались при малейшем попадании света на датчик и не включались при попадании в темное место на короткий промежуток времени– контроллер будет принимать решение о включении или выключении фар по показаниям датчика, собранным в течении последних 3-5 секунд (возможно время будет скорректировано).
- Если среднее значение освещения, собранное за 3-5 секунд меньше порога для включения фар – замыкаем реле, которое включит фары.
- Так же будет установлен выключатель автоматики, чтобы оставить включение фар водителю.
- Т.к. слежение за фарами – единственная задача контроллера – мы может смело использовать функцию 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));
}

Проехавшись по городу, я понял, что значение датчика, при котором нужно включить фары равно примерно 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++;
}
После сборки датчик света был приклеен на лобовое стекло. Контроллер, с висящим на нем диодом, был включен в ЮСБ и спрятан в бардачке. Диод выведен наружу.

После небольшого выезда вечером, я посмотрел, как загорается диод и не мигает ли когда едешь среди фонарей. К сожалению, видео или фото, того, как работала схема у меня нет. Но результат меня вполне устроил.
Реализация готового устройства
В предыдущем примере я включал один диод, но в машине нам нужно будет включить габариты и фары. Поэтому нам понадобится не одно реле, а два. Включать мы их будем не одновременно, а с задержкой 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++;
}
Контроллер и реле поместил в небольшую распаечную коробку, купленную в обычном магазине электроприборов. В коробке просверлил небольшое отверстие, которое вывел на проводе датчик света, а также косу с штекером для питания и выводами реле. Работа реле была проверена с помощью настольной лампы.



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



Теперь нужно припаять (или скрутить) провода к фишке, которая будет подключаться к устройству. Как я уже говорил, из нашего устройства выходи кабель со штекером. На нем уже есть питание (красный и рядом с ним черный провода) их мы подключаем выводам зажигания, и две пары проводов – выводы реле, их мы подключаем к габаритам и фарам. В разрыв провода питания вставить предохранитель и кнопку (для отключения автоматики).
Выводы
В этом небольшом проекте мы изучили новый микроконтроллер, и сделали небольшую разработку, которая позволит владельцам стареньких автомобилей (или просто автомобилей, не оснащенных функцией “автоматическое включение фар”) модернизировать свой автомобиль.
Предыдущий проект: 3D-принтер своими руками