Перейти к основному содержимому

Фоторезистор

Принцип работы фоторезистора

Фоторезистор - это полупроводниковый прибор, электрическое сопротивление которого меняется в зависимости от интенсивности падающего на него света. Чем интенсивней свет, тем меньше становится сопротивление фоторезистора.

Фоторезистор

Рисунок 1. Фоторезистор

Фоторезистор имеет два вывода: один подключается к питанию, второй через резистор к земле. В месте соединения вывода фоторезистора с резистором устанавливается провод для считывания его показаний. Номинал резистора от 1 до 10 кОм. В зависимости от величины резистора будет меняться диапазон показаний датчика.

На платформе tinkercad изменить освещенность резистора можно перемещая ползунок слева направо.

Изменение освещенности резистора

Рисунок 2. Изменение освещенности резистора

Считываем показания фоторезистора в монитор порта

Собираем схему с фоторезистором

Схема с фоторезистором

Рисунок 3. Схема с фоторезистором

Программа для считывания показаний фоторезистора в монитор порта

#define photores A0          //создаем переменную для фоторезистора
int light; //создаем переменную для хранения показаний фоторезистора

void setup(){
pinMode(photores, INPUT); //настраиваем пин, к которому подключен фоторезистор, как вход
Serial.begin(9600); //настраиваем работу с монитором порта
}

void loop(){
light = analogRead(photores); //считываем показания фоторезистора и сохраняем в переменную light
Serial.print("Light = "); //выводим в монитор порта слово "Light: "
Serial.println(light); //выводим в монитор порта значение переменной light и ждем полсекунды
delay(500);
}

Автоматическое освещение

Собираем схему

Схема для автоматического освещения

Рисунок 4. Схема для автоматического освещения

Программа для автоматического включения освещения

#define photores A0    //создаем переменную для фоторезистора
#define led 3 //создаем переменную для светодиода
int light; //создаем переменную для хранения показаний фоторезистора
int day = 400; //создаем переменную для условия день-ночь(светло-темно)

void setup(){
pinMode(photores, INPUT); //настраиваем пин, к которому подключен фоторезистор, как вход
pinMode(led, OUTPUT); //настраиваем пин, к которому подключен светодиод, как выход
Serial.begin(9600); //настраиваем работу с монитором порта
}

void loop(){
light = analogRead(photores); //считываем показания фоторезистора и сохраняем в переменную light
Serial.print("Light = ");
Serial.println(light); //выводим показания фоторезистора в монитор порта
if(light<day){ //если если текущая освещенность меньше 400, то включаем светодиод
digitalWrite(led, HIGH);
}
else{ //иначе светодиод выключен
digitalWrite(led, LOW);
}
delay(100); //задержка 100 миллисекунд
}

Управляем скоростью сервомотора в зависимости от освещенности

Собираем схему

Схема для управления скоростью сервомотора в зависимости от освещенности

Рисунок 5. Схема для автоматического освещения

Программа для управления скоростью сервомотора в зависимости от освещенности

#include <Servo.h>        //подключаем библиотеку для работы с сервомотором
#define photores A0 //создаем переменную для фоторезистора
Servo myservo; //объявляем сервомотор
int light; //создаем переменную для хранения показаний фоторезистора
int msec; //создаем переменную, отвечающую за скорость движений сервомотора
//эта переменная определяет время задержки сервомотора в каждой позиции во время его движения
//чем больше значение переменной, тем медленнее вращается сервомотор

void setup(){
pinMode(photores, INPUT); //настраиваем пин, к которому подключен фоторезистор, как вход
myservo.attach(2); //настраиваем пин 2 как управляющий пин сервомотора
}

void loop(){
for(int i=0; i<=180; i++){ //цикл для вращения сервомотора из 0 в 180
myservo.write(i);
delay(msec);
checkLight(); //функция, проверяющая уровень освещенности
}
for(int i=180; i>=0; i--){ //цикл для вращения сервомотора из 180 в 0
myservo.write(i);
delay(msec);
checkLight(); //функция, проверяющая уровень освещенности
}
}

//функция считывает показания фоторезистора
//затем преобразует их во время задержки сервомотора в каждой позиции
void checkLight(){
light = analogRead(photores);
msec = map(light, 6, 679, 100, 5);
}

Задания

  1. Соберите схему с двумя фоторезисторами, установленными под углом 90 градусов друг относительно друга. Напишите программу, которая после калибровки будет определять направление на источник света в диапазоне +-90 градусов с точностью 10 градусов.

  2. Соберите схему с четырьмя фоторезисторами, установленными под углом 90 градусов друг относительно друга. Напишите программу, которая после калибровки будет определять направление на источник света в диапазоне +-180 градусов с точностью 15 градусов.