Işık farkı için oransa okuma olabilir belki.

Tam aydınlık Açık alan okuma 1024, 50 kuruş okuma 500 Oran ~%50
Işık biraz az Açık alan okuma 800, 50 kuruş için %50 400 okunmalı.

Tabi değişimlerin/tepkilerin lineer olduğunu varsayıyorum.

@Gokrtl,

{... loop

int nihai_tespit =1024;
int okunan_deger=0;

while (analog_read < 800) // 800 den küçük okuma yakalandı while döngüsüne gir.
{
okunan_değer =analogread; // okuma yap
if ( okunan_deger < nihai_tespit ) nihai_tespit =okunan_deger; // yeni okunan değer daha küçükse onu referans al.
} // 800 den büyük okuyor artık para geçti gitti en küçük okumayı tespit ettik.

if ( 550 > nihai_tespit and nihai_tespit > 450 ) serialprint("okunan 50 kuruş");
if ( 750 > nihai_tespit and nihai_tespit > 650 ) serialprint("okunan 1TL");


loop ...}
Şuan sistemi sabitlemek üzere çalışma yapıyorum. sonrasında bu kodları kullanacağım.
 
Bu sorunu arduino due kullanarak çözebileceğini düşünüyorum.
SRAM yüksek olmalı ve SAAT FREKANSI da yüksek olmalı
Due belki sorunu çözebilir ama gereksiz derecede büyük ve pahalı gelir bu sistem için.
 
TL072 gelene kadar kumbara ile uğraşayım dedim. LDR ile yapmakta olduğum düzenek yapıştırıcının geç kuruması yüzünden bekletiyor beni.
Bu arada eski sistem para kaydırarak sayma işleminde nerede takıldığımı araştırmak üzere kodlara gömüldüm.
Biraz sakin kafa ile kurcalayınca paranın yataktan kaymasına rağmen neden okunmadığını buldum.
Pil ölçümü için kullandığımız A0 analog pini sürekli veri okuyor. O kadar çok veri okuyor ki diğer yataklardan geçen paraları arduino arada yakalayamıyor. Bu analog okumayı devre dışı bıraktığım zaman para yataktan geçene kadar 3-4 kere okuyor. Analog okuma kısmına "Delay" komutu versem bu sefer de loop'un başa dönmesi delay süresi kadar geciktiğinden yine okumuyor parayı.
Öyle bir şey yapmalıyım ki analog pin 2dk da bir kez pili okusun. Geri kalan kısımda loop sadece para yatakları için dönsün dursun. Ama ne?
 
Şöyle birşey olabilir. Ama bu delayMicroseconds her Arduinoda olmayabilir bakmak lazım.

C:
#define MAX_ZAMAN 30000
int zaman = 0;

void loop ()
{
    delayMicrosecond(1000);

    if (zaman < MAX_ZAMAN)
    {
        ++zaman;
    }
    else
    {
        zaman = 0;
    }

    if ((zaman % 1000) == 0)
    {
        // bir saniye gecti
    }
}
 
Şöyle birşey olabilir. Ama bu delayMicroseconds her Arduinoda olmayabilir bakmak lazım.

C:
#define MAX_ZAMAN 30000
int zaman = 0;

void loop ()
{
    delayMicrosecond(1000);

    if (zaman < MAX_ZAMAN)
    {
        ++zaman;
    }
    else
    {
        zaman = 0;
    }

    if ((zaman % 1000) == 0)
    {
        // bir saniye gecti
    }
}
"//Bir saniye geçti "kısmına bizim kodları mı ekleyeceğiz abi?
 
Oraya eklediğin kod saniyede bir çalışacak.
delayMicrosecond(1000);

Bu kod arduino web sitesinde fonksiyonlar içinde tanıtılmasına rağmen ide tanımıyor abi.
Birisi millis fonksiyonunu önerdi ama nasıl kullanılıyor bilmiyorum. Şimdi onun örneklerine bakacağım.
 
TL072 gelene kadar kumbara ile uğraşayım dedim. LDR ile yapmakta olduğum düzenek yapıştırıcının geç kuruması yüzünden bekletiyor beni.
Bu arada eski sistem para kaydırarak sayma işleminde nerede takıldığımı araştırmak üzere kodlara gömüldüm.
Biraz sakin kafa ile kurcalayınca paranın yataktan kaymasına rağmen neden okunmadığını buldum.
Pil ölçümü için kullandığımız A0 analog pini sürekli veri okuyor. O kadar çok veri okuyor ki diğer yataklardan geçen paraları arduino arada yakalayamıyor. Bu analog okumayı devre dışı bıraktığım zaman para yataktan geçene kadar 3-4 kere okuyor. Analog okuma kısmına "Delay" komutu versem bu sefer de loop'un başa dönmesi delay süresi kadar geciktiğinden yine okumuyor parayı.
Öyle bir şey yapmalıyım ki analog pin 2dk da bir kez pili okusun. Geri kalan kısımda loop sadece para yatakları için dönsün dursun. Ama ne?
Arduino'da dış kesme kullanılabiliyor.
Para geçerken bir anahtarı tetikleyebilirse, bu geçişi dış kesme ile algılayıp sadece tam para geçerken ADC okuması çalıştırılabilir.

https://maker.robotistan.com/arduinoda-kesme-islemleri/
 
delayMicrosecond(1000);

