Tekrarlama Temelleri

Çoğu program, tekrarlama veya döngü içerir. Bir döngü, döngü devam koşulu doğru kaldığı sürece bilgisayarın tekrar tekrar yürüttüğü bir talimatlar grubudur. Tekrarlamanın iki anlamı vardır:

    1) Sayaç kontrollü tekrarlama    
    2) Sonlandırma kontrollü tekrarlama

Döngünün önceden kaç kere yürütüldüğünü önceden bildiÄŸimiz için sayaç kontrollü tekrarlama bazen belirli tekrarlama olarak adlandırılır. Döngünün tam olarak kaç kere yürütüleceÄŸini önceden bilinmediÄŸi için sonlandırma kontrollü tekrarlama bazen belirsiz tekrarlama olarak adlandırılır. 

Sayaç kontrollü tekrarlamada, tekrarlama sayısını sayısını saymak için bir kontrol değişkeni kullanılır. Kontrol değişkeni talimatlar grubunun yapıldığı her sefer ( genelde 1 ) arttırılır. Kontrol değişkeninin değeri doğru sayıda tekrarlamanın yapıldığı işaret ettiği zaman, döngü sonlanır ve yürütme, tekrarlama ifadesinden sonraki ifade ile devam eder.
    
    1) Kesin tekrarlama sayısı önceden bilinmediÄŸi,
    2) Döngü, döngünün yapıldığı her sefer veri alan ifadeler içerdiÄŸi zaman
tekrarlamayı kontrol etmek için sonlandırma değerleri kullanılır. Sonlandırma değeri "veri sonu" nu işaret eder. Sonlandırmalar, normal veriden farklı olmak zorundadır.

Sayaç Kontrollü Tekrarlama

Sayaç kontrollü tekrarlama:

    1) Kontrol deÄŸiÅŸkeninin ismi
    2)Kontrol deÄŸiÅŸkeninin baÅŸlangıç deÄŸeri
    3) Her döngü seferinde kontrol deÄŸiÅŸkeninin deÄŸiÅŸtirileceÄŸi arttırma ( veya azaltma)
    4) Kontrol deÄŸiÅŸkeninin son deÄŸeri

maddelerini gerektirir.

Aşağıdaki örnekte 1 'den 10 'a kadar sayıları ekrana yazan program yapılmıştır.

Örnek:

#include <stdio.h>

int main(void){
    
    unsigned int sayac = 1; // sayaça baÅŸlangıç deÄŸerinin verilmesi
    
    while( sayac <= 10) {
    
        printf("%u\n", sayac);
        ++sayac;  // arttırma iÅŸlemi
    } // while sonu
} // main fonksiyonu sonu


Ekran çıktısı:

1
2
3
4
5
6
7
8
9
10

Bu örneği inceleyelim:

Bu örnekte kontrol değişkenimiz "sayac" olarak isimlendirilmiştir. "unsigned int sayac = 1;" bu kod satırı ile kontrol değişkenimize değeri atanmıştır. "++sayac;" bu kod satırı ile ise, döngünün yapıldığı her sefer döngü sayacı 1 arttırır. while ifadesindeki döngü devam koşulu kontrol değişkeninin 10'dan küçük veya eşit olup olmadığını kontrol eder. Kontol değişkeni 10'u geçtiği zaman döngü sonlanır.

for Tekrarlama İfadesi

for tekrarlama ifadesi, sayaç kontrollü tekrarlamanın tüm detaylarını sağlar.

for döngüsü akış diyagramı



for ifadesinin genel biçimi:

for ( ifade1; ifade2; ifade3){
    ifade
}

Örnek:

1    #include <stdio.h>
2    
3    int main(void) {
4        
5        unsigned int sayac; // sayac tanımlanır
6    
7                    // baÅŸlangıç deÄŸeri verme, tekrarlama koÅŸulu ve arttırma'nın
       // tamamı for ifadesi baÅŸladığında dahil olmuÅŸtur.
9
10                 for ( sayac =1; sayac<=10; ++sayac){
11    
12            printf("%u\n", sayac);
13    
14        }// for sonu
15    
16    } // main sonu

Ekran çıktısı:

1
2
3
4
5
6
7
8
9
10

for ifadesi çalışmaya baÅŸladığı zaman, sayac kontrol deÄŸiÅŸkenine baÅŸlangıç deÄŸeri olarak 1 verilir. Sonra, sayac <= 10 döngü devam koÅŸulu kontrol edilir. sayac'ın baÅŸlangıç deÄŸeri 1 olduÄŸu için , koÅŸul saÄŸlanır, böylece 12. satır da sayac deÄŸerini, yani 1, yazar. sayac kontrol deÄŸeri daha sonra ++sayac ifadesi tarafından 1 arttırılır, ve döngü, döngü devam karşılaÅŸtırılması ile tekrar baÅŸlar. Kontrol deÄŸiÅŸkeni ÅŸimdi 2 olduÄŸu için, son deÄŸer aşılmamıştır, bu nedenle program  printf ifadesini  tekrar gerçekleÅŸtirir. Bu süreç, sayac kontrol deÄŸiÅŸkeninin son deÄŸeri 11 olana kadar devam eder.



Örnekler:

1) Kullanıcıdan alınan 3 sayıdan 25'e en yakın olan sayıyı bulan program:


#include <stdio.h>
int main(){
   int enyakinmesafe=25;
   int enyakinsayi=25;
   for(int i = 0;i<3;i++){
     int sayi;
     scanf("%d",&sayi);
     if((25-sayi)*(25-sayi)<enyakinmesafe){
                enyakinmesafe = (25-sayi)*(25-sayi);
                enyakinsayi = sayi;
     }
   }
   printf("en yakin sayi : %d",enyakinsayi);

Ekran çıktısı:

15
22
28
en yakin sayi : 22


2) Kullanıcıdan alınan sayıya kadar olan sayıların toplamı:


