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

quinta-feira, 21 de agosto de 2014

Arduino - Dicas de Programação - 03

Mais dois vídeos com dicas de programação para arduino.








// Definindo variáveis
#define LED_A 2
#define LED_B 3
#define LED_C 4
#define LED_D 6
#define LED_E 7
#define LED_F 9
#define LED_G 8

// Delay entre letras (ms)
const int tempo=500;

void setup(){
  pinMode(LED_A,OUTPUT);
  pinMode(LED_B,OUTPUT);
  pinMode(LED_C,OUTPUT);
  pinMode(LED_D,OUTPUT);
  pinMode(LED_E,OUTPUT);
  pinMode(LED_F,OUTPUT);
  pinMode(LED_G,OUTPUT);
}

void setDisplay(bool a, bool b, bool c, bool d, bool e, bool f, bool g){
  digitalWrite(LED_A, a);  
  digitalWrite(LED_B, b);  
  digitalWrite(LED_C, c);  
  digitalWrite(LED_D, d);  
  digitalWrite(LED_E, e);  
  digitalWrite(LED_F, f);  
  digitalWrite(LED_G, g);
}

void setDisplay(char c){

  setDisplay(0,0,0,0,0,0,0);     //apaga tudo
  
                                      // a b c d e f g                  
  if (c == '0')             { setDisplay(1,1,1,1,1,1,0); }
  if (c == '1')             { setDisplay(0,1,1,0,0,0,0); }
  if (c == '2')             { setDisplay(1,1,0,1,1,0,1); }
  if (c == '3')             { setDisplay(1,1,1,1,0,0,1); }
  if (c == '4')             { setDisplay(0,1,1,0,0,1,1); }
  if (c == '5')             { setDisplay(1,0,1,1,0,1,1); }
  if (c == '6')             { setDisplay(1,0,1,1,1,1,1); }
  if (c == '7')             { setDisplay(1,1,1,0,0,0,0); }
  if (c == '8')             { setDisplay(1,1,1,1,1,1,1); }
  if (c == '9')             { setDisplay(1,1,1,1,0,1,1); }
  
  if (c == 'a' || c == 'A') { setDisplay(1,1,1,0,1,1,1); }
  if (c == 'r' || c == 'R') { setDisplay(0,0,0,0,1,0,1); }
  if (c == 'd' || c == 'D') { setDisplay(0,1,1,1,1,0,1); }
  if (c == 'u' || c == 'U') { setDisplay(0,1,1,1,1,1,0); }
  if (c == 'i' || c == 'I') { setDisplay(0,1,1,0,0,0,0); }
  if (c == 'n' || c == 'N') { setDisplay(0,0,1,0,1,0,1); }
  if (c == 'o' || c == 'O') { setDisplay(1,1,1,1,1,1,0); }
  
  //fazer para os demais caracteres!!!
}

void showDisplayChar(char c, int timeOn, int timeOff, int atraso){
  long resto = (millis()-atraso+100000) % (timeOn + timeOff);
  
  if (resto < timeOn) { setDisplay(c); }
}


void showDisplayString(String s, int timeOn){
  for (int i=0; i< s.length();i++){
    showDisplayChar(s[i], timeOn, timeOn * s.length()-timeOn, (i-1)*timeOn );
  }
}


void loop(){
  showDisplayString("0123456789 ARDUINO ", tempo);
  
  
}





Inscreva-se no meu canal do youtube para ver mais vídeos como esse!