Нижний Новгород, Россия

Датчик освещенности ардуино

  • Автор статьи Михаил

  • Категория Ардуино

  • Опубликовано 2018-04-09

В этой статье мы расскажем о датчике освещенности Ардуино, где разберем его виды, методы подключения и программирования. Но начать все-таки стоит с того, для чего он может пригодиться. В первую очередь, эти комплектующие используются в сигнализации. Такой тип сенсоров чувствует изменения внешнего фона и на основе различных физических эффектов. Сразу сообщим, что их можно разделить на два вида: датчик присутствия и движения. Первый вариант очень чувствительный и способен различать даже мелкие перемещения в своей рабочей зоне (движения пальцев, взмах головы и т.д.). Второй же более грубый, реагирует на более серьезные изменения в пространстве. Данные различия очень полезны, когда требуется решить разные задачи, например при создании умного дома или smart device. Подобные устройства довольно сильно распространены (хоть и дороговаты) и входят в комплект любой домашней сигнализационной системы, но в их основе лежит именно то, о чем мы будем говорить далее.

Рассматриваемую электронику можно разбить на 2 подвида по способу ее реализации, а именно на ИК сенсор и фоторезистор. Во втором случае используется светочувствительный элемент, который меняет свое сопротивление при изменении интенсивности светового фона.

Первый - основан на тепловом излучении объектов, что подразумевает функционирование даже в темноте. Это делает их крайне востребованными. Принцип работы ИК датчика освещенности основан на пирочувствительном элементе. Не будем подробно расписывать этот физический принцип, скажем лишь то, что при попадании на него инфракрасного излучения создается разность потенциалов, которую можно использовать в качестве информации.

Методика подключения датчиков освещенности к Ардуино одинакова для всех типов. Они производятся с 4 ножками: GND, 5V - питание, А0 -аналоговый выход, D0 - цифровой. По двум последним как раз и передается нужная для нас информация. A0 дает возможность оценить интенсивность света в пределах от 0 до 1000, а D0 - 0 или 1, то есть может показать только наличие светового фона. Естественно, мы покажем, как работать именно с 1 вариантом, так как он более информативен.

Заметим, что аналогичное приспособление с фоторезистором тоже имеет 4 пина и механизм сборки электрической цепи и программирование будет таким же. Бывает, что у обоих видов сенсоров только 3 контакта - это означает отсутствие одного из A0 или D0, поэтому будьте внимательны при заказе.

За образец возьмем ИК Light Sensor TCRT5000 и подключим его к плате управления.

Отметим, что мы взяли активный прибор: оно имеет излучатель и приемник. Сначала изучим простую задачку, где научимся управлять сенсором и извлекать из него данные. Сборка скетча в RobotON Studio:

Здесь мы присваиваем переменной показания с устройства и выводим их на экран каждую секунду. Приведем код, который составила наша графическая среда (здесь подключены лишние библиотеки, не обращайте внимания):

#define ARDUINO_NANO 1

#include <Servo.h>

#include <StepperMotor.h>

#include <DC_Motor.h>

#include <Ultrasonic.h>

int vvedite_imja;

void setup() {

Serial.begin(9600);

while(true) {

vvedite_imja = analogRead(0);

Serial.println(vvedite_imja);

delay(1*1000);

}

}

void loop () { }

 

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


Пример скетча для такого задания мы продемонстрируем ниже. Чтобы понять все досконально, советуем Вам пройти наши занятия.

Сгенерированный код из RobotON Studio. Здесь создавались функции, которые позволили сократить основную логику. В наших курсах по конструированию роботов Вы сможете найти все необходимое, чтобы разобраться в программе (видео, методические материалы).

#define ARDUINO_NANO 1

#include <Servo.h>

#include <StepperMotor.h>

#include <DC_Motor.h>

#include <Ultrasonic.h>

Servo baza;

int ugol_baza;

int ugol_kleshnja;

int ugol_kran;

int ugol_dopolnitelnij;

int napravlenie_dopolnitelnij;

int napravlenie_kran;

int napravlenie_baza;

int napravlenie_kleshnja;

Servo kleshnja;

Servo kran;

Servo dopolnitelnaja;

float visota;

float parametr_plavnosti;

float dopolnitelnij_ugol;

int osveshennost;

void setup() {

Nastrojki();

Serial.begin(9600);

while(true) {

Uvelichenie_ugla_bazi_do(90);

delay(1*1000);

osveshennost = analogRead(0);

Serial.println(osveshennost);

delay(0.1*1000);

Plavnoe_uvelichenie_visoti_pri_krane_90(8);

if(780 < osveshennost && osveshennost < 850) {

Plavnoe_umenshenie_visoti_pri_krane_90(6);

delay(1*1000);

Plavnoe_uvelichenie_visoti_pri_krane_130(5);

delay(1*1000);

Umenshit_ugol_kleshni_do(40);

Plavnoe_uvelichenie_visoti_pri_krane_90(8);

delay(1*1000);

Umenshit_ugol_bazi_do(0);

delay(1*1000);

Uvelichit_ugol_kleshni_do(100);

delay(1*1000);

} else {

Umenshit_ugol_bazi_do(0);

delay(1*1000);

}

}

}

