Выполнение вычислений только по запросу через последовательный

Arduino Nano настроен на выполнение A/D преобразований и отправку результатов по последовательномуканалу. В настоящее время структура кода выглядит следующим образом

loop() {
  delayUntilNextTargetTime();
  measure();
  sendMeasurementsToSerial();
}

Хотя я уже убедился, что delayUntilNextTargetTime не слепо задерживает(MILLIS), а скорее вычитает время вычисления из времени сна, чтобы предотвратить дрейф, я бы предпочел получить время от главного компьютера.

Идея заключается в том, что хост-компьютер отправляет командную строку по последовательному каналу, когда ему нужны данные, поэтому цикл может выглядеть следующим образом

loop() {
  if (!Serial.available()) return;
  measure();
  sendMeasurementsToSerial();
}

Теперь мне интересно, есть ли способ сделать это без праздного опроса, что-то вроде

loop() {
  if(Serial.available()) {
    measure();
    sendMeasurementsToSerial();
  }
  sleepUntilSerialPotentiallyHasData();
}

Я читал, что экономия энергии трудна и, скорее всего, не стоит усилий, особенно при наличии USB - источника питания. Это чистое любопытство увидеть

  • что нужно, чтобы перевести систему, скажем, в режим ожидания, возможно, остановив и таймеры, потому что они не используются (я думаю)?
  • и что нужно, чтобы снова правильно выйти из режима ожидания, чтобы преобразование A/D в measure() работало без недостатков.

, 👍0


1 ответ


Лучший ответ:

3

На Nano вы можете #include <avr/sleep.h>, а затем просто вызвать sleep_mode() из loop(). Это переведет устройство в спящий режим, по умолчанию в режиме ожидания, до тех пор, пока не сработает следующее прерывание. Nano будет просыпаться по крайней мере один раз каждые 1,024 мкс, чтобы обслуживать прерывание таймера , которое используется для реализации функции синхронизации Arduino(millis (), delay ()и т.д.). Большую часть времени этот loop() будет делать не что иное , как тестирование Serial. available (), так что микроконтроллер будет бодрствовать только в течение пары микросекунд каждые 1024 мкс, что не так уж много.

Если вы отключите прерывание таймера, все функции синхронизации будут отключены, но MCU все равно будет разбужен прерыванием последовательного порта , как только данные станут доступны.

,