Parçalar · 9 dk okuma

ESP-01 Arduino Kullanımı: AT Komutları, Programlama ve Röle

ESP-01 (ESP8266) modülünü Arduino'ya bağla: 8 pin, 3,3 V besleme, AT komutlarıyla Wi-Fi, GPIO0-GND ile programlama, ESP-01S röle modülü ve sık hatalar.

ESP-01, ESP8266 Wi-Fi yongasını taşıyan, başparmak tırnağı büyüklüğünde (24,8 × 14,3 mm) ve çok ucuz bir modüldür. ESP-01'i Arduino'ya bağlayarak Uno ya da Nano gibi kablosuz bağlantısı olmayan bir karta birkaç kabloyla Wi-Fi ekleyebilirsin. Modül fabrikadan AT komut yazılımıyla gelir: Arduino seri hattan "AT+CWJAP" gibi kısa metin komutları gönderir, ESP-01 de ağa bağlanır, veri gönderir ve alır. İstersen ESP-01'i hiç Arduino kullanmadan, kendi başına bir mikrodenetleyici olarak da programlayabilirsin; içindeki işlemci Uno'nunkinden çok daha hızlıdır.

Bu rehberde ESP-01'in 8 pinini, neden mutlaka 3,3 V ve güçlü bir besleme istediğini, Arduino Uno ile AT komutlarını, telefondan LED yakan bir web sayfasını, USB-TTL dönüştürücüyle doğrudan programlamayı (GPIO0-GND yöntemi), ESP-01S röle modülüyle lamba kontrolünü ve Raspberry Pi Pico ile kullanımı adım adım öğreneceksin. Sonunda en sık karşılaşılan hataların çözümlerini ve NodeMCU ya da ESP32'nin ne zaman daha iyi bir seçim olduğunu bulacaksın.

ESP-01 ESP8266 Wi-Fi modülü
ESP-01 Wi-Fi modülü: ESP8266EX yongası, flaş bellek, PCB anten ve 2×4 dizilmiş 8 pin aynı küçük kartta.

ESP-01 nedir, nasıl çalışır?

ESP-01, Ai-Thinker firmasının ESP8266EX yongası etrafında tasarladığı ilk ve en küçük modüldür. Kartın üzerinde yonga, 26 MHz kristal, programın ve ayarların saklandığı flaş bellek ve kıvrımlı bir PCB anten bulunur; USB bağlantısı, voltaj regülatörü ya da düğme yoktur. Bu yüzden ESP-01 tek başına bilgisayara takılamaz, beslemeyi ve seri bağlantıyı senin kurman gerekir. Modülü iki farklı şekilde kullanabilirsin: Wi-Fi modemi olarak (AT yazılımı yüklüdür, Arduino komut gönderir) ya da bağımsız mikrodenetleyici olarak (Arduino IDE ile kendi programını yüklersin, AT yazılımı silinir). Bugün satılan modüllerin çoğu siyah renkli ESP-01S sürümüdür.

