ESP8266 - UTILIZANDO TIMERS PARA LIGAR / DESLIGAR PINOS

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);
}

Exibições: 1678

Comentar

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)

Comentário de Carlos kwiek em 12 setembro 2016 às 11:57

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

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço