Olá,
estou trabalhando com esp8266 e quis compartilhar um trecho de código que fiz para acionar buzzers, leds,
e o que mais for preciso acionar por tempos determinados, e sem interromper o processamento principal.
Para isso, utilizo um timer do esp8266.
Basicamente uma função que inicializa um pino em HIGH|LOW por um tempo em milisegundos, numa quantidade de vezes e eventualmente também comanda a alternância do pino, blink=true;
void atvTimerMillis(int pinNumber, int duration, int mode, int ocorrencias, bool blink) {
EX.:
// LIGAR UM PINO POR MEIO SEGUNDO
atvTimerMillis(5, 500, LOW, 0, false);
// DURANTE 20 SEGUNDOS A CADA 100 MILISSEGUNDOS ALTERNA ENTRE HIGH E LOW
atvTimerMillis(5, 100, LOW, 20, true);
// ATIVA POR 5 SEGUNDOS
atvTimerMillis(5, 5000, HIGH, 0, false);
#ifdef _PRN_
#define SF Serial.flush();
#define PRND Serial.print(__FUNCTION__);Serial.print(" NA LINHA=");Serial.println(__LINE__);Serial.flush();
#define PRNDE Serial.print(__FUNCTION__);Serial.print(" ** ERRO ** LINHA=");Serial.println(__LINE__);Serial.flush();
#define PRNLN Serial.println
#define PRN Serial.print
#else
#define PRNLN //
#define PRN //
#define PRND //
#define PRNDE //
#endif
extern "C" {
#include "user_interface.h"
}
os_timer_t myTimer;
typedef struct _MYTIMERSTRU_ {
int pinNumber;
int mode;
bool tickOccurred;
bool blink;
int ocorrencias;
}MYTIMERSTRU;
MYTIMERSTRU vStru;
void atvTimerCallback(void *pArg) {
if (pArg==NULL) {
return;
}
MYTIMERSTRU* pvStru = (MYTIMERSTRU*)pArg;
if (pvStru->blink) {
digitalWrite(pvStru->pinNumber, (digitalRead(pvStru->pinNumber)==HIGH) ? LOW : HIGH);
digitalWrite(LED_BUILTIN, (digitalRead(pvStru->pinNumber)==HIGH) ? LOW : HIGH);
}
if (pvStru->ocorrencias==-1) {
return;
}
pvStru->ocorrencias--;
if (pvStru->ocorrencias<=0) {
digitalWrite(pvStru->pinNumber, pvStru->mode);
digitalWrite(LED_BUILTIN, pvStru->mode);
os_timer_disarm(&myTimer);
pvStru->tickOccurred = true;
return;
}
} // End of timerCallback
/*
*/
void atvTimerMillis(int pinNumber, int duration, int mode, int ocorrencias, bool blink) {
vStru.mode = (mode==LOW) ? HIGH : LOW;
//vStru.mode = digitalRead(pinNumber);
vStru.pinNumber = pinNumber;
vStru.blink = blink;
digitalWrite(pinNumber, mode);
digitalWrite(LED_BUILTIN, mode);
if (ocorrencias<0) {
vStru.ocorrencias = -1;
}
else {
vStru.ocorrencias = ocorrencias;
}
//os_timer_disarm(&myTimer);
os_timer_setfn(&myTimer, atvTimerCallback, (void*)&vStru);
os_timer_arm(&myTimer, duration, true);
}
Comentar
Muito bom, parabéns Fernando,
Se ainda não é membro do grupo ESP8266 na garagem, venha fazer parte dele.
http://labdegaragem.com/group/esp8266-na-garagem
Saudações!
CK
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por
Você precisa ser um membro de Laboratorio de Garagem (arduino, eletrônica, robotica, hacking) para adicionar comentários!
Entrar em Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)