МУНИЦИПАЛЬНОЕ АВТОНОМНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ДОПОЛНИТЕЛЬНОГО ОБРАЗОВАНИЯ
«ЦЕНТР ДЕТСКОГО ТЕХНИЧЕСКОГО ТВОРЧЕСТВА»
Методическая разработка
«Проект «Матричный калькулятор»
к дополнительной общеобразовательной
общеразвивающей программе
технической направленности
«Лаборатория робототехники»
Возраст детей: 10-15 лет
Автор: Костычев Вадим Александрович
г. Заречный Пензенской области
2022 г.
В ходе изучения робототехники, схемотехники и программирования на основе платформы Arduino большую роль играет разработка проектов. Они позволяют отработать как навыки программирования, так и сборки электрических цепей устройств. Данная разработка призвана отработать навыки разработки алгоритмов и работы с матричной клавиатурой.
Целью данной разработки является повышение интереса учащихся к техническому творчеству посредством работы с платформой Arduino.
Данная методическая разработка используется как обучающий пример для работы по дополнительной общеобразовательной общеразвивающей программе технической направленности «Лаборатория робототехники». С их помощью учащиеся смогут понять как подключать, работать с матричной клавиатурой и библиотекой «SimpleKeypad», потренируются в написании алгоритмов.
Для выполнения данного проекта необходимо правильно подключить пины клавиатуры к плате Arduino. При неверном подключении значения нажатия на кнопки будут непредсказуемыми.
Далее необходимо подключить библиотеку SimpleKeypad и создать несколько массивов: пины строк клавиатуры, пины столбцов и многомерный массив значений кнопок. А также указать имя клавиатуры, и параметры для работы библиотеки.
В основной программе имеет смысл создать два цикла while: первый цикл принимает значение переменной a и математический оператор, второй – принимает оператор b и вызывает функцию, которая выполняет расчёты.
Эта функция работает на основе оператора switch и полученному математическому оператору. При выполнении функции все оператору обнуляются.
Важный алгоритм – введение числа в переменные a и b. Когда мы приняли символ от 0 до 9, мы должны переменную на 10, чтобы на конце оказался 0, а затем получив значение (номер) символа, через вычитание из него символа «0», сложить его с числом. Затем мы выводим полученное значение по одному, чтобы числа переменной не повторялись.
Принципиальная схема
Листинг программы
#include // подключение библиотеки для работы с матричной клавиатурой
#define KP_ROWS 4 // количество строк
#define KP_COLS 4 // количество столбцов
byte colPins[4] = {8, 9, 10, 11}; // уакзываем пины подключения колонок
byte rowPins[4] = {7, 6, 5, 4}; // указываем пины подключения строк
long a, b, res; // создаем переменные первой, второй переменной и результата
char key, operation; // и создаем символьные переменные для вводимого символа и оператора
char keys[KP_ROWS][KP_COLS] = { // создаем массив со значениями кнопок
{'1', '2', '3', '+'},
{'4', '5', '6', '-'},
{'7', '8', '9', '*'},
{'C', '0', '=', '/'}
};
SimpleKeypad pad((char*)keys, rowPins, colPins, 4, 4); // указываем библиотеке пины строк и колонок клавиатуры
void setup() {
Serial.begin(9600); // подключаем серийный порт
}
void loop() {
while (1) { // создаем цикл, который прервется только после получения мат. оператора
key = pad.getKey(); // примем значение с клавиатуры
if (key == 'C') { // если приняли значение 'C' - обнуляем все переменные
a = 0;
b = 0;
res = 0;
operation = 0;
}
if (key = '0' and key
a = a * 10 + (key - '0'); // переводим значение в число вычитанием символа '0', добавляем его в конец переменной a
Serial.print(key); // выводим принятое значение в серийный порт
}
if (a != 0 and (key == '-' or key == '+' or key == '*' or key == '/')) { // если уже ввели значение a, а затем мат. оператор
operation = key; // сохранили мат. оператор
Serial.print(operation); // вывели оператор на экран
break; // завершили цикл while
}
}
while (1) { // открыли новый цикл для того, чтобы ввести переменную b
key = pad.getKey(); // примем значение с клавиатуры
if (key == 'C') { // если приняли значение 'C' - обнуляем все переменные
a = 0;
b = 0;
res = 0;
operation = 0;
break; // завершаем цикл, возвращаемся в первый while
}
if (key = '0' and key
b = b * 10 + (key - '0'); // переводим значение в число вычитанием символа '0', добавляем его в конец переменной b
Serial.print(key); // выводим принятое значение в серийный порт
}
if (key == '=' and b != 0) { // если нажата кнопка равно, и уже введена переменная b
domath(); // воспользуемся функцией domath
break; // и завершим цикл while, вернемся в начало программы
}
}
}
void domath() { // создадим функцию для рассчета результата
switch (operation) { // воспользуемся оператором switch, он по аргументу operation опеределит операцию
case '+': // при сложении
res = a + b; // складываем a и b в переменную res
Serial.print('='); // выводим знак равно
Serial.println(res); // выводим результат
break; // завершаем работу оператора switch
case '-': // Вычитание
res = a - b; // вычитаем b из a в переменную res
Serial.print('='); // выводим знак равно
Serial.println(res); // выводим результат
break; // завершаем работу оператора switch
case '*':
res = a * b; // умножаем a на b и присваиваем значение переменной res
Serial.print('='); // выводим знак равно
Serial.println(res); // выводим результат
break; // завершаем работу оператора switch
case '/': // Деление
double res = (float)a / (float)b; // создаем дробь res и делим переменные, как дроби
Serial.print('='); // выводим знак равно
Serial.println(res); // выводим результат
break; // завершаем работу оператора switch
}
a = 0; // обнуляем переменные для следующей записи
b = 0;
res = 0;
operation = 0;
}