74LS74 decoder entegresi ile 7 segment display devresini kuracağız. Öncelikle kullanacağımız entegreyi iyice tanıyalım.

75LS47 DIP-16 BCD  - 7 Segment Decoder Entegresi:

 74LS47 Entegresi Decoder - Encoder kategorisinde olup fonksiyon olarak bir BCD - 7 Segment Decoder entegresidir. 7 adet çıkışı bulunan 74LS47 BCD - 7 Segment Decoder Entegresi 4.75 - 5.25 V aralığında besleme gerilimi ile çalışmaktadır.

74LS47 IC, ortak anot LED'leri doğrudan sürmek için tasarlanmış aktif düşük çıkışlara sahiptir. Giriş olarak ikili kodlanmış bir ondalığı kabul eder ve 0 ila 9 arasındaki rakamları görüntülemek için 7 segmenti sürmek için onu bir modele dönüştürür. İkili kodlu ondalık (BCD), bir sayının her basamağının kendi ikili dizisi ile temsil edildiği bir kodlamadır. (genellikle dört bitlik).

74LS47 Pinleri:


74LS47 Kod Çözücü:

74LS47 kod çözücü / sürücü ile ortak anot ekranı arasındaki baÄŸlantı, akım akışını sınırlamak için yedi direnç gerektirir. Ekranın her LED bölümünün düzgün yanması için, her bölümden geçen akım akışının dikkatlice kontrol edilmesi gerekir. Akımı bir ekran segmenti aracılığıyla sınırlamanın en iyi yöntemi, yedi LED segmentinin her biri ile seri olarak bir akım sınırlama direnci kullanmaktır. Seri baÄŸlı bir direnç kullanmazsak, maksimum akım akacak ve LED kalıcı olarak bozulmadan önce kısa bir süre için çok parlak olacaktır.

Tipik bir 7 segmentli LED ekranın her bir LED segmenti 6 ila 20mA arasında çalışacak şekilde derecelendirildiğinden, normal parlaklık için LED'in diyot bağlantısında yaklaşık 1,8 voltluk bir voltaj düşüşü sunar. LED segmenti başına gerekli akımı üretmek için gereken akım sınırlayıcı direncin değerini hesaplayabiliriz.


Ortak anot gösterimi için, her bir LED bölümünün anotları birlikte 5 voltluk bir kaynağa (VS) bağlanır. Yandığında, LED bağlantısındaki ileri voltaj düşüşü yaklaşık 1,8 volt ise, seri direnç üzerindeki voltaj da eşit olmalıdır: VS - VLED = 5 - 1,8 = 3,2 volt.

Dolayısıyla, tek bir segmentin seri akım sınırlayıcı direnci için gerekli direnç deÄŸeri, onu aydınlatmak için gerekli akım akışında Ohm Yasası kullanılarak basitçe bulunur. 



7 - Segment Display Direnç Değerleri:




Bu nedenle, 6mA akımda, tercih edilen en yakın değere 533Ω veya 560Ω'lik bir seri akım sınırlama direnci ve akımı 20mA ile sınırlamak için 160Ω'luk bir direnç gerekir. Gerçekte, 220Ω ve 360Ω arasında herhangi bir iyi standart tercih edilen direnç değeri, 5 voltluk bir beslemeden 7 segmentli bir ekranı aydınlatmak için kullanılabilir; bunların tümü, sahip olduğunuz direnç değerlerine bağlıdır.


74LS47 BCD 7 - Segment Devresi:




Devrenin Proteus Dosyası:

Drive linkinden devrenin proteus dosyasını indirebilirsiniz.


















C ++ da bu sefer deÄŸiÅŸkenleri ve sabitleri iÅŸliyoruz.


DeÄŸiÅŸkenler :

Program içerisinde deÄŸerini deÄŸiÅŸtirebileceÄŸimiz verilere deÄŸiÅŸkenler adını veririz.  Bir deÄŸiÅŸken bize adlandırılmış bir depolama yeteneÄŸi saÄŸlar. Programcının verileri ihtiyaca göre deÄŸiÅŸtirmesine izin verir. C ++ 'daki her deÄŸiÅŸkenin bir türü vardır. DeÄŸiÅŸken türü, deÄŸiÅŸkenin bellek haritasının boyutunu ve düzenini, bu bellekte saklanabilecek deÄŸer aralığını ve ona uygulanabilecek iÅŸlemler kümesini belirlemeye yardımcı olur.

DeÄŸiÅŸkenleri tanımlarken büyük ve küçük harflere dikkat etmemiz gerekir. DeÄŸiÅŸkenler _ ile baÅŸlayabilirler. DeÄŸiÅŸken isimleri sayı içerebilir ama sayı ile baÅŸlayamazlar .

Değişken tanımlama;

değişken_türü değişken_adı;

Örnek olarak;

int x;

EÄŸer  deÄŸiÅŸkene bir deÄŸer atamak istersek,

