Arduino IR Kumanda ile Menü Kontrol

Arduino Uno'da IR (Kızılötesi) Kumanda ile I2C LCD Ekranda Menü Kontrolü uygulaması.
Program içerisinde gerekli açıklamaları yazdım. Kendi ihtiyacınıza göre programı geliştirebilirsiniz. Devre şeması eklemedim, program içerisinde hangi pin nereyle bağlantılı yazılı.

Malzeme listesi:
Arduino Uno, I2C + 1602 LCD,IR alıcı, herhangi bir IR kumanda
IR alıcıyı eski uydu cihazlarından da sökebilirsiniz
IR alıcının 3 tane bacağı vardır: GND, VSS, OUT (şase, +V, çıkış)
Kulandığınız modele göre ayak bağlantılarına dikkat edin.

Önce ayrı bir program ile kumanda kodlarını öğreniyoruz ve kullanıyoruz. Bununla ilgili ino dosyası kodlarını aşağıda verdim. Ayrıca bütün kodları da aşağıdaki linkten indirebilirsiniz.
Ben Next UK-660 uydu alıcısı (Next Minix Punto Plus) kumandasını kullandım
(kodlarını öğrenebildiğiniz her kumandayı kullanabilirsiniz)

Arduino Uno bağlantıları:
A0 ==> IR alıcı OUT
A4 ==> I2C LCD SDA  (data)
A5 ==> I2C LCD SCL  (clock)








I2C LCD kütüphanesini eklemedim. Kullandığınız kütüphaneye göre aşağıda kodlarda mavi renkle belirttiğim satırları kendinize göre düzenleyebilirsiniz. Doğrudan LCD kütüphanesi de kullanabilirsiniz ama mavi renkli yerleri düzenlemeyi unutmayın.
Menüleri seçince yaptırmak istediğiniz işlemleri void action... fonksiyonları içine yerleştirin.

IR_Menu.ino dosyası kodları:

/*  IR (Kızılötesi) Kumanda ile Menü Kontrol
 *  Ekim 2019-kodlagitsin
 *  kodlagitsin.blogspot.com
 *
 *  Malzeme listesi:
    Arduino Uno, I2C + 1602 LCD,IR alıcı, herhangi bir IR kumanda
    IR alıcıyı eski uydu cihazlarından sökebilirsiniz
    3 tane bacağı vardır GND, VSS, OUT (şase, +V, çıkış)
    kulandığınız modele göre ayak bağlantılarına dikkat edin.
 *  Ayrı bir program ile kumanda kodlarını öğreniyoruz ve burada kullanıyoruz
    Ben Next UK-660 uydu alıcısı (Next Minix Punto Plus) kumandasını kullandım
   (kodlarını öğrenebildiğiniz her kumandayı kullanabilirsiniz)
   A0 ==> IR alıcı OUT
   A4 ==> I2C LCD SDA  (data)
   A5 ==> I2C LCD SCL  (clock)
*/

#include <IRremote.h>   // IR alıcılar için kütüphane

#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C  lcd(0x27,2,1,0,4,5,6,7);

//--------NEXT KUMANDA KODLARI-----------------------------------------------------
# define ileri    0x80BF53AC      // p+
# define geri   0x80BF4BB4        // p-
# define ekran  0x80BF6B94        // epg
# define secim  0x80BF738C        // ok
#define  menu_liste   0x80BF0BF4  // info
//---------------------------------------------------------------------------------

const int receive = A0;         // IR pini tanımlıyoruz(IR output çıkışı ==> A0 'a bağlanacak)
IRrecv irrecv(receive);
decode_results dec;

int menu = 1;                   // hangi menüde olduğumuzu tutan değişkenimiz

void setup() {
  irrecv.enableIRIn();
  lcd.begin(16, 2);
  lcd.setBacklightPin(3,POSITIVE);
  lcd.setBacklight(HIGH);
  normalEkran();
}

