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.

01
02
public class Ekran {
03
public final int EkranSatir1 = 0;
04
public final int EkranSatir2 = 1;
05
public final String BosSTR = "                "; //16 karakterli boş string
06
final GpioController gpio = GpioFactory.getInstance(); // LCD Sıfırlar ve Başlatır
07
final GpioLcdDisplay lcd = new GpioLcdDisplay(2,    // LCD Satır Sayısı
08
16,       // LCD Sütun Sayısı
09
RaspiPin.GPIO_06,  // LCD RS pini
10
RaspiPin.GPIO_05,  // LCD E pini
11
RaspiPin.GPIO_04,  // LCD D4 Veri Biti
12
RaspiPin.GPIO_00,  // LCD D5 Veri Biti
13
RaspiPin.GPIO_01,  // LCD D6 Veri Biti
14
RaspiPin.GPIO_03); // LCD D7 Veri Biti 
15
 
16
public void Goster(String str1Mesaj, String str2Mesaj,boolean ortala ,boolean temizle){
17
try{
18
if(temizle) lcd.clear();
19
Thread.sleep(100);
20
String str1Bos="",str2Bos="";
21
if(ortala){
22
str1Bos = Bosluk(str1Mesaj);
23
str2Bos = Bosluk(str2Mesaj);
24
}
25
lcd.write(EkranSatir1,str1Bos + str1Mesaj + str1Bos);
26
Thread.sleep(100);
27
lcd.write(EkranSatir2,str2Bos + str2Mesaj + str2Bos);
28
Thread.sleep(500);
29
}
30
catch(Exception e){
31
 
32
}
33
}
34
private String Bosluk(String mesaj){
35
int bosluk = (16-mesaj.length())/2;
36
return BosSTR.substring(0, bosluk);
37
}
38
public void Clear(){
39
try{
40
lcd.clear();
41
Thread.sleep(500);
42
}
43
catch(Exception e){
44
 
45
}
46
}
47
public void Close(){
48
try{
49
lcd.clear();
50
Thread.sleep(500);
51
}
52
catch(Exception e){
53
 
54
}
55
gpio.shutdown();
56
}
57
}
58

