Arduino Esplora’da Otomatik LCD Döndürme

Arduino-Esplora-Auto-LCD-RotationHerkese tekrar merhaba. Bir başka Arduino yazısı ile sizlerleyim.

Yazımda Arduino Esplora‘nın dahili ivme sensörünü kullanarak LCD’nin yönünü otomatik olarak nasıl çevirebileceğimize değinmek istiyorum.

Arduino Esplora’nın ivme sensörü hakkındaki detaylı bilgi için Arduino Esplora’ya Giriş başlıklı önceki yazımı inceleyebilirsiniz.

Bu çalışmayı yaparken Adafruit’in ST7735 ve GFX LCD kütüphanelerini kullandım. Eğer Arduino yazılımınıza bu kütüphaneler kurulu değilse bir önceki yazımı incelemenizi tavsiye ediyorum:
Arduino Esplora ile Güzel Bir Termometre Projesi

LCD döndürmenin mantığını az çok akıllı telefonlardan biliyorsunuzdur. Üzerlerindeki ivme sensörünü kullanarak, kullanıcının cihazı tutuş yönünü algılıyorlar ve ekranı uygun yöne döndürerek kullanım kolaylığı sağlıyorlar.

Esplora LCD Rotation

Burada da buna benzer bir mantıkta ivme sensöründen aldığım bilgiyi birkaç ifelse if yapısından geçirerek Arduino Esplora‘nın konumunu belirlemeye çalıştım.

Mutlaka daha iyi ve hızlı bir algoritması vardır bu işlemin ama aşağıdaki kod da fevkalade iş görüyor.

Katkılarınız ve sorularınız için aşağıdaki yorum bölümünü kullanmaktan çekinmeyin. 🙂

İşte video’su:

 

/**
 * @file   Esplora_LCD_Otomatik_Dondurme.ino
 * @author M. Hamit YANIK (hamityanik@hotmail.com)
 * @date   Eylül, 2013
 * @brief  Arduino Esplora'nın LCD'sinin iPhone benzeri
 *         otomatik döndürülmesi
 *
 * Arduino Esplora + TFT LCD ile üzerindeki ivme sensörü kullanılarak
 * yapılmış otomatik LCD döndürme uygulaması.
 * www.arduinoturkiye.com
 */

#include <Esplora.h>// Esplora hazır fonksiyonlarını kullanmak için
#include <Adafruit_GFX.h>// Çekirdek grafik kütüphanemizi dahil edelim
#include <Adafruit_ST7735.h>// Esplora LCD'sinin sürücüsünü dahil edelim
#include <SPI.h>// Esplora LCD'sini SPI haberleşme kullanarak daha hızlı
                             // kullanmak için SPI.h dosyasını dahil edelim

// Esplora LCD'sinin pin bağlantılarını ayarlıyoruz
#define sclk 15 // Arduino'nun 15. pini: SCK clock pini
#define mosi 16 // Arduino'nun 16. pini: Master Output Slave Input (MOSI) data pini
#define cs   7
#define dc   0
#define rst  1

// RGB565CONVERT fonksiyonu 32 bit rgb renk kodunu 16 bit rgb renk koduna cevirir
// Photoshop, Adobe Fireworks gibi tasarım programları 32bit rgb renk kodları ile çalışır.
// Parlak kırmızı renk kodu bilgisayarda #FF3300 iken, bunu 16 bit renk koduna çevirmek
// için RGB565CONVERT fonksiyonundan geçirmeliyiz: RGB565CONVERT(0xFF, 0x33, 0x00)
#define RGB565CONVERT(red, green, blue)\
(uint16_t)((( red   >> 3 )<< 11 )| \
(( green >> 2 )<< 5  )| \
( blue  >> 3 ))

// Renk tanımlaması: Arduino mavisi.
#define mavi RGB565CONVERT(0x00, 0x97, 0x9C)

int yon = 0;
int eski_yon = 0;
bool donduruldu = false;
long previousMillis = 0;

// Seçenek 1: herhangi bir giriş-çıkış pinini kullanarak LCD ile haberleşebiliriz.
// ama bu biraz yavaş olacak.
//Adafruit_ST7735 tft = Adafruit_ST7735(cs, dc, mosi, sclk, rst);

// Seçenek 2: SPI donanım pinlerini kullanarak LCD ile haberleşelim.
// İşte bu LCD'yi kullanmanın en hızlı yolu!
Adafruit_ST7735 tft = Adafruit_ST7735(cs, dc, rst);