Bu kod arduino web sitesinde fonksiyonlar içinde tanıtılmasına rağmen ide tanımıyor abi.
Birisi millis fonksiyonunu önerdi ama nasıl kullanılıyor bilmiyorum. Şimdi onun örneklerine bakacağım.

Normal delay fonksiyonu milisaniye bazlı çalışıyor, ama 1 milisaniye beklemek için onu kullanırsan hassas olmaz. Ama 10 milisaniye bazında kullanabilirsin. Bu durumda delayMicroseconds yerine delay(10) yaparsın ve artık senin zaman sayacın 10 milisaniye birimli olur.
 
Anahtarları paralel kullanabilir ve sadece para geçerken LDR ye düşen ışık miktarını ADC ile ölçebilirsin.
Bu şekilde loop içinde sürekli ADC okumanda gerekmez.
 
Ray ve elektriksel temas ile o işi hiçbir zaman güvenilir bir şekilde yapamazsın. İyi temasın garantisi yok. Para kayarken, duruma göre ya hiç temas etmez, ya bir kere temas eder yada onlarca kez temas eder. Bu projede saçları ağartmak istemiyorsan, o işin ya ışıkla yada manyetik yolla olması lazım :)
 
Denemenin kolay yolu. A0 pini ile kesme oluşturacak uygun bir pine bağlantı. Direkt kısa devre şeklinde.
Muhtemelen büyük paralarda çalışacaktır.
Çalışırsa, ama küçük paralarda kesme oluşuracak kadar düşük voltaj üretemezse, küçük paralar için referans gerilim belirleyip bir komparatordan sonra kesme pinine bağlantı.
 
Dediğim gibi LDR ile para tanımlama işi yapıştırıcının yavaş kurumasından dolayı zaman alıyor. Ben o boşlukta bu para kayma konusunu kurcalıyorum. sorunu çözelim ki aklımızda "neden olmadı" sorusu kalmasın.
Velhasıl kelam milis() fonksiyonu mikro işlemcinin beklemeden çalışmaya devam etmesini sağlıyormuş.
Delay yerine millis kullandığımızda sadece kullandığımız yeri bekletip diğer kodların çalışmaya devam etmesini sağlıyormuş.
Yarın bu kodu kullanarak deneme yapacağım. Artık uyku vakti :)
 
Aslında tam olarak kaç sn geçtiğini bilmene gerek yok. Aşağıdaki gibi pratik bir yol izleyebilirsin.

kontrol_zamanı = şimdi + X dk.

void loop ()
{
if (şimdi >= kontrol_zamanı ){
... // veri kayıt fonksiyonu
kontrol_zamanı = şimdi + X dk.
}
// else kullanmana gerek yok.
... // normal akış
 
Aslında tam olarak kaç sn geçtiğini bilmene gerek yok. Aşağıdaki gibi pratik bir yol izleyebilirsin.

kontrol_zamanı = şimdi + X dk.

void loop ()
{
if (şimdi >= kontrol_zamanı ){
... // veri kayıt fonksiyonu
kontrol_zamanı = şimdi + X dk.
}
// else kullanmana gerek yok.
... // normal akış
Şimdi değişkenini nerden bilecek cihaz?
Sanırım onun için
Kod:
şimdi = millis();
kullanmamız gerek.
 
Aşağıdaki kodlar ile çözdüm işi. Ama 32 saniyeden (32000ms) fazla değer girince çalışmıyor. Yani 2dk da bir çalıştırmak istiyorum ama 120000ms kabul etmiyor.

C:
//Globaller

unsigned long simdiki_zaman = 0;
unsigned long onceki_zaman = 0;
int aralik = 32000;

// Loop
 simdiki_zaman = millis();
  if (simdiki_zaman - onceki_zaman >= aralik) {
    onceki_zaman = simdiki_zaman;
    //Pil Ölçüm Kodları
  }
 
Ben genel bir cevap verdim. millis Arduino çalışmaya başladıktan sonra geçen süreyi ifade ediyor. Yaklaşık 50 gün sonra sıfırlanıyor. Ona uygun yazman lazım.
 
Ben genel bir cevap verdim. millis Arduino çalışmaya başladıktan sonra geçen süreyi ifade ediyor. Yaklaşık 50 gün sonra sıfırlanıyor. Ona uygun yazman lazım.
Okuduğum kadarıyla sıfırlanınca baştan başlıyor. Mevcut durumda öngöremediğim bir şey var mı bilmiyorum ama 50 gün sonra sıfırdan başlamasının bana bir zararı yok gibi.
 

Çevrimiçi personel

Forum istatistikleri

Konular
6,952
Mesajlar
118,755
Üyeler
2,824
Son üye
selocan32

Son kaynaklar

Son profil mesajları

hakan8470 wrote on Dede's profile.
1717172721760.png
Dedecim bu gul mu karanfil mi? Gerci ne farkeder onu da anlamam. Gerci bunun anlamini da bilmem :gulus2:
Lyewor_ wrote on hakan8470's profile.
Takip edilmeye başlanmışım :D ❤️
Merhaba elektronik tutsakları...
Lyewor_ wrote on taydin's profile.
Merhabalar. Elektrik laboratuvarınız varsa bunun hakkında bir konunuz var mı acaba? Sizin laboratuvarınızı merak ettim de :)
Lyewor_ wrote on taydin's profile.
Merhabalar forumda yeniyim! Bir sorum olacaktı lcr meterler hakkında. Hem bobini ölçen hemde bobin direnci ölçen bir lcr meter var mı acaba?
Back
Top