Как грамотно сделать scheduler на micropython?
Все (или почти все) примеры программ в итырнетах заканчиваются на while True: Изначально мне мнилось что микроконтроллер не должен всей своей тактовой частотой гонять цикл по кругу. И, как выяснилось, если посмотреть Программирование микроконтроллеров. Занятие 2 примерно с 58:30 то действительно я не первый кто пришел к такому выводу.
Для тех, кто видео не посмотрел. Задача минимум:
При опросе датчика DS18B20 мы должны дать ему пинка, подождать 750мс(смотри даташит) и только потом запрашивать показания. Кстати, эмпирическим путём установлено, что если подождать чуть дольше, то все работает.
Допустим каждые n минут(или часов, или дней) нам нужно отправлять данные куда-то. Также у нас может сработать прерывание потому что пользователь кнопку нажал. и нужно постоять поморгать циферблатом пока он(юзер) значения выбирает. А режим отправки сообщений нарушать нельзя. А это я ещё до всяких интернетов не добрался. Вот как это грамотно женить между собой?
В простом Питоне это уже реализовали, если я правильно понял. Но моё кунг-фу ещё не так сильно, и мне кажется не все библиотеки есть на микропитоне.
Ответы (1 шт):
- Совсем короткие задержки, грубо говоря до 2 секунд (например, подождать 750 мс перед получением данных с датчика) лучше делать через
sleep. Для более длинных задержек (несколько секунд - несколько минут) можно использовать таймер: Timers
Для действий через длительные промежутки времени (десятки минут и более) можно попробовать использовать режим низкого энергопотребления (deep sleep mode) с пробуждением по сигналу от RTC (real-time clock - встроенных часов "реального" времени): Deep-sleep mode.
Также можно сделать пробуждение при действии пользователя или вообще при внешнем воздействии: пробуждение происходит при сбросе платы, и пробуждение по сигналу от часов именно так и реализуется (для того, чтобы работало пробуждение по сигналу от часов, нужно соединить пин "будильника" с пином сброса).
Также см. MicroPython: ESP8266 Deep Sleep and Wake Up Sources.
Вариант с режимом сна работает для ESP8266 и ESP32, но на каком-нибудь Pyboard (STM32) режима сна нет. Его можно его реализовать через внешний таймер (например, TPL5110), который будет включать/выключать питание платы.