ÖzellikDeğer
YongaESP8266EX (Tensilica L106, 32 bit)
Saat hızı80 MHz (160 MHz'e çıkarılabilir)
Flaş bellekESP-01: 512 KB, ESP-01S: 1 MB
RAMYaklaşık 80 KB veri RAM'i; Wi-Fi bağlıyken programa ~50 KB kalır
Wi-Fi802.11 b/g/n, yalnızca 2,4 GHz, PCB anten
Çalışma gerilimi3,0–3,6 V (önerilen 3,3 V)
AkımBağlıyken ortalama 70–80 mA, gönderirken ~170 mA, anlık tepeler 300 mA üstü
Derin uyku akımıYaklaşık 20 µA (yonga)
Kullanılabilir GPIO4 adet: GPIO0, GPIO2, GPIO1 (TX), GPIO3 (RX)
Analog girişYok (ADC pini dışarı çıkarılmamış)
Boyut24,8 × 14,3 mm
Fabrika yazılımıAT komut yazılımı (genellikle 115200 baud)

ESP-01 ile ESP-01S farkı

ÖzellikESP-01ESP-01S
Kart rengiGenellikle maviSiyah
Flaş bellek512 KB (sonraki siyah sürümlerde 1 MB)1 MB
Güç LED'iKırmızı, sürekli yanarYok
Mavi LEDTX (GPIO1) hattına bağlı, veri giderken yanıp sönerGPIO2'ye bağlı, pin LOW iken yanar
Pin dizilişi8 pinAynı 8 pin, birebir uyumlu
TüketimGüç LED'i yüzünden birkaç mA fazlaDaha düşük, pil projelerine daha uygun

ESP-01 pinleri: 8 pinin görevi

ESP-01'de 2×4 dizilmiş 8 pin vardır ve bunların yalnızca dördü giriş-çıkış olarak kullanılabilir. Pin isimleri her kartın üzerinde yazmaz; bağlamadan önce modülünü satıcının pin şemasıyla karşılaştır, çünkü VCC ile GND'yi ters bağlamak modülü saniyeler içinde yakar. Pinlerin görevleri ve normal çalışmadaki bağlantıları şöyle:

PinGöreviNormal çalışmada bağlantı
VCC3,3 V besleme girişiGüçlü bir 3,3 V kaynak (en az 300 mA)
GNDToprakArduino ve beslemeyle ortak GND
TX (GPIO1)Seri veri çıkışıArduino'nun RX hattına
RX (GPIO3)Seri veri girişiArduino'nun TX hattına (5 V kartlarda gerilim bölücüyle)
EN (CH_PD)Yongayı çalıştırır3,3 V'a (doğrudan ya da 10 kΩ ile)
RSTLOW olunca yongayı yeniden başlatırBoşta ya da 10 kΩ ile 3,3 V'a
GPIO0Açılış modunu seçer, sonra giriş-çıkışAçılışta HIGH (boşta); programlarken GND
GPIO2Giriş-çıkış (ESP-01S'te mavi LED)Açılışta HIGH kalmalı
ESP-01 yalnızca 3,3 V ile çalışır; yonganın üst çalışma sınırı 3,6 V'tur. VCC pinine Arduino'nun 5 V'unu bağlamak modülü kalıcı olarak bozabilir. Arduino Uno'nun TX pini de 5 V seviyesinde sinyal verir; bunu ESP-01'in RX pinine doğrudan değil, bir gerilim bölücüyle ya da lojik seviye dönüştürücüyle bağla.

Akım ihtiyacı: Arduino'nun 3,3 V pini neden yetmez?

ESP-01'i bozan ya da sürekli yeniden başlatan sorunların çoğu beslemeden kaynaklanır. Modül Wi-Fi'ye bağlıyken ortalama 70–80 mA, veri gönderirken 170 mA civarında akım çeker; açılışta ve ağa bağlanma anında kısa süreli tepeler 300 mA'i aşabilir. Arduino Uno'nun 3,3 V pini ise resmî olarak yalnızca 50 mA verir. Bu pinden beslenen ESP-01 çoğu zaman "AT" komutuna cevap verir, ama ağa bağlanmaya çalıştığı anda gerilim çöker ve modül resetlenir; bu da yazılım hatası gibi görünür. Çözüm, 5 V'tan beslenen bir AMS1117-3.3 regülatörü (1 A) kullanmak ve modülün VCC-GND pinleri arasına 100–470 µF'lık bir elektrolitik kondansatör eklemektir. Regülatörlerin çalışma mantığını 7805 voltaj regülatörü yazısında bulabilirsin.

Besleme kaynağıUygun mu?Not
Arduino Uno 3,3 V piniHayırResmî sınır 50 mA; Wi-Fi'ye bağlanırken modül resetlenir
USB-TTL dönüştürücünün 3,3 V piniÇoğu zaman hayırYonganın iç regülatörü genellikle 50–100 mA verir
AMS1117-3.3 regülatör (5 V girişli)Evet1 A'e kadar; çıkışa 10 µF, modülün yanına 100–470 µF kondansatör
ESP-01 USB adaptörüEvetÜzerinde CH340 ve AMS1117 bulunur, modül doğrudan takılır
2 adet AA pil (3 V)SınırdaPiller zayıfladıkça gerilim 3 V'un altına iner ve modül kararsızlaşır
Tek hücre Li-ion pil (3,7–4,2 V)Doğrudan hayır3,6 V sınırını aşar; düşük kayıplı (LDO) 3,3 V regülatör gerekir

ESP-01'i Arduino Uno'ya bağlamak (AT komutları için)

Arduino Uno'nun tek donanım seri portu (D0 ve D1) USB bağlantısıyla paylaşılır. Bu yüzden ESP-01'i SoftwareSerial kütüphanesiyle D2 ve D3 pinlerine bağlamak en pratik yoldur: Uno'ya kod yüklerken ESP-01'i sökmen gerekmez ve Seri Monitör'ü hata ayıklamak için serbestçe kullanırsın. Raspberry Pi Pico zaten 3,3 V ile çalıştığı için onda bölücüye gerek kalmaz:

ESP-01 piniArduino UnoRaspberry Pi PicoNot
VCCAMS1117-3.3 çıkışıAMS1117-3.3 ya da 3V3(OUT)Uno'nun 3,3 V pini yetmez; Pico'nun 3V3 çıkışı için önerilen sınır 300 mA
GNDGNDGNDRegülatör, kart ve modül ortak GND'de
TXD2GP1 (UART0 RX)Doğrudan bağlanır
RXD3 (1 kΩ / 2 kΩ bölücüyle)GP0 (UART0 TX)Pico'da bölücüye gerek yok
EN (CH_PD)3,3 V3,3 VDoğrudan ya da 10 kΩ ile
RSTBoştaBoştaİstersen 10 kΩ ile 3,3 V'a çek
GPIO0BoştaBoştaNormal çalışmada GND'ye bağlama
GPIO2BoştaBoştaAçılışta HIGH kalmalı

Uno'nun D3 pininden çıkan 5 V'luk sinyali düşürmek için D3'ten ESP-01 RX'e 1 kΩ, ESP-01 RX'ten GND'ye 2 kΩ direnç bağla. Çıkış gerilimi 5 × 2 / (1 + 2) = 3,33 V olur; 2 kΩ yerine 2,2 kΩ kullanırsan 3,44 V elde edersin, ikisi de güvenlidir. Farklı direnç değerlerini gerilim bölücü aracında hesaplayabilirsin. Ters yönde bölücüye gerek yoktur: ESP-01'in TX pininden çıkan 3,3 V, Uno'nun HIGH kabul ettiği 3 V eşiğinin üstündedir. Seri haberleşmenin temellerini UART seri haberleşme yazısında ayrıntılı anlattık.

İlk test: Seri Monitör'den AT komutu göndermek

  1. Aşağıdaki köprü kodunu Uno'ya yükle; ilk denemede ESP_BAUD değerini 115200 yap, çünkü çoğu modül bu hızla gelir (eski modüllerde 9600 olabilir).
  2. Seri Monitör'ü 115200 baud hızında aç ve satır sonu ayarını Both NL & CR yap; bu ayar olmadan modül komutun bittiğini anlamaz.
  3. AT yazıp gönder, OK cevabını görmelisin. Anlamsız karakterler geliyorsa hız uyuşmuyordur.
  4. SoftwareSerial 115200 hızında güvenilir okuma yapamaz; AT+UART_DEF=9600,8,1,0,0 komutuyla modülün hızını kalıcı olarak 9600'e düşür. Cevap bozuk görünse bile komut çoğu zaman yerine ulaşır.
  5. Koddaki ESP_BAUD değerini 9600 yapıp yeniden yükle ve AT komutunu tekrar dene; OK cevabı artık temiz görünmeli.
  6. AT+GMR ile yazılım sürümüne, AT+CWLAP ile çevredeki Wi-Fi ağlarına bakarak modülün sağlam çalıştığını doğrula.
C++ (Arduino IDE)
1#include <SoftwareSerial.h>
2
3SoftwareSerial esp(2, 3);          // D2 = RX, D3 = TX (bölücüyle ESP RX'e) / D3 to ESP RX via divider
4
5const long ESP_BAUD = 9600;        // ilk denemede 115200 yap / use 115200 on the first try
6
7void setup() {
8  Serial.begin(115200);            // Seri Monitör hızı / Serial Monitor speed
9  esp.begin(ESP_BAUD);
10  Serial.println("AT komutu yaz / type an AT command");
11}
12
13void loop() {
14  if (esp.available()) {           // ESP-01'den geleni ekrana yaz / ESP-01 -> screen
15    Serial.write(esp.read());
16  }
17  if (Serial.available()) {        // klavyeden yazılanı ESP-01'e gönder / keyboard -> ESP-01
18    esp.write(Serial.read());
19  }
20}

En çok kullanılan ESP-01 AT komutları

KomutNe yapar?Örnek cevap
ATBağlantıyı test ederOK
AT+RSTModülü yeniden başlatırOK ... ready
AT+GMRYazılım sürümünü gösterirAT version:... SDK version:... OK
AT+UART_DEF=9600,8,1,0,0Baud hızını kalıcı olarak değiştirirOK
AT+CWMODE=1İstemci (station) modu; 2 = erişim noktası, 3 = ikisi birdenOK
AT+CWLAPÇevredeki Wi-Fi ağlarını listeler+CWLAP:(3,"AgAdi",-58,...)
AT+CWJAP="AgAdi","Sifre123"Wi-Fi ağına bağlanırWIFI CONNECTED, WIFI GOT IP, OK
AT+CIFSRAlınan IP adresini gösterir+CIFSR:STAIP,"192.168.1.45"
AT+CIPMUX=1Çoklu bağlantıyı açar (sunucu için şart)OK
AT+CIPSERVER=1,8080 numaralı portta TCP sunucu başlatırOK
AT+CIPSTART=0,"TCP","192.168.1.10",800 numaralı bağlantıyla bir sunucuya bağlanır0,CONNECT ve OK
AT+CIPSEND=0,200 numaralı bağlantıya 20 bayt gönderir> ... SEND OK
AT+CIPCLOSE=00 numaralı bağlantıyı kapatır0,CLOSED ve OK
AT+CWJAP başarısız olursa modül +CWJAP:1 (zaman aşımı), +CWJAP:2 (yanlış şifre), +CWJAP:3 (ağ bulunamadı) ya da +CWJAP:4 (bağlantı başarısız) kodunu ve ardından FAIL yazar. ESP8266 yalnızca 2,4 GHz ağları görür; ağ bulunamıyorsa modeminde 2,4 GHz bandının açık olduğundan emin ol. Komutları büyük harfle, ağ adı ve şifreyi çift tırnak içinde yaz.

Arduino Uno ve ESP-01 ile telefondan LED kontrolü

Şimdi AT komutlarını bir programa dönüştürelim. Aşağıdaki kod ESP-01'i ağa bağlar, 80 numaralı portta küçük bir web sunucusu açar ve Seri Monitör'e IP adresini yazar. Aynı Wi-Fi'ye bağlı telefonunun tarayıcısına bu adresi yazdığında iki düğmeli bir sayfa açılır; düğmeler Uno'nun 13 numaralı pinindeki dahili LED'i yakıp söndürür. LED yerine bir röle modülü bağlarsan aynı yöntemle bir lambayı kontrol edersin. Kodu yüklemeden önce modülün hızını önceki adımda 9600'e ayarlamış olmalısın.

C++ (Arduino IDE)
1#include <SoftwareSerial.h>
2
3SoftwareSerial esp(2, 3);              // D2 = RX, D3 = TX (bölücüyle) / D3 via divider
4const int LED_PIN = 13;                // Uno'nun dahili LED'i / Uno onboard LED
5
6const char* WIFI_SSID = "AgAdi";       // Wi-Fi adın / your Wi-Fi name
7const char* WIFI_PASS = "Sifre123";    // Wi-Fi şifren / your Wi-Fi password
8
9bool ledOn = false;
10bool pending = false;                  // cevap bekleyen istek var mı / request waiting for a reply
11int linkId = 0;                        // ESP-01'in bağlantı numarası (0-4) / connection id (0-4)
12char line[64];
13byte lineLen = 0;
14
15// Beklenen yazıyı süre dolana kadar ara / wait until the expected text arrives or time runs out
16bool waitFor(const char* expect, unsigned long timeout) {
17  unsigned long start = millis();
18  size_t idx = 0;
19  size_t len = strlen(expect);
20  while (millis() - start < timeout) {
21    if (esp.available()) {
22      char c = esp.read();
23      Serial.write(c);                 // gelen her şeyi göster / echo everything
24      if (c == expect[idx]) {
25        idx++;
26        if (idx == len) return true;
27      } else {
28        idx = (c == expect[0]) ? 1 : 0;
29      }
30    }
31  }
32  return false;
33}
34
35bool sendAT(const char* cmd, const char* expect, unsigned long timeout) {
36  esp.println(cmd);                    // println sonuna \r\n ekler / println adds \r\n
37  return waitFor(expect, timeout);
38}
39
40void sendPage(int id) {
41  char body[220];
42  snprintf(body, sizeof(body),
43           "<meta name='viewport' content='width=device-width'>"
44           "<h2>LED: %s</h2>"
45           "<a href='/on'><button>AC / ON</button></a> "
46           "<a href='/off'><button>KAPAT / OFF</button></a>",
47           ledOn ? "ACIK / ON" : "KAPALI / OFF");
48  char head[110];
49  snprintf(head, sizeof(head),
50           "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n"
51           "Content-Length: %d\r\nConnection: close\r\n\r\n",
52           (int)strlen(body));
53
54  esp.print("AT+CIPSEND=");            // önce kaç bayt gideceğini söyle / announce the length first
55  esp.print(id);
56  esp.print(',');
57  esp.println(strlen(head) + strlen(body));
58  if (waitFor(">", 2000)) {            // ">" gelince veriyi yolla / send data after ">"
59    esp.print(head);
60    esp.print(body);
61    waitFor("SEND OK", 5000);
62  }
63  esp.print("AT+CIPCLOSE=");           // bağlantıyı kapat / close the connection
64  esp.println(id);
65  waitFor("OK", 2000);
66}
67
68void handleLine() {
69  if (strncmp(line, "+IPD,", 5) == 0) {          // yeni istek / new request: +IPD,0,384:GET /on ...
70    linkId = line[5] - '0';
71    if (strstr(line, "GET /on ")) ledOn = true;
72    else if (strstr(line, "GET /off ")) ledOn = false;
73    digitalWrite(LED_PIN, ledOn ? HIGH : LOW);
74    pending = true;
75  } else if (pending && lineLen == 0) {           // boş satır = isteğin sonu / empty line = end of request
76    pending = false;
77    sendPage(linkId);
78  }
79}
80
81void setup() {
82  pinMode(LED_PIN, OUTPUT);
83  Serial.begin(115200);
84  esp.begin(9600);                     // AT+UART_DEF=9600,8,1,0,0 ile ayarlanmış olmalı / set with AT+UART_DEF
85
86  sendAT("AT+RST", "ready", 5000);     // temiz başlangıç / clean restart
87  sendAT("AT+CWMODE=1", "OK", 2000);   // istemci modu / station mode
88
89  esp.print("AT+CWJAP=\"");            // AT+CWJAP="ad","şifre" / AT+CWJAP="ssid","password"
90  esp.print(WIFI_SSID);
91  esp.print("\",\"");
92  esp.print(WIFI_PASS);
93  esp.println("\"");
94  if (!waitFor("OK", 20000)) {
95    Serial.println(F("\nWi-Fi baglanamadi / Wi-Fi failed"));
96  }
97
98  sendAT("AT+CIPMUX=1", "OK", 2000);         // sunucu için çoklu bağlantı / multiple connections
99  sendAT("AT+CIPSERVER=1,80", "OK", 2000);   // 80 portunda sunucu / server on port 80
100  sendAT("AT+CIFSR", "OK", 2000);            // IP adresini yaz / print the IP address
101}
102
103void loop() {
104  while (esp.available()) {            // ESP-01'den gelenleri satır satır oku / read line by line
105    char c = esp.read();
106    if (c == '\n') {
107      line[lineLen] = '\0';
108      handleLine();
109      lineLen = 0;
110    } else if (c != '\r' && lineLen < sizeof(line) - 1) {
111      line[lineLen++] = c;
112    }
113  }
114}

Kodun mantığı şöyle: Tarayıcı bağlandığında ESP-01, isteği +IPD,0,384:GET /on HTTP/1.1 biçiminde Arduino'ya iletir; buradaki 0 bağlantı numarası, 384 ise gelen bayt sayısıdır. Arduino bu satırda "GET /on" ya da "GET /off" arar ve LED'i ayarlar. İsteğin sonunu gösteren boş satır gelince AT+CIPSEND=0,uzunluk komutuyla kaç bayt göndereceğini bildirir, modül ">" işaretini verince sayfayı yollar ve "SEND OK" cevabından sonra AT+CIPCLOSE ile bağlantıyı kapatır. Sayfayı bilerek kısa tuttuk: Uno'nun 2 KB RAM'i uzun HTML metinleri için yetersizdir ve tek bir CIPSEND komutu en fazla 2048 bayt gönderebilir. Daha karmaşık projelerde AT komutlarını kendin yönetmek yerine WiFiEspAT gibi bir kütüphane kullanmak işini kolaylaştırır.

ESP-01'i doğrudan programlamak: GPIO0'ı GND'ye bağlama yöntemi

ESP-01'in içindeki ESP8266, 80 MHz'lik 32 bitlik işlemcisiyle Arduino Uno'dan çok daha güçlüdür. Projen yalnızca bir röle, bir sensör ya da bir LED içeriyorsa Arduino'ya hiç gerek yoktur; programı doğrudan ESP-01'e yüklersin. ESP8266 açılırken GPIO0, GPIO2 ve GPIO15 pinlerinin seviyesine bakarak ne yapacağına karar verir. ESP-01 kartında GPIO15 zaten GND'ye bağlıdır ve GPIO2 HIGH kalmalıdır; böylece açılış modunu yalnızca GPIO0 belirler:

GPIO0GPIO2GPIO15Açılış modu74880 baud açılış mesajı
HIGH (boşta)HIGHLOWNormal çalışma: flaştaki program başlarboot mode:(3,x)
LOW (GND)HIGHLOWProgramlama (UART indirme) moduboot mode:(1,x) ve waiting for host
ESP-01 piniBağlantıNot
VCC3,3 V regülatör çıkışıUSB-TTL'nin 3,3 V pini çoğu zaman yetmez
GNDUSB-TTL GND ve regülatör GNDHepsi ortak toprakta
TXUSB-TTL RXDÇapraz bağlantı
RXUSB-TTL TXDJumper 3,3 V konumunda olmalı
EN (CH_PD)3,3 VDoğrudan ya da 10 kΩ ile
RSTBoşta (reset için kısa süre GND)İstersen 10 kΩ ile 3,3 V'a çek
GPIO0GNDYalnızca yükleme sırasında; sonra ayır
GPIO2BoştaAçılışta HIGH kalmalı
  1. Arduino IDE'de Dosya > Tercihler bölümündeki "Ek kart yöneticisi URL'leri" alanına https://arduino.esp8266.com/stable/package_esp8266com_index.json adresini ekle.
  2. Kart Yöneticisi'nde esp8266 ara ve ESP8266 Community paketini kur.
  3. Araçlar > Kart menüsünden Generic ESP8266 Module seç. Flash Size ayarını ESP-01S için 1MB (FS:64KB OTA:~470KB), eski mavi ESP-01 için 512KB seçeneklerinden biri yap.
  4. USB-TTL dönüştürücünün jumper'ını 3,3 V konumuna al, modülü yukarıdaki tabloya göre bağla ve GPIO0'ı GND'ye bağlı tut.
  5. Modülün beslemesini kesip yeniden ver ya da RST'yi kısa süre GND'ye dokundur; modül artık programlama modunda açılır.
  6. Araçlar > Port menüsünden USB-TTL'nin portunu seç ve kodu yükle. İlk deneme için Dosya > Örnekler > ESP8266 > Blink örneği uygundur; ESP-01S'te mavi LED GPIO2'ye bağlıdır.
  7. Ekranda "Hard resetting via RTS pin..." yazısını görünce GPIO0'ı GND'den ayır ve modülü yeniden başlat. GPIO0 GND'de kalırsa programın çalışmaz, modül yine programlama modunda açılır.
Programlamayı kolaylaştırmak için üzerinde CH340 ve AMS1117 bulunan bir ESP-01 USB adaptörü kullanabilirsin; modül doğrudan adaptöre takılır. Bu adaptörlerin bazılarında UART/PROG anahtarı vardır; anahtarsız modellerde GPIO0 ile GND arasına bir buton ya da jumper lehimlemen gerekir. Elinde USB-TTL yoksa Arduino Uno'nun RESET pinini GND'ye bağlayıp kartın USB yongasını aracı olarak kullanmak da mümkündür; bu durumda TX-TX ve RX-RX düz bağlanır ve 5 V seviyesi yine bölünmelidir. Ayrıntılar için USB-TTL dönüştürücü yazısına bak.

GPIO0 ve GPIO2 ile röle kontrolü: ESP-01S röle modülü

ESP-01'de giriş-çıkış için ayrılmış pinler GPIO0 ve GPIO2'dir, ama ikisi de açılış sırasında HIGH olmak zorundadır. Bu yüzden bu pinlere bağladığın devre, kart açılırken pini LOW'a çekmemelidir. En güvenli çözüm LOW ile tetiklenen bir bağlantıdır: pin açılışta HIGH olduğu için röle kapalı kalır, programın pini LOW yaptığında röle çeker. Hazır satılan ESP-01S röle modülü tam olarak böyle tasarlanmıştır: 5 V ile beslenir, üzerindeki regülatör ESP-01S için 3,3 V üretir ve GPIO0 bir transistör üzerinden 10 A 250 V AC kontaklı bir röleyi sürer. v4.0 ve sonraki kartlarda röle GPIO0 LOW olunca çeker; eski v1.0 kartlarda ESP-01S ile çalışmak için kartta küçük bir değişiklik gerekebilir, bu yüzden kartının sürümünü kontrol et.

5 V röle modülü
Röle, küçük bir kontrol sinyaliyle 220 V'luk bir lambayı açıp kapatmanı sağlar; ESP-01S röle kartında aynı röle ESP-01'in GPIO0 pinine bağlıdır.
C++ (Arduino IDE)
1#include <ESP8266WiFi.h>
2#include <ESP8266WebServer.h>
3#include <ESP8266mDNS.h>
4
5const char* ssid = "AgAdi";            // Wi-Fi adın / your Wi-Fi name
6const char* password = "Sifre123";     // Wi-Fi şifren / your Wi-Fi password
7
8const int RELAY_PIN = 0;               // ESP-01S röle kartında GPIO0 / GPIO0 on the ESP-01S relay board
9const int RELAY_ON = LOW;              // çoğu kartta LOW = çeker; tersse değiştir / LOW = on, swap if yours is inverted
10const int RELAY_OFF = HIGH;
11
12ESP8266WebServer server(80);
13bool relayOn = false;
14
15void sendPage() {
16  String html = F("<!DOCTYPE html><html><head><meta charset='utf-8'>"
17                  "<meta name='viewport' content='width=device-width,initial-scale=1'>"
18                  "<title>ESP-01</title></head>"
19                  "<body style='font-family:sans-serif;text-align:center'>"
20                  "<h1>ESP-01 Röle / Relay</h1><p><b>");
21  html += relayOn ? "AÇIK / ON" : "KAPALI / OFF";
22  html += F("</b></p><p><a href='/on'><button>AÇ / ON</button></a> "
23            "<a href='/off'><button>KAPAT / OFF</button></a></p></body></html>");
24  server.send(200, "text/html", html);
25}
26
27void setRelay(bool on) {
28  relayOn = on;
29  digitalWrite(RELAY_PIN, on ? RELAY_ON : RELAY_OFF);
30  server.sendHeader("Location", "/");  // ana sayfaya dön / back to the main page
31  server.send(303, "text/plain", "");
32}
33
34void setup() {
35  digitalWrite(RELAY_PIN, RELAY_OFF);  // önce kapalı seviye / off level first
36  pinMode(RELAY_PIN, OUTPUT);
37  Serial.begin(115200);
38
39  WiFi.mode(WIFI_STA);
40  WiFi.begin(ssid, password);
41  while (WiFi.status() != WL_CONNECTED) {
42    delay(500);
43    Serial.print('.');
44  }
45  Serial.println();
46  Serial.println(WiFi.localIP());      // bu adresi tarayıcıda aç / open this address in a browser
47  MDNS.begin("esp01");                 // ya da http://esp01.local / or http://esp01.local
48
49  server.on("/", sendPage);
50  server.on("/on", []() { setRelay(true); });
51  server.on("/off", []() { setRelay(false); });
52  server.begin();
53}
54
55void loop() {
56  server.handleClient();
57  MDNS.update();
58}

Kodu yukarıdaki yöntemle ESP-01S'e yükledikten sonra modülü röle kartına tak ve kartı 5 V ile besle. IP adresini USB-TTL bağlıyken Seri Monitör'den okuyabilir ya da modeminin bağlı cihazlar listesinde görebilirsin; mDNS destekleyen bir bilgisayardan http://esp01.local adresi de çalışır. Buton gibi bir giriş eklemek istersen en uygun pin GPIO3'tür (RX), çünkü açılışta seviyesinin bir önemi yoktur. Bu durumda seri portu yalnızca gönderme yönünde açmak için Serial.begin(115200, SERIAL_8N1, SERIAL_TX_ONLY) kullan.

Röle kontaklarına 220 V şebeke gerilimi bağlayacaksan kabloları enerji yokken bağla, açıkta kontak bırakma ve devreyi yalıtkan bir kutuya koy. Röle üzerinde 10 A yazsa da küçük kartlardaki bakır yollar bu akımı taşıyamayabilir; birkaç yüz watttan büyük yükleri bu modülle sürme. Ayrıntılar için Röle Modülü Nedir? yazısına bak.

Raspberry Pi Pico ile ESP-01 (MicroPython)

Wi-Fi'si olmayan Raspberry Pi Pico'ya da ESP-01 ile kablosuz bağlantı ekleyebilirsin. Pico 3,3 V ile çalıştığı için gerilim bölücüye gerek yoktur: ESP-01'in RX'i GP0'a (UART0 TX), TX'i GP1'e (UART0 RX) bağlanır. Pico'nun donanım UART'ı 115200 baud'u rahatça okuduğu için modülün hızını değiştirmen de gerekmez; Uno bölümünde hızı 9600'e düşürdüysen koddaki baudrate değerini de 9600 yap. Aşağıdaki MicroPython kodunu Thonny ile çalıştır; modül ağa bağlanır, IP adresini yazar ve 30 saniyede bir çevredeki ağları listeler. Elinde Pico W varsa yerleşik Wi-Fi'yi kullanmak daha kolaydır; bunun için Pico W ile Wi-Fi web sunucu yazısına göz at.

MicroPython
1from machine import UART, Pin
2import time
3
4# GP0 (TX) -> ESP-01 RX, GP1 (RX) <- ESP-01 TX
5uart = UART(0, baudrate=115200, tx=Pin(0), rx=Pin(1))
6
7def at(cmd, timeout=2000):
8    uart.write(cmd + "\r\n")                   # her komut \r\n ile biter / every command ends with \r\n
9    start = time.ticks_ms()
10    resp = b""
11    while time.ticks_diff(time.ticks_ms(), start) < timeout:
12        if uart.any():
13            resp += uart.read()
14            if b"OK" in resp or b"ERROR" in resp or b"FAIL" in resp:
15                break
16    print(cmd, "->", resp)                     # cevabı göster / show the reply
17    return resp
18
19at("ATE0")                                     # komut yankısını kapat / turn off echo
20at("AT")                                       # OK gelmeli / should answer OK
21at("AT+CWMODE=1")                              # istemci modu / station mode
22at('AT+CWJAP="AgAdi","Sifre123"', 20000)       # Wi-Fi'ye bağlan / join Wi-Fi
23at("AT+CIFSR")                                 # IP adresini sor / ask for the IP
24
25while True:
26    at("AT+CWLAP", 10000)                      # çevredeki ağları tara / scan nearby networks
27    time.sleep(30)

ESP-01 mi, NodeMCU mu, ESP32 mi?

ÖzellikESP-01NodeMCU (ESP8266)ESP32 DevKit
YongaESP8266ESP8266ESP32 (çift çekirdek)
Kullanılabilir GPIO4 (ikisi TX/RX)Yaklaşık 11Yaklaşık 25
Analog girişYok1 (A0)18 kanal, 12 bit
USB ile programlamaYok, USB-TTL gerekirVarVar
BeslemeYalnızca 3,3 VUSB 5 V ya da VINUSB 5 V ya da VIN
BluetoothYokYokVar (Classic ve BLE)
Boyut24,8 × 14,3 mmBreadboard'a takılan kartBreadboard'a takılan kart
En iyi kullanımArduino'ya Wi-Fi, tek röle ya da sensörWi-Fi'ye başlangıç, birkaç sensörÇok pinli ve Bluetooth'lu projeler

ESP-01'in en büyük avantajı küçüklüğü ve fiyatıdır; mevcut bir Arduino projesine Wi-Fi eklemek, bir röleyi ya da tek bir sensörü kablosuz yapmak için idealdir. Ancak USB'si olmadığı için her kod yüklemede kablo değiştirmek, regülatör kurmak ve GPIO0'ı GND'ye bağlamak zahmetlidir. Analog girişi yoktur ve GPIO16 dışarı çıkarılmadığı için derin uykudan zamanlı uyanma, yonganın bacağına ince bir tel lehimlemeden çalışmaz. Pille çalışacak bir proje planlıyorsan ortalama tüketimi pil ömrü hesaplayıcısına girerek kaç gün dayanacağını görebilirsin. Öğrenme aşamasındaysan ya da üçten fazla pine ihtiyacın varsa NodeMCU ESP8266 aynı yongayı USB ve regülatörle birlikte sunar. Bluetooth, daha fazla pin ve işlem gücü gerekiyorsa ESP32 doğru seçimdir; kartlar arasındaki farkları Arduino mu ESP32 mi? yazısında karşılaştırdık.

ESP-01 ile proje fikirleri

  • Wi-Fi akıllı priz: ESP-01S röle modülü ve yukarıdaki kodla bir lambayı telefondan aç-kapat; zamanlayıcı ekleyerek akşamları otomatik yanmasını sağla.
  • Kablosuz sıcaklık sensörü: DS18B20 sensörünü GPIO2'ye bağla; veri hattındaki 4,7 kΩ pull-up direnci açılış için gereken HIGH seviyesini de sağlar.
  • Nem ve sıcaklık takibi: DHT11 ölçümlerini telefondan açılan bir web sayfasında göster.
  • Hareket bildirimi: PIR sensörünü GPIO3'e bağla ve hareket algılanınca Telegram'dan mesaj gönder; yöntem ESP32 Telegram botu yazısındakine çok benzer.
  • Arduino projesine Wi-Fi: Uno ile yaptığın bir hava istasyonunun ölçümlerini AT komutlarıyla bilgisayarındaki bir programa ya da bir sunucuya gönder.
  • Garaj kapısı kumandası: Rölenin kontaklarını kapı motorunun butonuna paralel bağlayarak kapıyı telefondan aç.

Sık yapılan hatalar ve çözümleri

BelirtiOlası nedenÇözüm
"Failed to connect to ESP8266: Timed out waiting for packet header"Modül programlama modunda değil ya da TX-RX ters bağlıGPIO0'ı GND'ye bağla, beslemeyi kesip yeniden ver, TX'i RXD'ye, RX'i TXD'ye bağla
Seri Monitör'de anlamsız karakterlerBaud hızı uyuşmuyor; açılış mesajları 74880 baud hızındadır115200 ve 9600'ü dene; açılış mesajını görmek için 74880 seç
AT yazınca hiç cevap gelmiyorSatır sonu ayarı yanlış, TX-RX ters ya da EN bağlı değilBoth NL & CR seç, hatları çapraz bağla, EN'i 3,3 V'a bağla
Modül sürekli resetleniyor, Wi-Fi'ye bağlanırken kopuyorYetersiz akımAyrı bir AMS1117-3.3 ve 100–470 µF kondansatör kullan, kabloları kısalt
"busy p..." cevabıÖnceki komut bitmeden yenisi gönderildiHer komuttan sonra OK ya da ERROR cevabını bekle
+CWJAP:3 ve FAILAğ bulunamadı (5 GHz ağ ya da yanlış ad)2,4 GHz ağı kullan, büyük-küçük harfe dikkat et
Modül çok ısınıyor, LED yanmıyorVCC'ye 5 V verilmiş ya da VCC-GND ters bağlanmışBeslemeyi hemen kes; modül büyük olasılıkla bozulmuştur
Röle takılıyken modül açılmıyorGPIO0 ya da GPIO2'ye bağlı devre açılışta pini LOW çekiyorLOW ile tetiklenen bağlantı kullan ya da girişi GPIO3'e taşı
5 V röle modülü hiç kapanmıyor3,3 V'luk HIGH sinyali 5 V modülün optokuplörünü tam söndürmüyor3,3 V uyumlu röle modülü ya da transistörlü sürücü kullan
Arduino IDE ile kod yükledikten sonra AT komutları çalışmıyorYüklediğin program AT yazılımının yerini aldıEspressif'in AT yazılımını esptool ya da Flash Download Tool ile yeniden yükle
Modülün gerçekten açılıp açılmadığını anlamak için Seri Monitör'ü 74880 baud hızına al ve modülü resetle. boot mode:(3,x) görüyorsan normal modda, boot mode:(1,x) görüyorsan programlama modunda açılmıştır. Hiçbir şey görmüyorsan besleme, EN bağlantısı ya da TX-RX hattı sorunludur.

ESP-01, küçük boyutuna rağmen IP adresi, TCP bağlantısı, web sunucusu ve seri haberleşme gibi Wi-Fi'nin bütün temel kavramlarını öğrenmek için harika bir modüldür. Bağlantılarda sorun yaşarsan önce beslemeyi, sonra TX-RX hatlarını ve GPIO0'ın seviyesini kontrol et; sorunların büyük çoğunluğu bu üç noktadadır. BlueGrays uygulamasında Wi-Fi bağlantısı, web sunucu, mDNS, kablosuz kod güncelleme (OTA) ve röleli akıllı aydınlatma gibi projeleri adım adım devre şemaları ve kodlarıyla bulabilirsin.

Sıkça sorulan sorular

ESP-01 5V ile çalışır mı?

Hayır. ESP-01 3,0–3,6 V aralığında çalışır ve VCC pinine 5 V bağlamak modülü kalıcı olarak bozabilir. Arduino'nun 5 V'undan beslemek istiyorsan araya AMS1117-3.3 gibi bir regülatör koy; Uno'nun TX hattından gelen 5 V sinyali de gerilim bölücüyle 3,3 V'a düşür.

ESP-01 Arduino'nun 3.3V pininden beslenebilir mi?

Önerilmez. Uno'nun 3,3 V pini resmî olarak 50 mA verir, ESP-01 ise veri gönderirken 170 mA'e, kısa anlarda 300 mA'in üzerine çıkar. Modül AT komutuna cevap verse bile ağa bağlanırken resetlenir; en az 300–500 mA verebilen ayrı bir 3,3 V regülatör kullan.

ESP-01 AT komutlarına neden cevap vermiyor?

En sık nedenler yanlış baud hızı, Seri Monitör'de satır sonu ayarının Both NL & CR olmaması, TX ve RX'in çapraz bağlanmaması ve EN (CH_PD) pininin 3,3 V'a bağlanmamasıdır. Modüle daha önce Arduino IDE ile program yüklendiyse AT yazılımı silinmiştir; bu durumda AT yazılımını yeniden yüklemen gerekir.

ESP-01'e Arduino IDE ile kod yüklenince AT yazılımı silinir mi?

Evet. Arduino IDE ile yüklediğin program flaş belleğe AT yazılımının yerine yazılır ve modül artık AT komutlarını anlamaz. AT moduna dönmek için Espressif'in ESP8266 AT yazılımını esptool ya da Flash Download Tool ile, modülünün flaş boyutuna uygun adreslere yeniden yükleyebilirsin.

ESP-01 ile ESP-01S arasındaki fark nedir?

Yonga ve pin dizilişi aynıdır. ESP-01S genellikle siyahtır, 1 MB flaş belleğe sahiptir, güç LED'i yoktur ve mavi LED'i GPIO2'ye bağlıdır. Eski mavi ESP-01'de ise 512 KB flaş, sürekli yanan kırmızı bir güç LED'i ve TX hattına bağlı mavi bir LED bulunur.

ESP-01'in varsayılan baud hızı nedir?

Güncel AT yazılımlı modüllerin çoğu 115200 baud ile gelir; eski modüllerde 9600 ya da 57600 görülebilir. Açılışta ekrana düşen ilk mesajlar ise 74880 baud hızındadır. Arduino Uno'da SoftwareSerial kullanıyorsan AT+UART_DEF=9600,8,1,0,0 komutuyla hızı kalıcı olarak 9600'e düşürmek bağlantıyı güvenilir hale getirir.

Tüm projeleri gör
ESP32 Wi-Fi STA Bağlantısı (LCD Ekranlı)
#127İleri

ESP32 Wi-Fi STA Bağlantısı (LCD Ekranlı)

Bu projede ESP32'yi Station (STA) modunda evdeki Wi-Fi ağına güvenli ve hata toleranslı şekilde bağlıyoruz. SSID/şifreyi secrets.h dosyasına ayırarak Git'e sızmasını önlüyor, otomatik yeniden bağlanma mekanizması kuruyor, RSSI sinyal seviyesini ve IP adresini I2C LCD ekranda gösteriyoruz. Dahili LED durum göstergesi olarak çalışır. Üretim seviyesi bir bağlantı yöneticisidir.

4.4(21)
34
ESP32 Async Web Server (LCD'de IP Göstergeli)
#129İleri

ESP32 Async Web Server (LCD'de IP Göstergeli)

Bu projede ESP32'yi aynı Wi-Fi ağındaki telefonunuzdan veya bilgisayarınızdan kontrol edebileceğiniz asenkron bir web sunucusuna dönüştürüyoruz. ESPAsyncWebServer kütüphanesi sayesinde sunucu birden fazla isteği aynı anda işleyebiliyor (klasik WebServer.h gibi tek istekte bloklamıyor). Tarayıcıdan ESP32'nin IP adresine bağlanıp ON/OFF butonlarına basarak (/on ve /off adresleri) GPIO 5'e bağlı LED'i açıp kapatabileceksiniz.

4.8(16)
26
ESP32 mDNS: bluegrays-esp.local ile Cihaza Erişim (LCD Ekranlı)
#131İleri
Premium

ESP32 mDNS: bluegrays-esp.local ile Cihaza Erişim (LCD Ekranlı)

Bu projede ESP32'ye mDNS (Multicast DNS) servisi ekleyerek IP adresi yerine bluegrays-esp.local gibi okunabilir bir host adıyla erişim sağlıyoruz. DHCP'nin verdiği IP değişse bile cihaza her zaman aynı isimle ulaşabilirsiniz. Üzerinde küçük bir web server da çalıştırarak tarayıcıdan http://bluegrays-esp.local/ adresiyle LED kontrolü gönderiyoruz. I2C LCD ekranda hostname, IP ve LED durumu hem Türkçe hem İngilizce gösterilir. iOS, macOS ve Linux mDNS'i doğal olarak destekler; Windows'ta Bonjo

4.8(14)
23
ESP32 OTA Update — Kablosuz Firmware Yükleme (LCD Ekranlı)
#132İleri
Premium

ESP32 OTA Update — Kablosuz Firmware Yükleme (LCD Ekranlı)

Bu projede ESP32'ye USB kablosu olmadan, Wi-Fi üzerinden yeni firmware yüklemeyi öğreneceksin. ArduinoOTA kütüphanesi ile ESP32 ağda görünür hale gelir ve Arduino IDE'nin "Network port" sekmesinde bluegrays-ota olarak otomatik listelenir. İlk yükleme USB ile yapılır, sonrasında tüm güncellemeler kablosuz olur — saha cihazları için çok kritik bir özelliktir. I2C LCD ekranda WiFi durumu, IP, hostname, OTA yükleme yüzdesi ve hata mesajları hem Türkçe hem İngilizce gösterilir. Parola koruması, h

4.6(14)
22
ESP32 NTP ile İnternetten Gerçek Zaman
#128İleri
Premium

ESP32 NTP ile İnternetten Gerçek Zaman

ESP32, Wi-Fi'a bağlanıp NTP (Network Time Protocol) sunucularından milisaniye hassasiyetiyle gerçek zamanı çeker. configTzTime() fonksiyonu sayesinde Türkiye saat dilimi (TRT, UTC+3) otomatik uygulanır ve yaz/kış saati uygulayan ülkelerde DST geçişi POSIX TZ string'i ile otomatik yönetilir. Saat hem Serial Monitor'e hem de opsiyonel I2C LCD'ye yazdırılır. configTzTime() SNTP hizmetini başlatır; ağ erişimi varken periyodik yeniden senkronizasyon yapılır ve iki senkronizasyon arasında sistem s

4.5(13)
21
ESP32 Akıllı Aydınlatma (PIR + LDR + Röle + OLED)
#141İleri
Premium

ESP32 Akıllı Aydınlatma (PIR + LDR + Röle + OLED)

ESP32, PIR hareket sensörü, LDR ışık sensörü ve röle modülü ile evinin koridorunu, tuvaletini veya kilerini akıllı aydınlatmaya dönüştürüyoruz. Klasik "karanlıkta hareket algılanınca ışık yansın" senaryosunu inşa ediyoruz — ortam aydınlıksa hareket olsa bile ışık yanmaz, böylece gündüz gereksiz yere yanmaz ve enerji tasarrufu sağlanır. Işık 30 saniye yanık kalır; hareket devam ederse timer otomatik sıfırlanır ve süre uzar. SSD1306 OLED ekranda büyük fontlarla durum (AÇIK / GÜNDÜZ / BEKLE), geri

4.3(6)
11
220V Ampülü Buton(On-Off) İle Yakma
#20İleri
Premium

220V Ampülü Buton(On-Off) İle Yakma

Evdeki gerçek bir ampulü küçük bir butonla açıp kapatmak ister misin? Butona her bastığında Arduino röleyi çevirir ve ampul yanar, bir daha basınca söner. Röle, kartın zayıf sinyaliyle şebeke elektriğ

4.5(33)
44
2 Arduino Tek Yönlü Haberleşme
#57Orta
Premium

2 Arduino Tek Yönlü Haberleşme

İki Arduino'yu tek bir kabloyla konuşturursun: birindeki butona basınca öbüründeki LED yanar, bir daha basınca söner. Gönderen kart butona basıldığını kısa bir mesajla bildirir, alan kart bu mesajı du

4.4(37)
50