void Uvelichenie_ugla_bazi_do(int alfa) {

while(ugol_baza < alfa) {

ugol_baza = ugol_baza + napravlenie_baza;

baza.write(ugol_baza);

delay(0.01*1000);

}

}

void Nastrojki() {

parametr_plavnosti = 0.1;

ugol_baza = 0;

napravlenie_baza = 1;

ugol_kleshnja = 160;

napravlenie_kleshnja = 1;

ugol_kran = 90;

napravlenie_kran = 1;

ugol_dopolnitelnij = 90;

napravlenie_dopolnitelnij = 1;

osveshennost = 800;

visota = 0;

baza.attach(13);

kleshnja.attach(12);

kran.attach(10);

dopolnitelnaja.attach(11);

}

void Umenshit_ugol_kleshni_do(int alfa) {

while(alfa < ugol_kleshnja) {

ugol_kleshnja = ugol_kleshnja - napravlenie_kleshnja;

kleshnja.write(ugol_kleshnja);

delay(0.01*1000);

}

}

void Uvelichit_ugol_krana_do(int alfa) {

while(ugol_kran < alfa) {

ugol_kran = ugol_kran + napravlenie_kran;

kran.write(ugol_kran);

delay(0.01*1000);

}

}

void Uvelichit_ugol_dopolnitelnij_do(int alfa) {

while(ugol_dopolnitelnij < alfa) {

ugol_dopolnitelnij = ugol_dopolnitelnij + napravlenie_dopolnitelnij;

dopolnitelnaja.write(ugol_dopolnitelnij);

delay(0.01*1000);

}

}

void Umenshit_ugol_bazi_do(int alfa) {

while(ugol_baza > alfa) {

ugol_baza = ugol_baza - napravlenie_baza;

baza.write(ugol_baza);

delay(0.01*1000);

}

}

void Uvelichit_ugol_kleshni_do(int alfa) {

while(ugol_kleshnja < alfa) {

ugol_kleshnja = ugol_kleshnja + napravlenie_kleshnja;

kleshnja.write(ugol_kleshnja);

delay(0.01*1000);

}

}

void Umenshit_ugol_dopolnitelnij_do(int alfa) {

while(ugol_dopolnitelnij > alfa) {

ugol_dopolnitelnij = ugol_dopolnitelnij - napravlenie_dopolnitelnij;

dopolnitelnaja.write(ugol_dopolnitelnij);

delay(0.01*1000);

}

}

void Umenshit_ugol_kran_do(int alfa) {

while(ugol_kran > alfa) {

ugol_kran = ugol_kran - napravlenie_kran;

kran.write(ugol_kran);

delay(0.01*1000);

}

}

void Peremeshenie_po_visote_pri_krane_90(int santimetri) {

ugol_dopolnitelnij = (((30 * santimetri) + 210) / 4);

dopolnitelnaja.write(ugol_dopolnitelnij);

}

void Plavnoe_uvelichenie_visoti_pri_krane_90(float santimetri) {

Umenshit_ugol_kran_do(90);

while(visota < santimetri) {

visota = (visota + parametr_plavnosti);

dopolnitelnij_ugol = (((visota * 30) + 210) / 4);

dopolnitelnaja.write(dopolnitelnij_ugol);

delay(0.01*1000);

}

}

void Plavnoe_umenshenie_visoti_pri_krane_90(float santimetri) {

Umenshit_ugol_kran_do(90);

while(visota > santimetri) {

visota = (visota + (-parametr_plavnosti));

dopolnitelnij_ugol = (((visota * 30) + 210) / 4);

dopolnitelnaja.write(dopolnitelnij_ugol);

delay(0.01*1000);

}

}

void Peremeshenie_po_visote_pri_krane_130(float santimetri) {

kran.write(130);

dopolnitelnij_ugol = (((20 * santimetri) + 70) / 1.8);

dopolnitelnaja.write(dopolnitelnij_ugol);

}

void Plavnoe_uvelichenie_visoti_pri_krane_130(float santimetri) {

Uvelichit_ugol_krana_do(110);

while(visota < santimetri) {

visota = (visota + parametr_plavnosti);

dopolnitelnij_ugol = (((visota * 20) + 70) / 1.8);

dopolnitelnaja.write(dopolnitelnij_ugol);

delay(0.01*1000);

}

}

void Plavnoe_umenshenie_visoti_pri_krane_130(float santimetri) {

Uvelichit_ugol_krana_do(110);

while(visota > santimetri) {

visota = (visota + (-parametr_plavnosti));

dopolnitelnij_ugol = (((visota * 20) + 70) / 1.8);

dopolnitelnaja.write(dopolnitelnij_ugol);

delay(0.01*1000);

}

}

void loop () { }

Комментарии:

Интересные статьи: