Servo zamanlayici3

Servo Motor ile 0-10Dk zamanlayıcı yapma

Servo motorlar ile daha önce yaptığımız termometre gibi bu yazımızda 0 ile 10 dk arasını servo motor ile göstererek zamanlama devresi yapmamız mümkün. Projemiz kullanımı açısından çok hoşunuza gidecektir. Fazla uzatmadan Projemizin mantığını anlatayım.

 

Projemizin çalışma mantığı daha önce anlattığımız servo motor ile termometre yapma projemize benzemektedir.

Projemizde 2 buton, 3 LED , 1 Potansiyometre , 1 servo motor ve 3 adet 220ohmluk direnç vardır.

Bağlantı şeması aşağıdaki gibidir.

Servo zamanlayici

Potansiyometre ile arduinomuzun A0 ucuna  0 ile 1024 arası değer verilmektedir, bu verilen değer 0 ile 180 derece arasına dönüştürülerek servoya bu çıkış yazdırılır, Çalıştır butonuna bastığımızda ise , programımızda oluşturduğumuz zaman döngüsü ile servo motorumuzu 0 noktasına doğru hareket ettiririz. Servo motorumuz 0 dakikaya geldiğinde artık alarmımız çalmaya başlayacaktır. Bu projeyi nerelerde kullanabiliriz sorusunu yine size bırakayım ama zamanlama devreleri hayatımızın olmazsa olmazıdır.

Aşağıdaki resimde yapılmış bir örnek görmektesiniz.

Servo zamanlayici2

Programımız

#include <Servo.h>
 
#define LED_GREEN     7
#define LED_YELLOW    6
#define LED_RED       5
 
#define BUTTON_RESET  4
#define BUTTON_START  12
 
#define POTENTIOMETER 0
 
#define SERVO         9
 
#define ZERO_MINUTES  154 // 0dk için servonun konumu
#define TEN_MINUTES   12 // 10dk içi servonun konumu
 
#define MODE_SETUP    0
#define MODE_RUNNING  1
#define MODE_PAUSE    2
#define MODE_ALARM    3
 
Servo needle;
byte state = MODE_SETUP;
word potPosition;
unsigned long startTime;
unsigned long pauseTime;
unsigned long alarmTime;
 
unsigned long lastButtonStartPress;
unsigned long lastButtonResetPress;
 
void setup() {       
  pinMode(LED_GREEN, OUTPUT);
  pinMode(LED_YELLOW, OUTPUT);
  pinMode(LED_RED, OUTPUT);
   
  pinMode(BUTTON_RESET, INPUT);
  pinMode(BUTTON_START, INPUT);
   
  needle.attach(9);
 
  Serial.begin(9600);
}
 
void loop() {
  /*
   * Start/Pause-Button
   */
  if((digitalRead(BUTTON_START) == HIGH) && (lastButtonStartPress + 250 < millis())) {
    lastButtonStartPress = millis();
     
    switch(state) {
      case MODE_SETUP:
        startTime = millis();
        state = MODE_RUNNING;
        digitalWrite(LED_GREEN, HIGH);
      break;
      case MODE_RUNNING:
        pauseTime = millis();
        state = MODE_PAUSE;
        digitalWrite(LED_GREEN, LOW);
        digitalWrite(LED_YELLOW, HIGH);
      break;
      case MODE_PAUSE:
        startTime += millis() - pauseTime;
        state = MODE_RUNNING;
        digitalWrite(LED_GREEN, HIGH);
        digitalWrite(LED_YELLOW, LOW);
      break;
      case MODE_ALARM:
        digitalWrite(LED_GREEN, LOW);
        digitalWrite(LED_YELLOW, LOW);
        digitalWrite(LED_RED, LOW);
        state = MODE_SETUP;
      break;
    }
  }
   
  /*
   * Reset-Button
   */
  if((digitalRead(BUTTON_RESET) == HIGH) && (lastButtonResetPress + 250 < millis())) {
    lastButtonResetPress = millis();
     
    state = MODE_SETUP;
    digitalWrite(LED_GREEN, LOW);
    digitalWrite(LED_YELLOW, LOW);
    digitalWrite(LED_RED, LOW);
  }
   
  /*
   * Servo...
   */
  switch(state) {
    case MODE_SETUP:
      potPosition = analogRead(0);
      needle.write(map(potPosition, 0, 1023, ZERO_MINUTES, TEN_MINUTES));
    break;
    case MODE_RUNNING:
      alarmTime = startTime+map(potPosition, 0, 1023, 0, 10l*60l*1000l);
      needle.write(map(alarmTime-millis(), 0, 10l*60l*1000l, ZERO_MINUTES, TEN_MINUTES));
    break;
    case MODE_PAUSE:
    break;
    case MODE_ALARM:
    break;
  }
   
  /*
   * Alarm?
   */
   if((state == MODE_RUNNING) && (alarmTime < millis())) {
      state = MODE_ALARM;
      digitalWrite(LED_GREEN, LOW);
   }
   if(state == MODE_ALARM) {
    if((millis()/250) % 2 == 0) {
      digitalWrite(LED_RED, LOW);
      noTone(3);
    } else {
      digitalWrite(LED_RED, HIGH);
      tone(3, 20000);
    }
   }
}

Bir Cevap Yazın

Time limit is exhausted. Please reload CAPTCHA.