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