C/C++

Помогите самоучке с ардуино/с++

Функция имитирует мигание указателя в меню.
Void BlinkCursor (const byte set_column, const byte set_row, const char cursor)
{
if (millis() - g_COUNT_BLINK_CURS >= 400) {
g_COUNT_BLINK_CURS = millis();
g_BLINK_CURS++;
}

switch (g_BLINK_CURS) {
case 0: lcd.setCursor (set_column, set_row); lcd.write(cursor); break;
case 1: lcd.setCursor (set_column, set_row); lcd.print(" "); break;
case 0: g_BLINK_CURS = 1;
}
}
Пока millis() - g_COUNT_BLINK_CURS >= 400 истина, каждый case выполняется 76 раз это заметно нагружает мк ненужными действиями. Не хватает фантазии сделать отрисовку единожды. По говнокод не надо писать. Я учусь сам как могу.
ИМХО (как вариант блинка со своим таймингом):

#include< LiquidCrystal.h >

unsigned long g_COUNT_BLINK_CURS = 0;
bool state = false;

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
void setup()
{
lcd.begin(16, 2);
}

void loop() {
if (millis() - g_COUNT_BLINK_CURS >= 400) {
g_COUNT_BLINK_CURS = millis();
state = ! state;
lcd.setCursor(0,0);
lcd.write(state? ' ':'_');
}
//<-- здесь ещё можно задержку поставить, чтобы не очень часто крутить цикл.
//через тот-же delay
}

Проект/пример на тинкере, завтра закрою:
https://www.tinkercad.com/things/eeTexD57bx0
Aziz Yakubov
Aziz Yakubov
84 764
Лучший ответ
Я вот наивно видно думал, что case должен быть уникален, а не повторяться case 0: да case 0: в

case 0: lcd.setCursor (set_column, set_row); lcd.write(cursor); break;
case 1: lcd.setCursor (set_column, set_row); lcd.print(" "); break;
case 0: // от сель же должно дать ошибку?

Про моргание не знаю... где-то пишут в библиотеках:
blink(); – Включение мигающего курсора (с частотой около 1 Гц).
noBlink(); – Выключение мигающего курсора.

"76 раз это заметно нагружает мк ненужными действиями" тут надо прерываниями видно как-то, уже не упомню, лет 5 видно что-то помудрил да закинул подальше эту плату. А так программы можно найти, эмулятор был даже онлайн и даже графически это рисовал... даже без электронной платы можно собрать.
Наран Манджиев я же написал во дополнении что, ошибка... case 3: g_BLINK_CURS = 0; фишка в том что я сам могу создавать любой символ через lcd.createChar() и передавать его в функцию BlinkCursor()
Сергей Парфинович Нам код не полный выводит: case 3 нет.
Сергей Парфинович так значит ошибка была в том, что g_BLINK_CURS принимал значение, для которого не было кейса?
Давай помогу. Если у тебя такая острая потребность в программировании контроллеров. Возьми планку выше, программируй stm32. Мне кажется, тебе знаний хватит
Rex ..
Rex ..
3 832
Наран Манджиев Здравствуйте. Спасибо за ответ. Пока пишу на ардуино в platformio vs code. Программировать stm32 на ардуино - этож бред? А для работы с++ пока знаний маловать.
Ну и нахрена. Шёл бы уроки с таким рвением делал. Ту же физику