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

Для этого соберем схему:

Токоограничительный резистор (последовательно со светодиодом) номиналом 470 Ом, а сопротивление переменного резистора - 47 кОм.

Программа очень простая, раcсмотрим её внимательнее:
void setup()
{
  pinMode(11, OUTPUT);  // программируем пин 9 как выход, к нему подключим светодиод.
  pinMode(A0, INPUT);  // программируем пин A0 как вход, на него подется сигнал с потенциометра. 
}
 
void loop()
{
  analogWrite(11, analogRead(A0) / 4); // на вывод 9 подаем сигнал от 0 до 255, в завимости от считанного с вывода A0
}
Небольшое пояснение к программе.

Сигнал на входе A0 может принимать значение от 0 до 5В. А считанное значение с вывода A0, возвращаемое функцией analogRead(A0), соответственно принимает значение от 0 до 1023. А так как функция analogWrite() может передавать на указанный пин значение от 0 до 255, то мы просто разделим считанное значение на четыре. Таким образом функция analogWrite(9, analogRead(A0) / 4) выдаст на пин 11 значение от 0 до 255, в зависимости от угла поворота ручки переменного резистора.

Рассмотрим еще одну схему. Теперь управлять яркостью будем с помощью матричной клавиатуры:


Используем немного переделанный скетч из предыдущих уроков с матричной клавиатурой:

#include 

const byte ROWS = 4; // четыре строки в матричной клавиатуре
const byte COLS = 4; // четыре колонки в матричной клавиатуре
char hexaKeys[ROWS][COLS] = {  // определяем названия кнопок на клавиатуре
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
byte rowPins[ROWS] = {9, 8, 7, 6}; // подключаем строки к соответвующим пинам контроллера
byte colPins[COLS] = {5, 4, 3, 2}; // подключаем колонки к соответвующим пинам контроллера


//инициализируем клавиатуру
Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS); 

void setup(){
  Serial.begin(9600);
}
  
void loop(){
  char customKey = customKeypad.getKey();
  
  if (customKey){
    Serial.println(customKey);
    analogWrite(11, ((int)customKey-48)*28);
    Serial.println(((int)customKey-48)*28);
  }
}


Разберем строку: analogWrite(11, ((int)customKey-48)*28);

Функция (int)customKey преобразует переменную customKey в целое число, и выдает значение нажатой клавиши в соответвии с таблицей ASCII, т.е. от 48 до 57, в зависимости от нажатой цифры. Есоли нажать 0, то возвращает число 48, если 1, то 49 и т.д. Теперь диапазон от 48 до 57 нужно пропорционально преобразовать в диапазон от 0 до 255

Сделать это можно математически. Сначала мы отнимем от возвращаемого значения нажатой кнопки 48, тогда мы получим число соответствующее нажатой кнопке. Теперь это число нужно умножить на 28, тогда значению 0 будет соответвовать значение 0, значению 1 - значение 28, значению 2 - значение 56 и так далее до значения 252, это будет соответвовать максимальной яркости.

Значение нажатой клавиши и уровень яркости можно посмотреть в мониторе порта.

Логические операторы

Логические операторы чаще всего используются в проверке условия оператора if. Базовые сведения о логических операциях здесь: Алгебра логики

&& (логическое И)

Истина, если оба операнда истина (true).
if (digitalRead(2) == HIGH  && digitalRead(3) == HIGH) { // считывает состояние двух портов
  // ...
}
Истина если оба порта вход/выхода HIGH

|| (логическое ИЛИ)

Истина, если хотя бы один операнд истина, например:
if (x > 0 || y > 0) {
  // ...
}
будет верно (истина) если x или y больше 0.

! (логическое отрицание)

True, если операнд false, и наоборот, например:
if (!x) {
  // ...
}
условие верно, если x - false (x равно 0).

Важно различать логический оператор "И" - && и битовый оператор "И" - &. Тоже самое относится к логическому оператору "ИЛИ" - || и битовому оператору "ИЛИ" - |.

Пример
 
if (a >= 10 && a <= 20){}   // условие верно, если a больше или равно 10, но меньше или равно 20
Далее...


Copyright © R9AL 2020 Все права защищены

Рейтинг@Mail.ru Яндекс цитирования