Выполнение вычислений только по запросу через последовательный
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()
работало без недостатков.
@Harald, 👍0
1 ответ
Лучший ответ:
На Nano вы можете #include <avr/sleep.h>
, а затем просто вызвать
sleep_mode()
из loop()
. Это переведет устройство в спящий режим, по
умолчанию в режиме ожидания, до тех пор, пока не сработает следующее прерывание. Nano будет
просыпаться по крайней мере один раз каждые 1,024 мкс, чтобы обслуживать прерывание таймера
, которое используется для реализации функции синхронизации Arduino(millis ()
,
delay ()
и т.д.). Большую часть времени этот loop()
будет делать не что иное
, как тестирование Serial. available ()
, так что микроконтроллер будет бодрствовать только в течение
пары микросекунд каждые 1024 мкс, что не так уж много.
Если вы отключите прерывание таймера, все функции синхронизации будут отключены, но MCU все равно будет разбужен прерыванием последовательного порта , как только данные станут доступны.
- Отправка последовательных данных в прерывании
- Серийное прерывание
- Как остановить цикл в последовательном мониторе?
- Реализация циклического буфера и Serial.print()
- Передача переменных для PID в прерывании
- Есть ли способ использовать последовательный порт в качестве источника прерывания?
- Можно ли безопасно использовать последовательный порт в процедуре прерывания SPI?
- Как заставить переключатель работать до тех пор, пока не будет обнаружен другой последовательный вход?