Уроки ардуино Простой калькулятор

Уроки ардуино Простой калькулятор

Рассказано как подключить клавиатуру к Ардуино, и сделать простой калькулятор с выводом на дисплей LCD 1602. Это серия уроков «Изучаем Ардуино на простых примерах». Подробно рассказано как сделать калькулятор.
Простой Калькулятор на Ардуино.

Хочу открыть новое направление, «Изучаем Ардуино на простых примерах». Если зайдёт на канале, то будет продолжение, а если нет, то нет.

Первое видео из этой серии — это Простой калькулятор.

Простой он, потому что на нём можно делать всего 4 простые арифметические действия. Это сложение, вычитание, деление и умножение. Это ограничение связано с количеством кнопок на клавиатуре, а так его легко можно усложнить и добавить всякие там корни, синусы, косинусы и так далее. Для этого надо всего лишь прописать дополнительные функции вывода этих значений. Можно поставить пищалку и немного оживить этот пример. Но это не тема сегодняшнего урока.
   
Для простых математических действий будем использовать кнопки с буквенными символами, для знака равно будем использовать решётку, а для стирания звёздочку.
Код этого примера я постараюсь объяснить как можно подробнее, чтобы было понятно всем, даже далёким от программирования, но хотящим узнать как это работает.
Подключить клавиатуру к Ардуино совсем не сложно. Потому что существует библиотека для работы с клавиатурой, и все основные принципы прописаны там. Вам надо всего лишь скачать её и установить.
Скачать библиотеку и код примера можно как всегда на моём сайте, ссылка на него, а также на текстовую версию урока можно найти в описании к видео.

Для этого примера понадобятся любая Ардуино и клавиатура. Можно использовать широко распространённую матричную клавиатуру, но у меня она сломалась и поэтому я использую другую, но это не важно.
Выводить будем на обычный жидко кристаллический экран LCD 1602. Я буду использовать экран с подключением по I2C. Как сделать из обычного экрана I2C можно посмотреть в этом видео. Это даст нам экономию 5 выводов на плате Ардуино.
Также я буду использовать библиотеку для вывода кириллицы. Не забудьте, что одновременно на одном экране может быть выведено не больше 8 своих символов, то есть символов отличающихся от ASCII.
Этот пример легко переделать для вывода на TFT экран.
 
Давайте посмотрим схему подключения.


Схема довольно простая. Сначала надо подключить экран по I2C для этого надо использовать шину I2C Ардуино, и 8 выводов на плате Ардуино. Я для этого использовал цифровые выводы расположенные подряд, чтобы было удобно подключать гребёнку клавиатуры.

Сначала загрузим скетч - сканер шины I2C. Если вы не знаете по какому адресу находится ваше устройство, в данном случае экран, то сначала запустите этот пример и посмотрите адрес. Если вам что-то не понятно, то посмотрите это видео. Ссылка будет наверху справа. Этот адрес надо будет потом вставить с пример калькулятора.
Теперь проверим подключение клавиатуры. Для этого вам надо установить библиотеку Keyboard. Их несколько, мой пример Калькулятора работает с библиотекой которая будет в архиве, но она вполне вероятно будет работать и с другой библиотекой, но вам придётся немного изменить код.

Запускаем скетч Keyboard. В скетче показано, что у нас подключена нужная библиотека.
Клавиатура 4*4.
Здесь указаны кнопки в том порядке в каком они расположены на клавиатуре.
Здесь к каким контактам на Ардуино подключена клавиатура. На схеме мы это уже видели.
Загрузим скетч и посмотрим что он нам выведет.
Я по порядку нажму на все кнопки и мы увидим, что они выводятся в том порядке что и на клавиатуре. За этот вывод отвечает вот этот массив значений. А то если изменить эти значения на другие. Для калькулятора, на не нужны буквенные значения, вот их мы и изменим на арифметические знаки, решётку заменим на знак равно, а звёздочку на букву С. Она будет отвечать за сброс значений и очистку экрана.

Давайте попробуем это сделать. Для этого я расскомментирую этот код где я уже изменил значения на другие, те что нам нужны, а старый массив закомментирую, Так как в программе не может двух массивов с одинаковыми значениями. Прошиваем и смотрим.
Сначала я нажму только на те значения, что я изменил. Видим, что теперь вместо букв выводятся знаки плюс, минус, умножить, разделить, равно и сброс. Всё работает. Проверим работают ли цифры. Как можно видеть все цифры тоже работают.
Вывод.
Из этого примера мы узнали как подключить клавиатуру, и как выводить значения нажатой кнопки, и не важно что у вас там на клавиатуре написано, на выводе будет то что у вас написано в массиве.

