ivy
New member
В Ардуино есть базовый пример как мигнуть светодиодом. И пример даже асимметричный - 1 сек включено, 2 сек выключено. Проблема в том, что при использовании задержки ESP ничего другого делать не может.
В сети есть зиллион примеров как сделать мигание диода в фоновом режиме. Все методы ориентированы на более-менее простую имплементацию симметричного мигания. Асимметрия сильно осложняет код этих примеров. Все примеры основаны на использовании шедулеров, таск-менеджеров, корутин, и других доп. модулей.
Предлагаю метод асимметричного мигания светодиодом в фоновом режиме (без блокировки ESP) с использованием только встроенных комманд, без доп. инклюдов.
В сети есть зиллион примеров как сделать мигание диода в фоновом режиме. Все методы ориентированы на более-менее простую имплементацию симметричного мигания. Асимметрия сильно осложняет код этих примеров. Все примеры основаны на использовании шедулеров, таск-менеджеров, корутин, и других доп. модулей.
Предлагаю метод асимметричного мигания светодиодом в фоновом режиме (без блокировки ESP) с использованием только встроенных комманд, без доп. инклюдов.
Код:
#define LED_ON_PULSE 200 // ms
#define LED_PIN 4
#define CYCLE_TIME 5000 // ms
static unsigned long m_last_sample_time = millis();
void setup() {
pinMode(LED_PIN, OUTPUT); // Initialize the LED pin as an output
}
void loop() {
// Do a job every cycle (not logical)
unsigned long now = millis();
if (digitalRead(LED_PIN) == LOW && now - m_last_sample_time > LED_ON_PULSE) {
// turn off led
digitalWrite(LED_PIN, HIGH);
pinMode(LED_PIN, INPUT_PULLUP);
}
if (digitalRead(LED_PIN) == HIGH && now - m_last_sample_time < LED_ON_PULSE) {
// turn on led
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, LOW);
}
// Wait 5 sec. Run loop once in 5 sec.
if (now - m_last_sample_time < CYCLE_TIME)
return;
m_last_sample_time = now; // Register full logical cycle passed
// Do a job once in logical cycle time
}