Nesse vídeo é mostrado como criar uma classe para controlar botões (pushbuttons).
Vídeo sobre liga/delisga e debounce:
Código-Fonte
//############ CODIGO DA CLASSE BOTAO ################
class Botao {
private:
int _pino_botao;
int _debounce_delay;
int _leitura_anterior;
int _leitura_anterior_db;
long _time_ultimo_debounce;
long _debounce_ok;
bool _pressionou;
bool _soltou;
public:
Botao(int pin, int debounce);
void atualiza();
bool pressionou();
bool soltou();
long tempo_pressionado();
};
Botao::Botao(int pin, int debounce){
_pressionou = false;
_soltou = false;
_pino_botao = pin;
_debounce_delay = debounce;
pinMode(_pino_botao, INPUT);
}
void Botao::atualiza(){
int leitura_atual = digitalRead(_pino_botao);
if (leitura_atual != _leitura_anterior ) { _time_ultimo_debounce = millis(); _debounce_ok = 0; }
if ( (millis() - _time_ultimo_debounce) > _debounce_delay ) { _debounce_ok = 1; }
if (_debounce_ok == 1) {
_pressionou = (leitura_atual == 1 && _leitura_anterior_db == 0) ;
_soltou = (leitura_atual == 0 && _leitura_anterior_db == 1) ;
_leitura_anterior_db = leitura_atual;
}
_leitura_anterior = leitura_atual;
}
bool Botao::pressionou() { return _pressionou; }
bool Botao::soltou() { return _soltou; }
long Botao::tempo_pressionado() {
if ( _leitura_anterior_db ) {
return ( millis()-_time_ultimo_debounce );
} else {
return 0;
}
}
//############## FIM CODIGO DA CLASSE BOTAO #############
const int PINO_LED_1 = 8;
const int PINO_LED_2 = 9;
const int PINO_LED_3 = 10;
Botao *b; //ponteiro para botao
Botao *b2; //ponteiro para botao
void setup() {
b = new Botao(11, 100); //pino 11 , debounce time 100
b2 = new Botao(12, 100); //pino 12 , debounce time 100
Serial.begin(9600);
}
void loop() {
b->atualiza(); //faz a leitura do estado do pino e atualiza as variaveis de controle
if ( b->pressionou() ) { led_1(); Serial.println("pressionou"); } //liga led 1
if ( b->soltou() ) { led_2(); Serial.println("soltou"); } //liga led 2
if ( b->tempo_pressionado() > 3000 ) { led_3(); Serial.println("3 segundos"); } //aciona beep depois de 3 segundos pressionado
b2->atualiza(); //faz a leitura do estado do pino e atualiza as variaveis de controle
if ( b2->pressionou() ) { led_1(); Serial.println("pressionou"); } //liga led 1
if ( b2->soltou() ) { led_2(); Serial.println("soltou"); } //liga led 2
if ( b2->tempo_pressionado() > 3000 ) { led_3(); Serial.println("3 segundos"); } //aciona beep depois de 3 segundos pressionado
}
void led_1() { digitalWrite(PINO_LED_1, !digitalRead(PINO_LED_1)); }
void led_2() { digitalWrite(PINO_LED_2, !digitalRead(PINO_LED_2)); }
void led_3() { digitalWrite(PINO_LED_3, true); }
vc tem outro video com exemplo biblioteca como construir obrigado vc me der uma luz
ResponderExcluirsou iniciante gosoto muito de programa mais estou começando agora e estou aprendendo muito
com seus videos obrigado que Deus abençoe vc cada dia e família
ola amigo, tentei usar esse código, ele chega a carregar, porem no momento em que tento usar, ele sequer liga os reles, sabe o que pode ser?
ResponderExcluir