Страница 1 из 1

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

Добавлено: Пт окт 10, 2014 12:36:42
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
Сначала светодиод тухнет, уровень света на фоторезисторе падает, из-за чего светодиод вновь загорается.

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

Собственно, моя проблема: не могу ответить на вопрос поставленный в уроке. Проблему вижу, а предположений, как её решить, нет

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

Добавлено: Пт окт 10, 2014 12:53:12
Gudd-Head
Дык, а какой вопрос-то?

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

Добавлено: Пт окт 10, 2014 13:00:37
ETS
Gudd-Head писал(а):Дык, а какой вопрос-то?
Если мы установили светодиод так, что он светит на фоторезистор, как нам нужно изменить программу, чтобы устройство работало верно?

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

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

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

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

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

  digitalWrite(LED_PIN, LOW);
  delay(1);
  int lightness = analogRead(LDR_PIN);
Каждый цикл гашу светодиод перед тем, как считать значение яркости, на миллисекунду и получается, что светодиод горит очень тускло.
Чем больше делаю задержку, тем хуже становится

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

Добавлено: Пт окт 10, 2014 14:01:43
Gudd-Head
Дык, а потом включаете-то? :)))

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

Добавлено: Пт окт 10, 2014 14:07:12
ETS
Gudd-Head писал(а):Дык, а потом включаете-то? :)))

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

  digitalWrite(LED_PIN, LOW);
  delay(1);
  int lightness = analogRead(LDR_PIN);
  digitalWrite(LED_PIN, HIGH);
Если Вы про это, то так он постоянно горит. В предыдущем варианте, он хоть и тускло горит, но работает, как положено, реагирует на показания фоторезистора :idea: .

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

Добавлено: Пт окт 10, 2014 14:10:30
Gudd-Head
ETS писал(а):Если Вы про это, то так он постоянно горит.
:))) :facepalm: Дык, включать после преобразования надо только если он до этого горел.

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

Добавлено: Пт окт 10, 2014 14:17:43
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; // светодиод не горит
  }
}
Задержку после включения светодиода сделал, чтобы он меньше мерцал хД