Урок №10 Считывание данных с фоторезистора и вывод данных на экран
В этом уроке мы будем видеть работу фоторезистора.
Что нам понадобится?
Достаньте и подготовьте необходимые детали из коробки.
Arduino Uno
Мозг нашей схемы
Популярный микроконтроллер, его мощности достаточно пока нам для начальных экспериментов
Светодиод
Любого цвета
Длинная ножка на положительно заряженный, короткая на отрицательно
Макетная плата
на 400 точек
Соединения идут параллельно, плата разделена на 2 части горизонтальной линией
Резистор
На 10 кОм
О резисторах подробно мы подробно поговорим чуть ниже в разделе "Базовые знания"
Так как esp32 значительно быстрее чем Arduino Uno, то и данные обновляются быстрее. Нам не надо будет смотреть на в компьютер на «монитор порта» для того чтобы увидеть изменения значения освещенности, которое передает датчик – ведь все будет видно на экране! Удобно, не правда ли?)

Схема подключения:
1. Пины GND соединяем проводами с двух сторон на минусы на макетной плате. Вся линия минуса вдоль макетной платы таким образом будет минусом.

2. Пины 5V соединяем с плюсами с двух сторон на макетной плате. Таким образом вся линия плюса станет под напряжением 5 Вольт.

3. Соединяем минус на датчике с минусовой линией.

4. Соединяем средний пин – это плюс на датчике с линией напряжения плюса. Так датчик будет получать питание в 5 Вольт.

5. Соединяем пин S ( Signal – Сигнал) с пином № 36

Но! Именно в этом датчике отображение данных идет реверсивно – то есть когда много света он показывает 0%, и когда свет мало, то он показывает 100%. Чтобы данные отображались верно – соедините минус с плюсом на макетной плате, а плюс с минусом
Код
/*Обьявление переменных экрана*/
#include "SSD1306.h" 
#define SDA_PIN 4// GPIO4 -> SDA
#define SCL_PIN 15// GPIO15 -> SCL
#define SSD_ADDRESS 0x3c
SSD1306  display(SSD_ADDRESS, SDA_PIN, SCL_PIN);

#define lightPin 36 //порт к которому подключен фоторезистор

int lightSensor = 0; //Переменная для хранения уровня освещения

void setup() {
  Serial.begin(115200);
  /*Включаем экран*/
  pinMode(16,OUTPUT); //Обьявляем пин экрана как выходной. Reset экрана
  digitalWrite(16, LOW);    
  delay(50); 
  digitalWrite(16, HIGH); 
  display.init();
  display.flipScreenVertically();
  display.setFont(ArialMT_Plain_16); //Размер шрифта
  display.setTextAlignment(TEXT_ALIGN_LEFT); //Выравнивание по левому краю
  display.clear();   // Очистка дисплея
}

void loop(){
 int lightRead = analogRead(lightPin);//Считывание данных с фоторезистора.
 lightSensor = map(lightRead, 0, 4095, 0, 100); //Преобразовывание данных об освещенности в проценты  
 Serial.println(lightSensor);           
 display.clear();   // Очистка дисплея
 display.drawString(0,0,"light: " + String(lightSensor) + "%"); //Вывод информации об уровне освещённости в процентах на экран
 display.display();
}
Программирование
Сравните эту программу с кодом из прошлого занятия «работа с экраном» – кроме двух строк все повторяется. А эти две строки такие же как и в уроке № 2 – «работа с фоторезистором».

Мы видим функцию «map»

lightSensor = map(lightRead, 0, 4095, 0, 100);

Эта функция преобразовывает значение от 0 до 4095 в значение от 0 до 100. Почему 4095? Потому что встроенный АЦП (аналогово-цифровой преобразователь) в ESP32 мощнее чем АЦП в Arduino.
Задания
1. Попробуйте найти место в коде отвечающее за размер шрифта и сделать надпись больше.

2. Поводите рукой над датчиком и убедитесь, что все работает верно.

3. Опытным путем найдите оптимальное значение освещения в помещении.