Esp8266 ile Tost Makinanızı Wifi’dan Nasıl Kontrol Edebilirsiniz? #5

Birinci yazıda, Bağlanılabilecek ağların listesini almıştık.
İkinci yazıda, Serial Ekran’da satır sonu yorumlarına bakmıştık.
Üçüncü yazıda, Kendi WiFi ağımıza katılmış ve ESP’ye ait IP adresini öğrenmiştik.
Dördüncü yazıda, Daha önce manuel yaptığımız işlemleri, Kodlara yaptırmış ve ESP’yi server moduna hazırlamıştık.


Serial.begin ve CWJAP gibi bir defa çalışması gerekli aynı zamanda yeterli olan kodlara setup() fonksiyonu içinde yer vermiştik.

Şimdi, herhangi bir basit elektrikli cihazdan gelişmiş bir elektronik cihaza, programların port dinleme mantığından dillerin _main_ fonksiyonlarına kadar pek şey etkileyen şeye sıra geldi: loop()

Günlük hayatta atıyorum tv kumandasının ses açma düğmesine basıp geçiyoruz. Oysa o anda arka planda çokça olay gerçekleşiyor. Bu işlerle uğraşmaya başladığımdan bu yana fark ediyorum ki, evdeki kumandada yazılımcının hatası var. Sebebinin loop() fonksiyonunu tam içselleştirememesi olması diye düşünüyorum.

Loop bilindiği üzere döngü demek. Arduino gibi cihazlarda loop şu demek:

While (cihazda elektrik varsa) {sonsuza kadar dönüp dur}

Burayı iyi kavramak gerekiyor. SÜREKLİ bir döngünün içindeyiz. “Şu olursa, şunu yap” dediğimizde iş BİTMİYOR. Başa dönüp, “Şu olursa, şunu yap” işlemini yeniden yapıyor. Kod yazarken buna dikkat etmek işlerin daha sağlıklı ilerlemesini sağlayacaktır.


Yukarıdaki mantıktan hareketle, yapılacak işlemleri belli bir koşula bağlayalım.

Serial’den iletişim yapabiliyor muyuz.

Güzel. Ama kartımızda arıza yoksa buradan hep Evet yanıtı gelecek. Bu yüzen hem koşulla sınırlandıralım hem de ESP’den gelen yanıt içinde Server’lığa hazır mı bakalım.

Buradan Evet gelmesi heyecanlı zira, Uzaktaki cihazın yönetim ekranını yapıp sunacağız demek.

HTML’e vakıf olanlar için şekerleme tadında olan, basit bir sayfa hazırlıyoruz.

Evet, hayli ilkel fakat işlevsel 😉

Kodlarımız şöyle:

<h3>TOST MAKİNASI KONTROL </h3>
<br><a href=\” ?pin=on\”><button type=’button’>AC</button></a>
<br>
<br><a href=\” ?pin=off\”><button type=’button’>KAPAT</button></a>

 

ESP’nin data Transferi olarak bunları sunabilmesi için bir değişkene atayıp, AT+CIPSEND ile gönderim yapmasını sağlıyoruz.

Dikkat edilirse aslında asıl komutumuz AT+CIPSEND
Burada diyoruz ki Sana şu kadar bilgi göndereceğim. //manuel olarak yazmak yerine length() ile ölçüyoruz.
Ardından da kast ettiğimiz bilgiyi gönderiyoruz.

Böylece, WiFi ağında, ESP’nin IP adresine girdiğimizde, hazırlamış olduğumuz Html Yönetim sayfasını göreceğiz.

 


forum.the-big-bang-theory.com

Evdeki Hesap Döngüye Uymazsa

Ö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


Hatırlarsanız

// Sürekli çalışan fonksiyonumuz.

diye bir şeyden bahsetmiştik.

Bir nevi cihazda elektrik olduğu süre zarfında daima çalışan ana fonksiyondu. Ve alışageldiğimiz, program sonlarına adeta “bitmesin bu güzel hikaye” der gibi, her defasında başa alarak, sürekli dönmesini sağlıyordu.

Ve yine hatırlarsanız, bir önceki yazıda

‘ten bahsetmiştik.

Hatta bunun programcılığın iki harflik özeti olabileceğinden ve Algılama/Tetiklenme dediğimiz şeyin özündeki sihirli algoritma olabileceği mealinde şeyler söylemiştik.

Bu yüzden, “Gün ağardığında Sokak lambaları sönsün” şeklindeki amacımız doğrultusunda şöyle bir kurgu yapmıştık..

Yani,

x bir tam sayı olsun, (2 byte)
A0 pini Giriş modunda olsun
ve
X eşittir = A0 pinine bağlı ışık Sensöründen okuduğumuz değerler olsun.

Şayet ışık-x, 200’den fazla ise
3 nolu pin kapansın.. ki bu pine bağlı röle kapansın.. ki sokak lambaları sönsün..


Her şey güzel..

Ama!
Bu kodları çalıştırdığınızda, şaşıracaksınız.. Zira lamba bir kere söndükten sonra geri yanmayacak.
Hatta faklı kurguda hazırlanmış akış içerisinde, beklentinizin aksine bağladığınız cihazın hiç sönmediğini de görebilirsiniz.