void loop() {

  if(irrecv.decode(&dec))        // IR alıcıdan sinyal alırsa-----------------------------
   {
  if (dec.value==menu_liste){   // IR kumandanın menu_liste tusuna basılırsa
    updateMenu();
   }
  if (dec.value==ekran){      // IR kumandanın ekran tuşunabasılırsa
   normalEkran();
  menu=1;
   }
 
if (dec.value==geri){        // IR kumandanın geri tuşuna basılırsa
    menu++;
    updateMenu();
    delay(100);
  }
  if (dec.value==ileri){     // IR kumandanın ileri tuşuna basılırsa
    menu--;
    updateMenu();
    delay(100);
  }
  if (dec.value==secim){ 
    // IR kumandanın secim tusuna basılırsa---/menuden herhangi bir seçim yapınca
    executeAction();
    updateMenu();
    delay(100);
  }
   irrecv.resume();        // IR alıcıdan komut almaya devam et........................
   }
}

void normalEkran()
{ /* burası açılışta LCD ekranda görünmesini istediğimiz bölüm,
     ... saat ekranı olabilir ...
  */
    lcd.clear();
    lcd.setCursor(2, 0);
    lcd.print("KODLA GiTSiN");
    lcd.setCursor(0, 1);
  lcd.print("IR Menu Kontrol ");
  }

void updateMenu() {
  /* menü elemanlarınmızı LCD ekrana getiren bölüm
    menuden herhangi bir seçim yapınca executeAction() fonksiyonuna atlıyor */

  switch (menu) {
    case 0:
      menu = 1;
      break;
    case 1:
      lcd.clear();
      lcd.print(">Menu 1");
      lcd.setCursor(0, 1);
      lcd.print(" Menu 2");
      break;
    case 2:
      lcd.clear();
      lcd.print(" Menu 1");
      lcd.setCursor(0, 1);
      lcd.print(">Menu 2");
      break;
    case 3:
      lcd.clear();
      lcd.print(">Menu 3");
      lcd.setCursor(0, 1);
      lcd.print(" Menu 4");
      break;
    case 4:
      lcd.clear();
      lcd.print(" Menu 3");
      lcd.setCursor(0, 1);
      lcd.print(">Menu 4");
      break;
    case 5:
      menu = 4;
      break;
  } 
}

void executeAction() { // menu numarasına göre olaylara zıplama bölümü
  switch (menu) {
    case 1:   // 1.menü seçilirse
      action1();
      break;
    case 2:  // 1.menü seçilirse
      action2();
      break;
    case 3:  // 1.menü seçilirse
      action3();
      break;
    case 4:  // 1.menü seçilirse
      action4();
      break;
  }

}

void action1() {         
  // 1.olayımız için kodlar buraya----------
  lcd.clear();
  lcd.print(">olay #1");
  delay(1500);
}

void action2() {         
  // 2.olayımız için kodlar buraya----------
  lcd.clear();
  lcd.print(">olay #2");
  delay(1500);
}

void action3() {           
  // 3.olayımız için kodlar buraya----------
  lcd.clear();
  lcd.print(">olay #3");
  delay(1500);
}

void action4() {         
  // 4.olayımız için kodlar buraya----------
  lcd.clear();
  lcd.print(">olay #4");
  delay(1500);
}


IR Kumanda kodlarını öğrenebilmeniz için aşağıdaki programı kullanıp Seri Port Ekranında kodları alabilirsiniz. IR alıcı out çıkışı Arduino Uno'nun A0 pinine bağlı. Pek çok farklı kumanda için kodları öğrenebiliyorsunuz. Kütüphane dosyası ekte sunulmuştur.

IR_kod.ino dosyası kodları:

/*
 * 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
 */
// Seri Port Ekranında hemen her türlü uzaktan kumanda kodlarını öğrenebilirsiniz

#include <IRremote.h> 

int RECV_PIN = A0;   // başka bir pin de tanımlayabilirsiniz

IRrecv irrecv(RECV_PIN);
decode_results results;

void setup()
{
  pinMode(13, OUTPUT);
  Serial.begin(9600);
  irrecv.enableIRIn(); // Alıcıyı başlat
}

void loop() {
  if (irrecv.decode(&results)) {
           dump(&results); 
     }
   irrecv.resume(); // Bir sonraki değeri almak için devam et
     delay(1000);
}

void dump(decode_results *results) {
  int count = results->rawlen;
  if (results->decode_type == UNKNOWN) {
    Serial.println("Mesajın kodu çözülemedi");
  }
  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.println("");
}

PROGRAM DOSYALARINI İNDİR

KULLANILAN PROGRAMLAYICI: Arduino 1.8.10

Yorumlar