/*Индивидуальное задание №12
Задание
1) Выбрать из списка фамилий все фамилии кроме фамилий с кодом заглавной буквы K, B, S (Eng), вывести на монитор.
2) В зависимости от количества нажатий кнопки pin7 в течение интервала 10сек. (не более 18 нажатий)
• выбрать из списка группы фамилию с номером пропорциональным количеству нажатий по по возрастанию (с начала), выдать на монитор.
• установить частоту оборотов двигателя из его диапазона частот вращения обратно пропорциональную количеству нажатий,
• установить яркость светодиода pin9 (PWM), прямо пропорциональную количеству нажатий.
• Все три значения вывести на монитор (использовать MAP).
3) Написать программу для исполнения на контроллере Arduino, компилировать, проверить на наличие ошибок.
4) Дать пояснения к написанной программе, показать место в коде выполняющее функцию из задания по указанию преподавателя.
5) Оформить отчет по выполненной программе с подробным описанием программы в комментариях
*/
String MyGroup[18] = {"Aldonina", "Vasilevsky", "Vasyutenkova", "Glushakov", "Zagorets","Ivanov",
"Kibalin", "Kobsar", "Krapan", "Sema","Sideev", "Silenko", "Stepanov", "Stepanova",
"Surovov", "Ugdygekova", "Khudonogov", "Chaptykov"}; // задаём массив с фамилиями студентов группы в виде String-строки
int nazjatiya = 0; // целочисленная переменная для пересчитывания нажатий кнопки
boolean knopkaOtpushena = 1; // целочисленная переменная для проверки отпущена ли кнопка (boolean принимает значения 1 или 0)
long nachalnoeVremya; // целочисленная переменная для хранении данных времени
int minimumVoltage = 0; // задаём целочисленную переменную для определения минимального напряжения работы двигателя
int SVETODIOD = 9; // задаём целочисленную переменную для ПИНа светодиода
int KNOPKA = 7; // задаём целочисленную переменную для ПИНа кнопки
int DVIGATEL = 6; // задаём целочисленную переменную для ПИНа двигателя
int DATCHIK = 5; // задаём целочисленную переменную для ПИНа датчика
int timeSec = 0; // целочисленная переменная для таймера разгона двигателя
long tTime; // целочисленная переменная для таймера в задании с кнопкой (нужна для вывода отсчёта 10 секунд на экран)
void setup() // запускается блок команд в фигурных скобках
{
Serial.begin(9600); // задается скорость передачи данных равная 9600 бит/с
pinMode(KNOPKA, INPUT); // задаётся режим ПИНа кнопки на вход (input) данных
pinMode(SVETODIOD, OUTPUT); // задаётся режим ПИНа светодиода на выход (output) данных
pinMode(DVIGATEL, OUTPUT); // задаётся режим ПИНа двигателя на выход (output) данных
pinMode(DATCHIK, INPUT); // задаётся режим ПИНа датчика на вход (input) данных
Serial.print("1. Фамилии, не начинающиеся с букв K, B, S:"); // выводим текстовую информацию о сути задания 1
Serial.println(" "); // перенос на следующую строку
for(int i = 0; i < 18; i++) // перебираем элементы массива MyGroup
{
if(MyGroup[i][0] != 75 && MyGroup[i][0] !=66 && MyGroup[i][0] != 83) // задаём условие, при котором отметаются фамилии с кодом заглавных букв 75, 66, 83 (K, B, S)
{
Serial.print(MyGroup[i]); // выводим фамилии, удовлетворяющие условию
Serial.print(" "); // пробел
}
}
Serial.println(" "); // перенос на следующую строку
Serial.println(" "); // перенос на следующую строку
Serial.println("Происходит определение минимального напряжения для работы двигателя...");// Выводим оповещение о наращивании оборотов двигателя
while (!pulseIn(DATCHIK,LOW))
{
digitalWrite(DVIGATEL, minimumVoltage);
minimumVoltage++;
}
Serial.println(" "); // перенос на следующую строку
Serial.println(" "); // перенос на следующую строку
Serial.println("Минимальное напряжение для работы двигателя: "); // выводим значение напряжения на экран
Serial.println(minimumVoltage); // выводим значение напряжения на экран
Serial.println(" "); // перенос на следующую строку
Serial.println("Жмите на кнопку в течении 10 секунд"); // Уведомляем пользователя, что настало время жать кнопку
Serial.println("Отсчёт времени не начнётся, пока не будет хотя бы одного нажатия кнопки");
Serial.println(" "); // перенос на следующую строку
}
void loop() // запускается цикл команд в фигурных скобках
{
if (!digitalRead(KNOPKA)) // если нет сигнала с кнопки на ПИН 7, то процесс считывания нажатий и отчёта времени не произойдёт
{
nazjatiya = 0; // присваиваем нажатиям значение 0
nachalnoeVremya = millis(); // Задаём отсчёт миллисекунд с начала выполнения считывания
tTime = nachalnoeVremya; // присваиваем значение tTime равное значению nachalnoeVremya
while(millis() <= (nachalnoeVremya + 10000)) // вводится цикл while - пока идёт 10 секунд, выполняем команды ниже
{
if (millis()-tTime>1000) // задаём условие if для таймера 10 секунд
{
Serial.print("Осталось секунд: "); // выводим данные по оставшемуся времени
Serial.print((11000 - (millis()-nachalnoeVremya))/1000); // выводим данные по оставшемуся времени
Serial.println(" "); // перенос на следующую строку
tTime = millis(); // возвращаем значение tTime
}
if (knopkaOtpushena && !digitalRead(KNOPKA)) // условие if, когда кнопку нажали
{
delay(100); // задержка для устранения ложных считыаний из-за "дребезга" контактов кнопки
knopkaOtpushena = 0; // возвращаем значение кнопки на 0
}
if (!knopkaOtpushena && digitalRead(KNOPKA)) //условие if, когда кнопку отпустили - если происходит нажатие кнопки, считываем нажатие
{
nazjatiya++; // суммируем нажатия
if (nazjatiya <= 18) // ограничиваем вывод значений по нажатиям числом 18
{
Serial.print("Нажатий: "); // на каждое значение кнопки выводим текущее значение переменной nazjatiya
Serial.print(nazjatiya); // на каждое значение кнопки выводим текущее значение переменной nazjatiya
Serial.println(" "); // перенос на следующую строку
}
if (nazjatiya >= 18) //ограничиваем приращение значений нажатий выше 18
nazjatiya = 18; // возвращает на 18 нажаий, когда нажатий больше 18
knopkaOtpushena = 1; // возвращаем значение кнопки на 1
delay(100); // задержка чтоб убрать "дребезг" контактов кнопки
}
}
Serial.println(" "); // перенос на следующую строку
Serial.print("10 секунд прошло"); // Оповещение об окончании времени для считывания нажатий
Serial.println(" "); // перенос на следующую строку
Serial.print("Итоговое количество нажатий = "); // вывод значения нажатий кнопки
Serial.print(nazjatiya); // вывод значения нажатий кнопки
Serial.println(" "); // перенос на следующую строку
Serial.println(" "); // перенос на следующую строку
Serial.print("2.1 Фамилия от количества нажатий"); // выводим текстовую информацию о сути задания 2.1
Serial.print(" (№"); // выводим номер фамилии в списке
Serial.print(nazjatiya); // выводим номер фамилии в списке
Serial.print(" в списке): "); // выводим номер фамилии в списке
Serial.print(MyGroup[map(nazjatiya, 1, 18, 1, 18) - 1]); // выводим фамилию на экран при помощи функции map ПРЯМО пропорционально количеству нажатий
Serial.println(" "); // перенос на следующую строку
analogWrite(DVIGATEL, map(nazjatiya, 1, 18, 255, minimumVoltage)); // подаём сигнал на ПИН 6 для двигателя ОБРАТНО пропорционально количеству нажатий с помощью функции map
Serial.print("2.2 Напряжение на ПИНе двигателя (обратная пропорция): "); // выводим текстовую информацию о сути задания 2.2
Serial.print(map(nazjatiya, 1, 18, 255, minimumVoltage)); // выводим значение оборотов двигателя на экран при помощи функции map ОБРАТНО пропорционально количеству нажатий
Serial.println(" "); // перенос на следующую строку
analogWrite(SVETODIOD, map(nazjatiya, 1, 18, 1, 255)); // подаём сигнал на ПИН 9 для светодиода ПРЯМО пропорционально количеству нажатий с помощью функции map
Serial.print("2.3 Напряжение на ПИНе светодиода (прямая пропорция): "); // выводим текстовую информацию о сути задания 2.3
Serial.print(map(nazjatiya, 1, 18, 1, 255)); // выводим значение яркости светодиода на экран при помощи функции map ПРЯМО пропорционально количеству нажатий
}
}