Arduino ile dc motoru butonlarla süreli çalıştırma

sessizl1q

Üye
Katılım
17 Tem 2021
Mesajlar
9
Puanları
1
Yaş
31
Arduino uno kullanıyorum. 1 butona basınca dc motoru 500ms çalıştırıp 300ms durdurmak istiyorum. Örneğin butona 1 defa bastıgımda 5dk boyunca motor sürekli olarak 500ms çalışıp 300ms duracak. 5dk bitmeden tekrar butona bastıgımda bu defa 10dk boyunca aynı işlemi yapacak 3. de 15dk 4. de 20dk. Delay ile durma çalışma süresini ayarlıyorum fakat budefa butona bastıgım anda delay içindeyse algılamıyor. Beceremedim. Millis kullandım yapamadım kodu beceremedim sanırım.
Arduinonun 2ve 3. pinini kesme için kullanıyorum hız arttır ve azalt düğmesi olarak
 
Son düzenleme:
..delay içindede buton kontrolu yapmak gerekir..ayrıca butona kaçıncı defa basıldığını anlamak için bir buton sayacı gerekecek sanırım.
 
..delay içindede buton kontrolu yapmak gerekir..ayrıca butona kaçıncı defa basıldığını anlamak için bir buton sayacı gerekecek sanırım.
Sayacı koyuyorum. Butona basılıyken değil butonu bırakınca işleme başlayacak. Tek sorunum delaylı olmuyor. Çoklu işlem için millisle beceremedim tam hakim olmadıgım için kodlara.
 
..bence programı parçalara ayırıp ve basitleştirerek başlasan daha iyi.Mesela butona basınca bir led 2 saniye yansın..ve sönsün.İkinci defa basınca 3 sn yansın ve sonra sönsün gibi..sonra istediğin şekilde çalışması için geliştirebilirsin.Ben öyle yapıyorum.
 
..bence programı parçalara ayırıp ve basitleştirerek başlasan daha iyi.Mesela butona basınca bir led 2 saniye yansın..ve sönsün.İkinci defa basınca 3 sn yansın ve sonra sönsün gibi..sonra istediğin şekilde çalışması için geliştirebilirsin.Ben öyle yapıyorum.
onları yapabiliyorum. Led 5 sn yansın sönsün yaparım. Ama ledin sönmesi için süresi dolmadan tekrar bastıgımda başka işlemi yaptırabilmem gerekiyor. Delay sonuçta işlemi bekletiyo. Süre dolmadan yapamıyorum. O konuda yetersizim şuan.
 
program bir işleme dallandımı o işi bitimeden dönmez,bu sebepten 5 saniye 10 saniye gibi süreleri bekletirken ve aynı anda butonlarıda okumak istiyorsanız 5 saniyeyi 100 e bölün ve her 50 milisaniyede bir (50*100=5 saniye)butona basılmışmı diye kontrol edin.yani bekleme işlemi yaparken buton kontrolude yaptırın.
 
Aşağıdaki kod işini görecektir. Motor yerine onboard ledi kullandım onu değiştirirsin. Ledleri bağlamadım belki sıralaması yanlış olabilir. Teorik olarak çalıştı, pratik olarak devreni görmeden bişey söyleyemem. Butonlarının uçlarının gnd verecek şekilde olduğunu varsayıyorum eğer 5v vereceksen digitalRead lerin başındaki ünlem işaretini sil.

C++:
#include <Arduino.h>

enum buton{durdur,baslat,hiz_artir,hiz_azalt,toplam_buton};
const uint8_t butonlar [toplam_buton]  = {5,4,3,2};  //buton pinleri

enum led{bir,iki,uc,dort,toplam_led};
const uint8_t ledler[toplam_led]  = {6,7,8,9};       //led pinleri

enum durumlar{kademe_1,kademe_2,kademe_3,kademe_4,duruyor};
const uint8_t durum_sureleri[5] = {5,10,15,20,0};  //dk cinsinden süreler
uint8_t durum_indexi = duruyor;

const int calisma_suresi  = 500;  //ms cinsinden
const int durma_suresi  = 300;  //ms cinsinden

unsigned long hareket_gecikmesi = 0;
unsigned long hareket_zaman_sayaci = 0;
unsigned long simdiki_zaman_sayaci = 0;

void motor_dur(),motor_baslat(),hiz_artirma(),hiz_azaltma(),led_yakma(uint8_t); //Gereken fonksiyonlar

void setup() {
  for(uint8_t i=0;i<toplam_led;i++)
    pinMode(ledler[i],OUTPUT);
  led_yakma(4); //Hepsi sönük
  for(uint8_t j=0;j<toplam_buton;j++)
    pinMode(butonlar[j],INPUT_PULLUP);

  pinMode(LED_BUILTIN,OUTPUT);   

}

void loop() {
  simdiki_zaman_sayaci = millis();
  if(!digitalRead(butonlar[durdur])){
    delay(150);
    while(!digitalRead(butonlar[durdur]));
    motor_dur();
    hareket_zaman_sayaci = 0; //motor dursun
    }
  if(!digitalRead(butonlar[hiz_artir])){
    delay(150);
    while(!digitalRead(butonlar[hiz_artir]));
    hiz_artirma();
    } 
  if(!digitalRead(butonlar[hiz_azalt])){
    delay(150);
    while(!digitalRead(butonlar[hiz_azalt]));
    hiz_azaltma();
    }
  if(!digitalRead(butonlar[baslat])){
    delay(150);
    while(!digitalRead(butonlar[baslat]));
    durum_indexi++;
    hareket_gecikmesi = durum_sureleri[durum_indexi%5];
    hareket_zaman_sayaci = simdiki_zaman_sayaci + (hareket_gecikmesi *60*60);    //dk'yı ms'ye çevirdi
    led_yakma(durum_indexi%5);
  }
 
    if(simdiki_zaman_sayaci >= hareket_zaman_sayaci){
      motor_dur();
      led_yakma(4); //ledler sönsün
      durum_indexi = duruyor;
      hareket_gecikmesi = durum_sureleri[durum_indexi];
      hareket_zaman_sayaci = 0;
    }
    else{
      if(((hareket_zaman_sayaci-simdiki_zaman_sayaci)%(calisma_suresi+durma_suresi))< calisma_suresi){
        motor_baslat();
        }
      else {
        motor_dur();
        }
    }
}