Öncelikle biz bu değişkeni int ya da unsigned int veri tipinden olduğunu belirtmeliyiz (unsigned int ve int veri tipi ikisi de tam sayıları belirtmek için kullanılıyordu ) , daha sonra değişkenimizin adını yazarız , biz burada değişkenimize x adını verelim. O halde kodumuz şöyle olacaktır ;

int x=6;



Yerel ( Local ) DeÄŸiÅŸkenler

Bir işlev içinde tanımlanan bir değişken (işlev gövdesi içinde kaşlı ayraçlar arasında tanımlanır) yerel değişken veya otomatik değişken olarak adlandırılır. Kapsamı yalnızca tanımlandığı işlevle sınırlıdır. Basit bir ifadeyle, yerel değişken vardır ve yalnızca bir işlevin içinden erişilebilir. Fonksiyon çıktığında yerel bir değişkenin ömrü sona erer (yok edilir).

Örnek:

#include <iostream>
using namespace std;
void test();
int main()
{

    int var = 5;
    test();
   

    var1 = 9;
}
void test()
{
   
    int var1;
    var1 = 6;
    // illegal: var not declared inside test()
    cout << var;
}

Var değişkeni test () içinde kullanılamaz ve var1 main () işlevi içinde kullanılamaz. Otomatik anahtar kelime daha önce yerel değişkenleri tanımlamak için kullanılırdı: auto int var; Ancak, C ++ 'den sonra auto farklı bir anlama sahiptir ve yerel değişkenleri tanımlamak için kullanılmamalıdır.

Genel ( Global ) DeÄŸiÅŸken

Bir değişken tüm fonksiyonların dışında tanımlanırsa, o zaman global değişken olarak adlandırılır. Global bir değişkenin kapsamı tüm programdır. Bu, beyanından sonra programın herhangi bir bölümünde kullanılabilir ve değiştirilebilir demektir. Aynı şekilde ömrü ancak program bittiğinde biter.

Örnek

#include <iostream>
using namespace std;


int c = 12;

void test();

int main()
{
    ++c;
    cout << c <<endl;
    test();

    return 0;
}

void test()
{
    ++c;
    cout << c;
}

Ekran çıktısı:

13
14

Yukarıdaki programda, c global bir değişkendir. Bu değişken, yukarıdaki programda hem main () hem de test () tarafından görülebilir.

Statik Yerel DeÄŸiÅŸken

Statik değişkeni tanımlamak için kullanılır.

Örnek olarak
... .. ...
int main()
{
   static float a;
   ... .. ...
}

Statik bir yerel değişken, yalnızca bildirildiği (yerel bir değişkene benzer) bir işlevin içinde bulunur, ancak ömrü işlev çağrıldığında başlar ve yalnızca program bittiğinde sona erer. Yerel değişken ile statik değişken arasındaki temel fark, statik değişkenin değerinin programın sonunda devam etmesidir.

Örnek

include <iostream>
using namespace std;

void test()
{
    // var is a static variable
    static int var = 0;
    ++var;

    cout << var << endl;
}

int main()
{
    
    test();
    test();

    return 0;
}

Ekran çıktısı:

1
2
Yukarıdaki programda test () işlevi 2 kez çağrılır. İlk çağrı sırasında değişken var, statik değişken olarak bildirilir ve 0 olarak ilklendirilir. Ardından ekranda görüntülenen var'a 1 eklenir. Fonksiyon test () döndüğünde, var değişkeni statik bir değişken olduğu için hala mevcuttur. İkinci işlev çağrısı sırasında, yeni değişken var oluşturulmaz. Aynı değişken 1 artırılır ve ardından ekranda görüntülenir.


Sabitler :

Sabitler , değişkenlerin aksine programda belirli bir değere sahiplerdir. Program boyunca bu değer hafızada tutulur ve kullanılır. Yani sabitlerin değerini değiştiremeyiz.

Sabit bildirimi, baÅŸlangıç deÄŸeri verilen deÄŸiÅŸken bildirimi gibi yapılır. Ancak, veri tipinin önüne const anahtar sözcüğü konmalıdır.


Örnek;


const float PI = 3.142857;
const double NOT= 12345.8596235489;
const int EOF= -1;


Aynı ÅŸekilde sabit tanımlamayı #define ön iÅŸlemci komutu ile de gerçekleÅŸtirebiliriz.   

#define MAX 100
#define LENGTH 10
#define  WIDTH 5

VERİ TİPLERİ


Herhangi bir dilde program yazarken, çeÅŸitli bilgileri depolamak için çeÅŸitli deÄŸiÅŸkenler kullanmanız gerekir. DeÄŸiÅŸkenler, deÄŸerleri saklamak için ayrılmış bellek konumlarından baÅŸka bir ÅŸey deÄŸildir. Bu, bir deÄŸiÅŸken oluÅŸturduÄŸunuzda bellekte biraz yer ayırdığınız anlamına gelir.



C++ da veri türleri temel olarak üçe ayrılır.


İLKEL YERLEŞİK TÜRLER

Bu veri türleri yerleÅŸik veya önceden tanımlanmış veri türleridir ve kullanıcı tarafından deÄŸiÅŸkenleri bildirmek için doÄŸrudan kullanılabilir. Ã¶rnek: int, char, float, bool vb. C ++ 'da bulunan ilkel veri türleri aÅŸağıdaki tabloda verilmiÅŸtir. 




İlkel veri tiplerinden birkaçını açıklayalım.

int: Tam sayı olan deÄŸiÅŸkenleri tanımlamak istediÄŸimizde int veri tipini kullanırız. int ingilizce de tam sayı anlamına gelen integer kelimesinden gelmektedir. 

double: Ondalıklı olarak tanımlayacağımız deÄŸiÅŸkenleri double veri tipiyle yazarız.

float: Float veri tipini de double veri tipi gibi ondalıklı olarak yazdırmamız gereken deÄŸiÅŸkenleri tanımlarken kullanırız. 

char:  char tipinde deÄŸiÅŸken deÄŸer atandıktan sonra bir karakteri temsil etmektedir.







TÜRETİLMİŞ VERİ TÜRLERİ

Türetilmiş veri türleri ilkel yerleşik veri türlerinden türetilmiştir . Bunlar 4 tipte olabilir;
  • Function
  • Array
  • Pointer
  • Referance

KULLANICI TANIMLI VERİ TÜRLERİ

Bu veri türleri kullanıcının kendisi tarafından tanımlanırC ++, aşağıdaki kullanıcı tanımlı veri türlerini sağlar:
  • Class
  • Structure
  • Union
  • Enumeration
  • Typedef defined DataType




Kaynakça

https://www.tutorialspoint.com/cplusplus/cpp_constants_literals.htm#:~:text=Advertisements,Characters%2C%20Strings%20and%20Boolean%20Values.

https://www.quora.com/What-things-would-you-change-about-C++-if-you-could

https://www.guru99.com/cpp-tutorial.html

https://medium.com/@dijitalgezginler16/c-programlama-dili-veri-tipleri-de%C4%9Fi%C5%9Fkenler-ve-sabitler-1ce8c43003c1

http://yapbenzet.kocaeli.edu.tr/cpp-degiskenleri-sabitleri/

https://merttopuz.com/yazilim/cpp/cpp-sabitler

https://firateski.com/ders-2-cpp-degiskenler

https://www.programiz.com/cpp-programming/storage-class#:~:text=A%20variable%20defined%20inside%20a,accessed%20only%20inside%20a%20function.









 Osilatör Nedir ?

Osilasyon(Salınım): Herhangi bir nesnenin belli bir deÄŸere göre iki durum arasında zamana göre tekrarlanan deÄŸiÅŸimidir. Elektronik sistemlerde ise zaman içerisinde yönü ve ÅŸiddeti belli bir düzen içerisinde deÄŸiÅŸen sinyallere osilasyon denir. 


Osilasyon elektronik devrelerde istenmeyen bir olaydır. Devre çıkışında oluşan fazla osilasyon zararlı olabilir. Bu nedenle osilasyonu azalatmak için elektronik devreler kullanılır. Fakat bu osilasyonların gerekli olduğu sistemlerde vardır. Bu nedenle osilasyon sinyalleri üreten devrelere ihtiyaç vardır. Bu devrelere osilatör devresi denir.



Osilatörler: Belli frekanslarda kare, sinüs, üçgen  veya testere diÅŸi biçiminde sinyal üreten, geri beslemeli amplifikatör(yükseltici) devrelerdir. Ayarlandığı frekansta ya da sabit bir frekansta sürekli çıkış veren devrelerdir.

Osilatörler, dc enerjiyi eÅŸdeÄŸer ac enerjisine dönüştüren enerji dönüştürücüdür. Osilatör çıkışındaki ac sinyalinin frekans aralıkları birkaç Hz ile birkaç GHz arasında deÄŸiÅŸir. 

Osilatörün Blok Şeması

Osilatör, pozitif geri besleme devresi ile amplifikatörden oluşur.



Burada geri besleme ağı, frekans seçici devredir. Blok diyagramında amplifikatör devresinden önce kullanılan salınımlı devrenin LC tank devresi, RC ağı veya  kuvars kristali olabileceÄŸine dikkat edilmelidir. 

Amplifikatör, temel olarak kaynak tarafından saÄŸlanan dc voltajı ac gücüne dönüştürür. Bu ac sinyali daha sonra bir geri besleme yolu ile tank devresine gönderilir. Ayrıca, tank devresinin salınımları ile amplifikatör beslenir.  Amplifikatör, uygulanan giriÅŸ terminalinde güçlendirildiÄŸi'den, amplifikatör'ün çıkışında, uygulanan dc voltajı nedeniyle yükseltilmiÅŸ salınımlar elde edilir. 

Osilatörün Çalışması

Aşağıdaki devre osilatörün geri besleme devresidir:



Vi, A kazancına sahip amplifikatör'ün terminaline uygulanan giriÅŸtir. Ayrıca, bir geri besleme ağı kullanılır. Bu geri bildirim ağında geri bildirim fonksiyonu vardır: Î².  Amplifikatör'ün çıkışı Vo ve geri besleme ağının çıkışı Vf'dir. 

