В loop отсчитывать интервалы таким образом будет только очень пузатый чайник. Точность в таком случае будет никакая. Увы, порог входа в Arduino почти нулевой (так задумывалось изначально), по этому почти весь ардуинский код есть самый жуткий говнокод (в том числе и оба ваши примера).
Как уже писали, продвинутые чайники используют millis() (или micros()). Тогда код будет выглядеть так.
void loop() {
if (!state) {
if (millis() - myTimer > PERIOD) { // таймер периода
myTimer = millis(); // сброс таймера
}
} else {
if (millis() - myTimer > WORK) { // таймер времени работы
myTimer = millis(); // сброс
}
}
}
Здесь вы можете быть уверенны в точности +-2мс для millis() или +-50мкс для micros()
Программисты для отсчета интервалов используют счетчики таймеры. В таком случае можно осуществлять более точные и сложные измерения. Только при этом нужно помнить, что все таймеры используются функцией analogWrite(), таймер 0 так же используется millis() и micros(). При других настройках таймеров эти функции будут недоступны.
Для очень точного отсчета больших интервалов используйте RTC, в Mega2560 он встроен, для других нужен внешний