#include <Servo.h>
#include <EEPROM.h>
#include <LiquidCrystal_I2C.h>
// LCD ekran bilgileri
LiquidCrystal_I2C lcd(0x27, 16, 2);
Servo myservo;
#define ldr A0
#define pil A7
#define ikaz 12
int ldr_oku;
int lldr = 0;
int adim = 106;
float para = 0;
// Pil değişkenleri
int min_deger = 988;
float yuzde = 0;
float deger = 0;
int gerilim = 0;
unsigned long simdiki_zaman = 0;
unsigned long onceki_zaman = 0;
int aralik = 32000;
// Pil Karakterleri
byte pil_yuz[8] = {
B01110,
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
B11111
};
byte pil_yetmisbes[8] = {
B01110,
B11011,
B10001,
B11111,
B11111,
B11111,
B11111,
B11111
};
byte pil_elli[8] = {
B01110,
B11011,
B10001,
B10001,
B11111,
B11111,
B11111,
B11111
};
byte pil_yirmibes[8] = {
B01110,
B11011,
B10001,
B10001,
B10001,
B11111,
B11111,
B11111
};
byte pil_on[8] = {
B01110,
B11011,
B10001,
B10001,
B10001,
B10001,
B11111,
B11111
};
// Kumbara değişkenleri
float toplam = 0;
float veritipi;
void setup()
{
Serial.begin(115200);
myservo.attach(8);
pinMode(ldr, INPUT);
pinMode(ikaz, OUTPUT);
myservo.write(106);
digitalWrite(ikaz, LOW);
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Kumbara V.1");
lcd.setCursor(0, 1);
float toplam = EEPROM.get(0, veritipi);
SatirTemizle(1);
lcd.setCursor(0, 1);
lcd.print("Toplam: ");
String mst = String(toplam);
String msst = "TL";
mst.concat(msst);
lcd.setCursor(8, 1);
lcd.print(mst);
}
void loop()
{
// Para Tanımlama Ve Kaydetme
lldr = analogRead(ldr);
ldr_oku = map(lldr, 0, 800, 0, 1);
if (ldr_oku == 0) {
myservo.write(adim);
adim++;
digitalWrite(ikaz, HIGH);
delay(30);
lldr = analogRead(ldr);
ldr_oku = map(lldr, 0, 800, 0, 1);
if ((ldr_oku == 1) && (adim >= 146)) {
para = 1;
Hesapla(para);
} else if ((ldr_oku == 1) && (adim >= 137)) {
para = 0.50;
Hesapla(para);
} else if ((ldr_oku == 1) && (adim >= 126)) {
para = 0.25;
Hesapla(para);
} else if ((ldr_oku == 1) && (adim >= 119)) {
para = 0.10;
Hesapla(para);
} else if ((ldr_oku == 1) && (adim >= 115)) {
para = 0.05;
Hesapla(para);
}
} else {
myservo.write(106);
}
// Pil Ölçümü
simdiki_zaman = millis();
if (onceki_zaman >= 4294967295) onceki_zaman = 0;
if (simdiki_zaman - onceki_zaman >= aralik) {
onceki_zaman = simdiki_zaman;
gerilim = analogRead(pil);
Serial.print("Analog Read: ");
Serial.println(gerilim);
if (gerilim >= 1022)
gerilim = 1022;
if (gerilim <= 988)
gerilim = 988;
yuzde = gerilim - min_deger;
//Serial.print("Yüzde: ");
//Serial.println(yuzde);
deger = (100.00 / 34.00) * yuzde;
//Serial.print("Değer: ");
//Serial.println(deger);
if (deger >= 90.00) {
PilGosterge(pil_yuz);
} else if (deger >= 75.00) {
PilGosterge(pil_yetmisbes);
} else if (deger >= 50.00) {
PilGosterge(pil_elli);
} else if (deger >= 25.00) {
PilGosterge(pil_yirmibes);
} else {
PilGosterge(pil_on);
}
}
}
// Para Kaydetme Fonksiyonu
void Hesapla(float gelen_para) {
SatirTemizle(0);
lcd.setCursor(0, 0);
lcd.print("Son Atilan: ");
lcd.setCursor(12, 0);
lcd.print(gelen_para);
Serial.print("Son Atilan: ");
Serial.println(gelen_para);
float toplam = EEPROM.get(0, veritipi);
toplam += gelen_para;
// Aşağıdaki EEPROM satırı sistem tamamen çalışır duruma gelince aktif edilecek.
// Bu komut kapalı olduğu için sistem toplama yapmaz.
// Sistemem tamamen hazır olduğunda aktif edilir ve toplama yapmaya başlar.
// EEPROM.put(0,toplam);
SatirTemizle(1);
lcd.setCursor(0, 1);
lcd.print("Toplam: ");
String mst = String(toplam);
String msst = "TL";
mst.concat(msst);
lcd.setCursor(8, 1);
lcd.print(mst);
adim = 106;
myservo.write(adim);
digitalWrite(ikaz, LOW);
Serial.print("Toplam: ");
Serial.print(toplam);
Serial.println(" TL");
delay(50);
}
// Pil Göstergesi Fonksiyonu
void PilGosterge(byte gelen_char) {
lcd.createChar(1, gelen_char);
lcd.setCursor(15, 1);
lcd.write(1);
}
// LCD Satır Temizleme Fonksiyonu
void SatirTemizle(int satir) {
lcd.setCursor(0, satir);
lcd.print(" ");
lcd.setCursor(0, satir);
}