avatar_kotan04

arduino gosub

Başlatan kotan04, 08 Mart 2017, 09:28:21

kotan04

Merhaba ;

programı denedim . değişken açılışta 300  değerini alıyor butona basınca 310 oluyor elimi çektiğimde tekrar 300 oluyor .

sanırım ufak bir şeyler var çalışacak gibi.

mg1980

Buton durumlarını gösteren if'leri ayrı ayrı {} parantez içine alın.

kotan04

ekledim  fakat aynı isterseniz bir inceleyin.


const int buton1 = 3; 
const int buton2 = 2;
int hiz=300;// defeul değer
int led1 = 13;
int led2 = 12;

int butonstate1,butonstate2 ;

void setup()

{

pinMode(led1,  OUTPUT);
pinMode(led2,  OUTPUT);

pinMode(buton1, INPUT_PULLUP);
pinMode(buton2, INPUT_PULLUP);
delay (800);

}

void loop()

{
  while(1){
  digitalWrite(led1, HIGH);   //
  digitalWrite(led2, LOW);    //

  delay(hiz);
  kontrol();

  digitalWrite(led1, LOW);      //
  digitalWrite(led2, HIGH);     //

  delay(hiz); 
  kontrol();
}
}
void kontrol(){
   
     butonstate1 = digitalRead(buton1);
     butonstate2 = digitalRead(buton2);
     delay(1000);
     {
       if (butonstate1==LOW)  ;
     }
       
         hiz=hiz+10;
    { 
         if(hiz>=2500) hiz=2000;
         delay(200);     
    } 
 
  {
       if (butonstate2==LOW) ;
  }
        hiz=hiz-10;
   {
       if(hiz<=100) hiz=100;
        delay(200);
   }

}


mg1980

Yanlış olmuş.Benim son koyduğum kodlarda düzelttim.Orada if'lerin karşısındaki ; da hatalıymış yeni farkettim.Buna göre deneyin.

kotan04

Merhaba mg1980;

son yaptığın düzeltme işe yaradı ben sadece bekleme sürelerini değiştirdim eline sağlık .

konuyu anlamak için soruyorum ;

parantez işaretlerindeki düzeltmeleri açıklar mısın? neden bu şekilde yaptın?



const int buton1 = 3; 
const int buton2 = 2;
int hiz=120;// defeul değer
int led1 = 13;
int led2 = 12;

int butonstate1,butonstate2 ;

void setup()

{

pinMode(led1,  OUTPUT);
pinMode(led2,  OUTPUT);

pinMode(buton1, INPUT_PULLUP);
pinMode(buton2, INPUT_PULLUP);
delay (800);

}

void loop()

{
  while(1){
  digitalWrite(led1, HIGH);   //
  digitalWrite(led2, LOW);    //

  delay(hiz);
  kontrol();

  digitalWrite(led1, LOW);      //
  digitalWrite(led2, HIGH);     //

  delay(hiz); 
  kontrol();
}
}
void kontrol(){
   
     butonstate1 = digitalRead(buton1);
     butonstate2 = digitalRead(buton2);
   //  delay(1000);
     
       if (butonstate1==LOW)  {
     
       
         hiz=hiz+10;
         if(hiz>=2500) hiz=2000;
         delay(100);     
        }
 
       if (butonstate2==LOW) {
     
        hiz=hiz-10;
        if(hiz<=100) hiz=100;
        delay(100);
       }

}



mg1980

Kontrol ettiğiniz buton durumu(if)(şart) doğru olduğu sürece o parantez içlerindeki komutları yerine getirir.Bir önceki hatalı durumda if satırları sonunda ; olduğu için onu ayrı bir komut kabul ediyor işliyordu ama derleme hatası vermiyordu. Siz butona bir kere bastığınız halde her iki parantez grubu içine giriyor önce 10 artırıyor peşinden diğer butona basmadığınız halde eksiltiyordu. Size tavsiyem C dili ile ilgili bir döküman incelemeniz. Serdar ÇİÇEK'in CCS kitabı, öncesinde yazdığım Fahrettin ERDİNÇ'in Arduino kitaplarında bunların çok güzel açıklamaları var. Bunları incelerseniz daha kısa sürede öğrenirsiniz.

kotan04

çok teşekkürler :) ben hep ortadan daldığım için haliyle anlamadığım yerler oluyor yardımlarından dolayı teşekkür ederim.

iyi çalışmalar.

kotan04

Merhaba Arkadaşlar;

