#include <Arduino.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <AccelStepper.h>
#include <Keypad.h>
#include <EEPROM.h>
#include <NewPing.h> // Make sure you have the NewPing library installed
LiquidCrystal_I2C lcd(0x27, 16, 2);
#define StopSwitchPin 5
#define TRIG_PIN 3 // Define the trigger pin
#define ECHO_PIN 2 // Define the echo pin
#define Enpinstep 12 // Define the echo pin
#define MAX_DISTANCE 400 // Maximum distance we want to measure (in centimeters)
NewPing ultrasonic(TRIG_PIN, ECHO_PIN, MAX_DISTANCE);
int distance;
/* Keypad setup */
const byte KEYPAD_ROWS = 4;
const byte KEYPAD_COLS = 4;
byte rowPins[KEYPAD_ROWS] = {9, 8, 7, 6};
byte colPins[KEYPAD_COLS] = {A0, A1, A2, A3};
char keys[KEYPAD_ROWS][KEYPAD_COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '=', 'D'}
};
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, KEYPAD_ROWS, KEYPAD_COLS);
AccelStepper stepper(AccelStepper::DRIVER, 10, 11); // Define stepper motor driver pins for STEP and DIR
int mz80Pin = 12; // MZ80 sensörünün bağlandığı pin
int sensorState = LOW; // MZ80 sensörünün ilk durumu
int val = 0; // MZ80 sensöründen okunan değer
// Variables to hold values
float DEGER_ORANTI = 20.03;
int homingPosizyon = 10;
float maxSpeed = 1000.0;
float acceleration = 600.0;
int siperBaslangic = 1;
int siperBitis = 1200;
int hafizaButton0 = 0;
int hafizaButton1 = 0;
int hafizaButton2 = 0;
int hafizaButton3 = 0;
int hafizaButton4 = 0;
// EEPROM addresses
const int addrMaxSpeed = 0;
const int addrAcceleration = 4;
const int addrDEGER_ORANTI = 8;
//const int addrHomingPosizyon = 12;
const int addrsiperBaslangic = 16;
const int addrsiperBitis = 20;
const int addrhafizaButton0 = 24;
const int addrhafizaButton1 = 28;
const int addrhafizaButton2 = 32;
const int addrhafizaButton3 = 36;
const int addrhafizaButton4 = 40;
int menuIndex = -1; // Variable to keep track of the menu state
int stepPosition = 0; // Target position for the stepper motor
String inputString = ""; // String to hold the input from the keypad
unsigned long previousMillis = 0; // Zamanı takip etmek için değişken
const long interval = 5000; // 30 dakika (milisaniye cinsinden)
byte turkce_karakterler[8][8] = {
{ B00000, B00000, B00100, B00100, B00100, B00100, B00100, B00000 }, // ı
{ B10000, B10000, B10110, B11001, B10001, B10001, B10001, B00000 }, // ğ
{ B01010, B00000, B00000, B10001, B10001, B10001, B01110, B00000 }, // ü
{ B00000, B00000, B11111, B00001, B01111, B10001, B01111, B00000 }, // ş
{ B01010, B00000, B01110, B10001, B10001, B10001, B01110, B00000 }, // ö
{ B00000, B00000, B01110, B10000, B10000, B10000, B01110, B00000 }, // ç
{ B01110, B10001, B10000, B11100, B10000, B10001, B01110, B00000 }, // İ
{ B00000, B00000, B11111, B00001, B01111, B10001, B01111, B00000 } // Ş (büyük harf)
};
void setup() {
Serial.begin(9600);
lcd.init();
lcd.backlight();
for (int i = 0; i < 8; i++) {
lcd.createChar(i, turkce_karakterler[i]);
}
EEPROM.get(addrMaxSpeed, maxSpeed);
EEPROM.get(addrAcceleration, acceleration);
EEPROM.get(addrDEGER_ORANTI, DEGER_ORANTI);
//EEPROM.get(addrHomingPosizyon, homingPosizyon);
EEPROM.get(addrsiperBaslangic, siperBaslangic);
EEPROM.get(addrsiperBitis, siperBitis);
EEPROM.get(addrhafizaButton0, hafizaButton0);
EEPROM.get(addrhafizaButton1, hafizaButton1);
EEPROM.get(addrhafizaButton2, hafizaButton2);
EEPROM.get(addrhafizaButton3, hafizaButton3);
EEPROM.get(addrhafizaButton4, hafizaButton4);
pinMode(StopSwitchPin, INPUT_PULLUP); // Configure the limit switch pin
pinMode(Enpinstep, INPUT); // Configure the limit switch pin
pinMode(LED_BUILTIN, OUTPUT);
//yüklerken silinecek
DEGER_ORANTI = 20.03;
//homingPosizyon = 10;
maxSpeed = 1200.0;
acceleration = 600.0;
siperBaslangic = 1;
siperBitis = 1200;
hafizaButton0 = 340;
hafizaButton1 = 580;
hafizaButton2 = 752;
hafizaButton3 = 800;
hafizaButton4 = 100;
stepper.setMaxSpeed(maxSpeed);
stepper.setAcceleration(acceleration);
//yüklerken silinecek
// Declare key variable outside the loop
char key;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Siper konumu: B");
do {
key = keypad.getKey();
if (key) {
if (key >= '0' && key <= '9') {
inputString += key;
lcd.setCursor(0, 1);
lcd.print(inputString);
}
}
}
while (key != 'B');
// Validate and set initial stepper position
if (key == 'B') {
int num = inputString.toInt();
if (num >= siperBaslangic && num <= siperBitis) {
stepPosition = num;
stepper.setCurrentPosition(stepPosition * DEGER_ORANTI);
lcd.clear();
lcd.setCursor(0, 0);
lcd.write(4); // ö
lcd.print("l");
lcd.write(5); // ç
lcd.write(2); // ü
lcd.print(":");
lcd.setCursor(0, 1);
lcd.print("Siper:");
lcd.print(stepPosition);
inputString = "";
} else {
inputString = "";
lcd.clear();
lcd.setCursor(0, 0);
lcd.write(4); // ö
lcd.print("l");
lcd.write(5); // ç
lcd.write(2); // ü
lcd.print(":");
}
}
// Create special characters
lcd.setCursor(0, 1);
lcd.write(0); // ı
lcd.write(1); // ğ
lcd.write(2); // ü
lcd.write(3); // ş
lcd.write(4); // ö
lcd.write(5); // ç
lcd.write(6); // İ
lcd.write(7); // Ş
lcd.clear();
lcd.setCursor(0, 0);
lcd.write(4); // ö
lcd.print("l");
lcd.write(5); // ç
lcd.write(2); // ü
lcd.print(":");
lcd.setCursor(0, 1);
lcd.print("Siper:");
lcd.print(stepPosition);
}
/*
void Reklam() {
// Kayan yazı için metin
String text = "Bismillahirrahmanirrahim";
// Metnin uzunluğu
int textLength = text.length();
// LCD'nin genişliği
int lcdWidth = 16;
// Metni LCD'de kaydır
for (int i = 0; i < textLength + lcdWidth; i++) {
// LCD'yi temizle
lcd.clear();
// Başlangıç ve bitiş noktalarını hesapla
int start = max(0, i - lcdWidth + 1);
int end = min(textLength, i + 1);
// LCD'ye yazdırılacak kısmı al
String displayText = text.substring(start, end);
// Metni LCD'nin ortasında hizala
lcd.setCursor(lcdWidth - (i - start + 1), 0);
lcd.print(displayText);
lcd.setCursor(0, 1);
lcd.print("YK Dekor");
// Bir süre bekle
delay(50);
}
lcd.clear();
}
*/
void loop() {
bool ToggleHava;
unsigned long currentMillis = millis(); // Geçen zamanı al
// Belirli bir süre sonra motoru durdur
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis; // Zamanı güncelle
stepper.disableOutputs();
}
if (!stepper.isRunning()&&ToggleHava==false) {
int distance = ultrasonic.ping_cm();
if (distance > 100 && distance < 400) {
digitalWrite(LED_BUILTIN, HIGH); // LED'i yak
ToggleHava==true;
} else {
digitalWrite(LED_BUILTIN, LOW); // LED'i söndür
ToggleHava==false;
}
}
if (digitalRead(StopSwitchPin) == LOW) {
stepper.stop();
inputString = "";
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Durdur");
lcd.setCursor(0, 1);
lcd.print("Siper:");
int DurdurKonum = stepper.targetPosition();
lcd.print( DurdurKonum / DEGER_ORANTI);
}
char key = keypad.getKey();
if (key) {
if (key >= '0' && key <= '9') {
lcd.clear();
inputString += key;
lcd.setCursor(0, 0);
lcd.write(4); // ö
lcd.print("l");
lcd.write(5); // ç
lcd.write(2); // ü
lcd.print(":");
lcd.print(inputString);
} else if (key == '#') {
menuIndex = (menuIndex + 1) % 4; // Cycle through menu options
displayMenu();
inputString = ""; // Clear input string when switching menu
} else if (key == 'D') {
handleMenuOption();
} else if (key == '*') {
if (inputString.indexOf('.') == -1) { // Allow only one decimal point
inputString += '.';
lcd.setCursor(0, 1);
lcd.print("Input: ");
lcd.print(inputString);
}
} else if (key == 'A') {
int num = inputString.toInt();
if (num >= siperBaslangic && num <= siperBitis) {
stepPosition = num;
stepper.moveTo(stepPosition * DEGER_ORANTI);
inputString = "";
lcd.clear();
lcd.setCursor(0, 0);
lcd.write(4); // ö
lcd.print("l");
lcd.write(5); // ç
lcd.write(2); // ü
lcd.print(":");
lcd.setCursor(0, 1);
lcd.print("Siper:");
lcd.print(stepPosition);
} else {
inputString = "";
lcd.clear();
lcd.setCursor(0, 0);
lcd.write(4); // ö
lcd.print("l");
lcd.write(5); // ç
lcd.write(2); // ü
lcd.print(":HATALI");
}
} else if (key == 'B') {
int num = inputString.toInt();//EEPROM.get(addrsiperBaslangic, siperBaslangic);
// EEPROM.get(addrsiperBitiş, siperBitiş);
if (num >= siperBaslangic && num <= siperBitis) {
stepPosition = num;
stepper.setCurrentPosition(stepPosition * DEGER_ORANTI);
inputString = "";
lcd.clear();
lcd.setCursor(0, 0);
lcd.write(4); // ö
lcd.print("l");
lcd.write(5); // ç
lcd.write(2); // ü
lcd.print(":");
lcd.setCursor(0, 1);
lcd.print("Siper:");
lcd.print(stepPosition);
} else {
inputString = "";
lcd.clear();
lcd.setCursor(0, 0);
lcd.write(4); // ö
lcd.print("l");
lcd.write(5); // ç
lcd.write(2); // ü
lcd.print(":");
lcd.setCursor(0, 1);
lcd.print("Siper:");
lcd.print(stepPosition);
}
} else if (key == 'C') {
inputString = "";
lcd.clear();
lcd.setCursor(0, 0);
lcd.write(4); // ö
lcd.print("l");
lcd.write(5); // ç
lcd.write(2); // ü
lcd.print(":");
lcd.setCursor(0, 1);
lcd.print("Siper:");
lcd.print(stepPosition);
} else if (key == '=') {
menuIndex = (menuIndex + 1) % 13; // Cycle through menu options
displayMenu();
inputString = ""; // Clear input string when switching menu
}
}
stepper.run();
}
void displayMenu() {
lcd.clear();
lcd.setCursor(0, 0);
switch (menuIndex) {
case 0:
lcd.print("1: Max Speed");
lcd.setCursor(0, 1);
lcd.print(maxSpeed);
break;
case 1:
lcd.print("2: Acceleration");
lcd.setCursor(0, 1);
lcd.print(acceleration);
break;
case 2:
lcd.print("3: DEGER_ORANTI");
lcd.setCursor(0, 1);
lcd.print(DEGER_ORANTI);
break;
case 3:
lcd.print("4: sifirlama");
lcd.setCursor(0, 1);
lcd.print(homingPosizyon);
break;
case 4:
lcd.print("5: Siper 0");
lcd.setCursor(0, 1);
lcd.print(siperBaslangic);
break;
case 5:
lcd.print("6: Siper 150");
lcd.setCursor(0, 1);
lcd.print(siperBitis);
break;
case 6:
lcd.print("7: standart ayar");
lcd.setCursor(0, 1);
//lcd.print(siperBitis);
break;
case 7:
lcd.print("8:Hizli Git:0");
lcd.setCursor(0, 1);
lcd.print(hafizaButton0);
break;
case 8:
lcd.print("9:Hizli Git:1");
lcd.setCursor(0, 1);
lcd.print(hafizaButton1);
break;
case 9:
lcd.print("10:Hizli Git:2");
lcd.setCursor(0, 1);
lcd.print(hafizaButton2);
break;
case 10:
lcd.print("11:Hizli Git:3");
lcd.setCursor(0, 1);
lcd.print(hafizaButton3);
break;
case 11:
lcd.print("11:Hizli Git:4");
lcd.setCursor(0, 1);
lcd.print(hafizaButton4);
break;
case 12:
lcd.print("11:info=V:0.1");
lcd.setCursor(0, 1);
lcd.print("MMSG1");
break;
}
lcd.setCursor(8, 1);
lcd.print(menuIndex);
lcd.print("/0-12");
}
void handleMenuOption() {
lcd.clear();
switch (menuIndex) {
case 0: // Update max speed
maxSpeed = inputString.toFloat();
stepper.setMaxSpeed(maxSpeed);
EEPROM.put(addrMaxSpeed, maxSpeed);
lcd.print("Max Speed: ");
lcd.setCursor(0, 1);
lcd.print(maxSpeed);
break;
case 1: // Update acceleration
acceleration = inputString.toFloat();
stepper.setAcceleration(acceleration);
EEPROM.put(addrAcceleration, acceleration);
lcd.print("Accel: ");
lcd.setCursor(0, 1);
lcd.print(acceleration);
break;
case 2: // Update DEGER_ORANTI
DEGER_ORANTI = inputString.toFloat();
EEPROM.put(addrDEGER_ORANTI, DEGER_ORANTI);
lcd.print("DEGER_ORANTI: ");
lcd.setCursor(0, 1);
lcd.print(DEGER_ORANTI);
break;
case 3: // Update homing position
homingPosizyon = inputString.toInt();
// EEPROM.put(addrHomingPosizyon, homingPosizyon);
lcd.print("Homing Pos: ");
lcd.setCursor(0, 1);
lcd.print(homingPosizyon);
break;
case 4: // Update homing position
siperBaslangic = inputString.toInt();
EEPROM.put(addrsiperBaslangic, siperBaslangic);
lcd.print("siper baslama: ");
lcd.setCursor(0, 1);
lcd.print(siperBaslangic);
break;
case 5: // Update homing position
siperBitis = inputString.toInt();
EEPROM.put(addrsiperBitis, siperBitis);
lcd.print("Siper sonu: ");
lcd.setCursor(0, 1);
lcd.print(siperBitis);
break;
case 6:
DEGER_ORANTI = 20.03;
homingPosizyon = 10;
maxSpeed = 1200.0;
acceleration = 600.0;
siperBaslangic = 1;
siperBitis = 1200;
lcd.setCursor(0, 1);
lcd.print("standart ayar tamam: ");
stepper.setMaxSpeed(maxSpeed);
stepper.setAcceleration(acceleration);
break;
case 7:
hafizaButton0 = inputString.toInt();
EEPROM.put(addrhafizaButton0, hafizaButton0);
lcd.print("Hizli Git:0 ");
lcd.setCursor(0, 1);
lcd.print(hafizaButton0);
break;
case 8:
hafizaButton1 = inputString.toInt();
EEPROM.put(addrhafizaButton1, hafizaButton1);
lcd.print("Hizli Git:1 ");
lcd.setCursor(0, 1);
lcd.print(hafizaButton1);
break;
case 9:
hafizaButton2 = inputString.toInt();
EEPROM.put(addrhafizaButton2, hafizaButton2);
lcd.print("Hizli Git:2 ");
lcd.setCursor(0, 1);
lcd.print(hafizaButton2);
break;
case 10:
hafizaButton3 = inputString.toInt();
EEPROM.put(addrhafizaButton3, hafizaButton3);
lcd.print("Hizli Git:3 ");
lcd.setCursor(0, 1);
lcd.print(hafizaButton3);
break;
case 11:
hafizaButton4 = inputString.toInt();
EEPROM.put(addrhafizaButton4, hafizaButton4);
lcd.print("Hizli Git:4 ");
lcd.setCursor(0, 1);
lcd.print(hafizaButton4);
break;
}
inputString = ""; // Clear input string after handling
}
void homeStepper() {
stepper.setMaxSpeed(500.0); // Reduce speed for homing
stepper.setAcceleration(100.0);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("S");
lcd.write(0); // ı
lcd.print("f");
lcd.write(0); // ı
lcd.print("rlama");
// Move towards the limit switch
stepper.moveTo(-10000); // Move a large number of steps in the negative direction
while (digitalRead(StopSwitchPin) == HIGH) {
stepper.run();
}
stepper.stop(); // Stop the motor
stepper.setCurrentPosition(0); // Set current position as 0
stepper.setMaxSpeed(1200.0); // Restore speed
stepper.setAcceleration(600.0);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("S");
lcd.write(0); // ı
lcd.print("f");
lcd.write(0); // ı
lcd.print("rlama Tamam");
delay(1000); // Wait 1 second to display the message
lcd.clear();
lcd.setCursor(0, 0);
lcd.write(4); // ö
lcd.print("l");
lcd.write(5); // ç
lcd.write(2); // ü
lcd.print(":");
lcd.setCursor(0, 1);
lcd.print("Siper:");
lcd.print(stepPosition);
}