#include <Servo.h>
int pos,posHedef,posAdimMs,sureSayac,servoSayac,servoAdimMs;
unsigned long ms0,ms1,ms2,ms3;
Servo servo_9;
void setup()
{
servo_9.attach(9, 500, 2500);// örnek koddaki parametreler
pinMode(13, OUTPUT);
pinMode(12, OUTPUT);
pinMode(11, OUTPUT);
pinMode(10, OUTPUT);
// servo 0derecede olmaya bilir mevcut durumu okunamayacağından
// hız kontrolü yapılamaz doğrudan 0 dereceye doğrudan çekilir
// önceki döngüde servonun 0 derecede kapandığını varsaydım.
// servoya ilk güç verildiğinde ne yaptığını da test etmek lazım.
servo_9.write(0);
pos=0;
posHedef=0;
//çizelgeye göre tüm döngü 10 saniye sürüyor.
//servo hareketinde de hız 50ms ve 30ms adımnlarla kontrol edilmiş.
//10ms'lik adımlarla çalışan bir döngüyle yapılabilir.
ms0=millis(); //başlangıç anı.
ms1=ms0; // ms1 zaman takip değişkeni
// çizelgeye göre başlangıç koşulları
digitalWrite(10,LOW);
digitalWrite(11,HIGH);
digitalWrite(12,HIGH);
digitalWrite(13,LOW);
}
void loop()
{
if (millis()>=ms1+10)//döngü her 10ms'de 1 çalışır
{
ms1=millis();
// bir sonraki olay anı gelene kadar her 10ms'de bir mevcut olay döngüsü çalışır,
// ideal değil ama programın amacı için farketmez performans ve sonuç değişmez.
if((millis()-ms0)>=10000)
{
// 10. saniyenin sonunda hiçbir komut çalışmaz,
//sadece servo hareketini tamamlamamışsa hedef pozisyona devam eder
// millis() fonksiyonu taşıma gidince bozulmasın diye
if(millis()>20000)
{
while(1);//sonsuz döngü
}
}
else if((millis()-ms0)>=9500) // 10. olay 9500ms sonra
{
digitalWrite(10,LOW);
digitalWrite(11,LOW);
digitalWrite(12,LOW);
digitalWrite(13,LOW);
}
else if((millis()-ms0)>=9000) // 9. olay da 9000ms sonra
{
digitalWrite(10,HIGH);
digitalWrite(11,HIGH);
digitalWrite(12,LOW);
digitalWrite(13,HIGH);;
}
else if((millis()-ms0)>=8000) // 8. olay 8000 saniye sonra
{
digitalWrite(12,HIGH);
digitalWrite(13,LOW);
posHedef=0;
servoAdimMs=10;
}
else if((millis()-ms0)>=7000) // 7. olay 7000 ms sonra
{
digitalWrite(12,LOW);
digitalWrite(13,HIGH);
}
else if((millis()-ms0)>=6000) // 6. olay 6000 ms sonra
{
digitalWrite(12,HIGH);
digitalWrite(13,LOW);
}
else if((millis()-ms0)>=5000) // 5. olay 5000 ms sonra
{
digitalWrite(12,LOW);
digitalWrite(13,HIGH);
}
else if((millis()-ms0)>=4000) // 4. olay 4000 ms sonra
{
digitalWrite(12,HIGH);
digitalWrite(13,LOW);
}
else if((millis()-ms0)>=3000)// üçüncü olay 3000 ms sonra
{
digitalWrite(12,LOW);
digitalWrite(13,HIGH);
posHedef=80; // servo hedef 80 derece
// servo adımı örnek kodda 50ms verilmiş ama 80 dereceyi süpürmesi 4 saniye sürer
// sonraki servo komutuna kadar 80 dereceye gelemez bu yüzden 10ms adimlama yazdım
servoAdimMs=10;
}
else if((millis()-ms0)>=2000)// ikinci olay 2000 ms sonra
{
digitalWrite(12,HIGH);
digitalWrite(13,LOW);
}
else if((millis()-ms0)>=1000) // ilk olay ilk saniyenin sonunda
{
digitalWrite(12,LOW);
digitalWrite(13,HIGH);
}
if(pos>posHedef)// her 10ms'de sorgulanır
{
if(servoAdimMs<=(millis()-ms3))// eğer servo adim süresinden daha fazla zaman geçtiyse çalışır
{
servo_9.write(pos-1); // pos hedefe 1 derece yaklaştır
pos-=1;
ms3=millis(); // servo adimlama süresi için
}
}
// [S]else if(pos>posHedef)[/S]
else if(pos<posHedef)
{
if(servoAdimMs<=(millis()-ms3))// eğer servo adim süresinden daha fazla zaman geçtiyse çalışır
{
servo_9.write(pos+1); // pos hedefe 1 derece yaklaştır
pos+=1;
ms3=millis(); // servo adimlama süresi için
}
}
}
}