buton ile hız ayarlama sıkıntısını çözdüm şimdi isi hız değişkenin deki değeri eeproma kaydetmek istiyorum.

fakat değer 255 rakamını geçince eeprom içine kaydolmuyor aslında problemi kaynağını biliyorum.

eeproma kaydedeceğim rakam örneğin 1000 buda word tipi bir değişkene kayıt olabilir fakat ben eproma kayıt ederken high byte ,low byte olarak kayıt etmeyi beceremedim .yardımcı olursanız memnun olurum.


#include <EEPROM.h>
const int buton1 = 3; 
const int buton2 = 2;
word hiz;// defeult değer
int led1  = 13;
int led2  = 12;
int led3  = 11;
//int okunanVeri;
 
//int butonstate1,butonstate2 ;

void setup()

{
delay (1000);

pinMode(led1,  OUTPUT);
pinMode(led2,  OUTPUT);
pinMode(led3,  OUTPUT);
pinMode(buton1, INPUT_PULLUP);
pinMode(buton2, INPUT_PULLUP);


}
void loop()
{
   
  while(1){

 
  digitalWrite(led1, HIGH);   //
  digitalWrite(led2, LOW);    //



/* EEPROMa kaydedilmiş verileri okuyalım */
  // 10 adresini okuyacağız
hiz = EEPROM.read(1 ); /* EEPROMun 10 adresindeki veri okunanVeri değişkenine aktarılıyor. */
delay(10);

  delay(hiz);
  kontrol();

  digitalWrite(led1, LOW);      //
  digitalWrite(led2, HIGH);     //
 

  delay(hiz); 
  kontrol();
          }
          }
  void kontrol()


           {
           while(digitalRead(buton1)==LOW)
           {
 
           hiz=hiz+10;
           save();
           delay(50);
           if(hiz>=2500) hiz=2000; 
           //
           }
           
         
           while(digitalRead(buton2)==LOW)
           {
           
           hiz=hiz-10;
           save();
           delay(50);
           if(hiz<=100) hiz=100;
           //
           }
           
           }

void save()
{
/* EEPROMa veri kaydediyoruz */
/* Verinin yazılacağı EEPROM adresi */
   /* EEPROMA kaydedilecek veri */
EEPROM.write(1, hiz); /* EEPROMun 10 adresine 50 verisi yazdırıldı. */



}


iyi çalışmalar.

fatih88

usta değişkeni 2 byte olarak yazacan onuda örnek veriyorum 2525 gibi degerimiz olsun bunu c mantığıyla nasıl kayıt ederiz anlaşılan basic dilinden c diline geçmişiniz     degişken1=2525/100 diyoruz değişken1=25 degerini alacaktır degişken ikiyide mod bulma işlemine tabi tutacagız kalan bulma diyelim değişken2=2525%100 diyoruz  değişken2=25 degerini alacaktır sonra bu iki degeri eproma yazmak kalıyor eepromdan da okurken misal hız=değişken1x100+değişken2 diyoruz
bilgi paylaştıkça çoğalır!!

www.fayelektronik.com

mehmet

Buton okurken "debounce" gecikmesi koymayı ihmal
etmeyiniz. Mesela;


if(digitalRead(buton1) == 1)// butona basıldı mı?
{
     delay(20);
     if(digitalRead(buton1) == 1)//20ms sonra hala butona basılıyor mu?
     {
          butonstate1 = 1;
     }
}


"butonstate1" değerini de butona basıldığını anlayıp, işlediğiniz
yerde sıfırlarsınız.
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
http://www.mehmetbilgi.net.tr
CC BY

kotan04

Alıntı yapılan: mehmet - 31 Mart 2017, 03:47:29
Buton okurken "debounce" gecikmesi koymayı ihmal
etmeyiniz. Mesela;


if(digitalRead(buton1) == 1)// butona basıldı mı?
{
     delay(20);
     if(digitalRead(buton1) == 1)//20ms sonra hala butona basılıyor mu?
     {
          butonstate1 = 1;
     }
}


"butonstate1" değerini de butona basıldığını anlayıp, işlediğiniz
yerde sıfırlarsınız.

merhaba;

neden eklemeleyim ? anlatır mısınız ?

iyi çalışmalar.

kotan04