Теперь идём дальше. Переходим к примеру Калькулятора.
Для вывода информации на дисплей нужна библиотека LiquidCrystal_I2C, но если у вас китайский дисплей, то у вас практически наверняка не будет  возможности вывести символы отличные от ASCII.
Для того чтобы вывести русские буквы на любом дисплее нужна библиотека с поддержкой нашего могучего. Вот для этого мы и будем использовать вот эту библиотеку. У меня на канале есть очень подробное видео про русификацию. Если что не понятно посмотрите там.

С этими строчками кода мы уже познакомились когда подключали клавиатуру.
Теперь надо создать ряд переменных для хранения наших значений.
Первые две для хранения цифр что мы будем вводить с клавиатуры.
Вторая для полученного результат. Она будет типа float, то есть будет переменной с точкой и двумя значениями после точки.
Хотя мы и не можем ввести дробные цифры, но при делении у нас может получиться дробное число, вот для этого нам и понадобится тип float.
Символьные переменные нужны для хранения значений полученных с клавиатуры. Это для чисел и клавиш действий, то есть отличных от цифр.
И последняя переменная для полученного результата. Она имеет тип Boolean, то есть может иметь всего 2 значения, - это правда или ложь.
Здесь тоже ничего сложного. Это настройка дисплея и вывод на него названия этого урока. Выводим слова Простой калькулятор, ждём 2 секунды и очищаем экран. Готовимся к приёму значений для вычислений.

В цикле loop мы постоянно опрашиваем клавиатуру и ждём, не была ли нажата какая-нибудь кнопка, и если была, то считаем результат и выводим его на дисплей. Давайте подробнее рассмотрим эти функции.
Функция detectButtons самая большая в этом коде, но это не говорит, что она самая сложная. В ней обрабатываются все нажатия кнопок. А так как кнопок много то и код большой. Но он однотипный, поэтому для цифр я рассмотрю обработку всего одной цифры, все остальные подобны.
Если была нажата цифра 1, то выводим в монитор порта Кнопка 1. Если до этого значение переменной было 0, то изменяем его на единицу, Если уже было какое-то значение, то прибавляем ещё единицу. Это нужно когда вы захотите ввести например цифру 12, или 154.
Тоже самое и для двойки и других цифр. Поэтому я их рассматривать не буду.
Если нажата решётка, а мы помним, что решётка это символ равно, то сохраняем этот результат и в переменную result записываем значение true. Это нам пригодится для следующих функций.
С кнопкой звёздочка тоже всё просто. Она у нас служит для обнуления всех значений и очистки экрана, а в переменную result сохраняет значение false.
Этот код проверяет арифметические действия, то есть какое действие надо совершить с числами. Например если сложение то в переменную action сохраняется плюс, а если вычитание, то минус.
В функции результат производятся все действия с переменными. Если в переменной action  плюс, то первая цифра складывается со второй, а результат записывается в переменную Number.
Тоже самое и с другими операциями. Небольшое отличие имеет значение деления. Так как результат может иметь дробное значение, то переменные приводятся к значениям с точкой, то есть float.

Ну и последняя функция, это функция вывода на экран дисплея.
На первой строке выводятся первая и вторая цифра, а между ними знак операции. Затем идёт знак равно и полученный результат.
На второй строчке может быть два варианта.
Если ещё нет результата, то выводятся цифры при нажатии на клавиатуру и вы всегда можете видеть что вы ввели.
Второй вариант – это когда уже есть результат. Тогда после знака равно выводится сумма всех значений.
Регулируется это переменной result. Если она имеет значение true то сумма есть и её надо показать, а если false или не true то выводятся нажатия кнопок.

Вот как-то так получилось. Для первого урока возможно сумбурно, но со временем и с вашей помощью, я выработаю свой стиль и обучение станет более простым и интересным. Всё зависит от вас и вашей активности. Буду ждать комментариев и на их основе будет принято решение продолжать ли такие подробные видео, или как делать как всегда.


Примеры подключения и использования LCD дисплей 1602 и 2004
Подключение дисплея 1602 lcd i2c. 1602 ардуино дисплей
Простой таймер на Ардуино с реле и обратным отсчётом
Игры на Ардуино с дисплеем LCD 1602
Подключение I2C дисплея к ардуино. Русификация текста.
Модуль rfid rc522 идентификация. Карта rfid пропуск
Уроки ардуино Простой калькулятор
Температура процессора и видеокарты, их частота и загруженность.
rfid система. LCD дисплей 1602. Русификация
rfid идентификация. Учёт посещаемости Время прихода и ухода
LCD Дисплей 1602 и 2004: Проекты и Подключение к Arduino