Arduino. Ночной светильник

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
ETS
Родился
Сообщения: 5
Зарегистрирован: Пт окт 10, 2014 11:49:29

Arduino. Ночной светильник

Сообщение ETS »

Дошёл до пятого урока на сайте Амперки и наткнулся на вопрос, который поставил меня в тупик.

http://wiki.amperka.ru/%D0%BA%D0%BE%D0% ... 0%B8%D0%BA - сам урок.

Есть схема:
Изображение

Есть код:

Код: Выделить всё

#define LED_PIN  13
#define LDR_PIN  A0
#define POT_PIN  A1

int ledOn = false;
 
void setup()
{
  pinMode(LED_PIN, OUTPUT);
  Serial.begin(9600);
}
 
void loop()
{
  int lightness = analogRead(LDR_PIN);

  int threshold = analogRead(POT_PIN);

  boolean tooDark = (lightness < threshold);
 
  if (tooDark) {
    digitalWrite(LED_PIN, HIGH);
    if(!ledOn) Serial.println(lightness);
    ledOn = true; // светодиод горит
  } else {
    digitalWrite(LED_PIN, LOW);
    if(ledOn) Serial.println(lightness);
    ledOn = false; // светодиод не горит
  }
delay(500);
}
Есть вопрос:
Если мы установили светодиод так, что он светит на фоторезистор, как нам нужно изменить программу, чтобы устройство работало верно?

В этом коде я добавил определение переключения светодиода, то есть я знаю, при каких уровнях освещённости он загорается/тухнет. Загорается при уровне всегда ниже, чем когда тухнет. Задержка в конце добавлена, чтобы засечь визуально, когда схема самовозбуждается, т. е светодиод начинает мигать (без задержки светодиод горит вполсилы).

Вот вывод консоли при самовозбуждении:

Код: Выделить всё

248
248
404
252
405
249
771
Сначала светодиод тухнет, уровень света на фоторезисторе падает, из-за чего светодиод вновь загорается.

Значения всегда рандомные, разница меняется взависимости от порога (поворота потенциометра).

Собственно, моя проблема: не могу ответить на вопрос поставленный в уроке. Проблему вижу, а предположений, как её решить, нет
Последний раз редактировалось ETS Пт окт 10, 2014 13:02:26, всего редактировалось 2 раза.
Реклама
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: Arduino. Ночной светильник

Сообщение Gudd-Head »

Дык, а какой вопрос-то?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Реклама
ETS
Родился
Сообщения: 5
Зарегистрирован: Пт окт 10, 2014 11:49:29

Re: Arduino. Ночной светильник

Сообщение ETS »

Gudd-Head писал(а):Дык, а какой вопрос-то?
Если мы установили светодиод так, что он светит на фоторезистор, как нам нужно изменить программу, чтобы устройство работало верно?
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: Arduino. Ночной светильник

Сообщение Gudd-Head »

Как вариант, выключать светодиод на время преобразования АЦП чтобы он не засвечивал наш фоторезистор. Если делать это быстро, глаз не заметит.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Реклама
Эиком - электронные компоненты и радиодетали
ETS
Родился
Сообщения: 5
Зарегистрирован: Пт окт 10, 2014 11:49:29

Re: Arduino. Ночной светильник

Сообщение ETS »

Gudd-Head писал(а):Как вариант, выключать светодиод на время преобразования АЦП чтобы он не засвечивал наш фоторезистор. Если делать это быстро, глаз не заметит.
Хмм, сделал так

Код: Выделить всё

  digitalWrite(LED_PIN, LOW);
  delay(1);
  int lightness = analogRead(LDR_PIN);
Каждый цикл гашу светодиод перед тем, как считать значение яркости, на миллисекунду и получается, что светодиод горит очень тускло.
Чем больше делаю задержку, тем хуже становится
Реклама
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: Arduino. Ночной светильник

Сообщение Gudd-Head »

Дык, а потом включаете-то? :)))
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Реклама
ETS
Родился
Сообщения: 5
Зарегистрирован: Пт окт 10, 2014 11:49:29

Re: Arduino. Ночной светильник

Сообщение ETS »

Gudd-Head писал(а):Дык, а потом включаете-то? :)))

Код: Выделить всё

  digitalWrite(LED_PIN, LOW);
  delay(1);
  int lightness = analogRead(LDR_PIN);
  digitalWrite(LED_PIN, HIGH);
Если Вы про это, то так он постоянно горит. В предыдущем варианте, он хоть и тускло горит, но работает, как положено, реагирует на показания фоторезистора :idea: .
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: Arduino. Ночной светильник

Сообщение Gudd-Head »

ETS писал(а):Если Вы про это, то так он постоянно горит.
:))) :facepalm: Дык, включать после преобразования надо только если он до этого горел.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
ETS
Родился
Сообщения: 5
Зарегистрирован: Пт окт 10, 2014 11:49:29

Re: Arduino. Ночной светильник

Сообщение ETS »

Gudd-Head писал(а):
ETS писал(а):Если Вы про это, то так он постоянно горит.
:))) :facepalm: Дык, включать после преобразования надо только если он до этого горел.
Пхах xD. Спасибо большое :))) , заработало. Есть небольшое мерцание, но оно наблюдалось и при удалённом расположении светодиода, так что задачу я считаю решённой. Даже колебания значений в выводе сократились:

Код: Выделить всё

643
657
629
651
625
651
626
674
635
678
643



Вот конечный скетч для тех, кто будет интересоваться тем же вопросом
Спойлер

Код: Выделить всё

#define LED_PIN  13
#define LDR_PIN  A0
#define POT_PIN  A1

int ledOn = false;
 
void setup()
{
  pinMode(LED_PIN, OUTPUT);
  Serial.begin(9600);
}
 
void loop()
{
  digitalWrite(LED_PIN, LOW);
  delay(1);
  int lightness = analogRead(LDR_PIN);
  if(ledOn) digitalWrite(LED_PIN, HIGH);

  int threshold = analogRead(POT_PIN);

  boolean tooDark = (lightness < threshold);
 
  if (tooDark) {
    digitalWrite(LED_PIN, HIGH);
    delay(50);
    if(!ledOn) Serial.println(lightness);
    ledOn = true; // светодиод горит
  } else {
    digitalWrite(LED_PIN, LOW);
    if(ledOn) Serial.println(lightness);
    ledOn = false; // светодиод не горит
  }
}
Задержку после включения светодиода сделал, чтобы он меньше мерцал хД
Ответить

Вернуться в «Разные вопросы по МК»