#include <Arduino.h>
#include <LiquidCrystal.h>
#include <EEPROM.h>
// LCD pinleri (RS, E, D4, D5, D6, D7)
LiquidCrystal lcd(12, 14, 16, 17, 5, 18);
// Pin tanımları
#define BUTTON_UP 34
#define BUTTON_DOWN 35
#define BUTTON_LEFT 32
#define BUTTON_RIGHT 33
#define BUTTON_OK 25
#define PEDAL_PIN 13
#define RELAY_PIN 26
// Ayar aralıkları
#define MIN_PUNTA_MS 1
#define MAX_PUNTA_MS 255
#define MIN_DARBE 1
#define MAX_DARBE 255
#define MIN_ARALIK_MS 1
#define MAX_ARALIK_MS 255
// EEPROM adresleri
#define ADDR_PUNTA_MS 0
#define ADDR_DARBE 2
#define ADDR_ARALIK 4
#define ADDR_TOPLAM 6
// Sistem durumları
#define DURUM_BASLANGIC 0
#define DURUM_ANA_ARAYUZ 1
#define DURUM_MENU 2
#define DURUM_AYAR 3
// Değişkenler
uint8_t punta_ms = 20;
uint8_t darbe_sayisi = 3;
uint8_t aralik_ms = 10;
uint16_t toplam_punta = 0;
uint8_t anlik_darbe = 0;
uint8_t sistem_durumu = DURUM_BASLANGIC;
uint8_t menu_secim = 0; // 0: Punta süresi, 1: Darbe sayısı, 2: Aralık
uint8_t ayar_yanip_sonme = 0;
bool pedal_onceki = false;
bool islemde = false;
// Tuş kontrol değişkenleri
bool ok_basili = false;
bool ok_uzun_basim = false;
unsigned long ok_baslangic = 0;
unsigned long son_tus_zamani = 0;
bool tus_tekrar = false;
void ayarlariOku() {
punta_ms = EEPROM.read(ADDR_PUNTA_MS);
if (punta_ms < MIN_PUNTA_MS || punta_ms > MAX_PUNTA_MS) punta_ms = 20;
darbe_sayisi = EEPROM.read(ADDR_DARBE);
if (darbe_sayisi < MIN_DARBE || darbe_sayisi > MAX_DARBE) darbe_sayisi = 3;
aralik_ms = EEPROM.read(ADDR_ARALIK);
if (aralik_ms < MIN_ARALIK_MS || aralik_ms > MAX_ARALIK_MS) aralik_ms = 10;
toplam_punta = EEPROM.read(ADDR_TOPLAM) | (EEPROM.read(ADDR_TOPLAM+1) << 8);
}
void ayarlariKaydet() {
EEPROM.write(ADDR_PUNTA_MS, punta_ms);
EEPROM.write(ADDR_DARBE, darbe_sayisi);
EEPROM.write(ADDR_ARALIK, aralik_ms);
EEPROM.write(ADDR_TOPLAM, toplam_punta & 0xFF);
EEPROM.write(ADDR_TOPLAM+1, toplam_punta >> 8);
EEPROM.commit();
}
void baslangicEkrani() {
lcd.clear();
lcd.setCursor(2, 0);
lcd.print("TW POWER");
lcd.setCursor(2, 1);
lcd.print("SISTEM MUHENDISLIK");
delay(2000);
sistem_durumu = DURUM_ANA_ARAYUZ;
}
void anaArayuzGuncelle() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("P:");
lcd.print(punta_ms);
lcd.print("ms D:");
lcd.print(anlik_darbe);
lcd.print("/");
lcd.print(darbe_sayisi);
lcd.setCursor(0, 1);
lcd.print("Toplam:");
lcd.print(toplam_punta);
}
void menuGuncelle() {
lcd.clear();
lcd.setCursor(0, 0);
if (menu_secim == 0) lcd.print(">");
lcd.print("Punta:");
lcd.print(punta_ms);
lcd.print("ms");
lcd.setCursor(0, 1);
if (menu_secim == 1) lcd.print(">");
lcd.print("Darbe:");
lcd.print(darbe_sayisi);
if (menu_secim == 2) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(">Aralik:");
lcd.print(aralik_ms);
lcd.print("ms");
}
}
void ayarGuncelle() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Ayar:");
if (menu_secim == 0) {
lcd.print("Punta");
lcd.setCursor(0, 1);
if (ayar_yanip_sonme) lcd.print(">");
lcd.print(punta_ms);
lcd.print("ms");
}
else if (menu_secim == 1) {
lcd.print("Darbe");
lcd.setCursor(0, 1);
if (ayar_yanip_sonme) lcd.print(">");
lcd.print(darbe_sayisi);
}
else if (menu_secim == 2) {
lcd.print("Aralik");
lcd.setCursor(0, 1);
if (ayar_yanip_sonme) lcd.print(">");
lcd.print(aralik_ms);
lcd.print("ms");
}
}
void kaydedildiMesaji() {
lcd.clear();
lcd.setCursor(3, 0);
lcd.print("KAYDEDILDI");
delay(1000);
sistem_durumu = DURUM_ANA_ARAYUZ;
}
bool tusBas(int pin) {
return digitalRead(pin) == LOW;
}
void tusKontrol() {
static unsigned long son_update = 0;
// OK tuşu kontrolü
bool ok_simdiki = tusBas(BUTTON_OK);
if (ok_simdiki && !ok_basili) {
ok_basili = true;
ok_baslangic = millis();
ok_uzun_basim = false;
}
if (ok_basili && ok_simdiki) {
if (millis() - ok_baslangic > 1000 && !ok_uzun_basim) {
ok_uzun_basim = true;
// Uzun basım algılandı
if (sistem_durumu == DURUM_ANA_ARAYUZ) {
sistem_durumu = DURUM_MENU;
menuGuncelle();
}
else if (sistem_durumu == DURUM_AYAR) {
ayarlariKaydet();
kaydedildiMesaji();
}
}
}
if (!ok_simdiki && ok_basili) {
ok_basili = false;
if (!ok_uzun_basim) {
// Kısa basım
if (sistem_durumu == DURUM_MENU) {
sistem_durumu = DURUM_AYAR;
ayar_yanip_sonme = 1;
ayarGuncelle();
}
else if (sistem_durumu == DURUM_AYAR) {
sistem_durumu = DURUM_MENU;
menuGuncelle();
}
}
}
// Diğer tuşlar
if (sistem_durumu == DURUM_MENU) {
if (tusBas(BUTTON_LEFT)) {
if (millis() - son_tus_zamani > 200) {
menu_secim = (menu_secim + 2) % 3;
menuGuncelle();
son_tus_zamani = millis();
}
}
if (tusBas(BUTTON_RIGHT)) {
if (millis() - son_tus_zamani > 200) {
menu_secim = (menu_secim + 1) % 3;
menuGuncelle();
son_tus_zamani = millis();
}
}
}
if (sistem_durumu == DURUM_AYAR) {
unsigned long simdi = millis();
bool hizli_degisim = false;
if (tusBas(BUTTON_UP) || tusBas(BUTTON_DOWN)) {
if (simdi - son_tus_zamani > 200 || (simdi - son_tus_zamani > 50 && tus_tekrar)) {
if (simdi - son_tus_zamani > 50 && tus_tekrar) hizli_degisim = true;
else if (!tus_tekrar) tus_tekrar = true;
if (tusBas(BUTTON_UP)) {
if (menu_secim == 0 && punta_ms < MAX_PUNTA_MS) punta_ms++;
else if (menu_secim == 1 && darbe_sayisi < MAX_DARBE) darbe_sayisi++;
else if (menu_secim == 2 && aralik_ms < MAX_ARALIK_MS) aralik_ms++;
}
if (tusBas(BUTTON_DOWN)) {
if (menu_secim == 0 && punta_ms > MIN_PUNTA_MS) punta_ms--;
else if (menu_secim == 1 && darbe_sayisi > MIN_DARBE) darbe_sayisi--;
else if (menu_secim == 2 && aralik_ms > MIN_ARALIK_MS) aralik_ms--;
}
son_tus_zamani = simdi;
ayarGuncelle();
}
} else {
tus_tekrar = false;
}
// Yanıp sönme
if (simdi - son_update > 500) {
ayar_yanip_sonme = !ayar_yanip_sonme;
ayarGuncelle();
son_update = simdi;
}
}
}
void setup() {
Serial.begin(115200);
EEPROM.begin(16);
lcd.begin(16, 2);
pinMode(BUTTON_UP, INPUT_PULLUP);
pinMode(BUTTON_DOWN, INPUT_PULLUP);
pinMode(BUTTON_LEFT, INPUT_PULLUP);
pinMode(BUTTON_RIGHT, INPUT_PULLUP);
pinMode(BUTTON_OK, INPUT_PULLUP);
pinMode(PEDAL_PIN, INPUT_PULLUP);
pinMode(RELAY_PIN, OUTPUT);
ayarlariOku();
baslangicEkrani();
}
void loop() {
tusKontrol();
if (sistem_durumu == DURUM_ANA_ARAYUZ) {
static unsigned long son_guncelleme = 0;
if (millis() - son_guncelleme > 500) {
anaArayuzGuncelle();
son_guncelleme = millis();
}
}
// Pedal kontrolü
bool pedal = digitalRead(PEDAL_PIN) == LOW;
if (pedal && !pedal_onceki && !islemde && sistem_durumu == DURUM_ANA_ARAYUZ) {
islemde = true;
anlik_darbe = 0;
for (uint8_t i = 0; i < darbe_sayisi; i++) {
anlik_darbe = i + 1;
anaArayuzGuncelle();
digitalWrite(RELAY_PIN, HIGH);
delay(punta_ms);
digitalWrite(RELAY_PIN, LOW);
if (i < darbe_sayisi - 1) {
delay(aralik_ms);
}
}
toplam_punta++;
anlik_darbe = 0;
ayarlariKaydet();
islemde = false;
}
if (!pedal) {
islemde = false;
}
pedal_onceki = pedal;
}SOL
AŞAĞI
OK
SAĞ
PEDAL
YUKARI