Как запустить разные процедуры с разными интервалами
Поэтому я создаю интерфейс, который будет иметь цифровые часы ... раз в секунду.. я хотел бы делать другие вещи с разными интервалами, но если я задержу (1000), то мне придется ждать ту секунду, которая сейчас является минимальной, с которой должны работать другие вещи.
@BostonMacOSX, 👍1
Обсуждение3 ответа
Короткий ответ, который следует иметь в виду при изучении предложенного выше чтения, состоит в том, чтобы запустить ваш таймер быстрее, возможно, delay (1) или delay (10) или что-то еще достаточно быстрое, чтобы обслуживать ваши другие функции, а затем просто сделать "часы" одной из тех функций, которые подсчитывают общее количество небольшие задержки, чтобы получить вашу 1-секундную задержку. Это предполагает, что ваши другие функции не занимают слишком много времени для запуска, что приведет к снижению отсчета времени в 1 секунду. Таким образом, лучший способ, чем простой подсчет, - это заставить функцию часов считывать текущее время и сравнивать его со временем начала. Когда он достигает 1 секунды, вы устанавливаете новое время начала.
Пожалуйста, добавьте несколько примеров кода, потому что ваше описание не очень понятно. Ваше первое предложение (суммирование задержек) звучит так, как будто оно приведет к созданию кода, который трудно поддерживать и устранять неполадки. Второе предложение - это просто код, который используется в примерах, таких как пример Arduino “blinkWithoutDelay”, и он гораздо более полезен., @StarCat
Учитывая, что техника "миллис ()" / Мигание без задержки проста и хорошо документирована, кажется контрпродуктивным предлагать оператору, чтобы он комбинировал более короткие задержки., @Edgar Bonet
Как сказано в комментариях: вы должны прочитать о конечных автоматах и внимательно взглянуть на пример Blink Without Delay.
Чтобы начать с примера, более близкого к тому, чего вы хотите достичь, взгляните на приведенный ниже код; он будет считать секунды, не блокируя цикл.
unsigned long int secondsTimerMillis;
int seconds, minutes, hours = 0;
int secondsInterval = 1000; //мс
void setup() {
Serial.begin(9600);
// More setup() материал идет сюда
secondsTimerMillis = 0;
}
void loop() {
if ((millis() - secondsTimerMillis) >= secondsInterval) {
seconds++;
secondsTimerMillis = millis();
Serial.println(seconds);
// Больше вещей, которые вы хотите сделать каждую секунду, идет сюда
}
// Больше материала loop() идет сюда
}
Это всего лишь базовый механизм, и он не будет очень точным без какого-либо способа время от времени регулировать часы.
Вам также придется добавить код для проверки секунд == 60
и при необходимости увеличить минуты
/ сбросить секунды
; то же самое касается часов.
Наличие / обработка других событий с другими интервалами - это просто нечто большее.
Обратите внимание, что использование часов реального времени в качестве основы для вашего хронометража сделает вашу жизнь намного проще, а ваши часы более точными, но я предполагаю, что вы хотите сделать это "вручную".
Если вам нужны часы, то ваш лучший вариант - это... купить часы. Или, точнее, модуль RTC. Он не только будет намного точнее, чем ваш Arduino, но и сможет удерживать время от батареи, когда ваш проект выключен.
Если вы действительно хотите полагаться на (ненадежные) временные возможности
вашего Arduino, вы можете попробовать поддельный RTC на основе millis (), предоставляемый
библиотекой Adafruit RTClib: RTC_Millis. Пример
использования:
#include <RTClib.h>
RTC_Millis clock;
void setup() {
Serial.begin(9600);
clock.begin(DateTime(F(__DATE__), F(__TIME__)));
}
void loop() {
static DateTime last_time;
DateTime now = clock.now();
if (now != last_time) {
char buffer[] = "hh:mm:ss";
Serial.println(now.toString(buffer));
last_time = now;
}
}
Обратите внимание на тест if (now != last_time)
, который эквивалентен тесту
if (currentMillis - previousMillis >= интервал)
мигания без
Учебник по задержке (RTC имеет разрешение в одну секунду). Это позволяет
коду быть неблокирующим.
Обратите также внимание, что если вы хотите измерить скорость дрейфа ваших часов,
вы можете откалибровать этот дрейф, используя вместо
этого RTC_micros и вызывая метод adjustDrift()
в setup()
.
- ESP32 прекращает цикл после двух циклов
- Функция запуска при срабатывании
- Ошибка при попытке динамического моделирования температуры
- Пытаюсь распечатать элементы в структуре на aruino и получаю эту ошибку на compliation
- esp32, platformio A fatal error occurred: Packet content transfer stopped (received 8 bytes) *** [upload] Error 2
- Как выбрать альтернативные контакты I2C на ESP32?
- Драйверы для чипа последовательного порта CH9102X
- Как преобразовать форматированный оператор print в строковую переменную?
об этом спрашивали снова и снова ... изучите примерный скетч
blinkWithoutDelay
в среде IDE arduino и, пожалуйста, проведите некоторое исследование... аксо загляни в FSM (конечный автомат), @jsotolaВы также можете поискать в Google и найти "неблокирующую совместную многозадачность". Я довольно подробно писал об этом в своем ответе здесь: https://stackoverflow.com/a/50032992/4561887 . Начните с [Мигать без задержки] (https://www.arduino.cc/en/Tutorial/BuiltInExamples/BlinkWithoutDelay ) хотя сначала нужно разобраться в сути концепции., @Gabriel Staples
https://github.com/jandrassy/KitchenTimerClock/blob/master/KitchenTimerClock/KitchenTimerClock.ino, @Juraj