Alıntı yapılan: fatih88 - 30 Mart 2017, 18:08:44
usta değişkeni 2 byte olarak yazacan onuda örnek veriyorum 2525 gibi degerimiz olsun bunu c mantığıyla nasıl kayıt ederiz anlaşılan basic dilinden c diline geçmişiniz     degişken1=2525/100 diyoruz değişken1=25 degerini alacaktır degişken ikiyide mod bulma işlemine tabi tutacagız kalan bulma diyelim değişken2=2525%100 diyoruz  değişken2=25 degerini alacaktır sonra bu iki degeri eproma yazmak kalıyor eepromdan da okurken misal hız=değişken1x100+değişken2 diyoruz
merhaba fatih88
evet basic konusunda erol hoca ve arkadaşların çok katkısı oldu şimdide C diline merak saldım :)

formülün işimi çözecek gibi bu konuyu kod üstünde anlatır mısın? tam anlayamadım.

fatih88

#27
#include <EEPROM.h>
const int buton1 = 3; 
const int buton2 = 2;
//word hiz;// defeult değer
int led1  = 13;
int led2  = 12;
int led3  = 11;
//int okunanVeri;
 
//int butonstate1,butonstate2 ;
int8_t degisken1;//8 bitlik ilk değişken
int8_t degisken2;//8 bitlik ikinci değişken
int16_t hiz;//16 bitlik hız değişkeni

void setup()
{
delay (1000);

pinMode(led1,  OUTPUT);
pinMode(led2,  OUTPUT);
pinMode(led3,  OUTPUT);
pinMode(buton1, INPUT_PULLUP);
pinMode(buton2, INPUT_PULLUP);


}
void loop()
{
   degisken1 = EEPROM.read(0 ); if(degisken1==255)degisken1=0;
   degisken2 = EEPROM.read(1); if(degisken2==255)degisken2=0;
   hiz=degisken1*100+degisken2;
  while(1){

 
  digitalWrite(led1, HIGH);   //
  digitalWrite(led2, LOW);    //



/* EEPROMa kaydedilmiş verileri okuyalım */
  // 10 adresini okuyacağız
hiz = EEPROM.read(1 ); /* EEPROMun 10 adresindeki veri okunanVeri değişkenine aktarılıyor. YUKARDA OKUDUK BAŞKA OKUMAYA GEREK YOK(büyük harfle yazmam dikkat çeksin diye yanlış anlaşılmasın*/
delay(10);

  delay(hiz);
  kontrol();

  digitalWrite(led1, LOW);      //
  digitalWrite(led2, HIGH);     //
 

  delay(hiz); 
  kontrol();
          }
          }
  void kontrol()


           {
           while(digitalRead(buton1)==LOW)
           {
 
           hiz=hiz+10;
           save();
           delay(50);
           if(hiz>=2500) hiz=2000; 
           //
           }
           
         
           while(digitalRead(buton2)==LOW)
           {
           
           hiz=hiz-10;
           save();
           delay(50);
           if(hiz<=100) hiz=100;
           //
           }
           
           }

void save()
{
/* EEPROMa veri kaydediyoruz */
/* Verinin yazılacağı EEPROM adresi */
   /* EEPROMA kaydedilecek veri */
EEPROM.write(1, hiz); /* EEPROMun 10 adresine 50 verisi yazdırıldı. */
degisken1=hiz/100;degisken2=hiz%100;
EEPROM.write(0, degisken1);EEPROM.write(1, degisken2);
_delay_us(10);
EEPROM.read(0,degisken1);EEPROM.read(1,degisken2);
_delay_us(10);
  hiz=degisken1*100+degisken2;
}

kotan04 abi pek arduniodan anlamam hiçte sevmedim ne yaptığını nasıl alt yapıda calıştıgını bilmem umarım yardımcı olmuşumdur
iyi çalışmalar
bilgi paylaştıkça çoğalır!!

www.fayelektronik.com

fatih88

Abi şöyle bi göz gezdirdimde hatalı Yazılım çok bana göre butonlar düzgün çalışmaya bilir bu devre ne işe yarayacak abi en azından daha derli toplu birşeyler yazalım sizinle ama ardunio size yazılımda çok fazla kazanç sağlamaz eğer atmel programlamak istiyorsanız atmel studio ile çalışın en azından proğramlama beceriniz gelişir ama zor bir kaç proje yaptım inanılmaz zor tüm işleri registerler özerinden yapıyorsunuz aynı zamanda c++ bilginiz olmalı ama pic lere göre üstün özellikleri var
bilgi paylaştıkça çoğalır!!

www.fayelektronik.com

kotan04

merhaba amacım basic' de öğrendiğim konuları C dilinde kavramak yazdığın programı deneyip bildireceğim çok teşekkürler .
iyi çalışmalar.

Powered by EzPortal