Burada Î² temel olarak girdiye geri bildirim olarak saÄŸlanan çıktı fonksiyonunu tanımlar. 

Başlangıçta Vi amplifikatör'ün terminaline kazanç A ile uygulanır. Yani amplifikatör'ün çıkışında:


 Bu voltaj daha sonra bir frekansta en yüksek geri bildirime sahip olmak için temelde bir rezonans devresi olan geri besleme ağına verilir.

Bu nedenle, geri besleme amplifikatörünün çıkışında elde edilen sinyal ÅŸu ​​ÅŸekilde verilir:

Çünkü: f = βV o ve o = AV i

Amplifikatör ve geri besleme devresi 0° faz kayması getirirse, daha sonra hem geri besleme sinyali hem de giriÅŸ sinyali birbiriyle aynı fazda olacaktır. 

Åžimdi, geri besleme devresinin çıkışı, giriÅŸiyle birlikte amplifikatöre uygulandığında, ardından amplifikatörün çıkışındaki sinyal ÅŸu ÅŸekilde olur: 


Yani, osilatörün kapalı döngü kazancını geri bildirim ile yazabiliriz:



Diyelim ki, amplifikatör'ün girişinde sadece geri besleme devresinin çıkışını sağlıyoruz ve orijinal olarak uygulanan giriş sinyalini kaldırıyoruz.

Vi'nin çıkarılmasından sonra, sürekli salınımlardan osilatörün döngü kazancı sorumludur.
  • Açık döngü kazancı 1'den az ise, yani Aβ <1. Daha sonra bir süre sonra çıktı söner. Çünkü burada AβVi amplifikatöre girdi olarak hizmet eder, bu nedenle bu Vi'den küçük olacak ve Aβ birlikten küçük olacaktır.
Bu nedenle, döngüden her geçtikten sonra sinyalin genliği azalacaktır. Sonuç olarak, salınımlar ortadan kalkacaktır.
  • Döngü kazancı 1'den ise, yani Aβ > 1. Bu çıktının birikmesine neden olur. Böylece, döngüden her geçildiÄŸinde, salınımların genliÄŸinde artış fark edilir.
  • Åžimdi, döngü kazancı 1'e eÅŸitse, yani Aβ = 1 ise, Vf'nin Vi'ye eÅŸit olmasına neden olur. Böylece çıkışta sinyal sürekli bir sinüzoidal dalga formu olacaktır. Bu ÅŸekilde, giriÅŸin kendisi devre tarafından saÄŸlanır ve dolayısıyla sinüzoidal bir çıktı elde edilir.
Burada, salınımları oluşturmak için başlangıçta döngü kazancının her zaman 1'den fazla olduğu belirtilmelidir. Ancak, sinyal tarafından belirli bir voltaja ulaşıldığında, döngü kazancı1 olur.

Bu, geri besleme amplifikatör devresinin doğrusal olmayan davranışından kaynaklanmaktadır.


Barkhausen Kriterleri


Barkhausen kriterleri, sürekli salınımlar elde etmek için iki koşulu belirtir. Bunlar aşağıda verilmiştir:

  1. Açık döngü kazancı 1'e biraz daha fazla veya eÅŸit olmalıdır. Bu, Aβ ≥ 1 anlamına gelir. 
  2. Devrenin genel faz kayması 0 olmalıdır. Böylece, giriş ve çıkış sinyali birbiriyle aynı fazda olacaktır.

Bu iki koşul, amplifikatör'ün çıkışında sürekli salınımlar sağlayacaktır. Bu, Barkhausen Kriterleri olarak adlandırılır.


Osilatör Çeşitleri

LC osilatörler

Osilatörün kuvvetlendirici katı için BJT, FET, İşlemsel Kuvvetlendirici gibi aktif devre elemanları kullanılır. Bu elemanların seçiminde osilatörün çalışma frekansı da rol oynar.

LC osilatörler, 100 kHz ve üzeri frekanslar için uygundur. LC osilatörler genellikle yüksek frekanslar üretmek için kullanıldığından genellikle BJT ve FET gibi elemanlar kuvvetlendirici katında tercih edilir.

RC osilatörler

RC osilatörleri RC zaman sabitinin osilasyon frekansını belirlemesine dayanır. LC osilatörlerinin aksine yüksek frekanslar için uygun değildir. RC osilatörler birkaç megahertz frekansına kadar kullanılırlar. Bu nedenle kuvvetlendirici katında işlemsel kuvvetlendiriciler (Op-Amp) da kullanılabilir.

Kristal Kontrollü Osilatörler

Tam ve kararlı osilasyonun sağlanabilmesi için osilatörlerin geribesleme yolu üzerinde piezoelektrik kristal adı verilen doğal yapılar kullanılır. Piezo elektrik kristal aslında bir quartz kristalidir. Bu kristallerden piezoelektrik etkiye sahip bulunanlar bu amaç doğrultusunda kullanılırlar. Bu etki, kristalin üzerine bir AC gerilim uygulandığında mekanik uygulanan frekansta titreşim oluşturur. Bunun tersi de doğrudur. Yani kristal titreşime uğrarsa üzerinde bir gerilim oluşur. Bu kristalin üzerinde en büyük titreşim kendi doğal frekansında oluşur. Bu frekans kristalin fiziksel boyutları ve kesiti ile belirlenir.


Non-sinüsoidal Osilatörler

  • Üçgen Dalga Osilatör
  • Gerilim kontrollü testere diÅŸli osilatö<rler
  • Dolup-BoÅŸalmalı Osilatörler

IC Osilatörler

Günümüz sistemlerinde, ister sinüzoidal ister non – sinüzoidal, osilatör ihtiyacı tümleÅŸik devreler (IC) ile giderilmektedir. Hemen hemen her frekans ve dalga ÅŸekline cevap verecek osilatörler tümleÅŸik devre halinde piyasada bulunabilir.

Kaynakça:

https://www.elektrikrehberiniz.com/osilator/osilator-nedir-10019/

https://teknolojiprojeleri.com/elektronik/osilator-nedir-ne-ise-yarar-cesitleri-nelerdir

https://electronicsdesk.com/oscillator.html


 Merhaba arkadaÅŸlar,  bu çalışmada nodemcu kullanarak bir araba yapacağız. Aynı zamanda arabanın hızını da kontrol edeceÄŸiz. 

Öncelikle nodemcu'nın ne olduğuna değinelim;

NodeMCU; ESP8266 tabanlı, düşük maliyetli ve açık kaynak kodlu elektronik geliştirme kartıdır. Kartın üzerinde bulunan ESP8266 Wifi modülü sayesinde internete kolayca bağlanabilir, bu sayede uzaktan kontrol ve IoT projelerinde kullanılmaktadır.

Åžimdi gelelim yapmak istediÄŸimiz arabaya.  Önce kullanacağımız arayüzü tasarlayacağız. Biraz html ve css bilgisi yeterli olacaktır. İleri, geri, dur, saÄŸ, sol, hızlı, orta, yavaÅŸ ÅŸeklinde butonları yerleÅŸtireceÄŸiz.


Bu çalışmanın html ve css kodu aşağıdadır:

 <!DOCTYPE html> 

 <head>

 <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">

 </head> 

 <style>

 html { font-family: Helvetica; 

 display: inline-block; 

 margin: 0px auto; 

 text-align: center;}

 .button 

 { 

 background-color: #6df996; 

 border: none; 

 color: white; 

 padding: 25px 25px;

 text-decoration: none; 

 font-size: 30px; 

 margin: 2px; 

 cursor: pointer;

 }

 .button2 {

 background-color: #9effba;

 }

 </style>

 <body> 

 <h1>RC Car - IOT</h1> 

 <button class=\"button\"><a href=\"ileri\">İLERİ</a></button>

 <br> <button class=\"button\" ><a href=\"sol\">SOL</a></button> 

 <button class=\"button button2\" ><a href=\"dur\">DUR</a></button> 

 <button class=\"button\"><a href=\"sag\">SAÄž</a></button> 

 <br> <button class=\"button\"><a href=\"geri\">GERİ</a></button> 

 <h2> Hız Miktarı </h2> 

 <button class=\"button\"><a href=\"yavas\">Yavas</a></button>

 <button class=\"button\"><a href=\"orta\">Orta</a></button>

 <button class=\"button\"><a href=\"Hızlı\">Hızlı</a></button>

 </body>

 </html>


Bu şekilde ara yüzümüz:




Daha sonra Arduino ide'sinde, butonların görevlerini, nodemcu'yu internete baÄŸlamak gibi iÅŸlemleri gerçekleÅŸtireceÄŸiz. Burada hızlı, orta, yavaÅŸ butonlarına basıldığında kod'ta belirlediÄŸimiz deÄŸere göre aracın hızı deÄŸiÅŸecektir. 

Nodemcu kodumuz:


#include <ESP8266WiFi.h>

#include <ESP8266WebServer.h>

ESP8266WebServer server(80); // 80 numaralı port


const int ena = 14;

const int enb = 12;

const int in1 = 5;

const int in2 = 4;

const int in3 = 0;

const int in4 = 2;


int speedCar=450;  

// wifi kurulumu

char ssid[] = "";

char pass[] = "";

char HTML[] = " <!DOCTYPE html>  <head> <meta name=\'viewport\' content=\'width=device-width, initial-scale=1\'></head>  <style> html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}.button { background-color: #6df996; border: none;  color: white;  padding: 25px 25px; text-decoration: none;  font-size: 30px;  margin: 2px;  cursor: pointer; } .button2 {background-color: #9effba; } </style> <body>  <h1>RC Car - IOT</h1>  <button class=\'button\'><a href=\'ileri\'>ILERI</a></button> <br> <button class=\'button\' ><a href=\'sol\'>SOL</a></button>  <button class=\'button button2\' ><a href=\'dur\'>DUR</a></button>  <button class=\'button\'><a href=\'sag\'>SAG</a></button>  <br> <button class=\'button\'><a href=\'geri\'>GERI</a></button>  <h2> Hiz Miktari </h2>  <button class=\'button\'><a href=\'yavas\'>Yavas</a></button> <button class=\'button\'><a href=\'orta\'>Orta</a></button> <button class=\'button\'><a href=\'hizli\'>Hizli</a></button> </body></html>";


