#include <LiquidCrystal_I2C.h> // LCD ekran ile iletişim kurmak için kütüphane
// Direnç değerleri ve diğer sabitler
const float r1 = 100000.0; // Voltmetre için kullanılan r1 direnç değeri
const float r2 = 10000.0; // Voltmetre için kullanılan r2 direnç değeri
const float Vin = 5.0; // Giriş voltajı
const float r3 = 1000.0; // Ohmmetre için kullanılan r3 direnç değeri
const int PinOut[2] = {10, 11}; // Buton matrisinin satırları için pinler
const int PinIn[2] = {12, 13}; // Buton matrisinin sütunları için pinler
int mode = 0; // İşlem modunu belirleyen değişken
// Buton matrisinin değerleri
const int value[2][2] = {
{0, 2}, // İlk satırdaki butonlar için değerler
{1, 3} // İkinci satırdaki butonlar için değerler
};
// LCD ekran nesnesi oluşturulmalı
LiquidCrystal_I2C lcd(0x27, 16, 2); // LCD ekranın I2C adresi 0x27, 16 sütun, 2 satır
unsigned long lastUpdate = 0; // Son güncelleme zamanı
const unsigned long updateInterval = 1000; // Ekranı güncelleme aralığı (ms)
void setup() {
lcd.begin(16, 2); // LCD ekranı başlat: 16 sütun, 2 satır
lcd.backlight(); // LCD ekranın arka ışığını aç
// Pinlerin modlarını ayarla
for (int i = 0; i < 2; i++) {
pinMode(PinOut[i], OUTPUT);
digitalWrite(PinOut[i], HIGH); // Satır pinlerini HIGH yap
pinMode(PinIn[i], INPUT_PULLUP); // Sütun pinlerini INPUT_PULLUP olarak ayarla
}
}
void matrix() {
// Buton matrisini tarayan fonksiyon
for (int i = 0; i < 2; i++) { // Her bir satırı sırayla kontrol et
digitalWrite(PinOut[i], LOW); // Satır pinine düşük seviye uygulama
for (int j = 0; j < 2; j++) { // Her bir sütunu sırayla kontrol et
if (digitalRead(PinIn[j]) == LOW) { // Butona basılmışsa
mode = value[i][j]; // Mode değerini güncelle
while(digitalRead(PinIn[j]) == LOW); // Butona basılmasını bekle
lastUpdate = 0; // Ekranın güncellenmesini sağla
}
}
digitalWrite(PinOut[i], HIGH); // Satır pinine yüksek seviye uygulama
}
}
void loop() {
matrix(); // Buton matrisini tarama fonksiyonunu çağır
unsigned long currentMillis = millis();
// Ekranı yalnızca updateInterval kadar zaman geçtikten sonra güncelle
if (currentMillis - lastUpdate >= updateInterval) {
lcd.clear(); // LCD ekranı temizle
switch (mode) {
case 0: {
// Başlangıç ekranı
lcd.setCursor(0, 0);
lcd.print("WELCOME!!!");
lcd.setCursor(0, 1);
lcd.print("SELECT MODE");
break;
}
case 1: {
// Voltmetre işlemi
int analogvalue = analogRead(A0); // A0 pininden analog değeri oku
float temp = (analogvalue * Vin) / 1024.0; // Voltajı hesapla
float input_volt = temp / (r2 / (r1 + r2)); // Gerçek voltajı hesapla
if (input_volt < 0.1) {
input_volt = 0.0; // Voltaj çok düşükse sıfır olarak ayarla
}
// Voltajı LCD ekranında göster
lcd.setCursor(0, 0);
lcd.print("VOLTMETER");
lcd.setCursor(0, 1);
lcd.print("Voltage= ");
lcd.print(input_volt, 2); // İki ondalık basamağa yuvarla
lcd.print(" V");
break;
}
case 2: {
// Ampermetre işlemi
int v0 = analogRead(A1); // A1 pininden analog değeri oku
int v1 = analogRead(A2); // A2 pininden analog değeri oku
float temp_val = (v0 - v1) * (Vin / 1024.0); // Gerilim farkını hesapla
float current_value = temp_val / 22.0; // Akımı hesapla
// Akımı LCD ekranında göster
lcd.setCursor(0, 0);
lcd.print("AMPERMETER");
lcd.setCursor(0, 1);
lcd.print("Current= ");
lcd.print(current_value, 4); // Dört ondalık basamağa yuvarla
lcd.print(" A");
break;
}
case 3: {
// Ohmmetre işlemi
int a2d_data = analogRead(A3); // A3 pininden analog değeri oku
float Vout = a2d_data * Vin / 1024.0; // Çıkış voltajını hesapla
float unknownR = (r3 * Vout) / (Vin - Vout); // Bilinmeyen direnci hesapla
// Direnci LCD ekranında göster
lcd.setCursor(0, 0);
lcd.print("OHMMETER");
lcd.setCursor(0, 1);
lcd.print("R (ohm) = ");
lcd.print(unknownR, 0); // Tam sayı olarak göster
break;
}
}
lastUpdate = currentMillis; // Son güncelleme zamanını güncelle
}
}
Ohmmeter
Ampermeter
Voltmeter