#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <stdio.h>
//#include "pico/stdlib.h"
#include "hardware/flash.h"
#include "hardware/sync.h"
#define menu_arti_button 6
#define menu_eksi_button 7
#define menu_select_button 8
// LCD setup
LiquidCrystal_I2C lcd(0x27, 16, 2);
int dilsecimi = 0;
int menuIndex = 0;
int altMenuIndex = 0;
bool inAltMenu = false; // Alt menüde olup olmadığınızı takip etmek için
const int addrDilsecimi = 0;
// EEPROM adresleri (Flash bellekte simüle ediyoruz)
const int addren = 4;
const int addrboy = 8;
const int addrderinlik = 12;
const int addrtumu = 16;
// EEPROM'a yazılacak değerler (örnek)
int eni = 100;
int boyu = 200;
int derinlik = 300;
int tumu = 400;
void write_to_flash(uint32_t addr, const void* data, size_t size) {
uint32_t ints = save_and_disable_interrupts(); // Kesme işlemlerini durduruyoruz
flash_range_erase(addr, FLASH_SECTOR_SIZE); // Flash'ı siliyoruz
flash_range_program(addr, (const uint8_t *)data, size); // Flash'a veri yazıyoruz
restore_interrupts(ints); // Kesme işlemlerini geri getiriyoruz
}
void read_from_flash(uint32_t addr, void* data, size_t size) {
memcpy(data, (const void *)(XIP_BASE + addr), size); // Flash'tan veri okuma
}
void setup() {
Serial.begin(9600);
Wire.setSDA(4);
Wire.setSCL(5);
Wire.begin();
lcd.init();
lcd.backlight();
lcd.begin(0,2);
lcd.print("Hello World!");
delay(2000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Pi Pico");
lcd.setCursor(0, 1);
lcd.print("lang menu");
delay(2000);
pinMode(menu_arti_button, INPUT_PULLUP);
pinMode(menu_eksi_button, INPUT_PULLUP);
pinMode(menu_select_button, INPUT_PULLUP);
// Flash'tan dil seçimini oku
read_from_flash(addrDilsecimi, &dilsecimi, sizeof(dilsecimi));
// Dil seçimine göre alt menüyü aç veya dil seçim menüsünü aç
if (dilsecimi < 0 || dilsecimi > 3) {
inAltMenu = false;
menuIndex = 0; // Dil seçim menüsüne yönlendir
displayMenu();
} else {
inAltMenu = true;
altMenuIndex = 1;
displayAltMenu();
}
}
void loop() {
if (digitalRead(menu_arti_button) == LOW) {
if (inAltMenu) {
altMenuIndex++;
if (altMenuIndex > 4) {
altMenuIndex = 0;
}
delay(300);
displayAltMenu();
} else {
menuIndex++;
if (menuIndex > 3) {
menuIndex = 0;
}
delay(300);
displayMenu();
}
}
if (digitalRead(menu_eksi_button) == LOW) {
if (inAltMenu) {
altMenuIndex--;
if (altMenuIndex < 0) {
altMenuIndex = 4;
}
delay(300);
displayAltMenu();
} else {
menuIndex--;
if (menuIndex < 0) {
menuIndex = 3;
}
delay(300);
displayMenu();
}
}
if (digitalRead(menu_select_button) == LOW) {
if (inAltMenu) {
handleAltMenuOption();
delay(300);
} else {
handleMenuOption();
delay(300);
}
}
}
void displayMenu() {
lcd.clear();
lcd.setCursor(0, 0);
switch (menuIndex) {
case 0:
lcd.print("0:Turkce");
break;
case 1:
lcd.print("1:English");
break;
case 2:
lcd.print("2:German");
break;
case 3:
lcd.print("3:Arabic");
break;
default:
lcd.print("Invalid Option");
break;
}
}
void displayAltMenu() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.leftToRight();
switch (altMenuIndex) {
case 0:
if (dilsecimi == 3) {
lcd.setCursor(15, 0);
lcd.rightToLeft();
} else {
lcd.leftToRight();
}
lcd.print(dilsecimi == 0 ? "Dil: Turkce" :
dilsecimi == 1 ? "Language: English" :
dilsecimi == 2 ? "Sprache: Deutsch" :
"العربية");
break;
case 1:
lcd.print(dilsecimi == 0 ? "Alt M: Parca eni" :
dilsecimi == 1 ? "Sub M: Part Width" :
dilsecimi == 2 ? "Unterm: Teil Breite" :
"عرض الجزء");
break;
case 2:
lcd.print(dilsecimi == 0 ? "Alt M: Parca boyu" :
dilsecimi == 1 ? "Sub M: Part Length" :
dilsecimi == 2 ? "Unterm: Teil Länge" :
"طول الجزء");
break;
case 3:
lcd.print(dilsecimi == 0 ? "Alt M: Parca derinlik" :
dilsecimi == 1 ? "Sub M: Part Depth" :
dilsecimi == 2 ? "Unterm: Teil Tiefe" :
"عمق الجزء");
break;
case 4:
lcd.print(dilsecimi == 0 ? "Alt M: Parca tum olcu" :
dilsecimi == 1 ? "Sub M: Part Full Measure" :
dilsecimi == 2 ? "Unterm: Teil Volle Maß" :
"القياس الكلي للجزء");
break;
default:
lcd.print("Invalid Option");
break;
}
lcd.leftToRight();
}
void handleMenuOption() {
lcd.clear();
switch (menuIndex) {
case 0:
dilsecimi = 0;
write_to_flash(addrDilsecimi, &dilsecimi, sizeof(dilsecimi));
lcd.print("Turkce Secildi");
inAltMenu = true;
altMenuIndex = 0;
displayAltMenu();
break;
case 1:
dilsecimi = 1;
write_to_flash(addrDilsecimi, &dilsecimi, sizeof(dilsecimi));
lcd.print("English Selected");
inAltMenu = true;
altMenuIndex = 0;
displayAltMenu();
break;
case 2:
dilsecimi = 2;
write_to_flash(addrDilsecimi, &dilsecimi, sizeof(dilsecimi));
lcd.print("German Selected");
inAltMenu = true;
altMenuIndex = 0;
displayAltMenu();
break;
case 3:
dilsecimi = 3;
write_to_flash(addrDilsecimi, &dilsecimi, sizeof(dilsecimi));
lcd.print("Arabic Selected");
inAltMenu = true;
altMenuIndex = 0;
displayAltMenu();
break;
default:
lcd.print("Invalid Option");
break;
}
delay(1000);
}
void handleAltMenuOption() {
lcd.clear();
switch (altMenuIndex) {
case 0:
menuIndex = 0;
inAltMenu = false;
displayMenu();
break;
case 1:
write_to_flash(addren, &eni, sizeof(eni));
lcd.print(dilsecimi == 0 ? "parca eni" :
dilsecimi == 1 ? "part width" :
dilsecimi == 2 ? "teil breite" :
"parcaa eni");
break;
case 2:
write_to_flash(addrboy, &boyu, sizeof(boyu));
lcd.print(dilsecimi == 0 ? "parca boyu" :
dilsecimi == 1 ? "part length" :
dilsecimi == 2 ? "teil länge" :
"parcaa boyu");
break;
case 3:
write_to_flash(addrderinlik, &derinlik, sizeof(derinlik));
lcd.print(dilsecimi == 0 ? "parca derinlik" :
dilsecimi == 1 ? "part depth" :
dilsecimi == 2 ? "teil tiefe" :
"parcaa derinlik");
break;
case 4:
write_to_flash(addrtumu, &tumu, sizeof(tumu));
lcd.print(dilsecimi == 0 ? "tum olcu" :
dilsecimi == 1 ? "full measure" :
dilsecimi == 2 ? "volle maß" :
"parcaa tum olcu");
break;
default:
lcd.print("Invalid Option");
break;
}
}