Arkadaşlar selamlar,
Arduino ide üzeründen derlediğim bu kodlar ile bir kart tasarladım. Atmega entegresi söküp takıyorum karta.
Proje bir tip sayıcı önünden geçen ürünleri ittiren bir motor var bir de düşen malzemeleri sayan bir sensör var .
Sistem çalışıyor sorun yok 120 yi geçtikten sonra rastgele bir sayıda kitleniyor tuşlar basmıyor sayaç saymıyor.
Enerjiyi kesip vermeme rağmen sistem eskisi gibi çalışmıyor.
Atmegaya yeniden kod yüklüyorum sorunsuz çalışmaya devam ediyor. Ancak bir yerde kitleniyor nerede kitleneceği hiç belli olmuyor.
Çıkışta 1amper çeken bir DC motor var RC filtre devresi var . 100R+100nF Besleme devresi uydu alıcısı adaptörü
Reset voltajı 2.7v olarak sigorta ayarlı
dahili 8mhz krsital
#include <EEPROM.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(6, 7, 2, 3, 4, 5); // bk
int ntc = A0;
//*************************************************************
const int ileri = 12;
const int geri = 11;
const int isitici_1 = 10;
const int isitici_2 = 9;
const int fan = 8;
//*************************************************************
const int menu = A3;
const int yukari = A4;
const int asagi = A5;
const int hasat = 13;
//************************************************************
word sayac = 0;
word sayac_set = 0;
byte ileri_set = 0;
byte men = 0;
byte sensay=0;
//***************************************************
void ayarlar() { // ayarlar
while (true) {
digitalWrite(fan, LOW);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("iLERi SET");
lcd.setCursor(0, 1);
lcd.print(ileri_set);
if ((ileri_set < 250) & (digitalRead(yukari)) == LOW) {
ileri_set++;
}
if ((ileri_set > 0) & (digitalRead(asagi)) == LOW) {
ileri_set--;
}
if (men == 1) {
men = 0;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("SAYAC:");
lcd.print(sayac);
lcd.setCursor(0, 1);
lcd.print("SET :");
lcd.print(sayac_set);
return;
}
if (digitalRead(menu) == LOW) {
delay(500);
EEPROM.put(4, ileri_set);
delay(20);
sayac_ayar();
}
delay(150);
}
}
void sayac_ayar() { // ayarlar
while (true) {
digitalWrite(fan, LOW);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("SAYAC SET");
lcd.setCursor(0, 1);
lcd.print(sayac_set);
if ((sayac_set < 1050) & (digitalRead(yukari)) == LOW) {
sayac_set=sayac_set+50;
}
if ((sayac_set > 0) & (digitalRead(asagi)) == LOW) {
sayac_set=sayac_set-50;
}
if (digitalRead(menu) == LOW) {
delay(500);
EEPROM.put(2, sayac_set);
delay(20);
men = 1;
return;
}
delay(120);
}
}
void setup() {
pinMode(ileri, OUTPUT);
pinMode(geri, OUTPUT);
pinMode(isitici_1, OUTPUT);
pinMode(isitici_2, OUTPUT);
pinMode(fan, OUTPUT);
pinMode(menu, INPUT);
pinMode(yukari, INPUT);
pinMode(asagi, INPUT);
pinMode(hasat, INPUT);
pinMode(ntc, INPUT);
lcd.begin(16, 2); // 16x2 LCD başlat
lcd.print("Panotim Otomasyn");
delay(1500);
lcd.clear();
EEPROM.get(2, sayac_set);
delay(20);
EEPROM.get(4, ileri_set);
delay(20);
if (sayac > 1010) {
sayac = 0;
}
if (sayac_set > 1010) {
sayac_set = 0;
}
if (ileri_set > 250) {
ileri_set = 0;
}
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("SAYAC:");
lcd.print(sayac);
lcd.setCursor(0, 1);
lcd.print("SET :");
lcd.print(sayac_set);
delay(1000);
}
void loop() {
if (digitalRead(hasat) == HIGH) { // ayrım motoru kontrol
sensay++;
if (sensay>=22){
sensay=0;
digitalWrite(fan, HIGH);
}
}
if (digitalRead(hasat) == LOW) {
digitalWrite(fan, LOW);
}
if (digitalRead(ntc) == HIGH) {
delay(7);
while (digitalRead(ntc) == HIGH) {
delay(7);
}
sayac++;
//lcd.clear();
lcd.setCursor(0, 0);
lcd.print("SAYAC:");
lcd.print(sayac);
//lcd.setCursor(0, 1);
//lcd.print("SET :");
//lcd.print(sayac_set);
if ( sayac >= sayac_set) { // bant kontrol
digitalWrite(fan, LOW);
delay(250);
digitalWrite(ileri, HIGH);
delay(1200);
digitalWrite(ileri, LOW);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("HEDEFE ULASTI");
lcd.setCursor(0, 1);
lcd.print("YENiDEN BASLIYOR");
sayac = 0;
delay(1000);
digitalWrite(ileri, HIGH);
delay(ileri_set * 50);
digitalWrite(ileri, LOW);
delay(1000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("SAYAC:");
lcd.print(sayac);
lcd.setCursor(0, 1);
lcd.print("SET :");
lcd.print(sayac_set);
delay(100);
}
}
if (digitalRead(asagi) == LOW) {
sayac = 0;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("SAYAC:");
lcd.print(sayac);
lcd.setCursor(0, 1);
lcd.print("SET :");
lcd.print(sayac_set);
}
if (digitalRead(menu) == LOW) {
delay(500);
ayarlar();
}
delay(10);
}
Alıntı yapılan: bahdiyarusta - 10 Kasım 2025, 17:15:35Arkadaşlar selamlar,
Arduino ide üzeründen derlediğim bu kodlar ile bir kart tasarladım. Atmega entegresi söküp takıyorum karta.
Proje bir tip sayıcı önünden geçen ürünleri ittiren bir motor var bir de düşen malzemeleri sayan bir sensör var .
Sistem çalışıyor sorun yok 120 yi geçtikten sonra rastgele bir sayıda kitleniyor tuşlar basmıyor sayaç saymıyor.
Enerjiyi kesip vermeme rağmen sistem eskisi gibi çalışmıyor.
Atmegaya yeniden kod yüklüyorum sorunsuz çalışmaya devam ediyor. Ancak bir yerde kitleniyor nerede kitleneceği hiç belli olmuyor.
Çıkışta 1amper çeken bir DC motor var RC filtre devresi var . 100R+100nF Besleme devresi uydu alıcısı adaptörü
Reset voltajı 2.7v olarak sigorta ayarlı
dahili 8mhz krsital
#include <EEPROM.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(6, 7, 2, 3, 4, 5); // bk
int ntc = A0;
//*************************************************************
const int ileri = 12;
const int geri = 11;
const int isitici_1 = 10;
const int isitici_2 = 9;
const int fan = 8;
//*************************************************************
const int menu = A3;
const int yukari = A4;
const int asagi = A5;
const int hasat = 13;
//************************************************************
word sayac = 0;
word sayac_set = 0;
byte ileri_set = 0;
byte men = 0;
byte sensay=0;
//***************************************************
void ayarlar() { // ayarlar
while (true) {
digitalWrite(fan, LOW);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("iLERi SET");
lcd.setCursor(0, 1);
lcd.print(ileri_set);
if ((ileri_set < 250) & (digitalRead(yukari)) == LOW) {
ileri_set++;
}
if ((ileri_set > 0) & (digitalRead(asagi)) == LOW) {
ileri_set--;
}
if (men == 1) {
men = 0;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("SAYAC:");
lcd.print(sayac);
lcd.setCursor(0, 1);
lcd.print("SET :");
lcd.print(sayac_set);
return;
}
if (digitalRead(menu) == LOW) {
delay(500);
EEPROM.put(4, ileri_set);
delay(20);
sayac_ayar();
}
delay(150);
}
}
void sayac_ayar() { // ayarlar
while (true) {
digitalWrite(fan, LOW);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("SAYAC SET");
lcd.setCursor(0, 1);
lcd.print(sayac_set);
if ((sayac_set < 1050) & (digitalRead(yukari)) == LOW) {
sayac_set=sayac_set+50;
}
if ((sayac_set > 0) & (digitalRead(asagi)) == LOW) {
sayac_set=sayac_set-50;
}
if (digitalRead(menu) == LOW) {
delay(500);
EEPROM.put(2, sayac_set);
delay(20);
men = 1;
return;
}
delay(120);
}
}
void setup() {
pinMode(ileri, OUTPUT);
pinMode(geri, OUTPUT);
pinMode(isitici_1, OUTPUT);
pinMode(isitici_2, OUTPUT);
pinMode(fan, OUTPUT);
pinMode(menu, INPUT);
pinMode(yukari, INPUT);
pinMode(asagi, INPUT);
pinMode(hasat, INPUT);
pinMode(ntc, INPUT);
lcd.begin(16, 2); // 16x2 LCD başlat
lcd.print("Panotim Otomasyn");
delay(1500);
lcd.clear();
EEPROM.get(2, sayac_set);
delay(20);
EEPROM.get(4, ileri_set);
delay(20);
if (sayac > 1010) {
sayac = 0;
}
if (sayac_set > 1010) {
sayac_set = 0;
}
if (ileri_set > 250) {
ileri_set = 0;
}
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("SAYAC:");
lcd.print(sayac);
lcd.setCursor(0, 1);
lcd.print("SET :");
lcd.print(sayac_set);
delay(1000);
}
void loop() {
if (digitalRead(hasat) == HIGH) { // ayrım motoru kontrol
sensay++;
if (sensay>=22){
sensay=0;
digitalWrite(fan, HIGH);
}
}
if (digitalRead(hasat) == LOW) {
digitalWrite(fan, LOW);
}
if (digitalRead(ntc) == HIGH) {
delay(7);
while (digitalRead(ntc) == HIGH) {
delay(7);
}
sayac++;
//lcd.clear();
lcd.setCursor(0, 0);
lcd.print("SAYAC:");
lcd.print(sayac);
//lcd.setCursor(0, 1);
//lcd.print("SET :");
//lcd.print(sayac_set);
if ( sayac >= sayac_set) { // bant kontrol
digitalWrite(fan, LOW);
delay(250);
digitalWrite(ileri, HIGH);
delay(1200);
digitalWrite(ileri, LOW);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("HEDEFE ULASTI");
lcd.setCursor(0, 1);
lcd.print("YENiDEN BASLIYOR");
sayac = 0;
delay(1000);
digitalWrite(ileri, HIGH);
delay(ileri_set * 50);
digitalWrite(ileri, LOW);
delay(1000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("SAYAC:");
lcd.print(sayac);
lcd.setCursor(0, 1);
lcd.print("SET :");
lcd.print(sayac_set);
delay(100);
}
}
if (digitalRead(asagi) == LOW) {
sayac = 0;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("SAYAC:");
lcd.print(sayac);
lcd.setCursor(0, 1);
lcd.print("SET :");
lcd.print(sayac_set);
}
if (digitalRead(menu) == LOW) {
delay(500);
ayarlar();
}
delay(10);
}
Kodların hepsi bu sanırım Semada eklense iyi olur devrede farkedılmeyen hata olabılır eklenirse eger arkadaslarımız daha iyi çözumler sunacaktır iyi çalışmalar
Alıntı yapılan: bahdiyarusta - 10 Kasım 2025, 17:15:35if ( sayac >= sayac_set) { // bant kontrol
İlk göze çarpan nokta burada iki adet sayaç kullanılmış.
İkisini takip etmek zor olabilir.
Hata ayıklama ile değerleri yazılabiliyor mu?
Alıntı yapılan: bahdiyarusta - 10 Kasım 2025, 17:15:35delay(ileri_set * 50);
Tercihen bekleme süresini sabit yapmak düşünülebilir.
vcc ve gnd arasına büyük bir kapasitör yada seramik kapasitör koy hocam voltaj çökmesi gibi duruyor.
Hata yakalamak için sayaç değişkenlerini seri porta yazmak düşünülebilir.
Fiziksel dünya ile iletişim kuran bir yazılımı, sahada görmeden hata tespiti güç olabilir.
Geçenlerde bir araba geliştirdik.
Saatlerce sürdük.
Sonradan motorların bir tanesinin dişlilerinin aşındığını farkettik.
Motor ilk kalkışta yüksek torkla kalktığı için muhtemelen aşınmış olabilir.
Araba ilk kez harekete geçiyorsa daha yavaş, seyir halinde ise normal hızla devam etmesi için ufak bir ekleme (https://codeberg.org/erdem/araba/src/branch/master/yazilim/araba/araba.ino#L37-L44) yaptık.
Bana kalsa oturur sil baştan yazılımı tekrar yazarım.
Yazılım geliştirirken, Git gibi sürüm denetimi yazılımlarının yanı sıra elle sürüm denetimi de yapıyorum.
Yazılımı ufak parçalara bölüyorum. Örneğin radyo, servo gibi.
Sonra bu ufak parçaların doğru çalıştığına emin oldukça ana yazılıma ekliyorum.
Ana yazılım toslarsa her zaman Git ile geri alma şansım var.
Bazen ufak parçalar da doğru çalışmıyor. Doğru çalışmayanları sürüm denetimi dışına, yani çöpe gönderiyorum.
Dikkat ederseniz iki kütük için ne kadar ön çalışma (https://codeberg.org/erdem/araba/src/branch/master/kaynak) yapılmış.
"int" değişkenleri "unsigned int" yapıp bir dene. Bir değişme oluyor mu?
Tekrar merhaba. Karşılaştığımız sorunlara çözüm bulabildiysek bunların yöntemini ve çözüm yolunu tekrar foruma yazalım ki insanlar bundan faydalanabilsin.
Motor enerji kablolarını çıkartıp sistemi çalıştırın ve takip edin kitlenme olacak mı?
Lojik devrelerde rastgelelik olmaz.
Çevre şartları değişmedikçe davranışı değişmez.
MCU larda PC (ProgramCounter) register ı wardır.
Eğer elektiriksel parazit alırsa bu sayaçlar sapıtır. Rastgele değer alırlar.
Tabii yazılan kodun neresine zıplayacağı bilnmediğinden kendi içindeki programıda bozacak okuma yazma oluşması mümkün.
ROM üzerinde yazılı olsa program resetleyince yeniden çalışır.
Ancak RAM, EPROM yada FLUSH hafıza üzerinde olunca datalar silinebilir yada yazılabilir hale gelir.
Bundan kurtulmanın yolu besleme hatlarını parazitlerden koruyacak filtrelerle devrenizi tasarlamak.
LC Filtrelerle parazitlerin NCU tarafına sirayetinin engellenmesi gerekir.
Selamlar,
İşlemcinin sahte olduğunu düşünerek farklı bir yerden sipariş verdim ve aynı yazılımı yükledim.
Problem çözüldü.
2 cipide nereden sipariş etmiştiniz alırken bizde dikkat edelim
Hakiki olanların üzerinde 1223 yazıyor. Diğerlerinin üzerinde 1409 yazıyor.
Hepsinde ATMEGA328P-PU yazıyor.
Sigorta bitleri bozulmuş olabilir.
Arduino geliştirme ortamı ile çekirdek yüklediğinizde sadece yazılımı atmakla kalmıyor sigortaları da ayarlıyor.