Сборка USB-вентилятора-часов на Arduino Nano: схема, код и настройка времени
USB LED-вентилятор с аналоговыми часами на Arduino NANO — код проекта, схема и функция установки времени
Если вы видели популярный гаджет — мини USB-вентилятор с часами на пропеллере, то этот проект покажет, как собрать аналогичное устройство на Arduino NANO, датчике Холла, резисторах, батарее, коллекторном двигателе и светодиодах.
Светодиоды вращаются, создавая персептивный образ аналоговых часов со всеми тремя стрелками (часы, минуты, секунды) и круговым циферблатом.
Главная особенность — возможность задать время (часы и минуты) через прошивку Arduino по USB. Разберем реализацию.
Готовый гаджет LED Fan Clock

Необходимые компоненты
- Arduino NANO
- Датчик Холла W130
- R1–R16 = 330 Ом
- R17 = 2,2 кОм
- R18 = 10 кОм
- LED 1–11 = красные
- LED 12–16 = зеленые
- LED 17 = синий
- Батарея = 3,7 В, 240 мА·ч (для мощного двигателя высокой скорости — 9–12 В)
- Выключатель = тумблер однополюсный (Slide Toggle)
- Доп.: текстолит, игрушечный коллекторный двигатель, провода, паяльник и расходники
Схема и монтаж
Ниже приведена схема для базовой версии. Для версии с настройкой времени по ИК — схема в конце статьи.

