Döngünün Kabuğunu Kırıp Dışarı Çıkmak

Önceki konular:
26 Satırda İsrafı Önleme
26 Satır Bahanesiyle, Ucundan Bit-Byte, MBit/s Meali
void loop() ve analogRead açıklaması
“Cihazın Algılaması” Dediğimiz Şey
Evdeki Hesap Döngüye Uymazsa
Tamam Sabah Söndü ama Akşam Olunca da Yansın
Döngü Kilidi


Yukarıdaki yazılara atıf yaparak girişi biraz hızlı geçeyim..
( Google ya da başka bir kaynaktan ilk olarak bu sayfaya geldi iseniz.. öncelikle linklere göz atmanız daha ağlıklı olabilir.
Diğer yandan halihazırda ileri derecede kodlamaya hakimseniz, buradaki yazılar siz kesmeyebilir.)

x değişkenimizin tam sayı olduğunu söylemiş,
LDR ışık sensöründen gelen değerleri A0 analog pininden okumuş ve bunları x’e atamıştık.

Ardından, -tecrübeye dayalı olarak, sabah ve akşam saatlerinde elde edilen gerçek veri değerlerini girmek gerekir- günün ağarmasına denk geldiğini varsaydığımız 200’den büyükse, 3 nolu pine giden elektriği kesmiştik.
// Ki bu pine bir röle ve bu röleye de sokak lambalarının ana hattının bağlı olduğunu kurgulamıştık.

IF (x>200)  sınaması ile kısmen amacımıza ulaşsak da Arduino gibi cihazların sürekli Loop/döngü halinde kalıyor olması reel uygulamalarda işleri biraz karıştıracaktı.

ve bu yüzden kendi Sonsuz Döngü Kilidimizi oluşturmuştuk..

Şimdi yapmamız gereken şu:

Sabah olduğunda;
“Lamba Yanık kal” lakaplı 🙂 Sonsuz döngüyü kırıp, “Lamba Sönük kal” lakaplı Sonsuz döngüye geçmek..

ve tahmin edeceğiniz üzere

Akşam olduğunda;
“Lamba Sönük kal” lakaplı Sonsuz döngüyü kırıp, “Lamba Yanık Kal” lakaplı Sonsuz döngüye geçmek..

Bunun için, Lamba durumu için Sonsuz dönme işlemi ESNASINDA, LDR-Işık değerini yeniden biliyor olmamız LAZIM ki, bu sonsuzluk kırılsın.. While dışında bir yerde okuttuğumuz X değeri için kıyaslama yapacak olursak; döngü içine girmiş akışın, dışarıdaki YENİ güneş ışığı değerinden haberi olmadığı için, bir gün elektrikler kesilene kadar kendi döngüsü içinde devam edip gidecektir.

Yakından bakalım 😉

Ve toplu halde uzaktan bakarak, açıklama serimizi bitirmiş olalım..

int x;

void setup() {
  Serial.begin(9600);
  pinMode(A0, INPUT);
  pinMode(3, OUTPUT);}

void loop() {
  
  x = analogRead(A0);
  if (x > 200) {
    digitalWrite(3, LOW);
    while (1) {      
      x = analogRead(A0);
      if (x < 200) { break; }
    }
  }

  x = analogRead(A0);
  if (x < 200) {
    digitalWrite(3, HIGH);
    while (1) {
      x = analogRead(A0);
      if (x > 200) { break; }
    }
  }
}

(Steemit üzerinden okuyorsanız, aşağıdaki linkten kodları daha okunur olarak görebilirsiniz)

Döngü Kilidi

Önceki konular:
26 Satırda İsrafı Önleme
26 Satır Bahanesiyle, Ucundan Bit-Byte, MBit/s Meali
void loop() ve analogRead açıklaması
“Cihazın Algılaması” Dediğimiz Şey
Evdeki Hesap Döngüye Uymazsa
Tamam Sabah Söndü ama Akşam Olunca da Yansın


Değer okumalarımız, değişken atamalarımız ve ardından Işığın şiddetinin  çok olmasına göres Lambalar’ın sönme işine ardından akşam olduğunda yeniden yanması işlemi için gerekli kodlara bakmıştık.

Arada Sessiz Hata diyebileceğimiz, programın hatasız çalışmasına rağmen istediğimiz sonuçları alamadığımız durumlara bakmıştık.

Son olarak, istediğimiz durum da gerçekleşmişti. Ancak uygulama kısmına gelince teori kısmında iken pek görülemeyen bir saha pratiği ile karşılaşmıştık.

Kodlar üzerinden gidecek olursak

int x;

void setup() {
  Serial.begin(9600);
  pinMode(A0, INPUT);
  pinMode(3, OUTPUT);}

void loop() { 
  x = analogRead(A0);
  if (x > 200) {
      digitalWrite(3, LOW); }

  if (x < 500) {
    digitalWrite(3, HIGH); }

}

Burada her şey normal görünüyor ve bir hata yok. Ancak korku filmi tadında durumlarla karşılaşmamız olası. Yani ışığın çok hızlı bir şekilde yanıp sönmesi durumu.

O halde, olaya yeni bir bakış açısı daha getirmemiz daha sağlıklı olabilir.

//Benzer vak’alar,
// bir düğme basılması ve sonrasındaki tutarsızlıklar
// ya da tam olarak düğmeye basma saniyeleri içinde gerçekleşen na hoş durumlar için güzel çözümlerden birisi olabilir. (Örn. şu an evdeki televizyon ve kumandası arasında böyle bir sorun var, ses düğmesine kısa kısa basınca sorun yok.. ancak basılı tutunca, fazlaca yüksek bir hızda artıyor, sesi alçaltmak için aksi yönde basınca bu kez de çok hızlı bir şekilde düşüyor.)

While kilidi

Loop döngüsü deyip duruyoruz.. peki biz kendimiz bir döngü yapsak.. bu sonsuza kadar işine manuel(?) müdahaleler yapsak.. ve bizim istediğimiz durumlar için sonsuzluk yolculuğuna çıksa.. ya da sonsuzluk yolculuğunda hangi yöne gideceğini biz söylesek 

Bilindiği (bilinmesi gerektiği) gibi, while döngüsünün for döngüsünden farkı;
for: “3-5-817 gibi belirli bir sayıda dön”, demekken
while: “koşul sağlandığı sürece dön” demek.

Peki,
While (1==1) { .. }
dersek?

Aradığımız cevap derim 😉 Arduino’daki default fonksiyonlardan olan loop() gibi, kendimizin kontrolünde olan bir sonsuzluk döngüsü elde etmiş oluruz 😉

So.. 😉
Buraya kadar düzenli takip ettiyseniz yapılacakları sezdiniz sanırım 😉

 

Tamam Sabah Söndü ama Akşam Olunca da Yansın

Önceki konular:
26 Satırda İsrafı Önleme
26 Satır Bahanesiyle, Ucundan Bit-Byte, MBit/s Meali
void loop() ve analogRead açıklaması
“Cihazın Algılaması” Dediğimiz Şey
Evdeki Hesap Döngüye Uymazsa


Yukarıda linki verilen önceki bölümlerde, kısaca “Gün ağardığında sokak lambalarının otomatik sönmesi” şeklindeki amacımızdan, değişken atama ve bit/byte kavramlarından, arduino özelinde loop() fonksiyonundan, sensörlerden çevresel veri okumak için analogRead() fonksiyonundan bahsetmiştik.

Ardından daha çok algoritma tarafının konusu olan IF/Şayet deyiminden/operatöründen bahsetmiştik.

Sonrasında, yazdığımız kod ilk seferinde çalışmış, ancak devamında Lambalar sönük kalmıştı.

Ve bunun sebebi cihazda mekanik, kodlarda yazım hatası olması değildi. Aksine hata vermeden ne söylediysek yapıyordu. Ancak bir robota “Bir bardak su getirmesini” söylediyseniz ve robot da bunu getirdiyse “iyi de bu neden soğuk değil” veya “Su dediysem meyve suyu anlasana işte..” diyemezsiniz.

Zira o, sizin söylediğiniz şeyi yaptı, söylemediğiniz bir şeyi yapmadı.

Bizim yaptığımız şeyde de buna benzer bir Cümleyi eksik/yanlış kurma durumu var:

Loop döngüsü var.. sonsuza kadar dönecek..
içinde LDR/ışık/x için bir sına var: 200’den büyükse, lambalara giden hattı kesecek..

Ok. Sorun da yok gibi..

mi? acaba?

Gün ağardı.. lambalar söndü.. tamam.

Peki akşam olunca?

Koda bakalım.. akşam için bir şey söylemiş miyiz? Hayır. 
“`
Işık çoksa, sön
Işık çoksa, sön
Işık çoksa, sön
..
..
“`

Tek söylediğimiz bu. Akşam yanması için herhangi bir şey söylemedik.

Şimdi yapmasını istediğimiz şey aslında yine bir Algılama.

Cihazdan “Akşam olduğunu algılamasını” istiyoruz. Yani -linkte de geçtiği üzere- efsanevi IF‘i kullanma zamanı 😉

Kodlarını yazalım..

“`
if (x < 500) {
digitalWrite(3, HIGH);
}
“`

Şimdi Arduino ile Empati zamanı  Kendinizi cihazın yerine koyun ve ADIM ADIM hatta gerektiğinde virgül virgül harf harf yazılmış olan kodları işlediğinizi düşünün. A=15, b$ = “Robbie” 😉 gibi değer atanan değişkenler fazla ise, elinize kağıt kalem de alabilirsiniz.

Bakalım..

int x;

void setup() {
  Serial.begin(9600);
  pinMode(A0, INPUT);
  pinMode(3, OUTPUT);}

void loop() { 
  x = analogRead(A0);
  if (x > 200) {
      digitalWrite(3, LOW); }

  if (x < 500) {
    digitalWrite(3, HIGH); }

}

Bu kodlar işimizi görecek.. Söylediğimiz cümleyi de düzelttiğimiz için, artık olması gerektiği gibi..
Ancak 🙂
Sabahın ve akşamın ilk saatlerinde lambaların korku filmlerindeki gibi yanıp söndüğünü göreceğiz..
?