[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.

01
02
public class SicaklikveNem {
03
private String pythonYol;
04
String[] komutlar;
05
Runtime rt;
06
public SicaklikveNem(){
07
pythonYol = new File("").getAbsolutePath()+"/src/mebrantus/Sicaklik.py";
08
komutlar = new String[2];
09
komutlar[0] = "python3";
10
komutlar[1] = pythonYol;
11
 
12
rt = Runtime.getRuntime();
13
}
14
 
15
@Override
16
public String toString() {
17
try{
18
Process pr = rt.exec(komutlar);
19
 
20
BufferedReader bfr = new BufferedReader(new InputStreamReader(pr.getInputStream()));
21
String satir;
22
if((satir = bfr.readLine()) != null){
23
String []ifadeler = satir.split(";");
24
String nem = "Nem : "+ifadeler[0];
25
String sicaklik = "Sic: "+ifadeler[1];
26
return nem + sicaklik;
27
}
28
else return "Okuma Hatası!";
29
}
30
catch(IOException ex){
31
return "Okuma Hatası!";
32
}
33
}
34
public String[] toStr(){
35
try{
36
Process pr = rt.exec(komutlar);
37
 
38
BufferedReader bfr = new BufferedReader(new InputStreamReader(pr.getInputStream()));
39
String satir;
40
if((satir = bfr.readLine()) != null){
41
String []ifadeler = satir.split(";");
42
return ifadeler;
43
}
44
else throw new IllegalStateException("Okuma Hatası!");
45
}
46
catch(IOException ex){
47
throw new IllegalStateException("Okuma Hatası!");
48
}
49
}
50
}
51

1
2
import Adafruit_DHT
3
 
4
nem, sicaklik = Adafruit_DHT.read_retry(114)
5
print("{};{}".format(nem, sicaklik))
6

[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.

1
2
Gpio.pinMode (21, Gpio.INPUT) ;
3
if (Gpio.digitalRead(21) == 0){
4
d.Goster("Oda Isik Durumu""Aydinlik",true,true);
5
}
6
else{
7
d.Goster("Oda Isik Durumu""Karanlik",true,true);
8
}
9

[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.

01
02
public class Uzaklik {
03
//GPIO Pins
04
private GpioPinDigitalOutput sensorTriggerPin ;
05
private GpioPinDigitalInput sensorEchoPin ;
06
final GpioController gpio = GpioFactory.getInstance();
07
 
08
public Uzaklik(){
09
sensorTriggerPin = gpio.provisionDigitalOutputPin(RaspiPin.GPIO_28); // Trigger pin as OUTPUT
10
sensorEchoPin = gpio.provisionDigitalInputPin(RaspiPin.GPIO_23,PinPullResistance.PULL_UP); // Echo pin as INPUT
11
}
12
 
13
public double calculate() throws InterruptedException{
14
try {
15
sensorTriggerPin.high();
16
Thread.sleep((long) 0.01);
17
sensorTriggerPin.low();
18
 
19
while(sensorEchoPin.isLow()){
20
 
21
}
22
 
23
long baslangicZaman= System.nanoTime();
24
while(sensorEchoPin.isHigh()){
25
 
26
}
27
long bitisZaman= System.nanoTime();
28
 
29
return ((((bitisZaman-baslangicZaman)/1e3)/2) / 29.1);
30
 
31
}
32
catch (InterruptedException e) {
33
e.printStackTrace();
34
}
35
return -1;
36
}
37
}
38

Yukarıda anlatılan bu işlemleri kontrol eden sınıf aşağıda verilmiştir.
001
002
public class TusTakimi {
003
private List listener = new ArrayList();
004
public static final String KEY = "key";
005
public char basilanTus;
006
 
007
private static final char keypad[][] = { { '1''2''3' },
008
{ '4''5''6' },
009
{ '7''8''9' },
010
{ '*''0''#' } };
011
 
012
private final GpioController theGpio = GpioFactory.getInstance();
013
 
014
private static final Pin PIN_1_IN = RaspiPin.GPIO_11;
015
 
016
private static final Pin PIN_2_IN = RaspiPin.GPIO_10;
017
 
018
private static final Pin PIN_3_IN = RaspiPin.GPIO_14;
019
 
020
private static final Pin PIN_4_IN = RaspiPin.GPIO_02;
021
 
022
private static final Pin PIN_5_OUT = RaspiPin.GPIO_13;
023
 
024
private static final Pin PIN_6_OUT = RaspiPin.GPIO_12;
025
 
026
private static final Pin PIN_7_OUT = RaspiPin.GPIO_16;
027
 
028
private final GpioPinDigitalInput thePin1 = theGpio.provisionDigitalInputPin(PIN_1_IN, PinPullResistance.PULL_UP);
029
 
030
private final GpioPinDigitalInput thePin2 = theGpio.provisionDigitalInputPin(PIN_2_IN, PinPullResistance.PULL_UP);
031
 
032
private final GpioPinDigitalInput thePin3 = theGpio.provisionDigitalInputPin(PIN_3_IN, PinPullResistance.PULL_UP);
033
 
034
private final GpioPinDigitalInput thePin4 = theGpio.provisionDigitalInputPin(PIN_4_IN, PinPullResistance.PULL_UP);
035
 
036
private final GpioPinDigitalOutput thePin5 = theGpio.provisionDigitalOutputPin(PIN_5_OUT);
037
 
038
private final GpioPinDigitalOutput thePin6 = theGpio.provisionDigitalOutputPin(PIN_6_OUT);
039
 
040
private final GpioPinDigitalOutput thePin7 = theGpio.provisionDigitalOutputPin(PIN_7_OUT);
041
 
042
private final GpioPinDigitalOutput theOutputs[] = { thePin5, thePin6,thePin7};
043
 
044
private GpioPinDigitalInput theInput;
045
 
046
private int theLin;
047
 
048
private int theCol;
049
 
050
public TusTakimi(){
051
basilanTus='-';
052
initListeners();
053
}
054
 
055
private void initListeners() {
056
thePin1.addListener(new GpioPinListenerDigital() {
057
@Override
058
public void handleGpioPinDigitalStateChangeEvent(
059
final GpioPinDigitalStateChangeEvent aEvent) {
060
if (aEvent.getState() == PinState.LOW) {
061
theInput = thePin1;
062
theLin = 1;
063
findOutput();
064
}
065
}
066
});
067
thePin2.addListener(new GpioPinListenerDigital() {
068
@Override
069
public void handleGpioPinDigitalStateChangeEvent(
070
final GpioPinDigitalStateChangeEvent aEvent) {
071
if (aEvent.getState() == PinState.LOW) {
072
theInput = thePin2;
073
theLin = 2;
074
findOutput();
075
}
076
}
077
});
078
thePin3.addListener(new GpioPinListenerDigital() {
079
@Override
080
public void handleGpioPinDigitalStateChangeEvent(
081
final GpioPinDigitalStateChangeEvent aEvent) {
082
if (aEvent.getState() == PinState.LOW) {
083
theInput = thePin3;
084
theLin = 3;
085
findOutput();
086
}
087
}
088
});
089
thePin4.addListener(new GpioPinListenerDigital() {
090
@Override
091
public void handleGpioPinDigitalStateChangeEvent(
092
final GpioPinDigitalStateChangeEvent aEvent) {
093
if (aEvent.getState() == PinState.LOW) {
094
theInput = thePin4;
095
theLin = 4;
096
findOutput();
097
}
098
}
099
});
100
}
101
 
102
private void findOutput() {
103
for (int myO = 0; myO < theOutputs.length; myO++) {
104
for (final GpioPinDigitalOutput myTheOutput : theOutputs) {
105
myTheOutput.high();
106
}
107
 
108
theOutputs[myO].low();
109
 
110
if (theInput.isLow()) {
111
theCol = myO;
112
checkPins();
113
try {
114
Thread.sleep(200);
115
} catch (InterruptedException e) {
116
}
117
break;
118
}
119
}
120
 
121
for (final GpioPinDigitalOutput myTheOutput : theOutputs) {
122
myTheOutput.low();
123
}
124
}
125
 
126
private synchronized void checkPins() {
127
notifyListeners(this, KEY, this.basilanTus,
128
this.basilanTus = keypad[theLin - 1][theCol]);
129
}
130
private void notifyListeners(Object object, String property, char oldValue,char newValue) {
131
for (PropertyChangeListener name : listener) {
132
name.propertyChange(new PropertyChangeEvent(this, property,
133
oldValue, newValue));
134
}
135
}
136
 
137
public void addChangeListener(PropertyChangeListener newListener) {
138
listener.add(newListener);
139
}
140
}
141

Tasarlanan devreden resimler

Bir Cevap Yazın