Пошаговая сборка
- Вырежьте кусок текстолита под схему.
- Установите зеленые LED (12–16) длинными ножками влево. С медной стороны согните ножки в одну сторону (к выводам A5–A1 через R12–R16).
- Точно так же установите красные LED 1–11 (выводы D2–D12 через R1–R11).
- Синий LED 17 — выше зеленых (вывод A7 через R17=2,2кОм). Катод объедините с остальными катодами. Анод — через R17 на +5В Arduino.
- Все катоды соедините вместе. Отрежьте лишние ножки.
- Установите резисторы аналогично LED, согните и подрежьте ножки.
- Припаяйте компоненты по схеме.
- Припаяйте разъемы для Arduino NANO.
- Общий катод LED — на GND Arduino.
Подключение резисторов к выводам Arduino:
- R1–R11 → D2–D12
- R12–R16 → A1–A5
Датчик Холла:
- Выход (Out) → A0
- VCC → +5V
- GND → GND
Финальные шаги:
- Подключите батарею 3,7 В 240 мА·ч через тумблер на плюсовом проводе.
- Закрепите конструкцию на чипборде с игрушечным двигателем. Для высокоскоростного двигателя — батарея 9–12 В.
- Загрузите код (ниже) через USB, включите тумблер. Вентилятор покажет часы в движении.
Код проекта (прошивка)
В коде можно изменить начальные часы/минуты/секунды перед загрузкой.
Источник кода: hobbyprojects
int LED1 = 2; int LED2 = 3; int LED3 = 4; int LED4 = 5; int LED5 = 6; int LED6 = 7; int LED7 = 8; int LED8 = 9; int LED9 = 10; int LED10 = 11; int LED11 = 12; int LED12 = A1; int LED13 = A2; int LED14 = A3; int LED15 = A4; int LED16 = A5; int sensorPin = A0; int minuteSensor = A7; int hourSensor = A6; unsigned int n,ADCvalue,propeller_posn; unsigned long previousTime = 0; byte hours = 12; // установить часы byte minutes = 15; // установить минуты byte seconds = 00; // установить секунды int val; void setup() { pinMode(LED1,OUTPUT); pinMode(LED2,OUTPUT); pinMode(LED3,OUTPUT); pinMode(LED4,OUTPUT); pinMode(LED5,OUTPUT); pinMode(LED6,OUTPUT); pinMode(LED7,OUTPUT); pinMode(LED8,OUTPUT); pinMode(LED9,OUTPUT); pinMode(LED10,OUTPUT); pinMode(LED11,OUTPUT); pinMode(LED12,OUTPUT); pinMode(LED13,OUTPUT); pinMode(LED14,OUTPUT); pinMode(LED15,OUTPUT); pinMode(LED16,OUTPUT); pinMode(sensorPin,INPUT_PULLUP); if(hours == 12) hours = 0; //**************************************** // Раскомментируйте для теста ИК-сенсоров через Serial /* Serial.begin(9600); while(1) { ADCvalue = analogRead(minuteSensor); Serial.print("minuteSensor "); Serial.println(ADCvalue); ADCvalue = analogRead(hourSensor); Serial.print("hourSensor "); Serial.println(ADCvalue); Serial.println(); delay(1000); } */ //**************************************** } void loop() { val = digitalRead(sensorPin); while (val == LOW) { val = digitalRead(sensorPin); } if (millis() >= (previousTime)) { previousTime = previousTime + 1000; seconds = seconds+1; if (seconds == 60) { seconds = 0; minutes = minutes+1; } if (minutes == 60) { minutes = 0; hours = hours+1; } if (hours == 12) { hours = 0; } } propeller_posn=30; n=0; while(n < 60) { ADCvalue = analogRead(minuteSensor); if(ADCvalue < 500) { minutes = propeller_posn; seconds = 0; } ADCvalue = analogRead(hourSensor); if(ADCvalue < 500) { hours = propeller_posn/5; seconds = 0; } drawMinuteMarker(); if ((propeller_posn==0) || (propeller_posn==5) || (propeller_posn==10) || (propeller_posn==15) || (propeller_posn==20) || (propeller_posn==25) || (propeller_posn==30) || (propeller_posn==35) || (propeller_posn==40) || (propeller_posn==45) || (propeller_posn==50) || (propeller_posn==55)) drawHourMarker(); if ((propeller_posn==0) || (propeller_posn==15) || (propeller_posn==30) || (propeller_posn==45)) drawQuarterMarker(); if((propeller_posn == hours*5) || (( propeller_posn == 0 ) && (hours == 0))) drawHoursHand(); if(propeller_posn == minutes) drawMinutesHand(); if(propeller_posn == seconds) drawSecondsHand(); delayMicroseconds(100); // ширина пикселя LED (подстройте под скорость двигателя) displayClear(); drawInner_Circle(); delayMicroseconds(450); // зазор между пикселями (подстройте под скорость) n++; propeller_posn++; if(propeller_posn == 60) propeller_posn=0; } val = digitalRead(sensorPin); while (val == HIGH) { val = digitalRead(sensorPin); } } //========================= void displayClear() { digitalWrite(LED1,LOW); digitalWrite(LED2,LOW); digitalWrite(LED3,LOW); digitalWrite(LED4,LOW); digitalWrite(LED5,LOW); digitalWrite(LED6,LOW); digitalWrite(LED7,LOW); digitalWrite(LED8,LOW); digitalWrite(LED9,LOW); digitalWrite(LED10,LOW); digitalWrite(LED11,LOW); digitalWrite(LED12,LOW); digitalWrite(LED13,LOW); digitalWrite(LED14,LOW); digitalWrite(LED15,LOW); digitalWrite(LED16,LOW); } void drawMinuteMarker() { digitalWrite(LED16,HIGH); } void drawHourMarker() { digitalWrite(LED15,HIGH); digitalWrite(LED14,HIGH); } void drawQuarterMarker() { digitalWrite(LED13,HIGH); digitalWrite(LED12,HIGH); } void drawHoursHand() { digitalWrite(LED1,HIGH); digitalWrite(LED2,HIGH); digitalWrite(LED3,HIGH); digitalWrite(LED4,HIGH); digitalWrite(LED5,HIGH); digitalWrite(LED6,HIGH); digitalWrite(LED7,HIGH); } void drawMinutesHand() { digitalWrite(LED1,HIGH); digitalWrite(LED2,HIGH); digitalWrite(LED3,HIGH); digitalWrite(LED4,HIGH); digitalWrite(LED5,HIGH); digitalWrite(LED6,HIGH); digitalWrite(LED7,HIGH); digitalWrite(LED8,HIGH); digitalWrite(LED9,HIGH); } void drawSecondsHand() { digitalWrite(LED1,HIGH); digitalWrite(LED2,HIGH); digitalWrite(LED3,HIGH); digitalWrite(LED4,HIGH); digitalWrite(LED5,HIGH); digitalWrite(LED6,HIGH); digitalWrite(LED7,HIGH); digitalWrite(LED8,HIGH); digitalWrite(LED9,HIGH); digitalWrite(LED10,HIGH); digitalWrite(LED11,HIGH); } void drawInner_Circle() { digitalWrite(LED1,HIGH); delayMicroseconds(30); digitalWrite(LED1,LOW); }
Как настроить время (версия с ИК-приемником)
Для базового ИК-приемника, интегрированного в схему
Дополнительные компоненты:
- R19, R20 = 10 кОм
- ИК-фототранзистор (у LED#13 — настройка минут)
- ИК-фототранзистор (у LED#16 — настройка часов)
Соедините R19 с первым ИК-светодиодом (у LED#13), R20 — со вторым (у LED#16). Общие выводы ИК-светодиодов и резисторов — на GND и +5V Arduino. Перемычки: A7 — между R19 и вторым ИК; A6 — между R20 и первым ИК.

Для ИК-пульта (передатчика)
Компоненты:
- Крона 9В + коннектор
- ИК-светодиод (ИК-LED)
- Резистор 1 кОм
- Тактическая кнопка
- Текстолит
Соберите последовательно: батарея — ИК-LED — 1 кОм — кнопка (на плюсе). Этот пульт направляют на LED#13 (минуты) или LED#16 (часы) для настройки.
Фрагмент кода, отвечающий за настройку:
propeller_posn=30; n=0; while(n < 60) { ADCvalue = analogRead(minuteSensor); if(ADCvalue < 500) { minutes = propeller_posn; seconds = 0; } ADCvalue = analogRead(hourSensor); if(ADCvalue < 500) { hours = propeller_posn/5; seconds = 0; }
Настройка минут: наведите пульт на маркер минут, нажмите кнопку.
Настройка часов: наведите на маркер часов, нажмите кнопку.
Проверьте показания ИК-детектора через Serial Monitor: при обычном свете >500, под ИК — <500. Подстройте порог в коде под свои сенсоры.
Видео-демонстрация:
Ресурсы: гаджет, комплектующие, Arduino NANO для проекта.
Промышленные технологии
- Сборка светодиодного секвенсора на таймере 555 и счетчике 4017: деление частоты и устранение дребезга
- Arduino POV-часы: сборка дисплея на эффекте сохранения образа
- Создание пользовательских LED-часов с будильником — видно с 12 метров
- Крестики-нолики на Arduino с матрицей MAX7219 и картонным корпусом
- Пошаговое руководство: сборка умного четырёхногого робота на Arduino
- Сборка надежного таймера обратного отсчета на Arduino с 7-сегментным дисплеем SparkFun
- Arduino Flip Clock на матрице 8×8 LED — DIY проект реального времени
- Самодельный RC Porsche на Arduino: Пошаговое руководство
- DIY USB-трекпад на Arduino: превращаем старый ноутбучный тачпад в современное устройство ввода
- Профессиональная схема LED ночного светильника 230В/50Гц или 110В/60Гц — прямое питание от сети