Arduino hesap makinesi, 4x4 keypad'den girilen iki sayıyı ve işlemi okuyup sonucu 16x2 I2C LCD ekranda gösteren bir öğrenci projesidir. Rakam tuşları sayıyı yazar; A toplama, B çıkarma, C çarpma, D bölme yapar; # eşittir, * silme tuşudur. Devre USB'den beslenir ve lehim gerektirmez.
Cebinizdeki hesap makinesinin içinde ne olduğunu hiç merak ettiniz mi? Bu projede Arduino Uno, 16 tuşlu bir keypad ve iki satırlı bir LCD ekranla dört işlem yapan bir hesap makinesi kuruyoruz. Proje; tuş takımı okuma, ekrana yazma ve programda karar verme konularını tek bir çalışmada birleştirir. Ortaokul ve lise kodlama dersleri, meslek lisesi atölyeleri ve TÜBİTAK 4006 bilim fuarları için uygundur.
Arduino hesap makinesi nedir?
Arduino hesap makinesi, tuş takımından girilen sayıları ve işlem işaretini okuyan, sonucu mikrodenetleyicide hesaplayıp ekranda gösteren basit bir elektronik hesaplayıcıdır. Gerçek hesap makinelerinde bu işi tek bir özel çip yapar; bizim projemizde aynı görevleri Arduino Uno üstlenir.
Sistem üç parçadan oluşur: keypad giriş birimidir, Arduino işlem birimidir, LCD ekran ise çıkış birimidir. Bu üçlü, bilgisayarların temel yapısını (giriş, işlem, çıkış) anlatmak için de iyi bir örnektir.
Hangi malzemeler gerekir?
Arduino hesap makinesi için Arduino Uno, 4x4 keypad, I2C arayüzlü 16x2 LCD ve jumper kablolar yeterlidir. Pasif buzzer isteğe bağlıdır; her tuşta kısa bir bip sesi verir.
Malzeme listesi
| Malzeme | Adet | Ne işe yarar? |
|---|---|---|
| Arduino Uno R3 (CH340, USB kablolu) | 1 | Tuşları okur, işlemi hesaplar |
| 4x4 push buton keypad | 1 | Rakam ve işlem girişi (16 tuş, 8 uç) |
| 2x16 mavi LCD, I2C modüllü | 1 | İşlemi ve sonucu gösterir |
| Pasif buzzer 17 mm | 1 | Tuş sesi (isteğe bağlı) |
| Şeffaf breadboard, orta boy | 1 | Buzzer ve GND bağlantıları |
| 140 parça kutulu jumper kablo seti | 1 | Bağlantılar |
Arduino IDE'de Kütüphane Yöneticisi'nden "Keypad" (Mark Stanley, Alexander Brevig) ve "LiquidCrystal I2C" kütüphanelerini kurun. Keypad'in çalışma mantığını 4x4 keypad Arduino bağlantısı yazısında, ekranı ise 16x2 LCD ekran bağlantısı yazısında ayrıntılı anlattık.
Devre nasıl bağlanır?
Keypad'in 8 ucu D9'dan D2'ye sırayla, LCD'nin SDA ve SCL uçları A4 ve A5'e, buzzer ise D10'a bağlanır. Bağlantıyı yaparken USB kablosu takılı olmasın.
- Keypad'i tuşlar size bakacak şekilde tutun. Uçların ilk dördü satırlar (R1-R4), son dördü sütunlardır (C1-C4); sıra kartın üzerinde yazar.
- Satırlar: R1 → D9, R2 → D8, R3 → D7, R4 → D6.
- Sütunlar: C1 → D5, C2 → D4, C3 → D3, C4 → D2.
- LCD: GND → GND, VCC → 5V, SDA → A4, SCL → A5.
- Pasif buzzer: artı → D10, eksi → GND.
- USB kablosunu takıp kodu yükleyin. Ekran boş görünüyorsa LCD arkasındaki mavi trimpotu çevirerek kontrastı ayarlayın.
Hesap makinesi kodu nasıl çalışır?
Kod, işlem tuşuna basılana kadar gelen rakamları birinci sayıya, sonra gelenleri ikinci sayıya ekler; # tuşunda iki sayıyı seçilen işlemle hesaplayıp sonucu alt satıra yazar.
#include <Keypad.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
const byte SATIR = 4, SUTUN = 4;
char tuslar[SATIR][SUTUN] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
byte satirPin[SATIR] = {9, 8, 7, 6};
byte sutunPin[SUTUN] = {5, 4, 3, 2};
Keypad tus = Keypad(makeKeymap(tuslar), satirPin, sutunPin, SATIR, SUTUN);
LiquidCrystal_I2C lcd(0x27, 16, 2); // ekran boşsa 0x3F deneyin
const byte BUZZER = 10;
String sayi1 = "", sayi2 = "";
char islem = 0; // '+', '-', 'x' ya da '/'
bool bitti = false;
String metin(float x) { // tam sayıysa ondalıksız yaz
if (x == (long)x) return String((long)x);
return String(x, 2);
}
void ustSatir() {
lcd.clear();
lcd.print(sayi1);
if (islem) { lcd.print(islem); lcd.print(sayi2); }
}
void temizle() {
sayi1 = ""; sayi2 = ""; islem = 0; bitti = false;
lcd.clear();
lcd.print("0");
}
void hesapla() {
float a = sayi1.toFloat(), b = sayi2.toFloat(), s = 0;
bitti = true;
lcd.setCursor(0, 1);
if (islem == '/' && b == 0) { lcd.print("Sifira bolunmez"); sayi1 = ""; return; }
if (islem == '+') s = a + b;
if (islem == '-') s = a - b;
if (islem == 'x') s = a * b;
if (islem == '/') s = a / b;
if (fabs(s) > 9999999) { lcd.print("Cok buyuk sayi"); sayi1 = ""; return; }
lcd.print("= ");
lcd.print(metin(s));
sayi1 = metin(s); // sonuç yeni işlemin ilk sayısı olabilir
}
void setup() {
lcd.init();
lcd.backlight();
lcd.print("Hesap makinesi");
lcd.setCursor(0, 1);
lcd.print("A+ B- Cx D/ #=");
}
void loop() {
char t = tus.getKey();
if (!t) return;
tone(BUZZER, 2000, 30); // kısa tuş sesi
if (t == '*') { temizle(); return; }
if (t >= '0' && t <= '9') {
if (bitti) temizle(); // sonuçtan sonra rakam: yeni hesap
if (!islem && sayi1.length() < 6) sayi1 += t;
else if (islem && sayi2.length() < 6) sayi2 += t;
ustSatir();
} else if (t == '#') {
if (islem && sayi2.length() > 0) hesapla();
} else if (sayi1.length() > 0) { // A, B, C, D: işlem seçimi
if (bitti) { sayi2 = ""; bitti = false; }
if (sayi2.length() == 0) {
islem = (t == 'A') ? '+' : (t == 'B') ? '-' : (t == 'C') ? 'x' : '/';
ustSatir();
}
}
}
Sonuç ekrandayken bir işlem tuşuna basarsanız hesap o sonuçla devam eder: 12 + 8 = 20 gördükten sonra C ve 3 tuşlayıp # basarsanız 60 sonucunu alırsınız. Her sayı en çok 6 hane olabilir.
Tuşlar hangi işlemi yapar?
Rakam tuşları sayıyı yazar, A-B-C-D harf tuşları dört işlemi seçer, # sonucu hesaplar ve * ekranı temizler.
| Tuş | Görev | Örnek | LCD'de görünen |
|---|---|---|---|
| 0-9 | Sayının hanelerini yazar | 1, 2 | 12 |
| A | Toplama | 12 A 8 # | Üst: 12+8, alt: = 20 |
| B | Çıkarma | 5 B 9 # | Üst: 5-9, alt: = -4 |
| C | Çarpma | 25 C 4 # | Üst: 25x4, alt: = 100 |
| D | Bölme | 10 D 3 # | Üst: 10/3, alt: = 3.33 |
| # | Eşittir; sonucu hesaplar | - | Alt satırda sonuç |
| * | Her şeyi siler | - | 0 |
Neden bazı sonuçlar yuvarlanır?
Arduino Uno'daki float türü yaklaşık 6-7 anlamlı basamak tutabildiği için büyük ya da çok ondalıklı sonuçlar yuvarlanır. Örneğin 10 / 3 işleminin sonucu ekranda 3.33 olarak görünür, çünkü kod iki ondalık basamak yazdırır.
Bu yüzden kod, mutlak değeri 9.999.999'u geçen sonuçlarda "Cok buyuk sayi" uyarısı verir. Sıfıra bölme matematikte tanımsız olduğu için "Sifira bolunmez" mesajı çıkar. Ondalık ayırıcı olarak virgül değil nokta görünür; bu, programlama dillerinin ortak kuralıdır.
Hangi güvenlik kurallarına dikkat edilmeli?
Hesap makinesi USB'den 5V ile çalıştığı için güvenli bir projedir; yine de şu kurallara uyun:
- Devreyi bilgisayarın USB çıkışından, USB powerbank'tan ya da en çok 12V'luk bir adaptörden besleyin. 220V şebeke elektriğine hiçbir şey bağlamayın.
- Kabloları değiştirmeden önce USB kablosunu çıkarın; 5V ile GND'yi doğrudan birbirine değdirmeyin.
- Kutu yaparken maket bıçağını öğretmen ya da yetişkin gözetiminde kullanın.
- Arduino'yu metal bir yüzeye koymayın; alt yüzdeki lehim noktaları kısa devre yapabilir.
Ödevinizi nasıl sunarsınız?
Ödevinizi, jüriden bir işlem isteyip hesap makinenizle canlı olarak çözerek ve aynı işlemi telefonun hesap makinesiyle karşılaştırarak sunabilirsiniz.
- Problem: "Bir hesap makinesi tuşa basıldığını nasıl anlar ve sonucu nasıl bulur?"
- Gösteri: Dört işlemi, sıfıra bölmeyi ve 10 / 3 gibi yuvarlanan bir sonucu gösterin.
- Bilgi: Keypad'in 16 tuşu yalnızca 8 kabloyla okur, çünkü Arduino satırları sırayla tarar ve basılan tuşu satır ile sütunun kesişiminden bulur.
- Rapor: Bağlantı şemasını, tuş tablosunu ve kodun akış şemasını ekleyin.
- Geliştirme: Ondalık nokta tuşu, karekök ya da yüzde işlemi eklemeyi önerin.
Sık sorulan sorular
LCD ekranda yazı görünmüyorsa ne yapmalıyım?
Önce LCD'nin arkasındaki I2C kartında bulunan trimpotu küçük bir tornavidayla yavaşça çevirin; yazı çoğu zaman yalnızca kontrast düşük olduğu için görünmez. Arka ışık yanıyor ama hâlâ yazı yoksa koddaki 0x27 adresini 0x3F yapın. Adresi kesin öğrenmek için bir I2C tarayıcı kodu çalıştırabilirsiniz.
Keypad yanlış rakam yazıyorsa ne yapmalıyım?
Yanlış rakam, satır ve sütun kablolarının sırası karıştığında görülür. Kabloları sökmek yerine koddaki satirPin ve sutunPin dizilerindeki sayıların sırasını değiştirin. Örneğin 1 yerine A yazıyorsa sütun sırası ters bağlanmıştır; diziyi {2, 3, 4, 5} yapmak sorunu çözer.
Negatif ya da ondalıklı sayı girilebilir mi?
Bu sürümde doğrudan girilemez; ama işlem sonucu olarak elde edilebilir. Örneğin 5 - 9 işlemi -4 verir ve bu sonuçla hesaba devam edebilirsiniz. Ondalık giriş için tuşlardan birini, örneğin * tuşunu, nokta olarak tanımlayıp sayı metnine "." eklemek ve silme görevini başka bir tuşa taşımak gerekir.
Hesap makinesi pille çalışır mı?
Evet, 4 kalem pil (yaklaşık 6V) ya da 9V pil Arduino'nun VIN ve GND uçlarına bağlanarak çalıştırılabilir. LCD arka ışığı akımın büyük kısmını harcadığı için 9V pil uzun dayanmaz. Taşınabilir kullanımda USB powerbank daha pratik ve uzun ömürlü bir seçenektir.
Özet
- Arduino hesap makinesi; keypad (giriş), Arduino Uno (işlem) ve 16x2 I2C LCD'den (çıkış) oluşur.
- Bağlantı: keypad satırları D9-D6, sütunları D5-D2; LCD A4 ve A5; buzzer D10.
- A toplar, B çıkarır, C çarpar, D böler; # sonucu verir, * siler.
floattürü 6-7 anlamlı basamak tuttuğu için sonuçlar yuvarlanabilir; sıfıra bölme uyarı verir.- Devre USB'den 5V ile çalışır; 220V hiçbir şekilde kullanılmaz.
