m5stack cardputer adv
Прошивка представляет собой мощный математический REPL-калькулятор на базе библиотеки TinyExpr-PlusPlus с автодополнением по Tab, поддержкой приставок СИ, экспоненциальной записи, пользовательских переменных и функций.
Физические клавиши на клавиатуре Cardputer маппятся следующим образом для навигации и управления в интерфейсе калькулятора:
-
Кнопка G0 (Физическая кнопка на корпусе Cardputer):
- Из любого экрана/режима возвращает пользователя в терминал REPL (
STATE_CALC). - Если текущий активный экран уже REPL, нажатие на G0 очищает текущее выражение, результат, статус ошибки и сбрасывает историю.
- Из любого экрана/режима возвращает пользователя в терминал REPL (
-
Навигация (управление курсором во всех текстовых полях):
- Прямые клавиши
,/;.в полях ввода всегда печатают свои буквальные символы (запятую,, слэш/, точку с запятой;и точку.). - Управление курсором во всех полях ввода (REPL, формула, скрипты, переменные) осуществляется строго через зажатую клавишу
Fn:-
fn + ,$\rightarrow$ Left (Влево — перемещение курсора посимвольно влево) -
fn + /$\rightarrow$ Right (Вправо — перемещение курсора посимвольно вправо) -
fn + ;$\rightarrow$ Up (Вверх — прокрутка истории вычислений в REPL или навигация по строкам/спискам) -
fn + .$\rightarrow$ Down (Вниз — прокрутка истории вычислений в REPL или навигация по строкам/спискам)
-
-
Esc(клавишаEscили`/~без Fn)$\rightarrow$ Возвращает в предыдущее меню, из которого был открыт экран (или в REPL, если стек пуст). -
Ctrl + Left(Ctrl + fn + ,)$\rightarrow$ Перемещение курсора по словам влево -
Ctrl + Right(Ctrl + fn + /)$\rightarrow$ Перемещение курсора по словам вправо -
Ctrl + Up/Ctrl + Down(Ctrl + fn + ;/Ctrl + fn + .)$\rightarrow$ Прокрутка вьюпорта истории REPL вверх/вниз -
fn + l$\rightarrow$ Home (Переместить курсор в начало строки;Ctrl + fn + l— в начало документа) -
fn + '$\rightarrow$ End (Переместить курсор в конец строки;Ctrl + fn + '— в конец документа)
- Прямые клавиши
-
Контекстная справка и Встроенная помощь:
-
help()илиhelpв REPL$\rightarrow$ Выводит полный список всех поддерживаемых математических функций и операторов. -
help(func_name)$\rightarrow$ Выводит индивидуальную справочную информацию по конкретной функции (например,help(print),help(plot),help(len),help(sin)). -
fn + h$\rightarrow$ Вызов полноэкранного всплывающего окна справки Help Overlay с горячими клавишами, сочетаниямиfn+*и примерами. - Подробное руководство доступно в отдельном файле docs/help.md.
-
-
Автодополнение (Tab):
- Нажатие
Tabвыполняет контекстное автодополнение ключевых слов, функций, переменных (user_args), констант (user_consts) и ячеек истории (e1,e2...). - Поддерживает циклический перебор результатов при повторных нажатиях
Tab(например,si$\rightarrow$ sin()$\rightarrow$ sinh()$\rightarrow$ sin()).
- Нажатие
-
Режим графиков (
STATE_PLOT) клавиши и управление:-
Стрелки(Fn + ;/,/.//илиWASD/;./,)$\rightarrow$ Панорамирование/сдвиг графика по осям X/Y. -
Fn+EnterилиFn+R$\rightarrow$ Сохранить текущий скрипт и сразу запустить его на выполнение (runScript).
-
-
Блочный курсор: В системных настройках (
Fn+P) доступен выбор режима отображения курсора (Block Cursor: ON/OFF). В блочном режиме символ под курсором подсвечивается инвертированным цветом и остается полностью видимым.-
Ctrl + Arrow/Ctrl + WASD$\rightarrow$ Ускоренное в 5 раз панорамирование / скроллинг графика. -
-/_$\rightarrow$ Уменьшение масштаба (Zoom Out). -
=/+$\rightarrow$ Увеличение масштаба (Zoom In). -
Ctrl + -/Ctrl + +$\rightarrow$ Ускоренное в 5 раз масштабирование (Zoom 5x). -
a/A$\rightarrow$ Автомасштабирование (Сброс масштаба и центрирование графика). -
Esc(или`)$\rightarrow$ Возврат в меню/REPL, из которого был вызван график. -
Координатные оси: В центре координат
$(0,0)$ выводятся две взаимно перпендикулярные оси$X$ и$Y$ . -
История REPL: Команда
plot(...)сразу сохраняется в историю вычислений REPL (e#) и вычисляется с первого нажатияEnter.
-
-
Действия:
-
Enter$\rightarrow$ OK (Вычисление / Подтверждение введенного выражения) -
Backspace$\rightarrow$ Del (Стирание символа перед курсором) -
fn + Backspace(илиDelete)$\rightarrow$ Delete (Стирание символа справа от курсора) -
Ctrl + Backspace$\rightarrow$ Удаление слова слева от курсора -
Ctrl + Delete(илиCtrl + fn + Backspace)$\rightarrow$ Удаление слова справа от курсора -
fn + c$\rightarrow$ Clear (Полная очистка истории результатов, переменных, функций и экрана)
-
-
История ввода команд:
- При прокрутке истории ввода клавишами Up (
fn + ;) и Down (fn + .) выбранное ранее выражение подставляется в строку ввода, при этом курсор остаётся в конце строки без принудительного выделения всего текста (select_all_activeсбрасывается вfalse).
- При прокрутке истории ввода клавишами Up (
-
Горячие клавиши редактирования (Ctrl):
-
Ctrl + A$\rightarrow$ Выделить всю строку/текст (выделенный текст подсвечивается синим фоном). -
Ctrl + C$\rightarrow$ Копировать выделенный текст (или текущую строку) в буфер обменаclipboard. -
Ctrl + X$\rightarrow$ Вырезать выделенный текст (или всю текущую строку под курсором в редакторе скриптов, если ничего не выделено) в буфер обменаclipboard. -
Ctrl + V$\rightarrow$ Вставить текст из буфера обмена в позицию курсора. -
Ctrl + Z$\rightarrow$ Отменить последнее изменение строки (Undo). -
Ctrl + Y$\rightarrow$ Повторить отмененное изменение строки (Redo). -
Ctrl + Backspace/Ctrl + Del$\rightarrow$ Полная очистка текущей строки ввода.
-
-
Радужные скобки (Rainbow Brackets): Введенные круглые скобки
( )раскрашиваются на экране разными цветами в зависимости от глубины их вложенности: Циан$\rightarrow$ Маджента$\rightarrow$ Желтый$\rightarrow$ Зеленый$\rightarrow$ Оранжевый. Если в выражении есть непарная/незакрытая скобка, она подсвечивается ярко-красным цветом для предупреждения пользователя. -
Вывод ошибок: Если выражение содержит синтаксическую ошибку или приводит к математической неопределенности, результат окрашивается в ярко-красный цвет и выводится диагностическое сообщение. Возможные ошибки включают:
-
Mismatched Brackets— Возникает, если в выражении нарушен баланс открывающих и закрывающих круглых скобок( )(например,(2+3). -
Unknown Token— Возникает, если введены неизвестные символы, незарегистрированные переменные или допущена опечатка в имени математической функции (например,sinn(x)вместоsin(x)). -
Math Error— Возникает при попытке вычисления математически неопределенных операций:- Деление на ноль (например,
5 / 0). - Квадратный корень из отрицательного числа (например,
sqrt(-4)). - Логарифм от нуля или отрицательного числа (например,
ln(0)илиlog(-5)). - Числовое переполнение (overflow) при превышении максимального диапазона double.
- Деление на ноль (например,
-
Специфические синтаксические предупреждения (первая строка детального лога компилятора
mXparser, усеченная до 20 символов).
-
Библиотека TinyExpr-PlusPlus предоставляет обширный набор математических функций. Все имена функций чувствительны к регистру.
- Прямые:
sin(x),cos(x),tan(x),ctan(x)(илиcot(x)),sec(x),cosec(x)(илиcsc(x)) - Обратные:
asin(x),acos(x),atan(x),actan(x)(илиacot(x)),asec(x),acosec(x) - Преобразование углов:
deg2rad(x)(сокращениеd2r(x)— переводит градусы в радианы),rad2deg(x)(сокращениеr2d(x)— переводит радианы в градусы) - Гиперболические:
sinh(x),cosh(x),tanh(x),coth(x),sech(x),csch(x) - Обратные гиперболические:
asinh(x),acosh(x),atanh(x),acoth(x)
-
ln(x)— натуральный логарифм (основание$e$ ) -
log(x)— десятичный логарифм (основание 10) -
log2(x)— двоичный логарифм (основание 2) -
logb(b, x)— логарифм$x$ по произвольному основанию$b$ -
exp(x)— экспонента$e^x$ -
sqrt(x)— квадратный корень -
cbrt(x)— кубический корень
-
abs(x)— абсолютное значение (модуль) -
ceil(x)— округление вверх до ближайшего целого -
floor(x)— округление вниз до ближайшего целого -
round(x)— стандартное математическое округление -
trunc(x)— отбрасывание дробной части (усечение) -
sgn(x)— функция знака (сигнум) -
mod(x, y)(или инфиксный оператор%:x % y) — остаток от деления (деление по модулю). -
Постфиксный оператор процента
%:- Если за
%не следует число/выражение, он вычисляет проценты:- Одиночный процент:
5%$\rightarrow$ 0.05 - В вычитаниях/сложениях:
10 - 15%$\rightarrow$ вычитает 15% от 10 (вычисляется как10 - 10 * 0.15 = 8.5) -
100 + 5%$\rightarrow$ прибавляет 5% к 100 (вычисляется как100 + 100 * 0.05 = 105)
- Одиночный процент:
- Если за
Поддерживаются следующие операторы для логических и условных выражений (в REPL и в скриптах):
- Операторы сравнения:
>,<,>=,<=,==,!= - Логическое И (AND):
andили&& - Логическое ИЛИ (OR):
orили|| - Логическое НЕ (NOT):
notили! - Исключающее ИЛИ (XOR):
xor(например,a xor b)
rNor(mean, stddev)— случайное число из нормального распределенияrUni(min, max)— случайное число из равномерного распределенияmean(a1, a2, ...)— среднее арифметическоеmedian(a1, a2, ...)— медиана выборкиstd(a1, a2, ...)— стандартное отклонениеvar(a1, a2, ...)— дисперсия выборкиmin(a1, a2, ...)— поиск минимального значенияmax(a1, a2, ...)— поиск максимального значения
Калькулятор поддерживает создание векторов, массивов и диапазонов чисел, которые можно использовать в вычислениях, скриптах, циклах или для построения графиков.
-
Простой диапазон (шаг = 1):
начало:конец- Пример:
1:10генерирует вектор[1, 2, 3, 4, 5, 6, 7, 8, 9, 10].
- Пример:
-
Диапазон с шагом:
начало:шаг:конец- Пример:
1:2:10генерирует вектор[1, 3, 5, 7, 9]. - Пример:
10:-1:1генерирует убывающий вектор от 10 до 1.
- Пример:
-
Обращение к элементам вектора (индексация):
Элементы вектора извлекаются с помощью квадратных скобок
[индекс](индексация начинается с 1):- Пример:
(1:2:10)[1]$\rightarrow$ вернет1(первый элемент). - Пример:
(1:10)[5]$\rightarrow$ вернет5(пятый элемент).
- Пример:
Диапазоны используются как аргументы для циклов в скриптах (for X = 1:2:30) и для передачи наборов точек в графический режим построения (plot(1:30, Y)).
В выражениях REPL можно использовать логические условия и встроенные операторы циклов (суммирования/произведения).
-
Логические условия (If / Else): Используется встроенная функция
if(условие, выражение_если_да, выражение_если_нет):- Пример:
if(5 > 3, 10, 20)$\rightarrow$ вернет10. - Пример:
if(x != 0, 1/x, 0)$\rightarrow$ возвращает1/x, еслиxне равен нулю, предотвращая деление на ноль. Для множественных условий можно использовать функциюiff(условие1, да1, условие2, да2, ..., иначе): - Пример:
iff(x > 0, 1, x < 0, -1, 0)$\rightarrow$ возвращает знак числа (аналог функцииsgn(x)).
- Пример:
-
Математические циклы (Суммирование и Произведение):
-
Суммирование (Цикл Sum):
sum(индекс, от, до, выражение)- Пример:
sum(i, 1, 10, i^2)$\rightarrow$ вычисляет сумму квадратов чисел от 1 до 10 ($\sum_{i=1}^{10} i^2 = 385$ ).
- Пример:
-
Произведение (Цикл Prod):
prod(индекс, от, до, выражение)- Пример:
prod(i, 1, 5, i)$\rightarrow$ произведение чисел от 1 до 5 (вычисляет$5! = 120$ ).
- Пример:
-
Поиск минимума/максимума по диапазону:
min(индекс, от, до, выражение)иmax(...)- Пример:
max(x, 1, 5, -x^2 + 4*x)$\rightarrow$ найдет максимум функции на целочисленном интервале.
- Пример:
-
Суммирование (Цикл Sum):
-
C(n, k)(илиCnk(n, k)) — число сочетаний из$n$ по$k$ (биномиальный коэффициент) -
P(n, k)— число размещений из$n$ по$k$ -
fact(n)(илиn!) — факториал числа -
gcd(a, b, ...)— наибольший общий делитель -
lcm(a, b, ...)— наименьшее общее кратное -
fib(n)—$n$ -ое число Фибоначчи
-
pi(илиPI) — число$\pi \approx 3.14159265$ -
e(илиEесли не используется экспоненциальная запись) — экспонента$e \approx 2.71828182$ -
phi— золотое сечение$\approx 1.61803398$
В калькуляторе символ e используется в трех разных контекстах. Компилятор выражений автоматически различает их на основе контекста:
-
Математическая константа
e(основание натурального логарифма):- Используется как отдельный токен (например,
e,e^2,2*e). - Значение:
$\approx 2.71828182$ .
- Используется как отдельный токен (например,
-
Экспоненциальная запись (экспонента)
e:- Используется для ввода степеней десятки и записывается слитно между числами (например,
5e10$\rightarrow 5 \times 10^{10}$ ,1e-5$\rightarrow 10^{-5}$ ).
- Используется для ввода степеней десятки и записывается слитно между числами (например,
-
История ответов REPL
e#:- Записывается в виде буквы
e, за которой сразу же идет число — порядковый номер ответа в истории (например,e1,e2,e3). - Обозначает результат соответствующего шага вычислений.
- Записывается в виде буквы
| Степень | Приставка | Обозначение |
|---|---|---|
| 1e1 | дека | da |
| 1e2 | гекто | h |
| 1e3 | кило | k |
| 1e6 | мега | M |
| 1e9 | гига | G |
| 1e12 | тера | T |
| 1e15 | пета | P |
| 1e18 | экса | E |
| 1e21 | зетта | Z |
| 1e24 | йотта | Y |
| Степень | Приставка | Обозначение |
|---|---|---|
| 1e-1 | деци | d |
| 1e-2 | санти | c |
| 1e-3 | милли | m |
| 1e-6 | микро | u |
| 1e-9 | нано | n |
| 1e-12 | пико | p |
| 1e-15 | фемто | f |
| 1e-18 | атто | a |
| 1e-21 | зепто | z |
| 1e-24 | йокто | y |
-
Регистрозависимость (Case Sensitivity): Все имена переменных, функций и констант чувствительны к регистру. Переменная
xи переменнаяX— это два совершенно разных объекта (x != X). -
Однострочные функции: Пример:
f(x) = x^2илиf(x,y) = 2*x+y -
Многострочные функции и функции с блоком кода (
def/fn/function): Поддерживаются в REPL и в Скриптах с помощью ключевых словdef,fnилиfunctionи оператораreturn(блоки кода задаются в{ ... }или завершаются словомend):def stats(a, b) { s = a + b d = a - b m = a * b return s, d, m } x, y, z = stats(10, 4) print("Sum: {x}, Diff: {y}, Prod: {z}")
-
Множественный возврат (
return a, b, c) и присваивание кортежей (x, y, z = fn()): Операторreturnумеет возвращать сразу несколько значений через запятуюreturn x, yили в виде вектораreturn [x, y]. Конструкция присваивания видаx, y, z = stats(10, 4)автоматически распаковывает возвращенные значения по соответствующим переменным.
-
Множественный возврат (
-
Разделитель инструкций (Точка с запятой
;): В REPL и скриптах можно записывать несколько инструкций на одной строке через;: Пример REPL:x = 5; y = 10; x + y$\rightarrow$ возвращает15. Пример однострочного объявления функции:fn add(a, b) { return a + b }; add(5, 7)$\rightarrow$ возвращает12.
-
Простые вычисления:
- Ввод:
2 + 3 * 4 - Вывод:
e1 = 14(сохраняется вe1)
- Ввод:
-
Работа с историей ответов (REPL):
- Ввод:
e1 / 2 - Вывод:
e2 = 7(сохраняется вe2)
- Ввод:
-
Степени и экспоненциальная запись (scientific notation):
- Поддерживаются записи вида
5e10($5 \times 10^{10}$ ) и1e-5($10^{-5}$ ). - Ввод:
5e3 + 2.5e2 - Вывод:
e3 = 5250(сохраняется вe3)
- Поддерживаются записи вида
-
SI приставки:
- Ввод:
1.5k + 200 - Вывод:
e4 = 1700(сохраняется вe4) - Ввод:
100m + 10u - Вывод:
e5 = 0.10001(сохраняется вe5) - Ввод:
1k7 - Вывод:
1k7 = 1700(приставка СИ заменяет десятичную точку в R-нотации) - Ввод:
1 000 000или1 000 00 - Вывод:
e6 = 1000000илиe7 = 100000(пробелы внутри чисел автоматически игнорируются)
- Ввод:
-
Определение пользовательских переменных и констант:
- Ввод:
temp = 25 - Вывод:
temp = 25(создается переменнаяtempсо значением 25, сохраняется вe6) - Ввод:
temp * 2 - Вывод:
e7 = 50(сохраняется вe7) - Ввод:
const a = 3 - Вывод:
a = 3(создается константаaсо значением 3) - Ввод:
const a = 2 - Вывод:
a = 2(значение константыaобновляется) - Ввод:
a = 10 - Вывод:
Const Error(попытка перезаписать константу без ключевого словаconstзапрещена)
- Ввод:
-
Определение пользовательских функций:
- Ввод:
f(x) = x^2 + 10 - Вывод:
Def OK(создается функцияf(x)) - Ввод:
f(5) - Вывод:
e8 = 35(сохраняется вe8)
- Ввод:
-
Тригонометрия в градусах:
- Ввод:
sin(30) - Вывод:
e9 = 0.5
- Ввод:
Все созданные переменные, скрипты, формулы и привязки клавиш должны сохраняться в энергонезависимую память (NVS/Flash) ESP32, чтобы пользовательские настройки и наработки не терялись при перезагрузке или выключении Cardputer.
-
Автосохранение/Загрузка: При создании или изменении переменной, функции, скрипта или бинда состояние должно автоматически записываться в NVS. При старте прошивки все данные автоматически считываются.
-
Ручное управление: Дополнительно можно предусмотреть команду сохранения настроек или кнопку во всплывающем меню.
Экран управления переменными отображает список всех пользовательских аргументов.
- Интерфейс: Список пар
Имя_переменной = Значение(например,temp = 25). - Действия:
- Редактирование: Изменение значения выбранной переменной прямо из списка.
- Удаление: Удаление переменной из памяти для очистки места и автодополнения (кнопка
Delete). - Создание: Добавление новой переменной вручную.
Позволяет создавать, хранить и запускать небольшие программы для автоматизации вычислений.
-
Менеджер: Список сохраненных скриптов. У каждого скрипта должно быть уникальное имя (например,
fibonacci,sensor_log). - Редактор: Простой текстовый редактор кода.
-
Синтаксис: Поддерживает скрипты с синтаксисом в C-стиле (с фигурными скобками
{ }для блоков кода):-
Условные конструкции (
if / else if / elif / else) (поддерживаются какelse if, так и сокращенныйelif):if (x > 10) { print("x is large") } else if (x > 5) { // или elif (x > 5) print("x is medium") } else { print("x is small") }
-
Цикл
while:while (x < 100) { x = x * 2 print(x) }
-
Цикл
for:for (i = 1; i <= 10; i++) { print(i) }
-
Поддержка операторов присваивания и инкремента:
-
i++(эквивалентноi = i + 1) -
i--(эквивалентноi = i - 1) -
a += b(эквивалентноa = a + (b)) -
a -= b(эквивалентноa = a - (b))
-
-
Пауза:
sleep(ms)— приостанавливает выполнение скрипта на указанное число миллисекунд (например,sleep(200)). -
Поддерживает вывод результатов вычислений и строк через функцию
print(). Также поддерживается форматированный вывод с интерполяцией:print("val is {x}")(вычисляет выражение в фигурных скобках). -
Отступы: Отступы (пробелы и табуляция в начале строк) полностью игнорируются парсером.
-
Комментарии: Любой текст после символа
#считается комментарием и игнорируется. -
Команды в одну строку: Несколько выражений можно писать в одну строку, разделяя их точкой с запятой
;(например,x = 10; y = 20; print("{x} and {y}")). -
Работа с 1D-Массивами:
-
Объявление: Массивы можно задавать вручную в квадратных или круглых скобках:
A = [1, 2, 3]илиA = (10, 20, 30). Также поддерживаются диапазоны:A = 1:10(или с шагом:A = 1:2:10). -
Индексация (1-based): Доступ к элементам и запись выполняются через квадратные скобки:
A[1] = 99. При выходе индекса за границы массива выполнение прерывается с ошибкой (например,Error: Index 5 out of bounds). -
Операции над массивами:
-
.*— поэлементное умножение:C = A .* B -
*— матричное умножение (для 1D векторов возвращает их скалярное произведение, т.е. число):dot_val = A * B -
./— поэлементное деление:C = A ./ B -
+и-— поэлементное сложение и вычитание:C = A + B -
Операции со скалярами: Поддерживается умножение, деление, сложение и вычитание массива на число:
C = A * 5,C = A ./ 2,C = 10 + A. -
Длина массива:
len(A)— возвращает число элементов в массивеA(например,len([10, 20, 30])$\rightarrow$ вернет3).
-
-
Объявление: Массивы можно задавать вручную в квадратных или круглых скобках:
-
Последовательный показ графиков из скрипта (
plot.show()):- Вызов
plot.show()в скрипте приостанавливает выполнение скрипта и переключает калькулятор в интерактивный графический режим (STATE_PLOT). - Пользователь может исследовать график (зум, панорамирование), а после выхода по
Esc/G0выполнение скрипта автоматический продолжается с следующей строки. Это позволяет создавать скрипты с последовательным открытием нескольких графиков (например, сначала входной сигнал, затем его БПФ-спектр).
- Вызов
-
Встроенные скрипты в комплекте (
scripts/):-
solver.txt— скрипт решения квадратных уравнений$ax^2+bx+c=0$ и численного нахождения корней методом бисекции (деления пополам). -
ode_solver.txt— численное решение обыкновенных дифференциальных уравнений$y'=f(x,y)$ методом Рунге-Кутты 4-го порядка (RK4). -
fft.txt— спектральный БПФ/ДПФ анализ сигнала из 3 наложенных негармонических синусоид (6.25 Гц, 15.625 Гц, 31.25 Гц) с последовательным выводом графика входного сигнала во временной области и графика частотного спектра.
-
-
Важные ограничения и особенности выполнения:
-
Лимит шагов (инструкций): Во избежание зависания интерфейса и ESP32 максимальное число выполненных строк/инструкций в скрипте ограничено 1000 шагами. При превышении лимита выполнение прерывается с ошибкой
Error: Loop limit reached. - Изоляция переменных: Переменные, массивы и функции, созданные или измененные во время выполнения скрипта, хранятся локально во время работы скрипта. После его завершения все временные переменные и массивы вычищаются, восстанавливая глобальное состояние REPL до запуска.
-
Лимит шагов (инструкций): Во избежание зависания интерфейса и ESP32 максимальное число выполненных строк/инструкций в скрипте ограничено 1000 шагами. При превышении лимита выполнение прерывается с ошибкой
-
-
Действия:
-
Run(Запуск выбранного скрипта). -
Edit(Редактирование кода). -
Rename(Переименование файла скрипта). -
Delete(Удаление скрипта из памяти).
-
Отображает визуальный график функций или массивов точек на встроенном 1.14" дисплее. Поддерживает Matplotlib-подобный синтаксис для управления отображением из REPL и скриптов:
-
Синтаксис:
plot(x, y)— строит график по массивам точекxиy.plot(y)— строит график по одному векторуy. В этом случае по горизонтальной оси X откладывается порядковый номер точки от1доlen(y).plot(x, y, color)/plot(y, color)— строит график с указанием цвета (короткое имя или полное имя строки).plot(x, y, linestyle)/plot(y, linestyle)— строит график с указанием стиля линии.plot(x, y, color, linestyle)/plot(y, color, linestyle)— строит график с указанием цвета и стиля линии.- Доступные цвета (
color):"r"(Красный)"g"(Зеленый)"b"(Синий)"c"(Циан)"m"(Маджента)"y"(Желтый)"k"(Черный)"w"(Белый)
- Стили линий (
linestyle):"-"(Сплошная линия, по умолчанию)"--"(Штриховая линия / пунктир)"-."(Штрих-пунктирная линия)":"(Точечная линия)""или" "(Без линии)
- Типы маркеров точек (
marker):"*"(Звездочки)"o"(Кружки)"x"(Крестики)"+"(Плюсы)""или" "(Без маркеров, по умолчанию)
plot.show()— открывает графический экран и отображает все накопленные графики.plot.close()— закрывает графический экран и сбрасывает накопленные графики.plot.hold(1)— удерживает текущий график на экране, позволяя наложить следующий график поверх него.plot.hold(0)— отключает удержание (по умолчанию при вызове новогоplotпредыдущие стираются).plot.xlim([min, max])— вручную задает диапазон отображения по оси X.plot.ylim([min, max])— вручную задает диапазон отображения по оси Y.
-
Интерфейс:
- Двумерная координатная сетка.
- Масштабирование по осям (Auto-scale по максимальным/минимальным значениям).
- Вывод легенды и значений под курсором при навигации кнопками.
Позволяет назначать выполнение математических выражений или вставку шаблонов формул на быстрые сочетания клавиш Alt + буква.
-
Интерфейс: Таблица привязок, например:
-
Alt + S$\rightarrow$ вставитьsin( -
Alt + P$\rightarrow$ выполнитьtemp * pi
-
-
Управление:
- Кнопка Создать (Add): Выбор клавиши (буквы) и ввод строки/выражения.
- Кнопка Удалить (Remove): Очистка бинда с выбранной клавиши.
- Список существующих привязок для быстрого просмотра.
Менеджер сохраненных математических формул с пошаговым мастером ввода параметров и интерактивным редактором.
- Синтаксис: Определение многопараметрических функций вида
f(x, y) = x^2 + y^2(до 4 параметров). - Режимы:
- Список формул: Клавиши
Up/Down(Fn + ; / .) — выбор формулы,Enter— запуск интерактивного мастера вычисления. - Создание (
[N]) / Редактирование ([E]): Открывает поле ввода формулы с полноценной подсветкой синтаксиса (радужные скобки, желтые числа, циановые переменные, пурпурные константы).- Курсор: Интерактивный циановый вертикальный курсор
|с межсимвольным отступом. - Навигация:
Fn + Left/Right(Fn + , / /) — перемещение посимвольно;Ctrl + Left/Right— прыжки по словам. - Клавиша
,: Обычное нажатие печатает запятую,без сброса или скачка в начало строки. - Автодополнение:
Tabдополняет имена функций и переменных. - Выход:
Escили`возвращает к списку формул (при несохраненных изменениях выводится диалог подтвержденияSave modified formula?).
- Курсор: Интерактивный циановый вертикальный курсор
- Мастер параметров (Wizard): Последовательный запрос значений аргументов с автоматическим пересчетом результата по нажатию
Enter.
- Список формул: Клавиши
Панель настроек системы:
- Время отключения экрана: Время бездействия в секундах, по истечении которого экран полностью отключается (0 — всегда включен). Любое нажатие клавиши пробуждает экран.
- Яркость подсветки: Уровень яркости экрана (от 0 до 255).
- Thousands Sep: Включение (
ON) или выключение (OFF) вывода результатов с разделением тысяч пробелом (например,1 000 000.00). - Auto Brackets: Включение (
ON) или выключение (OFF) автозакрытия скобок ((,[,{) и кавычек (',"). При вводе открывающего символа автоматически дописывается парный закрывающий символ с размещением курсора между ними. Также при автодополнении функций поTabавтоматически вставляются скобки(). - Sticky Mod: Включение (
ON) или выключение (OFF) режима залипания клавиш-модификаторов (Fn,Shift/Aa,Opt,Ctrl,Alt).- Одиночное нажатие (< 1 сек): защелкивает модификатор (он остается активным для последующих нажатий).
- Удержание (> 1 сек): при отпускании отключает модификатор.
- Поддерживается одновременная фиксация нескольких модификаторов.
- Управление:
Arrows Up/Downили;/.-> выбор параметра.Arrows Left/Rightили,//илиEnter-> переключение режимов (ON/OFF) или регулирование значений.Escили[-> выход в REPL.
При нажатии комбинации Fn + H на любом экране поверх интерфейса открывается всплывающее окно справки (Modal Help Overlay) с подсказами и комбинациями клавиш, специфичными для текущего активного режима:
- Модальное окно: Не закрывается автоматически при отпускании
Fn. - Прокрутка справки: При наличии более 6-7 строк справку можно прокручивать кнопками
Up / Down(Fn + ; / .) или напрямую клавишами;и.. Индикатор(; . ^ v)в заголовке показывает наличие прокрутки. - Закрытие: Нажатие
Escили`/~закрывает окно помощи и возвращает в текущий режим.
При возникновении ошибки вычислений (синтаксическая ошибка, деление на ноль, неизвестный токен):
- Строка результата окрашивается в ярко-красный цвет с сообщением об ошибке.
- Включается красный RGB LED светодиод (
GPIO 21на безопасной яркости90). - При этом шина питания LED (
GPIO 38) постоянно удерживается в состоянии HIGH, предотвращая изменения яркости или "скачки" напряжения на дисплее. - При нажатии любой следующей клавиши на клавиатуре сообщение об ошибке автоматически сбрасывается, светодиод гаснет, а статус вычислений возвращается в норму без зависания или отключения экрана.
Разрешение встроенного экрана M5Cardputer составляет 240 × 135 пикселей. Интерфейс спроектирован с учетом жестких ограничений дисплея для обеспечения читаемости формул и удобства управления.
Отображается на всех экранах в верхней строке (высота: 12 пикселей) и отделен серой линией TFT_DARKGREY.
-
Индикаторы модификаторов (Sticky Mode): Слева от иконки аккумулятора выводятся цветные плашки активных модификаторов:
-
fn— Красный цвет (#FF0000/0xF800) -
Aa(Shift) — Синий цвет (#0000FF/0x001F) -
opt— Бирюзовый / Циан цвет (#00FFFF/0x07FF) -
ctrl/alt— Серый цвет (0x7BEF)
-
-
Левая часть — Режим и Статус:
-
Cardulator: Основной калькулятор. -
Cardulator | e#: Основной калькулятор с указанием номера следующей ячейки истории вычислений (например,Cardulator | e5). -
Cardulator | VARIABLES: Экран управления переменными. -
Cardulator | BINDS: Экран назначения горячих клавиш. -
Cardulator | FORMULASилиFormula: [имя]: Экран выбора формул или пошаговый мастер параметров. -
Cardulator | SCRIPTSилиEditing script: [имя]: Менеджер скриптов или текстовый редактор. -
Plot: [функция] | Zoom: [масштаб]: Графический режим. -
Cardulator | HELP: Справка.
-
-
Правая часть — Батарея и питание:
- Иконка аккумулятора: Отображает уровень заряда в виде рамки с заполняемой шкалой без текстовых процентов. Шкала окрашивается в красный цвет при уровне заряда ниже 20% и в зеленый — в остальных случаях.
-
Индикатор зарядки: При подключении USB-кабеля слева от иконки батареи появляется символ желтой молнии (
$\approx$ иконка зарядки).
Расположена в центральной части основного экрана калькулятора (координаты y = 13..88) над строкой ввода.
- Отображение: Выводит историю последних команд (префикс
>, темно-серый цвет) и вычисленных результатов (префиксeX =, зеленый цвет). - Вместимость: Отображает до 6 строк истории одновременно.
- Прокрутка: Прокручивается построчно вверх/вниз с помощью сочетаний клавиш
Alt + UpиAlt + Down.
Находится в нижней части экрана REPL под линией разделения (координата y = 92).
- Сетка символов: Шрифт размера 2 имеет габариты символа
12 × 16пикселей. - Вместимость: В ширину помещается до 20 символов.
- Курсор и скроллинг: В позиции редактирования отображается вертикальный курсор бирюзового цвета. Поле автоматически центрирует скроллинг вокруг курсора, удерживая его в пределах видимости.
- Цветовая подсветка (Syntax Highlighting):
- Числа и приставки СИ (микро, мега, кило и др.) подсвечиваются желтым.
- Скобки
(и)раскрашиваются в радужные цвета в зависимости от уровня вложенности (бирюзовый, фиолетовый, желтый, зеленый, оранжевый). Непарные скобки подсвечиваются красным.
Расположено в самой нижней части экрана калькулятора (координата y = 115) под второй разделительной линией.
- Вместимость: До 20 символов в ширину.
- Цвет статуса:
- Зеленый — при успешном вычислении (например,
e1 = 14). - Красный — при возникновении математической ошибки или ошибки синтаксиса (выводится краткий текст ошибки).
- Зеленый — при успешном вычислении (например,
- Ограничение длины: Если результат или сообщение об ошибке длиннее 18 символов, строка обрезается до 18 знаков и дополняется многоточием
..на конце (например,1.2345678901234567..илиSyntax Error..).
Используют общий стиль отображения списков:
- Выбранный элемент подсвечивается горизонтальной синей плашкой (
TFT_BLUE) во всю ширину экрана с белым текстом. - В нижней части экрана (координата
y = 115) под серой разделительной линией отображается контекстная строка-подсказка с доступными клавишами управления (например,Enter: Edit Del: Delete N: Create Esc: Exit). - При переходе в режим редактирования (например, значений переменных) внизу открывается поле ввода с желтым текстом приглашения и курсором
_.
Отображает интерактивную сетку с графиком функции:
-
Координатные оси: Горизонтальная ось
$X$ и вертикальная ось$Y$ прорисовываются серым цветомTFT_DARKGREYс центром в точке пересечения. -
Масштаб и навигация: Текущий график функции рисуется зеленым цветом
TFT_GREEN. Нажатие стрелок на клавиатуре сдвигает центр координат (панорамирование), а сочетанияfn + ,иfn + .изменяют масштаб по осям (приближение и отдаление).
Проект полностью покрыт автоматическими тестами на хост-платформе Linux/macOS с использованием библиотеки Unity и окружения PlatformIO native:
# Запуск всех 20 тестов на хосте (без необходимости прошивки ESP32):
./build_all.sh -t-
test_basic_evaluation— базовые математические выражения и приоритеты операторов. -
test_degrees_trig— тригонометрические функции в градусах. -
test_repl_history— сохранение и адресация ячеек истории вычисленийe1,e2... -
test_scientific_notation_and_si_prefixes— парсинг экспоненциальной записи (5e3) и СИ-приставок (2k26-> 2026,1k5-> 1500,4M7-> 4700000,1n5-> 1.5e-9). -
test_formulas— мастер формул и вычисление многопараметрических функцийhypot(x,y),area(r). -
test_user_defined_variables&test_user_defined_functions— пользовательские переменные и функции. -
test_autocompletion— автодополнение поTabдля функций, переменных, констант и циклический выборsi$\rightarrow$ sin()$\rightarrow$ sinh()$\rightarrow$ sin(). -
test_clear_all— полная очистка памяти и переменных. -
test_si_prefixes_as_variables— сосуществование переменных с именами СИ-приставок (переменнаяkvs СИ-приставка5k). -
test_const_definition— константы (const a = 3) и защищенный доступ от переопределения. -
test_multiline_functions_and_semicolon— функции с блоком кодаfn/returnи точки с запятой. -
test_array_operations— массивы, поэлементные операции (.*,./), матрицы и диапазоны1:10. -
test_script_execution— выполнение скриптов (fibonacci,while,for,if/else). -
test_plots— генерация графических линийplot(x, y, color, linestyle). -
test_vectors_and_ranges— генерация векторов1:2:10и индексация 1-based. -
test_loops— суммирование и циклыsum,prod,min,max. -
test_print_and_e_history— форматированный выводprint()и интерполяция строк"val={e1}". -
test_docs_scripts_files— прямое чтение и выполнение реальных файлов скриптов из репозитория:docs/life.txt(1D Game of Life),docs/plot_demo.txt(Lissajous & curves),docs/plot.txt(Math & Plot demo). -
test_help— вызов и форматирование встроенной справкиhelp,help(print),help(plot).