Да, что-то вроде. Цикл не нужен. За один вызов этого кода эта "частичная" отрисовка должна отработать только один раз. А уже на следующем вызове функции, значение q будет уже другое и отрисовано будет уже по-другому. Естественно, q должна быть либо глобальной, либо статической переменной, чтобы сохранять значение между вызовами этого кода.
P.S. Только
if (q < 12) { q=0;} - неправильное условие - всегда будет на 0 выходить.
Опять же, условие
if (millis() % 75==0) не очень корректное. Потому что именно в эту (одну из 75) миллисекунду, когда остаток от деления на 75 равен нулю, очень велик шанс, что будет выполняться код совсем где-то в другом месте, так что, пока программа придёт к этому месту, всё уже поменяется, и это условие не выполнится.
Лучше значение, возвращаемое millis(), запомнить (например, в переменной oldMillis). А затем, когда снова программа придёт к этому месту, проверить, сколько прошло времени. То есть, что-то вроде.
Код: Выделить всё
static unsigned long oldMillis = 0;
...
unsigned long now = millis();
if (now - oldMIllis >= 75) {
// делаем что-то;
oldMillis = now;
}
Тогда это "что-то" будет делаться не чаще раза в 75мс. А если где-то что-то подвиснет на пару миллисекунд в другом месте, то всё равно выполнится. Пусть, не через ровно 75, а на пару миллисекунд больше - некритично.