void handleRoot() {

  server.send(200,"text / html", HTML);

}

void setup() {

  pinMode(ena, OUTPUT);

  pinMode(enb, OUTPUT);

  pinMode(in1, OUTPUT);

  pinMode(in2, OUTPUT);

  pinMode(in3, OUTPUT);

  pinMode(in4, OUTPUT);

  

  Serial.begin(115200);

  WiFi.begin(ssid, pass); // wifi baÄŸlantısı için

  Serial.println("");

  Serial.print("BaÄŸlanıyor . ");

  while ( WiFi.status() != WL_CONNECTED){

    delay(500);

    Serial.print(".");

  }

  Serial.println("");

  server.on("/", handleRoot);// iÅŸleyici iÅŸlevini yolla ve iliÅŸkilendirme

  server.on("/other",[] (){

  server.send(200, "text/html"," Other URL");

  });

  server.begin(); //Server baÅŸladı

  Serial.print("Server bekliyor, acik ");

  Serial.print(WiFi.localIP());

  Serial.println(" tarayıcıda");

  server.on("/", handleRoot);

server.on("/ileri",ileri);

server.on("/sol",sol);

server.on("/sag",sag);

server.on("/geri",geri);

server.on("/dur",dur);


server.on("/yavas",yavas);

server.on("/orta",orta);

server.on("/hizli",hizli);

server.begin();

}

void loop(){

  server.handleClient(); // gelen taleplerin ele alınması  

}

void yavas(){

  speedCar = 300;

  server.send(200,"text/html",HTML);

}

void orta(){

 speedCar = 600;

 server.send(200,"text/html",HTML);

}

void hizli(){

   speedCar = 1000;

   server.send(200,"text/html",HTML);

}

void ileri(){

  Serial.println("\nMotor ileri");

  server.send(200,"text/html",HTML);


   digitalWrite(in1, LOW);

   digitalWrite(in2, HIGH);

   analogWrite(ena, speedCar);


   digitalWrite(in3, HIGH);

   digitalWrite(in4, LOW);

   analogWrite(enb, speedCar);

  Serial.print("Motor hizi: ");

  Serial.print(speedCar);

}

void geri(){

  Serial.println("\nMotor geri");

  server.send(200,"text/html",HTML);


  digitalWrite(in1, HIGH);

  digitalWrite(in2, LOW);

  analogWrite(ena, speedCar);


  digitalWrite(in3, LOW);

  digitalWrite(in4, HIGH);

  analogWrite(enb, speedCar);

  Serial.print("Motor hizi: ");

  Serial.print(speedCar);

}

void sag(){

  Serial.println("\nMotor sag");

  server.send(200,"text/html",HTML);


   digitalWrite(in1, HIGH);

   digitalWrite(in2, LOW);

   analogWrite(ena, speedCar);


   digitalWrite(in3, HIGH);

   digitalWrite(in4, LOW);

   analogWrite(enb, speedCar);

  Serial.print("Motor hizi: ");

  Serial.print(speedCar);

}

void sol(){

  Serial.println("\nMotor sol");

  server.send(200,"text/html",HTML)

  digitalWrite(in1, LOW);

  digitalWrite(in2, HIGH);

  analogWrite(ena, speedCar);


  digitalWrite(in3, LOW);

  digitalWrite(in4, HIGH);

  analogWrite(enb, speedCar);

  Serial.print("Motor hizi: ");

  Serial.print(speedCar);

  }

void dur(){

  Serial.println("\nMotor dur");

  server.send(200,"text/html",HTML);


  digitalWrite(in1, LOW);

  digitalWrite(in2, LOW);

  analogWrite(ena, speedCar);


  digitalWrite(in3, LOW);

  digitalWrite(in4, LOW);

  analogWrite(enb, speedCar);

  Serial.print("\nMotor hizi: ");

  Serial.print(speedCar);

}

Projenin devre şeması ise:




Github :

https://github.com/one-engineer/nodemcu-rc-car-web-server

 Algoritma

Bir sorunu çözmek veya belirlenmiş bir amaca ulaşmak için tasarlanan yola, takip edilen işlem basamaklarına algoritma denir.

Algoritmalar açıkça belirtilmiÅŸ bir baÅŸlangıcı ve sonu olan iÅŸlemler kümesidir. Amaca ulaÅŸmak için iÅŸlenecek çözüm yolları ve sıralamaları belirlenir ve algoritma bu sırayı  takip ederek en mantıklı çözüme ulaşır.

Yataktan kalkıp işe gitmek için genç bir idareci tarafından takip edilen "kalk ve ışılda algoritması"nı düşünün:


1)Yataktan kalk,
2)Pijamalarını çıkar,
3)DuÅŸ al,
4)Giyin,
5)Kahvaltı yap,
6)İşe git.