void motor_dur(){

  digitalWrite(LED_BUILTIN,LOW);
}
void motor_baslat(){
  digitalWrite(LED_BUILTIN,HIGH);

}
void hiz_artirma(){

}
void hiz_azaltma(){

}
void led_yakma(uint8_t ln){
  for (size_t i = 0; i < toplam_led; i++)
  {
    digitalWrite(ledler[i],LOW);
  }
  if(ln<toplam_led)
    digitalWrite(ledler[ln],HIGH);
 
}
 
Aşağıdaki kod işini görecektir. Motor yerine onboard ledi kullandım onu değiştirirsin. Ledleri bağlamadım belki sıralaması yanlış olabilir. Teorik olarak çalıştı, pratik olarak devreni görmeden bişey söyleyemem. Butonlarının uçlarının gnd verecek şekilde olduğunu varsayıyorum eğer 5v vereceksen digitalRead lerin başındaki ünlem işaretini sil.

C++:
#include <Arduino.h>

enum buton{durdur,baslat,hiz_artir,hiz_azalt,toplam_buton};
const uint8_t butonlar [toplam_buton]  = {5,4,3,2};  //buton pinleri

enum led{bir,iki,uc,dort,toplam_led};
const uint8_t ledler[toplam_led]  = {6,7,8,9};       //led pinleri

enum durumlar{kademe_1,kademe_2,kademe_3,kademe_4,duruyor};
const uint8_t durum_sureleri[5] = {5,10,15,20,0};  //dk cinsinden süreler
uint8_t durum_indexi = duruyor;

const int calisma_suresi  = 500;  //ms cinsinden
const int durma_suresi  = 300;  //ms cinsinden

unsigned long hareket_gecikmesi = 0;
unsigned long hareket_zaman_sayaci = 0;
unsigned long simdiki_zaman_sayaci = 0;

void motor_dur(),motor_baslat(),hiz_artirma(),hiz_azaltma(),led_yakma(uint8_t); //Gereken fonksiyonlar

void setup() {
  for(uint8_t i=0;i<toplam_led;i++)
    pinMode(ledler[i],OUTPUT);
  led_yakma(4); //Hepsi sönük
  for(uint8_t j=0;j<toplam_buton;j++)
    pinMode(butonlar[j],INPUT_PULLUP);

  pinMode(LED_BUILTIN,OUTPUT);  

}

void loop() {
  simdiki_zaman_sayaci = millis();
  if(!digitalRead(butonlar[durdur])){
    delay(150);
    while(!digitalRead(butonlar[durdur]));
    motor_dur();
    hareket_zaman_sayaci = 0; //motor dursun
    }
  if(!digitalRead(butonlar[hiz_artir])){
    delay(150);
    while(!digitalRead(butonlar[hiz_artir]));
    hiz_artirma();
    }
  if(!digitalRead(butonlar[hiz_azalt])){
    delay(150);
    while(!digitalRead(butonlar[hiz_azalt]));
    hiz_azaltma();
    }
  if(!digitalRead(butonlar[baslat])){
    delay(150);
    while(!digitalRead(butonlar[baslat]));
    durum_indexi++;
    hareket_gecikmesi = durum_sureleri[durum_indexi%5];
    hareket_zaman_sayaci = simdiki_zaman_sayaci + (hareket_gecikmesi *60*60);    //dk'yı ms'ye çevirdi
    led_yakma(durum_indexi%5);
  }
 
    if(simdiki_zaman_sayaci >= hareket_zaman_sayaci){
      motor_dur();
      led_yakma(4); //ledler sönsün
      durum_indexi = duruyor;
      hareket_gecikmesi = durum_sureleri[durum_indexi];
      hareket_zaman_sayaci = 0;
    }
    else{
      if(((hareket_zaman_sayaci-simdiki_zaman_sayaci)%(calisma_suresi+durma_suresi))< calisma_suresi){
        motor_baslat();
        }
      else {
        motor_dur();
        }
    }
}


void motor_dur(){

  digitalWrite(LED_BUILTIN,LOW);
}
void motor_baslat(){
  digitalWrite(LED_BUILTIN,HIGH);

}
void hiz_artirma(){

}
void hiz_azaltma(){

}
void led_yakma(uint8_t ln){
  for (size_t i = 0; i < toplam_led; i++)
  {
    digitalWrite(ledler[i],LOW);
  }
  if(ln<toplam_led)
    digitalWrite(ledler[ln],HIGH);
 
}
Çook teşekkür ederim. En kısa sürede deneyip sonuçları buradan yazıcam
 
@FakirMaker Çok teşekkür ediyorum. Kodları denedim. Söylediğin gibi motoru da bağladım. Çalıştırabildim sayende.
 

Forum istatistikleri

Konular
128,149
Mesajlar
915,477
Kullanıcılar
449,891
Son üye
Ercan29

Yeni konular

Geri
Üst