Neler oluyor? Neden çalışmıyor?

Çalışıyor.
Hem de tam olarak cihaza söylediğimiz şekilde çalışıyor.
// aksi durumlar için bkz: makinaların ayaklanması 🙂

Yazının başına dönelim..

loop() fonksiyonumuz, elektrik olduğu sürece kendini çalışmaya adamış sonsuz romantik bir arkadaşımızdı. Ve kodlar bittiğinde her seferinde filmi başa sarıp yeniden oynatıyordu..

Arduino ve benzer cihazlar kodlarken, ilk başlarda karşımıza çıkabilecek Error’suz Mantık hatası bu olsa gerek.

Sürekli bir döngünün içinde olduğumuzu daima akılda tutmak gerekiyor.

Yani aslında cihazın içinde gerçekleşen olay şu;
tanımlar
setup: tek seferlik ayarlar { .. }
loop: sonsuza kadar yapılacaklar { .. }

ve biz şöyle yazmıştık

görüleceği üzere sonsuza kadar dönecek olacak olan loop içinde;
Işık sensöründen gelen değeri okuyoruz,
bu değer 200’den büyükse
3 nolu pini kapatmasını söylüyoruz

cihazda bunu yapıyor.

Sonra ne oluyor?

Sonra başa dönüyor. Yeniden değeri okuyor. 200’den büyükse 3. pini kapatıyor..
sonra yeniden başa dönüyor.. ..

Cihaz hatasız çalışıyor ama sistemimiz hatalı: Yeniden yanmasına fırsat vermiyoruz 🙂


Görsel: shutterstock

 

 

void loop() ve analogRead açıklaması

Bkz: Önceki konular;
26 Satırda İsrafı Önleme
26 Satır Bahanesiyle, Ucundan Bit-Byte, MBit/s Meali


Kaldığımız yerden devam edelim..

// Sürekli çalışan fonksiyonumuz.
// Başlarda biraz kafa karıştırıcı olabilir.
// Zira normalde bir program akışı içinde, yazdığınız akış sona geldiğinde
// programın durmasını bekleriz.
// Ancak burada bazı dillerdeki _main_ fonksiyonları gibi,
// loop fonksiyonu sürekli çalışmaktadır.
// bu da bize “program sonu” olarak adlandıranbileceğimiz bir yer olmadığını gösterir.

// bi yerlerde başlayıp, bi yerlerde bitmesi, zihimizin çalışma mantığına daha uygun olduğu için
// şöyle denilebilir.. şu oluyor, bu oluyor.. sonra şu çalışıyor, bunu tektilliyor vs..
// en SON olarak buradaki WHILE döngüsü çalışıyor denilebilir.
// ki bu SON WHILE’ın çalışma şekli şekli şöyledir:
// while (elektrikler_var_mi) {}

 


// Cihazların üzerindeki A0, A1, A2.. şeklindeki pinlere gelen değerleri okumak için
// analogRead kullanıyoruz.
// hatırlayalım; Dijital demek 0-1 demekti.
// eğer alacağımız değerler 0-1 değilde 3 86 156 325 874 sadece var-yok sıfır-bir olmaktan
// öte değerler ifade ediyorsa lazım olan şey Analog işlemdir.
// bir ortamdaki “ışığın şiddeti” dediğimizde de böyle bir durumdan bahsediyoruz.
// sabah öğle akşam üstü gece yarısı sürekli değişecektir.
// ya da şu ayaklı, ışığı ayarlanabilir lamlarını düşünün.
// böyle bir ortamda ışık şiddetini 0-1’in ötesinde geniş bir sıkalada ifade edilecektir.

// LDR sensörü ise, ışığa duyarlı bir dirençtir. Üzerine düşen ışık değiştiğinde
// ldr’den okduğumuz direnç değerleri de değişir.

// O halde, LDR’yi dijital pinlere değil, analog pinlere bağlamak daha sağlıklı olacaktır
// ayrıca gelecek olan değer geniş bir aralıkta olduğu için biz de
// 0-300 arasındaysa şunu yap, 301 – 600 arasında bunu, 601-900 arasında şunu yap
// gibi farklı işlemler yapabileceğimiz gibi

// gelecek olan ışık şiddetini, bir servo motorun açısına eşitlemek gibi
// ışık şiddetinin az ya da çok değişimine dağlı olarak
// motorun açısını da orantılı ve anlık şekilde değiştirebiliriz.

// bu projede sabah olduğunda, sokak lambalarının sönmesi için, ışık şiddettine bağlı olarak
// çalışacak aşağıdaki kodları yazacağız.

// aşağıdaki linkten murattatar.xyz üzerinde daha okunur ve renkli olarak görebilirsiniz.

void loop() { 
  x = analogRead(A0);  
  if (x > 200) {
    while (1) {
      digitalWrite(3, LOW);
      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;
      }
    }
  }


}



Devam açıklamalar gelecek..
Görsel: shutterstock