Robootika: Öölamp

Задача:

Создать ночник, реагирующий на окружающий свет и управляемый ручкой или потенциометром. Цель проекта – применить знания о плате Arduino, электронных компонентах и программировании для создания практичного и визуально привлекательного решения для освещения.

Включение лампы: ночник можно включать и выключать нажатием кнопки или поворотом потенциометра.

Нажимая на кнопку или поворачивая потенциометр, можно регулировать яркость света в зависимости от окружающего освещения:

    Если используется один светодиод, его яркость регулируется в зависимости от окружающего освещения с помощью analogWrite(PIN, 0..255).

    Если используется несколько светодиодов, то при более темном освещении загорается больше светодиодов (с помощью digitalWrite(PIN, HIGH/LOW)).

При использовании RGB-светодиодов потенциометр позволяет выбирать различные цвета (путем изменения значений красного, зеленого и синего).

Для сборки понадобится:

  • х1 Фоторезистор
  • х1 Потенциометр
  • х1 RGB LED
  • х3 Резистор (220 Ом)
  • х1 Резистор (10 КОм)
  • х12 Провод

Прототип в TinkerCad:

Как работает:

  • Фоторезистор подключён к А1 модулю, потенциометр к А0 модулю
  • RGB LED Подключён к 11, 10 и 9 разъёму, соединён 3 резисторами и подключён напрямую к минусу
  • Для работы фоторезистора нужен резистор с сопротивлением 10 КОм
  • Подключёны базовые провода

Код:

const int potPin = A0;
const int ldrPin = A1;
const int buttonPin = 2;

const int redPin = 11;
const int greenPin = 10;
const int bluePin = 9;

bool lampOn = false;
bool lastButtonState = HIGH;

void setup() {
  pinMode(redPin, OUTPUT);
  pinMode(greenPin, OUTPUT);
  pinMode(bluePin, OUTPUT);
  pinMode(buttonPin, INPUT_PULLUP); // Кнопка замыкает GND

  Serial.begin(9600);
}

void loop() {
  // Чтение кнопки
  bool currentButtonState = digitalRead(buttonPin);
  if (lastButtonState == HIGH && currentButtonState == LOW) {
    lampOn = !lampOn;
    delay(200); // простая защита от дребезга
  }
  lastButtonState = currentButtonState;

  int potValue = analogRead(potPin);   // 0–1023
  int ldrValue = analogRead(ldrPin);   // 0–1023

  if (lampOn && ldrValue > 700) {
    // Используем потенциометр для выбора цвета
    
    int r = 0, g = 0, b = 0;
    if (potValue < 341) {
      r = map(potValue, 0, 340, 0, 255);
      g = 0;
      b = 255 - r;
    } else if (potValue < 682) {
      g = map(potValue, 341, 681, 0, 255);
      r = 255 - g;
      b = 0;
    } else {
      b = map(potValue, 682, 1023, 0, 255);
      g = 255 - b;
      r = 0;
    }

    analogWrite(redPin, r);
    analogWrite(greenPin, g);
    analogWrite(bluePin, b);
  } else {
    analogWrite(redPin, 0);
    analogWrite(greenPin, 0);
    analogWrite(bluePin, 0);
  }

  delay(50);
}

Видео: