Фиксированное точное время выполнения loop

Друзья, опять нужна ваша помощь.
Датчик должен передавать температуру на приемник (не ардуино, заводское устройство) с периодичность максимально близкой к постоянной, у родных передатчиков разница между двумя отправками в пределах 10 миллисекунд.
Хотелось бы добиться примерно такой же точности для корректного приема.
Подводит датчик температуры у которого очень разнится время чтения данных - от 60 до 120 миллисекунд из-за чего не получается “выровнять” время.
Пытался реализовать с помощью миллис, рассчитывая что отсчет время чтения датчика начнется одновременно с миллис и оно окажется как-бы “внутри” времени таймера миллис, но выводя данные в порт понял, что миллис работает не так. Перепробовал много разных схем с миллис, тут лишь один из “нерабочих” вариантов.
После отправки плата (lgt8f328p) уходит в сон на точно заданное время, с этим проблем нет.
Подскажите как реализовать точную задержку на чтение датчика и как следствие - точное время работы loop. Ох, надеюсь вы меня поняли.

#include "FineOffset.h"
#include <Wire.h>
#include <AHT20.h>
#define TX_PIN 10
#define DEVICE_ID 123

#include <LowPower.h>

AHT20 aht20;
unsigned long timer1;
unsigned long timer2;

void setup() {
  Serial.begin(9600);
  Wire.begin(); //Join I2C bus
  aht20.begin();
  timer1 = timer2 = millis();
}
FineOffset tx(TX_PIN);

void loop(void)	{
    if (millis() - timer1 > 50) {
    timer1 = millis();
    float temp = 20.0;
    tx.send(DEVICE_ID, temp);
    Serial.println(temp);
    //Serial.println(timer);
  }
  if (millis() - timer2 > 5000) {
   timer2 = millis();
   LowPower.idle(SLEEP_8S, ADC_OFF, TIMER2_OFF, TIMER1_OFF, TIMER0_OFF, SPI_OFF, USART0_OFF, TWI_OFF);
  }
}

А зачем? Себе же отправка по времени нужна (как я понял), ну и отправляй раз в нужно время (например раз в 2 секунды) ранее считанное значение. И даде если оно не успело обновиться или обновилось 500 раз - какая разница?))

А где тут чтение AHT?

С какой периодичностью-то?
Главное, чтобы эта периодичность была заведомо больше времени испольнения loop(). Если это условие выполняется - то остальное абсолютно без проблем, точность легко получить не только 10мс, но и 1-2 мс

Так дело не пойдёт. У этого датчика время измерения 80мс.
Причём, скорее всего блокирующие 80мс (из библиотеки):

 if (getBusyBit(AHT10_USE_READ_DATA) != 0x00) 
delay(AHT10_MEASURMENT_DELAY); //measurement delay

А ещё расчёты с float, шина.
Так что, здесь , как по мне, не менее 100мс, а то и больше надо брать.

Так он по интерфейсу i2c. Надо делать примерно так:

  1. Включили, ждём >40мс(калибровка и инициализация)
  2. Отправили команду чтения и вышли в луп.
  3. Через >80мс по миллису читаем и снова даём команду на чтение и выходим в луп.

То есть мы не зависаем, ожидая пока датчик измерит. Я такой алгоритм применял с датчиком HC-SR04. Итоговое время общения с ним было порядка 10-20мкс, то есть почти ничто.
Главное ручками свою неблокирующую библиотечку написать.