Bu akış, genç idareciyi kritik kararlar vermeye iyi bir şekilde hazırlar. Aynı adımları biraz farklı sırada yapıldığını düşünün:


1)Yataktan kalk,
2)Pijamalarını çıkart,
3)Giyin,
4)DuÅŸ al,
5)Kahvaltı yap,
6)İşe git.

Bu durumda, genç idarecimiz işe sırılsıklam gidecek. Bir bilgisayar programında ifadelerin hangi sırada yürütüleceğini belirlemeye program kontrolü denir.

Sözde Kod

Sözde kod algoritma geliÅŸtirmenize yardımcı olan yapay ve gayri resmi bir dildir. Günlük dile benzer; gerçek bir bilgisayar programlama dili olmamasına raÄŸmen uygun ve kullanıcı dostudur. 

Bu kodları bilgisayarda çalıştıramayız. Aksine, bir programını C gibi bir bilgisayar programlama dilinde yazmaya teÅŸebbüs etmeden önce sadece programı "planlama"nıza yardımcı olur. Yukarıda örnek olarak bahsettiÄŸimiz "kalk ve ışılda algoritması" sözde koda örnek olarak verilebilir. 

Başka bir örnek daha vermek istersek:

1)Birinci sayıyı oku;
2)İkinci sayıyı oku;
3)Üçüncü sayıyı oku;
4)İlk iki sayıdan büyük olanı bul;
5)Büyük sayıyı sonuç isimli değişkene ata;
6)Eğer sonuç değişkeni üçüncü sayıdan büyük ise sonuç değerini yazdır;
7)DeÄŸilse
8)Üçüncü sayıyı yazdır;

if Seçim İfadesi

Seçim ifadeleri, alternatif eylemler arasında seçim yapmak için kullanılır. Örneğin, bir sınavdaki geçme notunun 60 olduğunu düşünün:

Eğer öğrencinin notu 60'tan büyükse veya 60' a eşit ise
    "Geçti" Yaz

sözde kod ifadesi "öğrencinin notunun 60'tan büyük veya eşit" koşulunun doğru olup olmadığını karşılaştırır. Koşul doğru ise "Geçti" yazılır ve sıradaki sözde kod ifadesi "icra edilir". Koşul yanlış ise, yazma işlemi göz ardı edilir ve sonraki sözde kod icra edilir.

Yukarıdaki if ifadesi sözde kodu C'de:

if ( not >= 60 )
printf ( "Geçtiniz\n" );

gibi yazılabilir.


if...else Seçim İfadesi

if seçim ifadesi, yalnızca koşul doğru olduğu zaman işaret edilen eylemi yapar; diğer türlü eylem atlanarak geçilir. if...else seçim ifadesi koşul doğru olduğu zaman ve yanlış olduğu zaman yapılacak farklı eylemleri belirlemenize izin verir. Örneğin,


Eğer öğrencinin notu 60'tan büyük veya eşit ise
    "Geçti" Yaz
DeÄŸilse
    "Kaldı" Yaz

sözde kod ifadesi, öğrencinin notu 60'tan büyük veya eÅŸit ise "Geçti" veya öğrencinin notu 60'tan küçükse "Kaldı" yazar. İki durumda da, yazma iÅŸlemi olduktan sonra, sıradaki sözde kod "icra edilir." DeÄŸilse 'nin gövdesinde de boÅŸluk bırakılmamıştır. 

Yukarıdaki if..else ifadesinin sözde kodu C'de:

if ( not >= 60 )
    printf ( "Geçti" );
else
    printf ( "Kaldı" );



Kümelenmiş if...else İfadeleri