#include <stdio.h>

int main()
{
  int i,n,sonuc ;
  // degiÅŸkenler tanımlanıyor.
  
   // integer'e karşılık prinf ve scanf'te %d kullanırlır.
   
   printf("Bir sayi giriniz :");
   //Kullanıcıdan deÄŸerler alınıyor..
   
   scanf("%d", &n);
   // %d sayının tipini ifade ediyor. & sayısal olanlarda giriliyor.
   //  String bir ifade kullanmak istedeÄŸimizde & iÅŸaretini kullanmıyoruz.
   //
   
   sonuc=0;

   for  (i=1; i<=n; i++ )
   
   sonuc = sonuc + i;
   
   printf("istediginiz toplam: %d ", sonuc  );  
   // sonuç ekrana yazdırılıyor.. 
    // %f virgüllü sayılar
    // %s string ifadelerinde kullanıyoruz.
   
}
 
Ekran çıktısı:

Bir sayi giriniz :3
istediginiz toplam: 6 



3) Ä°ngiliz alfabesine A’dan Z’ye kadar harflei sıralayan bir C programı:

/* A-Z harflerini yazan for döngüsü. */
#include <stdio.h>
int main() {
    char c;
    for(c='A'; c<='Z'; ++c){
        printf("%c ",c);
    }
    return 0;
}

Ekran çıktısı:

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 

4) Kullanıcıdan alınan sayıya kadar olan sayıların faktöriyelini hesaplayan program:

#include <stdio.h>
 
main()
{
    int faktoriyel = 1; 
    int sayi;
    
    printf("Bir sayi giriniz: ");
    scanf("%d",&sayi);
    
    for(int i = 1; i <= sayi; i++)
    {
        faktoriyel *= i;         // faktoriyel = faktoriyel * i;
        printf("%d ! = %d\n", i , faktoriyel);    
    }
         //printf("%d ! = %d ", sayi, faktoriyel);
}

Ekran çıktısı:

Bir sayi giriniz: 6
1 ! = 1
2 ! = 2
3 ! = 6
4 ! = 24
5 ! = 120
6 ! = 720



Kısa Yollar:

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





Kaynaklar:


https://bilgisayarkavramlari.com/2010/01/13/c-ile-programlamaya-giris-quiz-sorulari-ve-cozumleri/

https://www.cag.edu.tr/uploads/site/lecturer-files/programlamatemelleri-iJim.pdf

http://www.baskent.edu.tr/~tkaracay/etudio/ders/prg/c/questions/h05/h05_loops.pdf

https://www.kodbloklari.com/c-dili-for-dongusu/

Deitel Deitel c ve c++ 
Bu çalışmada raspberry pi üzerindeki cpu'nun sıcaklık değerini okuyacağız. Bu okuduğumuz sıcaklık değerini TCP ile oluşturacağımız server'a aktaracağız. Programlama dili olarak Python kullanacağız.

Hadi baÅŸlayalım. 

Öncelikle raspberry pi üzerindeki cpu'nun sıcaklığını ölçmek ile başlayalım.

import os
import time

def measure_temp():
    temp = os.popen("vcgencmd measure_temp").readline()
    return (temp.replace("temp= ",""))
while True:
    print(measure_temp)
    time.sleep(1)



Bir saniye aralıklarla console ekranında cpu sıcaklık değerini yazdıracaktır. Biz programı durdurana kadar devam edecektir.




Evet artık cpu sıcaklık deÄŸerini okuyabiliyoruz. Åžimdi client ve server'larımızı oluÅŸturabiliriz. 

Önce TCP için yapalım:

Server kısmı: 

import socket

host = "192.168.1.42"
port = 12345

try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print("socket oluÅŸturuldu")

s.bind((host, port))
print("socket {} nolu porta bağlandı".format(port))

s.listen(5)
print("socket dinleniyor")

except socket.error as msg:
print("Hata:", msg)

while True:
# Client ile bağlantı kurulursa
c, addr = s.accept()
print('Gelen bağlantı:', addr)

# Bağlanan client tarafına bağlandığını belirtelim
mesaj = 'Bağlantı sağlandı'
c.send(mesaj.encode('utf-8'))

# client tarafından gönderilen cpu sıcaklık değeri
yanit = c.recv(1024)
print( yanit.decode("utf-8") )

# Bağlantıyı sonlandıralım
c.close()

Client kısmı:

# -*- coding: utf-8 -*-
import socket                
#cpu temp
import os
import time


while True:
    # Socket oluÅŸturulması
    s = socket.socket()          
    
    # BaÄŸlanılacak adres ve port
    host = "192.168.1.42"
    
    port = 12345                

    try:
        # BaÄŸlantıyı yap
        s.connect((host, port))
        

        # serverden yanıtı al
        yanit = s.recv(1024)
        print(yanit.decode("utf-8"))
       
        #cpu sıcaklığı ölçülür ve server'a gönderilir
        temp = os.popen("vcgencmd measure_temp").readline()
        mesaj= temp
        s.send(mesaj.encode("utf-8"))
    

        # baÄŸlantıyı kapat
        s.close() 
    except socket.error as msg:
        print("[Server aktif deÄŸil.] Mesaj:", msg)
    
    time.sleep(1)

Biz server'dan baÄŸlantıyı kesene kadar, client cpu sıcaklık deÄŸerini göndermeye devam edecektir. 
Şimdi çalıştıralım:

Server'a herhangi bir bağlantı olmadan önce:



Client çalıştırılınca server:



Client çıktısı:


Bu ÅŸekilde TCP ile veri aktarımını baÅŸarılı bir ÅŸekilde tamamlamış olduk. 

























 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