- Katılım
- 27 Şubat 2019
- Mesajlar
- 12,203
Arduino ile Para Sayan Kumbara yapmayı planlıyorum. 1tl, 50kr, 25kr, 10kr ve 5kr için 5 ayrı bölme olacak. Yani parayı attığımda hem ayıracak hem sayacak bir sistem. Bunun için paranın delikten geçtiğini görüp arduino pinine sinyal gönderecek 5 ayrı göz lazım. Ben bu gözün adını hatırlayamadım. IR alıcı mıydı, foto transistör müydü yada başka birşey miydi? Bu konuda bana yardımcı olur musunuz?
Edit: PROJEYİ BİTİRDİM
Uzun süredir üzerinde çalıştığım arduino nano kumbara projemi sonunda bitirdim. Bu kadar uzun sürmesinin nedeni parayı tanımlayacak mekanik kısmın uğraştırmasıydı. Çeşit çeşit mekanizmalar oluşturup denedim ve en sonunda güzel çalışan bir sistem yaptım.
Gerekli Tüm Dosyalar Ekteki Zip Dosyası İçindedir. Takıldığınız yeri Sorabilirsiniz.
Arduino Nano Shield
Test Aşamaları
Servo, LED ve LDR Bağlantı şeması
Edit: PROJEYİ BİTİRDİM
Uzun süredir üzerinde çalıştığım arduino nano kumbara projemi sonunda bitirdim. Bu kadar uzun sürmesinin nedeni parayı tanımlayacak mekanik kısmın uğraştırmasıydı. Çeşit çeşit mekanizmalar oluşturup denedim ve en sonunda güzel çalışan bir sistem yaptım.
Gerekli Tüm Dosyalar Ekteki Zip Dosyası İçindedir. Takıldığınız yeri Sorabilirsiniz.
Arduino Nano Shield
Test Aşamaları
Servo, LED ve LDR Bağlantı şeması
Kod:
#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(7, 1);
lcd.print(mst);
}
// Pil Göstergesi Fonksiyonu
/*void PilGosterge(byte gelen_char) {
lcd.createChar(1, gelen_char);
lcd.setCursor(15, 1);
lcd.write(1);
}*/
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);
digitalWrite(ikaz, LOW);
}
// 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);
lcd.createChar(1, pil_yuz);
lcd.setCursor(15, 1);
lcd.write(1);
} else if (deger >= 75.00) {
//PilGosterge(pil_yetmisbes);
lcd.createChar(1, pil_yetmisbes);
lcd.setCursor(15, 1);
lcd.write(1);
} else if (deger >= 50.00) {
//PilGosterge(pil_elli);
lcd.createChar(1, pil_elli);
lcd.setCursor(15, 1);
lcd.write(1);
} else if (deger >= 25.00) {
//PilGosterge(pil_yirmibes);
lcd.createChar(1, pil_yirmibes);
lcd.setCursor(15, 1);
lcd.write(1);
} else {
//PilGosterge(pil_on);
lcd.createChar(1, pil_on);
lcd.setCursor(15, 1);
lcd.write(1);
}
}
}
// 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(7, 1);
lcd.print(mst);
adim = 106;
myservo.write(adim);
digitalWrite(ikaz, LOW);
Serial.print("Toplam: ");
Serial.print(toplam);
Serial.println(" TL");
delay(50);
}
// LCD Satır Temizleme Fonksiyonu
void SatirTemizle(int satir) {
lcd.setCursor(0, satir);
lcd.print(" ");
lcd.setCursor(0, satir);
}
Ekler
Son düzenleme: