Arduino voltmetre ile uyarı

Analog inputlar, pull-up dirençleri açılmadığında ya da dışarıdan da herhangi bir yere bağlanmadığında devre yolları anten gibi çalışır ve rastgele değerler okurlar. Yaptığınız uygulamada pull-up dirençleri açmanıza gerek yok. A0'a ufak bir seramik kondansatör bağlayın,

Kontrol ederken siz de farketmişsinizdir, 12.5'dan küçükse röle çıkışını kapatıyor bu kod. Onun dışında bahsettiğiniz amaca hizmet ediyor gibi. Elektrolitik kondansatörlerin kutuplarına da dikkat ederseniz patlama çatlama olmadan çalışır.

ufak bir seramik kondansatör derken tam olarak ne koymam gerektiğini söyleyebilir misiniz ? Artı ucu A0 ucuna veri girişiyle beraber ? Eksi ucu gnd ? Doğru mu anladım ?
O zaman şu şekilde basit bir gerilim bölücü kullanabilirsiniz. Hesaplamaları +5V'a göre yapacaksınız.

Bu çıkışları Arduino'nun iki farklı analog girişine bağlayabilirsiniz.

Ekli dosyayı görüntüle 70276


Öncelikle İlgi ve alakanıza çok teşekkür ederim..
Dediğiniz gibi devreyi kursam bile yazılımı nasıl yapacağımı bilemedim.. A0 dan 14.4v ölçüp A1 den ölçtüğüm 5v ile kıyaslamam gerektiğini anladım sanki ama nasıl yapacağım hakkında bir fikrim yok.
 
Son düzenleme:
Göstermiş olduğunuz yazılım örneğinde hatalar var.

Birincisi analog olarak okuduğunuz veriyi 5'le çarpıyorsunuz ama devre şemasında 14.4 volta bağlanmış gibi görünüyor. O zaman hatalı işlem yapıyor.
Ben de ilk yazdığınız örneği daha dikkatli incelediğimde, her ne kadar 14.4 volta bağlamak pek iyi bir fikir olmasa da ilk yaptığınız hesaplamalar doğru gibi geldi.

soru1234.png

Fritzing devre şeması şu şekilde.

Burada iki tane farklı analog girişten gelen değerleri karşılaştırmanız gerekiyor.
 
Ben de ilk yazdığınız örneği daha dikkatli incelediğimde, her ne kadar 14.4 volta bağlamak pek iyi bir fikir olmasa da ilk yaptığınız hesaplamalar doğru gibi geldi.

Ekli dosyayı görüntüle 70279
Fritzing devre şeması şu şekilde.

Burada iki tane farklı analog girişten gelen değerleri karşılaştırmanız gerekiyor.
Neden bu değerleri karşılaştırması gerekiyor ki? Tek ihtiyaç duyduğu şey 14.4V olarak gösterdiği "Vin" voltajının değeri. Bunu hesaplatacak kodu da yazmış. Ve değişkenleri de doğru tanımlamış. Devreyi kurup, kodu derleyip sitemi de seri port ekranından sınayacak.
ufak bir seramik kondansatör derken tam olarak ne koymam gerektiğini söyleyebilir misiniz ? Artı ucu A0 ucuna veri girişiyle beraber ? Eksi ucu gnd ? Doğru mu anladım ?
Buraya100nF gibi bir kondansatör bağlayabilirsiniz. daha aşağısı da olur, fazlasına gerek yok. ilk çizdiğiniz devredeki gerilim bölücüdeki yüksek dirençler Arduinonun analog dijital çeviricisindeki örnekleme kondansatörünü yeterince hızlı doldurmayacaktır ve olduğundan düşük gerilim değerleri okumanıza sebep olacaktır. ilk mesajınızdaki devreyi kurun ve kodunuzu derleyin. Sonuçrı buradan paylaşırsınız.
 
Neden bu değerleri karşılaştırması gerekiyor ki?
Çünkü ölçülen değerlerin aralığının ölçüme etkisi var.

Direnç aralığı genişleyince ölçüm hatalı çıkıyor. Arkadaşımız da sadece gerilim 1-2 volt düşünce röleyi çalıştırmak istiyor.

Daha da hassas ölçüm için Schitt tetikleyicisi kullanmak düşünülebilir.

Ayrıca mantıksal devrelerle çalışırken her zaman +5V'la çalışmak, hatta mümkünse araya bir yalıtım elemanı koymak isteriz.
 
D
Direnç aralığı genişleyince ölçüm hatalı çıkıyor.
Ne kadar hatalı çıkıyor ve neden hatalı çıkıyor bunu açıklar mısınız? Kastettiğiniz şey hysteresis ise bunu kodlayarak sağlayabilir. Aslında analog çözüm daha zarif, küçük ve kararlı olur ama arkadaşın imkanları ve deyimi çerçevesinde sunduğu çözüm iş yapar.
 
Ne kadar hatalı çıkıyor ve neden hatalı çıkıyor bunu açıklar mısınız?

Tabi açıklarım.

Gerilim ölçmek için daha önce gösterdiğim bu basit örneği biraz değiştirdiğimizde, direnç aralıkları değiştiğinde okunması gereken gerilim hatalı çıkıyor.

C++:
#include <Arduino.h>

int cikisUcu = 13;
int okumaUcu = A0;
int okunanDeger = 0;
double gerilim = 0.0;
double okunmasiGerekenGerilim = 0.0;
double ilkDirenc = 220.00; // 220 Ω
double ikinciDirenc = 9900.00; // 9.9 kΩ
double besVoltGerilimi = 4.87;
double bilinmeyenDirenc = 0.00;

void setup()
{
    Serial.begin(9600);
    pinMode(cikisUcu, OUTPUT);
    digitalWrite (cikisUcu, LOW);
}

void loop()
{
    digitalWrite (cikisUcu, HIGH);
    okunanDeger = analogRead(okumaUcu);
    gerilim = okunanDeger * besVoltGerilimi / 1024.0;
    Serial.print(gerilim);
    Serial.println(" volt");
    okunmasiGerekenGerilim = besVoltGerilimi * (ikinciDirenc/(ilkDirenc + ikinciDirenc));
    Serial.print("Okunması gereken gerilim = ");
    Serial.print(okunmasiGerekenGerilim);
    Serial.println(" volt");

    bilinmeyenDirenc = ( (gerilim * ilkDirenc)) / ((besVoltGerilimi - gerilim));
    Serial.print(bilinmeyenDirenc);
    Serial.println(" ohm");
    delay(1000);
}

Bunun istatiki bir ölçümünü yapmadım ancak başkaları da benim aldığım sonuçlara benzer sonuç almışlar :

In order to get accurate output, the ratio of both resistors must be minimum.

Hassas bir ölçüm için direnç aralıkları birbirine yakın olmalı.

Burada birisi istatistiksel olarak bu değerleri hesaplatmış.

Anlattığına göre analog sayısal dönüşümünde ölçü olarak aldığımız gerilimdeki değişmelerin yanı sıra, düşük değerlikli bitlerde +-2 oynama nedeniyle de bir hata payı var.

Kastettiğiniz şey hysteresis ise bunu kodlayarak sağlayabilir. Aslında analog çözüm daha zarif, küçük ve kararlı olur

O zaman lütfen arkadaşa bu çözümü gösterin.
 
Tabi açıklarım.

Gerilim ölçmek için daha önce gösterdiğim bu basit örneği biraz değiştirdiğimizde, direnç aralıkları değiştiğinde okunması gereken gerilim hatalı çıkıyor.
Haklısınız, voltaj bölücüyü ölçüm ucunda maksimum değerinde, referans voltajına yakın olacak şekilde düzenlemek daha hassas sonuç verir. Ama burada 0,1V hassasiyetle ölçüm yapabilmek yeterli olacağını düşünmüştüm. Vref 5Volt iken 100k-10k voltaj bölücüyle 12 voltta ADC yaklaşık 250 okunacaktır ve 12/250=0,048V çözünürlük olur. Bunun yerine dediğiniz gibi 10k-5k gibi bir oran kullanması, daha hassas sonuç verir.
Hysteresis için de:

//0.1 V Histeresis için
if(digitalRead(relay)>0) // Röle çıkışı açıkken
{
if(vin>12.7)
{
digitalWrite(relay,0); //voltaj 12.7'den büyükse röleyi kapat
}
}
else // röle çıkışı kapalıyken
{
if(vin<12,6)
{
digitalWrite(relay,1); //voltaj 12.6'dan küçükse röleyi aç
}
}

kod böyle uygulanabilir. Çıkışın ne zaman açılıp kapanacağını devre elemanlarıyla oynamadan ayarlamış olur.
 
Ben de ilk yazdığınız örneği daha dikkatli incelediğimde, her ne kadar 14.4 volta bağlamak pek iyi bir fikir olmasa da ilk yaptığınız hesaplamalar doğru gibi geldi.

Ekli dosyayı görüntüle 70279
Fritzing devre şeması şu şekilde.

Burada iki tane farklı analog girişten gelen değerleri karşılaştırmanız gerekiyor.
14.4 volta mecburen bağlıyorum.. araba çalışırken 14.4v üretiyor.. 14.4 v de sabit kalmıyor zaten.. sürekli oynuyor.. arabam eski model bir araba olduğu için alternatörü düzenli bir çıkış sağlamıyor.. araba çalışmadığı zaman zaten aküye düşüyoruz.. aküde artık ne varsa.. iyi durumdaysa 12.5 civarı volt çıkar.. akü eskidikçe 11.5v 11v'a kadar düşer.. zaten amacım şarj kesmesini kontrol etmek.. alternatör de şarj ışığı olur normalde ama bende yok.. voltun 12.7 altına düştüğünde şarj etmediğini varsayıp voltajın sadece aküden geldiğini anlamış olucam.. galiba.. sanki.. inşallah..
Neden bu değerleri karşılaştırması gerekiyor ki? Tek ihtiyaç duyduğu şey 14.4V olarak gösterdiği "Vin" voltajının değeri. Bunu hesaplatacak kodu da yazmış. Ve değişkenleri de doğru tanımlamış. Devreyi kurup, kodu derleyip sitemi de seri port ekranından sınayacak.

Buraya100nF gibi bir kondansatör bağlayabilirsiniz. daha aşağısı da olur, fazlasına gerek yok. ilk çizdiğiniz devredeki gerilim bölücüdeki yüksek dirençler Arduinonun analog dijital çeviricisindeki örnekleme kondansatörünü yeterince hızlı doldurmayacaktır ve olduğundan düşük gerilim değerleri okumanıza sebep olacaktır. ilk mesajınızdaki devreyi kurun ve kodunuzu derleyin. Sonuçrı buradan paylaşırsınız.
İlk denememde çalıştı gibi ama şöyle bir sorunum var.. bazen çok güzel ölçüm yapıyor ama bazen 1-2 volt fazla ölçüyor.. ve volt hiç sabit kalmıyor.. sabit kalmayınca da röleye çok fazla tetik yolluyor.. özellikle yakın değerlere geldiğinde.. hatta bi ara röleye o kadar fazla tetik yolladı ki bozulacak sandım..
 
Analog girişe 100nF civarı bir kondansatör ekleyin. Yazdığım kodu inceleyip histeresis uygulayabilirsiniz. Bir de Erdem Bey'in önerdiği gibi direnç bölücüyü 10k-5k gibi veya 20k-10k gibi uygulayın. Ayrıca dögünün sonuna 1000ms delay ekleyin.
 
Analog girişe 100nF civarı bir kondansatör ekleyin. Yazdığım kodu inceleyip histeresis uygulayabilirsiniz. Bir de Erdem Bey'in önerdiği gibi direnç bölücüyü 10k-5k gibi veya 20k-10k gibi uygulayın. Ayrıca dögünün sonuna 1000ms delay ekleyin.
İlgi ve alakanız için çok teşekkür ederim.. dirençleri değiştirip tekrardan yapmayı deneyeceğim.. kondansatör de ekleyeceğim.. 1000 ms gecikme koyamıyorum diğer kodları etkiliyor..
 

Forum istatistikleri

Konular
128,106
Mesajlar
915,018
Kullanıcılar
449,807
Son üye
bdursun

Yeni konular

Geri
Üst