Publicidade:

terça-feira, 30 de setembro de 2014

Arduino - Dicas de Programação 04 - Orientação a Objetos

Exemplo de criação de código Orientado a Objetos a partir de um exemplo simples.
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); }

quarta-feira, 24 de setembro de 2014

Arduino - Controle Remoto - Reaproveitando Infravermelho de TV

Retirei uma plaquinha com um circuito de controle remoto de uma tv velha para usar com o Arduino.

O Circuito funcionou perfeitamente.









Para baixar a biblioteca, clique aqui

Extraia a bilbioteca na pasta libraries do Arduino.
Para a versão 1.0 da IDE do Arduino, abra o arquivo "IRRemoteInt.h" com um editor de texto e troque a seguinte linha:


"#include <WProgram.h>" 

para 

"#include <Arduino.h>". 

Código-Fonte:



/*
 * IRremote: IRrecvDemo - demonstrates receiving IR codes with IRrecv
 * An IR detector/demodulator must be connected to the input RECV_PIN.
 * Version 0.1 July, 2009
 * Copyright 2009 Ken Shirriff
 * http://arcfn.com
 */

#include <IRremote.h>

int RECV_PIN = 11;
int RELAY_PIN = 2;

IRrecv irrecv(RECV_PIN);
decode_results results;

// Dumps out the decode_results structure.
// Call this after IRrecv::decode()
// void * to work around compiler issue
//void dump(void *v) {
//  decode_results *results = (decode_results *)v
void dump(decode_results *results) {
  int count = results->rawlen;
  if (results->decode_type == UNKNOWN) {
    Serial.println("Could not decode message");
  } 
  else {
    if (results->decode_type == NEC) {
      Serial.print("Decoded NEC: ");
    } 
    else if (results->decode_type == SONY) {
      Serial.print("Decoded SONY: ");
    } 
    else if (results->decode_type == RC5) {
      Serial.print("Decoded RC5: ");
    } 
    else if (results->decode_type == RC6) {
      Serial.print("Decoded RC6: ");
    }
    Serial.print(results->value, HEX);
    Serial.print(" (");
    Serial.print(results->bits, DEC);
    Serial.println(" bits)");
  }
  Serial.print("Raw (");
  Serial.print(count, DEC);
  Serial.print("): ");

  for (int i = 0; i < count; i++) {
    if ((i % 2) == 1) {
      Serial.print(results->rawbuf[i]*USECPERTICK, DEC);
    } 
    else {
      Serial.print(-(int)results->rawbuf[i]*USECPERTICK, DEC);
    }
    Serial.print(" ");
  }
  Serial.println("");
}

void setup()
{
  pinMode(RELAY_PIN, OUTPUT);
  pinMode(13, OUTPUT);
    Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
}

int on = 0;
unsigned long last = millis();

void loop() {
  if (irrecv.decode(&results)) {
    // If it's been at least 1/4 second since the last
    // IR received, toggle the relay
    if (millis() - last > 250) {
      on = !on;
      digitalWrite(RELAY_PIN, on ? HIGH : LOW);
      digitalWrite(13, on ? HIGH : LOW);
      dump(&results);
    }
    last = millis();      
    irrecv.resume(); // Receive the next value
  }
}