Arduino: buton/sensör ile sayaç yaparak led yakma

Başlatan overlok, 29 Ocak 2017, 18:06:10

Kabil ATICI

@mg1980
aslında olay ATMEGA bootloader yüklerken ne yapılacağı ile ilgili. Sözünü ettiğiniz olay eeprom koruma bitinin seçilip seçilmemesi ile ilgili. Büyük olasılıkla eeprom program yazılırken korunsun biti aktiflenmediği için program yükleme esnasında siliniyor, yani korunmuyor.

@overlok
Yazdığınız koda bakarak butonun vcc ile pin arasına bağlı görünüyor.  Buton basılma durumunu delay ile kontrol ediyorsun, burada kendine elinin ve butonun hızına güveniyorsun. Buna göre biraz uzun süre butona basılı kalsan 5 tane sayma işini halledecek.

Onun için butonun bırakıldığını da kontrol etmelisin. Yani butonu bastın, bırakılana kadar  tekrar bastı mı diye kontrol etmesin.
Bunu ya while ile yapabilirsin, ya da if komutuna ek bir değişken ile birlikte.
while komutu ile kullanımı sorunu, while döngüsü içinde iken durum değişene kadar program döngü içinde kalır.

if döngüsünde iken buton durumu değişene kadar program diğer işlerine de devam edebilir. (değişkenler bölümüne int butondurum1=LOW;satırına unutma.)
  if (butondurum == HIGH)
{
  if (butondurum1 == LOW)
    {
      butondurum1 = HIGH;
      //buton basıldı işlemleri..
    }
  }
  else
  {
    if (butondurum1 == HIGH)
      butondurum1 = LOW;
  }
ambar7

mg1980

Hocam koruma olsa benim de yazamamam gerekmez mi? Yazıyorum so nra programda değişiklik yapıp yüklediğimde kayıtlar duruyor.255 görmek gerek miyor mu?

Kabil ATICI

sözünü ettiğimiz yazma koruması değil zaten.Örneğin Atmega328p veri kağıdında Fuse High Byte içine yer alan EEPROM verilerinin silinmeye karşı korunması.
ATMEL işlemci içindeki EEPROM koruması her programlama esnasında EEPROM verisini yazmadan korumak için, (asm kodu olarak SPM için), yoksa LPM kod koruması (kullanıcının veri yazmasına) elbette yok. Bu sigorta ayarı harici programlayıcılar kullanılarak bootloader  veya başka bir programın yüklemesi esnasında ayarlanan bir sigorta bitidir.

Her ne kadar Arduino bootloader programını incelemedim, her program yüklemesinde eeprom'u silip silmediğine bakmak gerek. Tahminim silinmesi gerektiği yönünde, Arduino'yu yeni bir uygulama için kullanmanız gerekiyor, ve EEPROM verileri üzerinde kaldı, ne olacak?

Arduino programı içinde yer alan işlemci  için kullanın bootloader kodlamalarına bakılırsa, EEPROM ile işlem yapması mümkün görünüyor. Ama Arduino yazılımı EEPROM kodu üretmiyor ve yüklemiyor. Daha önceki paylaşımlarda bu konuşulmuştu. Bu nedenlerden dolayı EEPROM sıfırlaması yoluna gidilmiş olabilir. (Yakın zamanda bunu denemedim, sürekli gelişmekte olan bir program)
ambar7

mehmet

#18
Eeprom silinmesi olayını daha öncede yazmıştım:
Güçü yüksek psu kullanılıp enerji kesilince, çıkış
kondansatörü uzun süre yüklü kalıyor. Bu gerilim
mcu kritik çalışma gerilimi civarında fazlaca kalırsa
eeprom siliniyor.

Bunun için BrownOut kullanınız. Mümkün olan en
düşük gerilimde. Bu gerilime düşünce seviye mcu
resette kalacak ve bu gibi gariplikler oluşmayacaktır.
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

mg1980


overlok

Öncelike cevaplar için teşekkürler.

Kod bu haliyle çalışıyor ama sayaç işlemi ledin durumuna göre çalışmıyor. Yani ayrıca arka planda çalışır gibi çalışıyor. Led yanıksa sayma işleminin devrede olmasını nasıl sağlayabilirim? Yani led yanık değilse butona basılsa bile sayma işlemi gerçekleşmesin.

const int sensorPin = 10; //Sensör bağladığımız Pini 10 olarak ayarladık.
const int butonPin = 9;  // Butonu bağladığımız Pini 9 olarak ayarladık.
int ledPin =  8;     // Ledi bağladığımız Pini 8 olarak ayarladık.
int butondurum = 0; // Butonun durumunu atadığımız bir değişken tanımladık.
int sensordurum = 0; // Sensör durumunu atadığımız bir değişken tanımladık.
int sayac = 0;
   void setup() 
   {
        pinMode(ledPin, OUTPUT);     // Led çıkış olarak ayarlandı. 
        pinMode(butonPin, INPUT);     // Buton giriş olarak ayarlandı.
        pinMode(sensorPin, INPUT);     // sensor giriş olarak ayarlandı.
   }
   void loop()
  {   
   //sayac==0;
    butondurum = digitalRead(butonPin); // Buton pininden dijital okuma işlemi
    sensordurum = digitalRead(sensorPin); // sensör pininden dijital okuma işlemi
   if (sensordurum == LOW){  // sensör aktif ise durumu
   digitalWrite(ledPin,HIGH);
   }
   if (butondurum == HIGH){  // buton aktif ise durumu
        delay(150);
        sayac = sayac+1;
        while(digitalRead(butonPin));
        if(sayac==6){			// saymac 6 ise ledi yak
        digitalWrite(ledPin,LOW);
        sayac=0;			// ve tekrar için saymacı sıfırla
      }
    
   }
Hanımların dikkatine, overlok makinesi ayağınıza geldi!

overlok

Bu kod parçası doğru olur mu?
if (ledPin,HIGH) && (butondurum == HIGH){
Hanımların dikkatine, overlok makinesi ayağınıza geldi!

mg1980


overlok

Bu işin mantığını çözemiyorum bir türlü. İki koşul sağlandığında bi alt komuta geçsin istiyorum. Yani led yanık değilken buton aktif olmasın, sayma işlemi başlamasın.

if (ledpin == HIGH) && (butondurum == HIGH)


Bu kodu ekliyorum, led hiç sönmüyor.
Hanımların dikkatine, overlok makinesi ayağınıza geldi!

mg1980

Ne istediğinizi tam anlamadım ama sadece yukarda yazdığınız kod ve devamını şu iki şekilde dener misiniz ;
if(ledpin==HIGH && butondurum==HIGH)....... veya

if(digitalRead(ledpin)==HIGH && butondurum==HIGH).......

overlok

#25
@mg1980
Hocam teşekkürler bu kod çalıştı. Şimdilik sorun yok gibi.
if(digitalRead(ledpin)==HIGH && butondurum==HIGH)
Hanımların dikkatine, overlok makinesi ayağınıza geldi!