void setup(void) {
  // Eğer LCD'niz düzgün çalışmıyorsa aşağıdaki farklı tanımlamaları deneyin.
  // If your TFT's plastic wrap has a Black Tab, use the following:
  tft.initR(INITR_BLACKTAB);   // initialize a ST7735S chip, black tab
  // If your TFT's plastic wrap has a Red Tab, use the following:
  //tft.initR(INITR_REDTAB);   // initialize a ST7735R chip, red tab
  // If your TFT's plastic wrap has a Green Tab, use the following:
  //tft.initR(INITR_GREENTAB); // initialize a ST7735R chip, green tab

  tft.setTextWrap(false); // Yazı kaydırma kapalı
  tft.fillScreen(mavi); // Ekranı mavi renk ile doldur
}

void loop(void) {
  unsigned long currentMillis = millis();
  int saniye = (currentMillis/1000);

  // Saniyede bir yönü kontrol et
  // İşlemciyi çok meşgul etmemek için bunu saniyede bir defa yapmamız yeterli
  if(currentMillis - previousMillis > 1000) {
    previousMillis = currentMillis;

    // X Eksenini oku ve bilgiyi "x_ekseni" değişkenine aktar
    int x_ekseni = Esplora.readAccelerometer(X_AXIS);
    // Y Eksenini oku ve bilgiyi "y_ekseni" değişkenine aktar
    int y_ekseni = Esplora.readAccelerometer(Y_AXIS);

    /*
    // İvme sensörü verilerini LCD'ye yazdırmak için
    tft.fillRect(0, 0, 50, 30, ST7735_BLACK);
    tft.setCursor(0, 0);
    tft.print("X: ");
    tft.println(x_ekseni);
    tft.print("Y: ");
    tft.println(y_ekseni);
    tft.print("Z: ");
    tft.println(z_ekseni);
    */

    // İvme sensörü verisinin değerlendirilmesi
    if( (x_ekseni < -75) && (y_ekseni > -80 ) ) {
      donduruldu = true;
      yon = 0;
    } else if( (x_ekseni > 150) && (y_ekseni > -80 ) ) {
      donduruldu = true;
      yon = 2;
    } else if( (x_ekseni > -75) && (x_ekseni < 75 ) && (y_ekseni > 110) ) {
      donduruldu = true;
      yon = 1;
    } else if( (x_ekseni > -75) && (x_ekseni < 75 ) && (y_ekseni < -90) ) {
      donduruldu = true;
      yon = 3;
    }

    // saniyede bir saniyeyi ekrana yaz
    tft.setTextSize(3);
    tft.setCursor(10, 80);
    // sanye yazılacak yeri önce mavi ile doldur (yani ekranı temizle)
    tft.fillRect(10, 80, 150, 21, mavi);
    tft.println(saniye);
  }

  // Eğer Esplora'nın yönü değiştirildiyse bu işlemleri yap
  if( donduruldu == true && yon != eski_yon ) {
    // LCD'yi temizle
    tft.fillScreen(mavi);

    // LCD yönünü değiştir
    tft.setRotation(yon);

    // değişkenleri güncelle
    donduruldu = false;
    eski_yon = yon;
  }

  tft.setCursor(6, 6);
  tft.setTextSize(2);
  tft.println("Arduino");
  tft.setCursor(18, 22);
  tft.println("Turkiye");
  tft.setCursor(76, 34);
  tft.println(".com");
}

M. Hamit YANIK

Makine öğretmeni, elektronik meraklısı, gömülü sistemler hastası, Arduino seveni, web geliştiricisi.

4 comments

  1. kaanceyhan dedi ki:

    illa alacağım bir esplora!
    güzel bir örnek daha, eline sağlık.

  2. süleyman karan dedi ki:

    İyi günler. Sanırsam bu uygulamada bir problem var çalıştırmayı denedik ama hata veriyor biraz yeniyiz arduinoda çözemedikte sorunu yardımcı olursanız mutlu olucaz 🙂

  3. FURKAN AKBAŞ dedi ki:

    eplora ile ekran döndürme yaptım kodları gönderdim ekran 4 tane uzun kalın cizgiler cıktı proplem nedir acaba yardımcı olursanız sevinirim

E-posta adresiniz gösterilmeyecek. Gerekli alanlar * ile işaretlidir.

*



Sosyal Ağlar