if...else ifadeleri içinde if...else ifadeleri yerleÅŸtirerek çoklu durumlar için karşılaÅŸtırma yapar. ÖrneÄŸin aÅŸağıdaki sözde kod ifadesi, 90'dan büyük veya eÅŸit olan sınav notları için A, 80'den büyük veya eÅŸit ( fakat 90'dan küçük) notlar için B, 70'ten büyük veya eÅŸit ( fakat 80'den küçük ) notlar için C, 60'tan büyük veya eÅŸit (fakat 70'ten küçük )  notlar için D ve diÄŸer tüm notlar için F yazılacaktır.


Eğer öğrencinin notu 90'dan büyük veya eşit ise
    "A" Yaz
DeÄŸilse
    EÄŸer öğrencinin notu 80'den büyük veya eÅŸit ise
        "B" Yaz
    DeÄŸilse
        EÄŸer öğrencinin notu 70'den büyük veya eÅŸit ise
            "C" Yaz
        DeÄŸilse
            EÄŸer öğrencinin notu 60'dan büyük veya eÅŸit ise
                "D" Yaz
            DeÄŸilse
                "F" Yaz


Bu sözde kod C'de:


if ( not >= 90 ){
    printf("A\n");
    } // if sonu
else{
    if ( not >= 80 ){
        printf("B\n");
        } // if sonu
    else {
        if (not >= 70){
            printf ("C\n");
            } // if sonu
        else {
            if ( not >= 60 ){
                printf ( "D\n" );
                } // if sonu
            else {
                printf ("F\n" );
                } // else sonu
           } // else sonu
        } // else sonu
    } // else sonu        

         

gibi yazılabilir. not deÄŸiÅŸkeni 90'dan büyük veya eÅŸitse, dört koÅŸulda olacaktır, ancak sadece ilk karşılaÅŸmadan sonra printf ifadesi yürütülecektir. Bu printf ifadesi yürütüldükten sonra, "en dış"taki if...else ifadesinin else kısmı atlanarak geçilir. 

Yukarıdaki if ifadesini;

if ( not >= 90 ) {
    printf("A\n"); 
    }
else if ( not >= 80 ){
    printf("B\n");
    }
else if (not >= 70){
    printf ("C\n");
    }
else if ( not >= 60 ){
    printf ( "D\n" );
    }
else{
    printf ("F\n" );
    }

ÅŸeklinde yazmayı tercih edebilirsiniz. 




while Tekrarlama İfadesi


Bir tekrarlama ifadesi, koşullar doğru olduğu sürece tekrar edilecek bir eylem belirtmemize izin verir.

Alışveriş listemde daha alınacak olduğu sürece
    Sonraki malzemeyi al ve listede üzerini çiz.

sözde kod ifadesi alışveriÅŸ boyunca meydana gelen tekrarı tanımlar. "AlışveriÅŸ listemde daha alınacak var" koÅŸulu doÄŸru veya yanlış olabilir. DoÄŸru ise "Sonraki malzemeyi al ve listede üzerini çiz" eylemi gerçekleÅŸir. Bu eylem, koÅŸul doÄŸru kaldığı sürece tekrarlı olarak gerçekleÅŸtirilir.  while  tekrarlama ifadesinin içerdiÄŸi ifade(ler) while 'ın gövdesini oluÅŸturur.  

En sonunda , koÅŸul yanlış olacaktır. Bu noktada, tekrarlama sonlanır ve tekrarlama yapısından sonraki ilk sözde kod yürütülür. 

C programlamada while döngüsünün syntax yapısı:

while(ÅŸart) {
   iÅŸlemler(s);
}


while ifadesine örnek olarak, 100'den büyük ve 3'ün kuvveti olan ilk sayıyı bulmak için tasarlanmış bir program parçası düşünün. sonuc tam sayı deÄŸiÅŸkeninin baÅŸlangıçta 3 olduÄŸunu farz edin. AÅŸağıdaki while tekrarlama ifadesinin çalışması bittiÄŸi zaman sonuc istenen cevabı içerecektir.  


sonuc = 3;
while( sonuc <= 100 ) {
    sonuc = 3 * sonuc ;
    } // while sonu




Örnekler

1) Negatif bir sayıyı ekrana yazan program:


#include <stdio.h>
int main() {
    int sayi;

    printf("Sayi giriniz: ");
    scanf("%d", &sayi);

    if (sayi < 0) {
        printf("Girdigin sayi: %d.\n", sayi);
    }
}

Ekran çıktısı:


Sayi giriniz: -2
Girdigin sayi: -2.


2) Bir tam sayının tek mi çift mi olduÄŸunu kontrol  eden program:


#include <stdio.h>
int main() {
    int sayi;
    printf("Bir tam sayi giriniz: ");
    scanf("%d", &sayi);

    if  (sayi%2 == 0) {
        printf("%d sayisi çift sayidir.",sayi);
    }
    else {
        printf("%d sayisi tek sayidir.",sayi);
    }

}


Ekran çıktısı:

Bir tam sayi giriniz: 7
7 sayisi tek sayidir.


3) Girilen iki tam sayı büyüklük olarak karşılaştıran program:


#include <stdio.h>
int main() {
    int sayi1, sayi2;
    printf("Iki tam sayi giriniz: ");
    scanf("%d %d", &sayi1, &sayi2);

    if(sayi1 ==sayi2) {
        printf("Sonuc: %d = %d",sayi1,sayi2);
    }

    else if (sayi1 > sayi2) {
        printf("Sonuc: %d > %d", sayi1,sayi2);
    }

    else {
        printf("Sonuc: %d < %d",sayi1, sayi2);
    }

}


Ekran çıktısı:

Iki sayi giriniz: 12
23
Sonuc: 12 < 23


4) 1'den 5'e kadar olan sayıları ekrana yazan program:


#include <stdio.h>
int main()
{
    int sayi = 1;
    
    while (sayi <= 5)
    {
        printf("%d\n", sai);
        ++i;
    }

}


Ekran çıktısı:

1
2
3
4
5


Kısa Yollar:

Aşağıdaki linkler ile C programlama ile ilgili olan diğer bölümlere ulaşabilirsiniz:



Kaynakça:

https://maker.robotistan.com/algoritma/

https://www.elektrikport.com/teknik-kutuphane/yalanci-kod-nedir/14925#ad-image-0

https://www.programiz.com/c-programming/c-if-else-statement

https://www.tutorialspoint.com/cprogramming/c_while_loop.htm

https://www.programiz.com/c-programming/c-do-while-loops

Deitel Deitel c ve c++