#include <Wire.h> // I2C iletişimi için
#include <LiquidCrystal_I2C.h> // I2C LCD kontrolü için
#include <TimerOne.h>
#include <Stepper.h> // Stepper motor kontrolü için
// LCD ekranın I2C adresi ve boyutları
#define LCD_ADDR 0x27 // I2C adresi, genellikle 0x27 veya 0x3F
#define LCD_COLS 16 // Kolon sayısı
#define LCD_ROWS 2 // Satır sayısı
// PWM ve potansiyometre pinleri
#define PWM_PIN 9
#define POT_PIN A0
// ACS712 akım sensörü pin
#define CURRENT_SENSOR_PIN A1
// Röle pin
#define RELAY_PIN 8
// Stepper motor pinleri
#define STEP_PIN 2
#define DIR_PIN 3
// Sensörün kalibrasyon değerleri
#define SENSOR_VCC 5.0 // Sensörün bağlı olduğu voltaj (genellikle 5V)
#define SENSOR_OFFSET 2.5 // 0A için voltaj offset (genellikle 2.5V)
#define SENSOR_SENSITIVITY 0.185 // ACS712'nin hassasiyeti (0.185 V/A için ACS712-5A)
// Stepper motor ayarları
#define STEPS_PER_REVOLUTION 200 // Motorun bir tam dönüş için adım sayısı (örneğin, 200 adım/tur)
// Stepper motor nesnesi oluşturma
Stepper stepper(STEPS_PER_REVOLUTION, STEP_PIN, DIR_PIN);
// Akım eşik değerleri
float currentThresholdForwardMin = 0.5; // İleri pozisyon için min eşik
float currentThresholdForwardMax = 2.0; // İleri pozisyon için max eşik
float currentThresholdStopMin = 2.0; // Durma pozisyonu için min eşik
float currentThresholdStopMax = 3.0; // Durma pozisyonu için max eşik
float currentThresholdReverseMin = 3.0; // Geri pozisyon için min eşik
float currentThresholdReverseMax = 5.0; // Geri pozisyon için max eşik
// LCD ekran nesnesi oluşturma
LiquidCrystal_I2C lcd(LCD_ADDR, LCD_COLS, LCD_ROWS);
void setup()
{
// LCD ekran başlatma
lcd.begin(LCD_COLS, LCD_ROWS);
lcd.backlight(); // Arka ışığı aç
// PWM pini ayarlama
pinMode(PWM_PIN, OUTPUT);
// Röle pinini ayarlama
pinMode(RELAY_PIN, OUTPUT);
digitalWrite(RELAY_PIN, HIGH); // Röleyi kapalı (aktif) yap
// Timer1 başlatma
Timer1.initialize(150); // 100 mikro saniye = 10 kHz
// Akım sensörünün pinini ayarlama
pinMode(CURRENT_SENSOR_PIN, INPUT);
// Stepper motor ayarlarını yap
stepper.setSpeed(60); // Stepper motor hızını RPM (Dönüş/dakika) olarak ayarla
// LCD ekranına başlangıçta akım eşik değerlerini göster
updateLCD("DUR"); // LCD ekranı güncelle
}
void loop()
{
// Potansiyometre değerini oku
int potValue = analogRead(POT_PIN);
// Potansiyometre değerini 0-1000 aralığına dönüştür
int pwmValue = map(potValue, 0, 1023, 0, 1000);
// PWM sinyalini ayarla
Timer1.pwm(PWM_PIN, pwmValue);
// Akım sensöründen veri oku
int sensorValue = analogRead(CURRENT_SENSOR_PIN);
// Sensör voltajını hesapla
float voltage = sensorValue * (SENSOR_VCC / 1023.0);
// Akımı hesapla
float current = (voltage - SENSOR_OFFSET) / SENSOR_SENSITIVITY;
// Akım değerine göre stepper motoru kontrol et ve röleyi ayarla
if (current >= currentThresholdReverseMin && current <= currentThresholdReverseMax) {
// Röleyi kapalı yap
digitalWrite(RELAY_PIN, LOW);
// Stepper motoru geri hareket ettir
stepper.step(-STEPS_PER_REVOLUTION / 20); // Geri hareket, adım sayısını ihtiyaca göre ayarlayın
// Durum bilgisini güncelle
updateLCD("GERI");
} else if (current >= currentThresholdForwardMin && current <= currentThresholdForwardMax) {
// Röleyi açık yap
digitalWrite(RELAY_PIN, HIGH);
// Stepper motoru ileri hareket ettir
stepper.step(STEPS_PER_REVOLUTION / 20); // İleri hareket, adım sayısını ihtiyaca göre ayarlayın
// Durum bilgisini güncelle
updateLCD("ILERi");
} else {
// Stepper motoru durdur
// Adımları sıfırla (motoru durdurmak için)
stepper.step(0);
// Durum bilgisini güncelle
updateLCD("DUR");
}
// LCD ekranında akım değerini göster
lcd.setCursor(0, 1); // 2. satıra geç
lcd.print(current);
lcd.print("A");
// Küçük bir gecikme (stabilite için)
delay(300);
}
void updateLCD(String status) {
lcd.setCursor(0, 0); // 1. satıra geç
lcd.print("PWM: ");
lcd.print(analogRead(POT_PIN)); // PWM değerini göster
lcd.setCursor(11, 0); // 1. satırın 11. sütununa geç
lcd.print(" "); // Önceki yazıyı temizle
lcd.setCursor(11, 0); // Tekrar konumlan
lcd.print(status); // Durum bilgisini yaz
}