Espruino:Примеры/Светочувствительный датчик и Espruino Pico: различия между версиями

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску
Нет описания правки
Нет описания правки
 
Строка 116: Строка 116:
=См.также=
=См.также=


{{ads}}
 


=Внешние ссылки=
=Внешние ссылки=
Строка 122: Строка 122:
<references />
<references />


{{Навигационная таблица/Espruino}}
{{Навигационная таблица/Портал/Espruino}}
{{Навигационная таблица/Телепорт}}

Текущая версия от 15:08, 20 мая 2023

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


Светочувствительный датчик и Espruino Pico[1]

В этом руководстве мы подключим к макетной плате датчик света и поэкспериментируем с включением/выключением светодиода в зависимости от условий окружающего освещения.

Нам понадобятся

Подсоединение

Давайте создадим простой делитель напряжения, где к одной стороне будет подключен обычный резистор, а к другой – светочувствительный резистор (т.е. датчик света).

  • Подключите Espruino Pico к макетной плате так, чтобы её USB-коннектор смотрел влево.
  • Один конец чёрного провода-перемычки подключите к самому нижнему левому контакту Pico (GND), а другой – к ряду отрицательных («-») контактов на макетной плате.
  • Один конец красного провода-перемычки подключите к третьему слева нижнему контакту Pico (3.3v), а другой – к ряду положительных («+») контактов на макетной плате.
  • Одну ножку светочувствительного резистора подключите к самому правому верхнему контакту Pico (A5), а другую – к ряду отрицательных («-») контактов на макетной плате.
  • Одну ножку обычного резистора подключите к самому правому верхнему контакту Pico (A5), а другую – к ряду положительных («+») контактов на макетной плате.

Код

Итак, делитель напряжения создан. Теперь давайте прочтём созданное нами напряжение. Впишите код ниже в левую часть Web IDE и нажмите  ↵ Enter :

analogRead(A5)

Эта функция прочтёт напряжение и вернёт значение в диапазоне между «0» (0 вольт) и «1» (3.3 вольта). Например, в моём случае она вернула 0.27612726024, но вообще это значение будет зависеть от света, падающего на датчик.

Теперь накройте светочувствительный резистор рукой, нажмите на клавишу «Вверх» (чтобы выбрать последнюю введённую команду) и снова нажмите  ↵ Enter . Теперь на датчик должно падать меньше света, благодаря чему сопротивление (а следом за ним и напряжение) вырастет. В результате в моём случае функция вернула =0.62012664988.

Итак, мы научились считывать значение освещённости, а теперь давайте запрограммируем Espruino так, чтобы она делала что-то автоматически.

Во-первых, нам нужно сохранить значение освещённости. Уберите руку от датчика и напечатайте следующее:

var light = analogRead(A5);

То есть здесь мы сохраняем в переменную light значение освещённости при ярком свете.

Теперь снова накройте датчик ладонью и напечатайте следующее:

var dark = analogRead(A5);

На этот раз мы сохранили в переменную dark значение освещенности в темноте.

Таким образом, теперь у нас есть два значения, которые мы можем использовать для дальнейших манипуляций. Давайте рассчитаем среднее значение:

var mid = 0.5*light + 0.5*dark;

Теперь мы можем написать функцию, которая будет сравнивать это значение с текущим напряжением и будет включать светодиод, если текущее значение освещённости ниже среднего значения:

function step() {
  var l = analogRead(A5);
  digitalWrite(LED1, l > mid);
}

Сама по себе эта функция ничего не делает, но давайте сделаем так, чтобы Espruino выполняла её каждые 10 мс (100 раз в секунду).

setInterval(step, 10);

Теперь проведите рукой рядом с датчиком. Когда «пролёта» руки над датчиком на Pico должен был загореться красный светодиод. Кроме того, в какой-то момент после того, как вы уберёте руку (особенно если вы накрыли датчик не рукой, а листом белой бумаги), светодиод должен начать очень быстро мигать. Это происходит, потому что датчик обнаруживает свет от светодиода – в темноте светодиод включается, но спустя 1/100 секунды он снова горит, из-за чего становится достаточно ярко, чтобы датчик определил, что сейчас очень светло, из-за чего светодиод выключается, потом датчик снова определяет темноту, и светодиод включается, и так далее.

Здесь можно поэкспериментировать с включением светодиода на разных уровнях яркости. Например, можете попробовать вот это:

var mid = 0.8*light + 0.2*dark;

Это должно сделать датчик гораздо более чувствительным. То есть теперь среднее пороговое значение снизилось – к соотношению 80/20 между «светом и тьмой», благодаря чему темнота теперь будет регистрироваться реже. Попробуйте поэкспериментировать с этими множителями – В зависимости от настроек светодиод можно будет включить проще или, наоборот, труднее.

Но что если воспользоваться этой системой для настоящего светильника – чтобы он автоматически включался, когда вокруг темно, и выключался, когда светло, но не моргал. Для этого нам надо будет воспользоваться такой штукой как «гистерезис». Гистерезис – это то, что происходит, когда текущее состояние вашей системы зависит от её предыдущего состояния, а также от текущей входящей информации. В нашем случае мы воспроизведём этот эффект, включая свет, когда будет становиться слишком темно, и выключая его, когда будет становиться слишком светло (а не привязывать состояние светодиода лишь к какому-то одному значению).

Во-первых, давайте зададим два состояния, при которых светодиод будет менять своё состояние:

var lightOn = 0.5*light + 0.5*dark;
var lightOff = 0.9*light + 0.1*dark;

А теперь давайте отредактируем функцию step(), чтобы она также включала и выключала светодиод LED2 на основе значений в переменных lightOn и lightOff.

function step() {
  var l = analogRead(A5);
  digitalWrite(LED1, l > mid);
  if (l > lightOn) digitalWrite(LED2, 1);
  if (l < lightOff) digitalWrite(LED2, 0);
}

То есть теперь красный светодиод будет вести себя по-прежнему, включаясь, когда вы будете подносить к датчику руку, и выключаясь, когда вы будете её убирать, а зелёному светодиоду будет требоваться больше времени на включение, и чтобы он погас, вам надо будет убрать руку очень далеко.

Опять же, вы можете поменять пороговые значения для включения и выключения зелёного светодиода – для этого отредактируйте значения в переменных lightOn и lightOff. Если два этих значения будут близки друг к другу, то мигание зелёного светодиода будет очень похоже на мигание красного, а если очень далеки, то обнаружится, что переключить зелёный светодиод будет очень непросто (или даже невозможно).

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

См.также

Внешние ссылки