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 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.
| Özellik | Değer |
|---|---|
| Yonga | ESP8266EX (Tensilica L106, 32 bit) |
| Saat hızı | 80 MHz (160 MHz'e çıkarılabilir) |
| Flaş bellek | ESP-01: 512 KB, ESP-01S: 1 MB |
| RAM | Yaklaşık 80 KB veri RAM'i; Wi-Fi bağlıyken programa ~50 KB kalır |
| Wi-Fi | 802.11 b/g/n, yalnızca 2,4 GHz, PCB anten |
| Çalışma gerilimi | 3,0–3,6 V (önerilen 3,3 V) |
| Akım | Bağ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 GPIO | 4 adet: GPIO0, GPIO2, GPIO1 (TX), GPIO3 (RX) |
| Analog giriş | Yok (ADC pini dışarı çıkarılmamış) |
| Boyut | 24,8 × 14,3 mm |
| Fabrika yazılımı | AT komut yazılımı (genellikle 115200 baud) |
ESP-01 ile ESP-01S farkı
| Özellik | ESP-01 | ESP-01S |
|---|---|---|
| Kart rengi | Genellikle mavi | Siyah |
| Flaş bellek | 512 KB (sonraki siyah sürümlerde 1 MB) | 1 MB |
| Güç LED'i | Kırmızı, sürekli yanar | Yok |
| Mavi LED | TX (GPIO1) hattına bağlı, veri giderken yanıp söner | GPIO2'ye bağlı, pin LOW iken yanar |
| Pin dizilişi | 8 pin | Aynı 8 pin, birebir uyumlu |
| Tüketim | Güç LED'i yüzünden birkaç mA fazla | Daha 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:
| Pin | Görevi | Normal çalışmada bağlantı |
|---|---|---|
| VCC | 3,3 V besleme girişi | Güçlü bir 3,3 V kaynak (en az 300 mA) |
| GND | Toprak | Arduino ve beslemeyle ortak GND |
| TX (GPIO1) | Seri veri çıkışı | Arduino'nun RX hattına |
| RX (GPIO3) | Seri veri girişi | Arduino'nun TX hattına (5 V kartlarda gerilim bölücüyle) |
| EN (CH_PD) | Yongayı çalıştırır | 3,3 V'a (doğrudan ya da 10 kΩ ile) |
| RST | LOW olunca yongayı yeniden başlatır | Boşta ya da 10 kΩ ile 3,3 V'a |
| GPIO0 | Açılış modunu seçer, sonra giriş-çıkış | Açılışta HIGH (boşta); programlarken GND |
| GPIO2 | Giriş-çıkış (ESP-01S'te mavi LED) | Açılışta HIGH kalmalı |
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 pini | Hayır | Resmî 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ır | Yonganın iç regülatörü genellikle 50–100 mA verir |
| AMS1117-3.3 regülatör (5 V girişli) | Evet | 1 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ırda | Piller 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ır | 3,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 pini | Arduino Uno | Raspberry Pi Pico | Not |
|---|---|---|---|
| VCC | AMS1117-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 |
| GND | GND | GND | Regülatör, kart ve modül ortak GND'de |
| TX | D2 | GP1 (UART0 RX) | Doğrudan bağlanır |
| RX | D3 (1 kΩ / 2 kΩ bölücüyle) | GP0 (UART0 TX) | Pico'da bölücüye gerek yok |
| EN (CH_PD) | 3,3 V | 3,3 V | Doğrudan ya da 10 kΩ ile |
| RST | Boşta | Boşta | İstersen 10 kΩ ile 3,3 V'a çek |
| GPIO0 | Boşta | Boşta | Normal çalışmada GND'ye bağlama |
| GPIO2 | Boşta | Boşta | Açı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
- 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).
- 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.
- AT yazıp gönder, OK cevabını görmelisin. Anlamsız karakterler geliyorsa hız uyuşmuyordur.
- 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.
- Koddaki ESP_BAUD değerini 9600 yapıp yeniden yükle ve AT komutunu tekrar dene; OK cevabı artık temiz görünmeli.
- 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.
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ı
| Komut | Ne yapar? | Örnek cevap |
|---|---|---|
| AT | Bağlantıyı test eder | OK |
| AT+RST | Modülü yeniden başlatır | OK ... ready |
| AT+GMR | Yazılım sürümünü gösterir | AT version:... SDK version:... OK |
| AT+UART_DEF=9600,8,1,0,0 | Baud hızını kalıcı olarak değiştirir | OK |
| AT+CWMODE=1 | İstemci (station) modu; 2 = erişim noktası, 3 = ikisi birden | OK |
| AT+CWLAP | Çevredeki Wi-Fi ağlarını listeler | +CWLAP:(3,"AgAdi",-58,...) |
| AT+CWJAP="AgAdi","Sifre123" | Wi-Fi ağına bağlanır | WIFI CONNECTED, WIFI GOT IP, OK |
| AT+CIFSR | Alı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,80 | 80 numaralı portta TCP sunucu başlatır | OK |
| AT+CIPSTART=0,"TCP","192.168.1.10",80 | 0 numaralı bağlantıyla bir sunucuya bağlanır | 0,CONNECT ve OK |
| AT+CIPSEND=0,20 | 0 numaralı bağlantıya 20 bayt gönderir | > ... SEND OK |
| AT+CIPCLOSE=0 | 0 numaralı bağlantıyı kapatır | 0,CLOSED ve OK |
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.
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:
| GPIO0 | GPIO2 | GPIO15 | Açılış modu | 74880 baud açılış mesajı |
|---|---|---|---|---|
| HIGH (boşta) | HIGH | LOW | Normal çalışma: flaştaki program başlar | boot mode:(3,x) |
| LOW (GND) | HIGH | LOW | Programlama (UART indirme) modu | boot mode:(1,x) ve waiting for host |
| ESP-01 pini | Bağlantı | Not |
|---|---|---|
| VCC | 3,3 V regülatör çıkışı | USB-TTL'nin 3,3 V pini çoğu zaman yetmez |
| GND | USB-TTL GND ve regülatör GND | Hepsi ortak toprakta |
| TX | USB-TTL RXD | Çapraz bağlantı |
| RX | USB-TTL TXD | Jumper 3,3 V konumunda olmalı |
| EN (CH_PD) | 3,3 V | Doğrudan ya da 10 kΩ ile |
| RST | Boşta (reset için kısa süre GND) | İstersen 10 kΩ ile 3,3 V'a çek |
| GPIO0 | GND | Yalnızca yükleme sırasında; sonra ayır |
| GPIO2 | Boşta | Açılışta HIGH kalmalı |
- 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.
- Kart Yöneticisi'nde esp8266 ara ve ESP8266 Community paketini kur.
- 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.
- 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.
- 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.
- 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.
- 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.
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.

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.
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.
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?
| Özellik | ESP-01 | NodeMCU (ESP8266) | ESP32 DevKit |
|---|---|---|---|
| Yonga | ESP8266 | ESP8266 | ESP32 (çift çekirdek) |
| Kullanılabilir GPIO | 4 (ikisi TX/RX) | Yaklaşık 11 | Yaklaşık 25 |
| Analog giriş | Yok | 1 (A0) | 18 kanal, 12 bit |
| USB ile programlama | Yok, USB-TTL gerekir | Var | Var |
| Besleme | Yalnızca 3,3 V | USB 5 V ya da VIN | USB 5 V ya da VIN |
| Bluetooth | Yok | Yok | Var (Classic ve BLE) |
| Boyut | 24,8 × 14,3 mm | Breadboard'a takılan kart | Breadboard'a takılan kart |
| En iyi kullanım | Arduino'ya Wi-Fi, tek röle ya da sensör | Wi-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
| Belirti | Olası 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 karakterler | Baud hızı uyuşmuyor; açılış mesajları 74880 baud hızındadır | 115200 ve 9600'ü dene; açılış mesajını görmek için 74880 seç |
| AT yazınca hiç cevap gelmiyor | Satır sonu ayarı yanlış, TX-RX ters ya da EN bağlı değil | Both 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 kopuyor | Yetersiz akım | Ayrı bir AMS1117-3.3 ve 100–470 µF kondansatör kullan, kabloları kısalt |
| "busy p..." cevabı | Önceki komut bitmeden yenisi gönderildi | Her komuttan sonra OK ya da ERROR cevabını bekle |
| +CWJAP:3 ve FAIL | Ağ 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ıyor | VCC'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ıyor | GPIO0 ya da GPIO2'ye bağlı devre açılışta pini LOW çekiyor | LOW ile tetiklenen bağlantı kullan ya da girişi GPIO3'e taşı |
| 5 V röle modülü hiç kapanmıyor | 3,3 V'luk HIGH sinyali 5 V modülün optokuplörünü tam söndürmüyor | 3,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ıyor | Yü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 |
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.
Bu yazıdan sonra yapabileceğin projeler
Tüm projeleri gör
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.

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.

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

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

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

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

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ğ

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
Diğer yazılar
BlueGrays uygulaması
Bu devreyi telefonunda adım adım kur
Devre şeması, kod ve parça listesi tek ekranda. 200'den fazla Arduino, ESP32 ve Pico projesi seni bekliyor.
Telefonunla tara
Kamerayı koda tut; telefonunun uygulama mağazası açılır.
ya da mağazada aç

