Нет. Вам же выше ‘BOOM’ показал пример считывания без цикла. Выносите ‘i’ в глобальные. И последнее значение таймера туда же. И на каждый вызов ‘loop’ выполняете то, что у вас является одной итерацией цикла. Далее проверяете, если все данные считаны, то как-то их обрабатываете и куда-то выводите, после чего обнуляете ‘i’ для считывания следующей порции данных.
Да, у меня именно в скетчах для Ардуино маловато опыта, так что ориентировался на пример выше и на примеры из туториалов на англоязычном сайте Ардуино.
А как ещё, ну кроме вынесения в глобальные, сохранять состояние между вызовами ‘loop’? Ну т.е. можно буфер считываемых значений, текущую позицию и время последнего считывания оформить в виде отдельного класса с каким-то набором внешних методов и свойств. Но ссылку на экземпляр этого класса всё равно ведь придётся хранить глобально, чтобы оно было доступно между вызовами ‘loop’.
На кнопки свой millis, на датчик свой и потом в loop оба проверять. Они у тебя не должны связаны друг с другом, и каждый срабатывать должен независимо. У гайвера про миллис вроде все доходчиво расписано
ISR(ADC_vect) {
if (trueValue) {
int result = ADCL | (ADCH << 8); // ADLAR=1, Получаем 8-битный результат, остальными битами пренебрегаем
ADMUX = analog_ref | (pin & 0x07);// Устанавливаем новый вход для преобразования
trueValue = false; // Устанавливаем флаг смены входного пина - следующее прерывание пропускаем
}
else {
trueValue = true; // Первый раз пропускаем считывание и устанавливаем флаг на чтение в следующий раз
}
}
Но они слишком медленные по сравнению с этим
for (byte i = 0; i < 100; i++)
{
DATA[i] = analogRead(PIN_A0);
delayMicroseconds(1399);
}