Прошу помощи со скетчем, светильник

Уважаемые гуру, прошу помощи в написании скетча для ардуино.
Сам не силён, всё что мог попробовал, корректно к сожалению не работает.
Необходимо оживить ночник.
Имеется: кнопка, датчик света, нагрузка в виде светодиодной ленты.
Задача: управление светом с помощью кнопки и датчика света.
Необходимо что бы свет автоматически включался и выключался при изменении освещенности + по нажатию кнопки можно было выключить или снова включить свет в любом состоянии датчика света.
Благодарю заранее.
Пробовал разные варианты, вот один пример того что накидал по кусочкам из интернета. Либо работает кнопка, либо работает от датчика, вместе ни как не хотит,

int led_pin = 13;
int button_pin = 2;
boolean lastBt = false;
boolean currentBt = false;
boolean ledOn = false;
int lightThreshold = 300;
boolean debvence (boolean last)
{
  boolean current = digitalRead(button_pin);
  if ( last != current)
  {
    delay(5);
    current = digitalRead(button_pin);
    return current;
  }
}
void setup()
{
  Serial.begin(9600);
  pinMode(led_pin, OUTPUT);
  pinMode(button_pin, INPUT);
}
void loop()
{
  int lightLevel = analogRead(0);
  Serial.println(analogRead(0));
  // Получаем состояние кнопки
  currentBt = debvence(lastBt);
  // Если кнопка не нажата
  if (lastBt == LOW && currentBt == HIGH)
  ledOn = !ledOn;
  digitalWrite(led_pin, ledOn);
  lastBt = currentBt; 

   // Если датчик света показывает, что света недостаточно и он выключен, включаем свет
  if (lightLevel < lightThreshold && !ledOn) {
    digitalWrite(button_pin, HIGH);
    ledOn = true;
  }
  // Если датчик света показывает, что света достаточно и он включен, выключаем свет
  if (lightLevel >= lightThreshold && ledOn) {
    digitalWrite(button_pin, LOW);
    ledOn = false;
  }
}

Данный код, что Вы привели от чего работает? Чего мозг-то выносите?

В строках №№ 37 и 42 Вы что зажигаете/гасите? Кнопку? Зачем? Она разве умеет загораться?

Впредь пишите! Накидывают навоз на грядки.

1 лайк

в строках 37 и 42 вы чего делаете то?

Зажигает и гасит кнопку, я ж вроде пояснил уже :slight_smile:

Ну почему же. Можно и по другому - просто играемся подтяжкой.)
(Подтяжка - внутренний подтягивающий резистор, порядка 30-50 ком.)

Она не включена, см. стр. №21

Дак, в 37-й включаем, а в 42-й выключаем. Поэтому и играемся.)

1 лайк

что возвращает функция debvence, если last == current?
И если предполагается, что функция должна возвращать состояние кнопки, то зачем ей знать, какое состояние было до?
Если хотите программно избавиться от дребезга, то лучше так, наверное:

boolean debvence ()
{
  if (digitalRead(button_pin) == LOW)
    return false;
  delay(50);
  if (digitalRead(button_pin) == LOW)
    return false;

  return true;
}

Функция простенькая, но в большинстве случаев работает.
button_pin, надеюсь, подтянут к GND?
Про то, что датчик у Вас включает кнопку, а не свет, Вам написали уже. Но в Вашем алгоритме проблема в основном в том, что если датчик считает, что света достаточно, а Вы хотите включить свет кнопкой, то датчик через мгновение выключает его. Тут надо алгоритм хорошо продумать, когда датчик должен включать/выключать свет, а когда не важно, что считает датчик, главное, что сказал пользователь. Например, чтобы кнопка переключала не On|Off, а On|Auto|Off, и датчик работал только в режиме Auto.

1 лайк

Я вообще, стараюсь свою извилину лишний раз не нагружать. Открытым текстом пишу pullup(button_pin); Пусть и чуть больше телодвижений для этого. И так во всём. Иной раз, откроешь старый проект и тихо фигеешь.)

Евгений, извиняюсь. Может не в тему, небольшое отступление. Как бы вы решили? Есть установки, разного типа, которые нужно менять, но при этом и экраны должны иногда меняться. Понятно, структура. Понятно, с ней работаем. Я тупо сделал через case. Всего 14. Не покидает ощущение что можно сделать элегантнее, через указатели. Не?)

Через наследуемые классы.

ОК. Не, это слишком. Да и люди не поймут.)

перфекционизм до добра никогда не доводил))

Это да. Но ведь хочется совершенства.) Ну и на будущее, дабы лишних телодвижений не производить. Хотя. Для кого это будущее…(

Столько железок всего скопилось… Да и мозги можно было бы передать… Кому? Пацан не по этому делу - ему по верхам лишь бы… Так вот и сгниёт. Тоска.(