Arduino 4 Bit Binary Counter

dogukanhan tarafından tarihinde yayınlandı

Özet

Bu deneyde butona basıldığında binary olarak sayı saymamız ve bunu ledler üzerinden göstermemiz amaçlanmıştır soldan sağa ilk led 0’inci bit olmak üzere 4 bitden oluşmaktadır. 5’inci led butona basılıp basılmadığını kontrol eden ufak bir ayrıntıdır ve gerekli değildir.

Not

Arduino ide içerisinde birden fazla sekme kullanımında soldan sağa doğru derleme işlemi gerçekleştirdiğinden dolayı, bir sekmedeki değişkenler yalnızca o sekmenin sağındaki sekmeler içerisinden erişilebilmektedir. Sekmeler alfabetik bir düzende tutulduğundan dolayı isimledirme yapılırken derleme sırasında hata almamak için başlarına sayı koyulması gerekmektedir.

1_deney.ino dosyası

Bu dosya içerisinde gerekli çıkışların tanımlanmış ve sabitler belirlenmiştir.

// Constant Definations
#define LED_COUNT 4
#define PIN_LED1 2
#define PIN_LED2 3
#define PIN_LED3 4
#define PIN_LED4 5

#define PIN_LED_DELAY 9

#define PIN_BUTTON_ACTION 8

#define BIT(n,i) (n>>i&1)

2_Button.ino

Bu dosya içerisinde Buton sınıfı tanımlanmıştır ve isPressed methodu ile basılıp basılmadığı kontrol edilebilmektedir.

class Button{
  private:
    byte pin;

  public:
    Button(byte pin){
      this->pin = pin;
      pinMode(this->pin,INPUT);
    }

    boolean isPressed(){
        return digitalRead(this->pin) == LOW;
    }
};

3_Led.ino dosyası

Bu dosya içerisinde Led sınıfı tanımlanmıştır, isOn methodu ile yanıp yanmadığını, setOn on ve off methotları ile ledin yanıp söndürülebilmesi amaçlanmıştır.

class Led{
  
  private:
    byte pin;
    bool led_is_on;

  public:
   
    Led(byte pinLed){
      this->pin = pinLed;
      this->led_is_on = false;
      pinMode(pinLed,OUTPUT);
      digitalWrite(pinLed,this->led_is_on);
    }

    boolean isOn(){
      return this->led_is_on;
    }

    void setOn(bool value){
      if(value){
        this->on();
      }else{
        this->off();
      }
    }

    void on(){
      if(!isOn()){
        this->led_is_on = true;
        digitalWrite(this->pin,this->led_is_on);
      }
    }

    void off(){
      if(isOn()){
        this->led_is_on = false;
        digitalWrite(this->pin,this->led_is_on);
      }
    }
    
};

4_Counter.ino Dosyası

Bu dosya içerisinde abstract bir counter sınıfı tanımlanmıştır. Turnleds methodu sınıfın içerisinde yer alan value değişkenini byte’a çevirerek gerekli ledleri yakmaktadır.

class Counter{
  
  protected:
    Led *leds;
    byte value = 0;
    
  public:
  
    Counter(Led *leds){
      this->leds = leds;     
    }
 
    virtual void count(){
   
    }

    //https://stackoverflow.com/questions/29983943/converting-int-to-binary-in-c-arduino
    void turnLeds(){
       for(byte i=0;i<LED_COUNT;i++){
         this->leds[i].setOn(BIT(value,i));
       }
    }
    
};

4_BinaryCounter.ino Dosyası

Bu dosya içerisinde Counter sınıfını extends eden bir BinaryCounter sınıfı yer almaktadır. BinaryCounter nasıl bir sayma işlemini kendi belirler ve üst sınıfının turnleds methodunu çağırarak sayma işleminin ledlerin yakılmasıyla sonuçlanmasını sağlar.

 
class BinaryCounter : public Counter{

    public:
      BinaryCounter(Led *leds) : Counter(leds){
      }
    
      void count() override
      {
        this->value = this->value + 1;
        
        if(this->value == 16){
          this->value = 0;
        }
      
        this->turnLeds();

      }
  
};

98_setup.ino

Bu dosya içerisinde ledler ve butonun tanımlanmış BinaryCounter sınıfından bir nesne oluşturulmıştur.

Led leds[] = {
   Led(PIN_LED1),
   Led(PIN_LED2),
   Led(PIN_LED3),
   Led(PIN_LED4)
};

Led delayLed(PIN_LED_DELAY);

Button countButton{ PIN_BUTTON_ACTION };

BinaryCounter counter(leds);

void setup(){
  counter.turnLeds();
}

99_loop.ino Dosyası

Bu dosya içerisinde arduino loop methodu yer almaktadır ve butonun basıldığı durumda binary counter nesnesinin count metodu çağrılarak ledlerin yakılması amaçlanmaktadır.

void loop() {

  if(countButton.isPressed()){
        delayLed.on();
        counter.count();
        delay(400);
        delayLed.off();
  }

  delay(20);
}
Kategoriler: Arduino

0 yorum

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir