Tachometre(Çözüldü)

Arkadaşlar merhaba,arduino megayı kullanaıyorum.Optik sensörden aldığım “0” ları saydırıp rpm ini hesaplamak istiyorum.Analog 1 numaralı pinden sensör değerini alıp digital pine takmış olduğum ledin tepkisine göre saydırıyorum.Fakat yazmış olduğum kodda hız değişse bile rpm değişmiyor.Nerde hata yaptığımı bir türlü çözemedim.Bu konuda bana yardımcı olabilir misiniz?Yazmış olduğum kodlar aşağıdadır. int led=52;//52 numaralı dijital pin int count=0; int sayi=LOW; int stat2; int pervane=2;//Motorun başında sensörün görmesi için takılmış pervanenin diş sayısı unsigned long ezaman; double rpm; int milisegundos=500.0; void setup() { Serial.begin(9600); pinMode(led,OUTPUT); } void loop() { { int log1=analogRead(A1); double sensor=log1*(5/1024.0); //sensorden alınan değerin volt cinsinden hesabı if (sensor <= 0.5) { sayi=LOW; } else { sayi=HIGH; } digitalWrite(52,sayi); if(stat2!=sayi ) //ledde değişiklik olup olmadığını anlamak için { count++; stat2=sayi; Serial.print(“count:”); Serial.println(count); } if( double(millis()-ezaman) >= milisegundos){ rpm=(count/ pervane)*60000.0/(milisegundos); Serial.print("RPM: "); Serial.println(rpm); count=0; ezaman=millis(); } } }

Bu konuda bilgisi olan kimse yok mu?Koda if (sensor <= 0.5) kısmmından sonra if(sayi==LOW) {count++}kodunu da ekliyorum ama sensör sayarken arada 3er 4er ekleyerek sayıyor ben sensör cismi gördüğünde coun 1 kez artsın cismi gö

if( double(millis()-ezaman) >= milisegundos){ rpm=(count/ pervane)*60000.0/(milisegundos); Serial.print("RPM: "); Serial.println(rpm); count=0; ezaman=millis(); burda ne yapmaya çalıştın?

RPM hesaplıyorum2 kanatlı pervane sensörden her geçişinde arduino ya 0 değerini veriyor bende bu sıfır değerlerini saydırıyorum.Bir turda 2 kez saydığından count u ikiye bölerek tur sayısını hesaplıyorum. Benim için Şu an en büyük sorun sensörden pervanenin tek kanadı geçtiğinde count u arka arkaya 2 3kez arttırıyor.Ben kanadı 1 kez gördüğünde 1kez arttırsın istiyorum.

ozaman count u arttırma şartını değiştireceksin, sen her sayi=LOW olduğunda countu 1 arttırıyorsun, sayı önce LOW sonra HIGH olduğunda countu bir arttırmalısın.

sensorun bağlı olduğu pine bir 4.7k dirençle pull up yapmayı dene. yeteri kadar hızlı yukselmedıgı için portun bir kaç kez tetıklenıyor olabılırsın

if(sayi==LOW) {count++} normalde bu kodu çıkardığımda sayı önce LOW sonra HIGH olduğunda arttır demiş olmuyor muyum?Öyle bir durumda da değiğşe bir şey olmuyor.Sürekli artmaya devam ediyor. Sensörü bağlı olduğu pine 4.7 k bağladığımda count saymayı bırakıyor.3.5k da da yı şekilde saymıyor.sırasıyla 1k,2k ve 3k yı deneyerek pull up yaptığımda 11 er 12şer arttıyor

programa tekrar baktım optık sensoru neden analogla okuyorsun. direk digitalread yap gitsin analog değeri low high diye ayırmak anlamsız olur. olmaz yani. if digitalread(a1)==LOW {sayacartır} gibi bir kod yazsan işin biter illa analogla olsun diyorsan analogda gelen değeri belirlemen lazım onun altındakiler de veya hangi değer aralığı işine geliryarsa orada sayacını say

dijitalde yapınca count tek geçişte502 ye kadar sayıyor.Hatta 4.7k direnç koyup pull up yaptığımda yine aynı.Analogda gelen aralığı belirledim.countun bir kez arttıktan sonra sayi tekrardan HIGH olana kadar döngüde bekletebilmek için nasıl bir kod eklemeliyim bir fikriniz var mı?

ayk, saydırma mantığın yanlış. önceki mesajımda anlatmaya çalıştım ama becerememişim, tekrar deniyorum :slight_smile: senin kodunda sensörün döngüde “önümde engel varmı diye?” kontrol edip dönüyor, evetse sayacına 1 ekliycek, buraya kadar problem yok ama pervane yavaş döner, yada tam önünde durursa sayaç değerin yanılacak. çözüm dediğim gibi, -önümde engel varmı? +evet (pervane sensörün önünde) -önümde engel varmı? +hayır (pervane sensörü geçmiş) şimdi kontrol et, -elinde 1 evet 1 hayır (yada tam tersi) varsa, sayacı 1 arttır. mantık budur, hadi şimdi yaz. kolay gelsin :slight_smile:

Estağfurullah nsaryc siz gayet açık anlatıyorsunuz ama ben daha çok yeni olduğumdan bunları kod üzerinde uygulamakta baya zorlanıyorum.Aslında bende sizin söylediğiniz mantığı uygulamak istiyorum ama kod üzerinde gerçekleştirirken zorlanıyorum. :frowning: if(stat2!=sayi ) //ledde değişiklik olup olmadığını anlamak için { if(sayi==LOW) { deneme=true; } else { deneme=false; } stat2=sayi; } if(deneme==true) { count++; deneme=false; Serial.print("count: "); Serial.println(count); } söyledikleriniz doğrultusunda bunu yazdım ama galiba anlayamamışım.Çünkü yine aynı hatayı veriyor. :frowning:

nsaryc, Sanırım söylediğin böyle birşeydi.Diğer sensörde hata çıkınca IR LED le değiştirdim modifiye edemiyorum. int led = 52; double count = 0; int sayi = HIGH; int stat2; int pervane = 1; unsigned long gecenzaman; unsigned long ezaman; double rpm; int milisegundos = 1000.0; boolean ba; void setup() { Serial.begin(9600); pinMode(led, OUTPUT); ba=true; } void loop() { int log1 = analogRead(A0); float sensor = log1 * (5 / 1024.0); //sensorden alınan değerin volt cinsinden hesabı Serial.print("sensor: "); Serial.println(sensor); if (sensor >4.66) { sayi = LOW; } else { sayi = HIGH; ba=true; } digitalWrite(led, sayi); if (stat2 != sayi ) //ledde değişiklik olup olmadığını anlamak için { if (ba) { if (sayi == LOW) { count++; ba=false; Serial.print("count: "); Serial.println(count); } } stat2 = sayi; } if ( double(millis() - ezaman) >= milisegundos) { rpm = ((count / pervane) * 60000.0) / (milisegundos); Serial.print("RPM: "); Serial.println(rpm); count = 0; ezaman = millis(); } }

Merhaba arkadaşlar, http://www.instructables.com/id/Measure-RPM-DIY-Portable-Digital-Tachometer/?ALLSTEPS linkinde tachometre yapımına dair bilgiler var ve gayet iyi durumda.