Raspberry Pi 3 ile Birlikte 3×4 Membran Tuş Takımı Yardımıyla Java dilinde birçok sensörü kontrol etme

Raspberry Pi 3’te Java dilini kullanarak yazacağımız uygulamada 3×4 Membran tuş takımını kullanarak çeşitli sensörleri okuyacak ve bazı işlemleri yaparak LCD ekran üzerinde gösterim sağlayacağız. Devreyi kurmak için gerekli araçlar

  • Raspberry Pi 3
  • Breadboard
  • GPIO Genişleme Kartı
  • Dişi-Dişi Erkek-Erkek Dişi-Erkek jumper kablo
  • Sıcaklık ve Nem Sensörü
  • Işık Sensörü
  • Ultrasonic Mesafe Sensörü
  • 2×16 LCD Ekran
  • 3×4 Membran Tuş Takımı
  • Potansiyometre ve Kapağı
  • 2 adet direnç

2×16 LCD ekranın breadboard’a nasıl bağlanacağı daha önceki yazımızda belirtmiştik. (http://fatihadak.com/?p=230)  Geri kalan devrenin nasıl bağlanacağı aşağıdaki şekilde verilmiştir. Bu uygulamadaki amaç belli görevlerin tuş takımı ile Raspberry pi’e iletilmesi ve bu görevlerde okunan değerlerin LCD ekranda gösterilmesi. Bu şekilde bilgisayara klavye ile müdahale etmeden bazı görevleri gerçekleştirmiş olacağız. Bu uygulamada gerçekleştirecek işlemler aşağıda verilmiştir.

[1] İşletim Sistemi            (Cihazda kurulu olan işletim sistemini gösterir)

[2] Kullanılan Bellek        (Cihazda o anda kullanımda olan bellek miktarını gösterir)

[3] İşlemci Sıcaklığı          (İşlemcinin sıcaklığını gösterir)

[4] Tarih                               (Sistemin tarihini gösterir)

[5] Saat                                (Sistemin saatini gösterir)

[6] Sıcaklık                          (Oda sıcaklığını gösterir)

[7] Nem                               (Odadaki nem miktarını yüzdelik olarak gösterir)

[8] Oda Işık Durumu       (Oda aydınlık mı karanlık mı?)

[9] Mesafe                         (Mesafe ölçen sensörle en yakın engele olan mesafeyi cm olarak verir)

[0] Ekranı Temizle            (LCD ekrandaki yazıları siler)

[*] Otomatik / Manuel  (Herhangi bir tuşa ihtiyaç duyamadan yukarıdaki komutları belli aralıkla çalıştırır.)

[#] Kapat                             (LCD ekranı temizleyip uygulamayı kapatır.)

Yukarıdaki komutlar yanında belirtilen sayı 3×4 tuş takımında basılarak gerçekleştirilmiş olacaktır.

Herşey LCD ekranda gösterileceği için Ekran isminde bir sınıf oluşturulmuştur. Ekran sınıfı, ekran hangi pinlerle Raspberry pi’ye bağlanmışsa bu ayarlamaları yapar ve bağlantıyı kurar. Ekranda bir mesaj gösterilmek istendiğinde Goster metodu çağrılmalıdır. Bu metot 4 parametre almaktadır. İlk iki parametre LCD ekranda gösterilecek mesajları belirtir. 3. Parametre eğer mesaj ortalanmak isteniyorsa true olarak girilmelidir. 4. Parametre ise mesaj yazılmadan önce LCD temizlenmesini sağlar.

public class Ekran {
public final int EkranSatir1 = 0;
public final int EkranSatir2 = 1;
public final String BosSTR = " "; //16 karakterli boş string
final GpioController gpio = GpioFactory.getInstance();
final GpioLcdDisplay lcd = new GpioLcdDisplay(2,    // LCD Satır Sayısı
                                              16,       // LCD Sütun Sayısı
                                                RaspiPin.GPIO_06,  // LCD RS pini
                                                RaspiPin.GPIO_05,  // LCD E pini
                                                RaspiPin.GPIO_04,  // LCD D4 Veri Biti
                                                RaspiPin.GPIO_00,  // LCD D5 Veri Biti
                                                RaspiPin.GPIO_01,  // LCD D6 Veri Biti
                                                RaspiPin.GPIO_03); // LCD D7 Veri Biti 

public void Goster(String str1Mesaj, String str2Mesaj,boolean ortala ,boolean temizle){
    try{
        if(temizle) lcd.clear();

        Thread.sleep(100);
        String str1Bos="",str2Bos="";

        if(ortala){
            str1Bos = Bosluk(str1Mesaj);
            str2Bos = Bosluk(str2Mesaj);
        }
        lcd.write(EkranSatir1,str1Bos + str1Mesaj + str1Bos);
        Thread.sleep(100);
        lcd.write(EkranSatir2,str2Bos + str2Mesaj + str2Bos);
        Thread.sleep(500);
    }
    catch(Exception e){

    }
}

private String Bosluk(String mesaj){
    int bosluk = (16-mesaj.length())/2;
    return BosSTR.substring(0, bosluk);
}
public void Clear(){
    try{
    lcd.clear();
    Thread.sleep(500);
    }
    catch(Exception e){

    }
}
public void Close(){
    try{
        lcd.clear();
        Thread.sleep(500);
    }
    catch(Exception e){

    }
    gpio.shutdown();
}
}

[1] İşletim Sistemi Birinci seçeneğe basıldığında Raspberry pi’ye kurulu olan işletim sistemi ekranda gösterilir. d.Goster(“Isletim Sistemi”, SystemInfo.getOsName(),true,true);

[2] Kullanılan Bellek İkinci seçenekte o anda ne kadarlık bellek kullanımı olduğunu yüzdelik olarak gösterir. d.Goster(“Bellek Kullanimi”, “% “+String.valueOf(((SystemInfo.getMemoryUsed()/1024/1024)*100)/927),true,false);

[3] İşlemci Sıcaklığı Üçüncü seçenekte işlemcinin o andaki sıcaklığını ekranda gösterir. d.Goster(“Islemci Sicaklik”, String.valueOf(SystemInfo.getCpuTemperature()) + ” C”,true,false);

[4] Tarih Sistemin tarihini formata uygun olarak gösterir. d.Goster(“Tarih”, sdff.format(call.getTime()),true,true);

[5] Saat Sistemin saatini formata uygun olarak gösterir. d.Goster(“Saat”, sdf.format(cal.getTime()),true,false);

[6] Sıcaklık Odanın sıcaklığını ekranda gösterir.

[7] Nem Odadaki nem miktarını yüzdelik olarak gösterir. 6 ve 7 seçenekler için aşağıdaki Java sınıfı kullanılmıştır. Bu sınıf yine Python kodunu kullanarak derece ve nem değerlerini alır. Java dilinde Python kodu çalıştırılmıştır. Burada komutların ilki hangi Python versiyonu yüklü ise onu belirtmek gerekir. python -V komutu ile bilgisayarda hangi Python versiyonunun kurulu olduğu görülebilir. Python kodunda birkaç satırla sıcaklık ve nem değerleri kolayca alınabilir. Burada sensör üzerindeki veri pininin hangi GPIO pinine bağlı olduğu kod içerisinde verilmelidir. Bu örnekte GPIO4’e bağlı olduğu için 4 değeri verilmiştir. 11 değeri ise sensörün modelini ifade eder.

public class SicaklikveNem {

	private String pythonYol;
	String[] komutlar;
	Runtime rt;

	public SicaklikveNem(){
		pythonYol = new File("").getAbsolutePath()+"/src/mebrantus/Sicaklik.py";

		komutlar = new String[2];

		komutlar[0] = "python3";
		komutlar[1] = pythonYol;
		rt = Runtime.getRuntime();
	}

	@Override
	public String toString() {
		try{
			Process pr = rt.exec(komutlar);
			BufferedReader bfr = new BufferedReader(new InputStreamReader(pr.getInputStream()));

			String satir;

			if((satir = bfr.readLine()) != null){

				String []ifadeler = satir.split(";");

				String nem = "Nem : "+ifadeler[0];
				String sicaklik = "Sic: "+ifadeler[1];

				return nem + sicaklik;

			}
			else return "Okuma Hatası!";
		}
		catch(IOException ex){
			return "Okuma Hatası!";
		}
	}
	public String[] toStr(){
		try{
			Process pr = rt.exec(komutlar);
			BufferedReader bfr = new BufferedReader(new InputStreamReader(pr.getInputStream()));
			String satir;
			if((satir = bfr.readLine()) != null){
				String []ifadeler = satir.split(";");
				return ifadeler;
			}
			else throw new IllegalStateException("Okuma Hatası!");
		}
		catch(IOException ex){
			throw new IllegalStateException("Okuma Hatası!");
		}
	}
}
import Adafruit_DHT

nem, sicaklik = Adafruit_DHT.read_retry(11, 4)
print("{};{}".format(nem, sicaklik))

[8] Oda Işık Durumu

Odanın aydınlık veya karanlık olduğu ışık sensörü yardımıyla bulunmaktadır. Burada da sensör veri pini GPIO21. Pine bağlanmıştır.

Gpio.pinMode (21, Gpio.INPUT) ;

if (Gpio.digitalRead(21) == 0){	
	d.Goster("Oda Isik Durumu", "Aydinlik",true,true);
}	
else{
	d.Goster("Oda Isik Durumu", "Karanlik",true,true);
}

[9] Mesafe

Ultrasonic mesafe sensörü yardımıyla sensöre en yakın engele olan mesafe cm olarak ekranda gösterilmektedir. Bu işlem için Uzaklik isminde bir sınıf yazılmıştır. Buradaki mantık sensörden ultrasonic ses dalgası gönderilir en yakın engele çarpan ses dalgası tekrar sensöre geri döner. Bu arada geçen zaman kod yardımıyla kaydedilir ve mesafe hesaplanır.

public class Uzaklik {
	//GPIO Pins
	private GpioPinDigitalOutput sensorTriggerPin ;
	private GpioPinDigitalInput sensorEchoPin ;
	final GpioController gpio = GpioFactory.getInstance();

	public Uzaklik(){
		sensorTriggerPin = gpio.provisionDigitalOutputPin(RaspiPin.GPIO_28); // Trigger pin as OUTPUT
		sensorEchoPin = gpio.provisionDigitalInputPin(RaspiPin.GPIO_23,PinPullResistance.PULL_UP); // Echo pin as INPUT
	}
	public double calculate() throws InterruptedException{
		try {
			sensorTriggerPin.high();
			Thread.sleep((long) 0.01);
			sensorTriggerPin.low();

			while(sensorEchoPin.isLow()){

			}
			long baslangicZaman= System.nanoTime();
			while(sensorEchoPin.isHigh()){

			}
			long bitisZaman= System.nanoTime();
			return ((((bitisZaman-baslangicZaman)/1e3)/2) / 29.1);
		}
		catch (InterruptedException e){
			e.printStackTrace();
		}

		return -1;
	}	
}

Yukarıda anlatılan bu işlemleri kontrol eden sınıf aşağıda verilmiştir.

public class TusTakimi {
	private List listener = new ArrayList();
	public static final String KEY = "key";
	public char basilanTus;
	private static final char keypad[][] = { { '1', '2', '3' },
											 { '4', '5', '6' },
											 { '7', '8', '9' },
											 { '*', '0', '#' } };

	private final GpioController theGpio = GpioFactory.getInstance();

	private static final Pin PIN_1_IN = RaspiPin.GPIO_11;
	private static final Pin PIN_2_IN = RaspiPin.GPIO_10;
	private static final Pin PIN_3_IN = RaspiPin.GPIO_14;
	private static final Pin PIN_4_IN = RaspiPin.GPIO_02;
	private static final Pin PIN_5_OUT = RaspiPin.GPIO_13;
	private static final Pin PIN_6_OUT = RaspiPin.GPIO_12;
	private static final Pin PIN_7_OUT = RaspiPin.GPIO_16;

	private final GpioPinDigitalInput thePin1 = theGpio.provisionDigitalInputPin(PIN_1_IN, PinPullResistance.PULL_UP);
	private final GpioPinDigitalInput thePin2 = theGpio.provisionDigitalInputPin(PIN_2_IN, PinPullResistance.PULL_UP);
	private final GpioPinDigitalInput thePin3 = theGpio.provisionDigitalInputPin(PIN_3_IN, PinPullResistance.PULL_UP);
	private final GpioPinDigitalInput thePin4 = theGpio.provisionDigitalInputPin(PIN_4_IN, PinPullResistance.PULL_UP);
	private final GpioPinDigitalOutput thePin5 = theGpio.provisionDigitalOutputPin(PIN_5_OUT);
	private final GpioPinDigitalOutput thePin6 = theGpio.provisionDigitalOutputPin(PIN_6_OUT);
	private final GpioPinDigitalOutput thePin7 = theGpio.provisionDigitalOutputPin(PIN_7_OUT);
	private final GpioPinDigitalOutput theOutputs[] = { thePin5, thePin6,thePin7};

	private GpioPinDigitalInput theInput;
	private int theLin;
	private int theCol;
	public TusTakimi(){
		basilanTus='-';
		initListeners();
	}

	private void initListeners() {

	thePin1.addListener(new GpioPinListenerDigital() {

	@Override
	public void handleGpioPinDigitalStateChangeEvent(

		final GpioPinDigitalStateChangeEvent aEvent) {

		if (aEvent.getState() == PinState.LOW) {

		theInput = thePin1;

		theLin = 1;

		findOutput();

		}

		}

	});

	thePin2.addListener(new GpioPinListenerDigital() {
	
	@Override
	public void handleGpioPinDigitalStateChangeEvent(

	final GpioPinDigitalStateChangeEvent aEvent) {

	if (aEvent.getState() == PinState.LOW) {
		theInput = thePin2;
		theLin = 2;

		findOutput();
	}

	}

	});

	thePin3.addListener(new GpioPinListenerDigital() {

	@Override


	public void handleGpioPinDigitalStateChangeEvent(


	final GpioPinDigitalStateChangeEvent aEvent) {

	if (aEvent.getState() == PinState.LOW) {

	theInput = thePin3;
	theLin = 3;
	findOutput();
	}
	}
	});


	thePin4.addListener(new GpioPinListenerDigital() {


	@Override
	public void handleGpioPinDigitalStateChangeEvent(
	final GpioPinDigitalStateChangeEvent aEvent) {
		if (aEvent.getState() == PinState.LOW) {
			theInput = thePin4;
			theLin = 4;
			findOutput();
		}
	}
	});
	}

	private void findOutput() {
		for (int myO = 0; myO < theOutputs.length; myO++) {
		for (final GpioPinDigitalOutput myTheOutput : theOutputs) {
		myTheOutput.high();
	}
	theOutputs[myO].low();
	if (theInput.isLow()) {

		theCol = myO;
		checkPins();
		try {
			Thread.sleep(200);
		} 
		catch (InterruptedException e) {

		}
		break;
	}


	}
	for (final GpioPinDigitalOutput myTheOutput : theOutputs) {
		myTheOutput.low();
	}
	}

	private synchronized void checkPins() {
		notifyListeners(this, KEY, this.basilanTus,
		this.basilanTus = keypad[theLin - 1][theCol]);
	}

	private void notifyListeners(Object object, String property, char oldValue,char newValue) {
		for (PropertyChangeListener name : listener) {
			name.propertyChange(new PropertyChangeEvent(this, property,oldValue, newValue));
		}
	}

	public void addChangeListener(PropertyChangeListener newListener) {
		listener.add(newListener);
	}
}

Tasarlanan devreden resimler

You may also like...

Bir cevap yazın

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