ESP-12E (ESP8266) İle Arduino Uno Wifi Bağlantısı
ESP-12E, popüler ESP8266 WiFi modülünün gömülü projelerde kullanılmak üzere tasarlanmış SMD sürümüdür. Internet Of Things (IOT) uygulamalarınız için mükemmel bir seçimdir. ESP8266 WiFi Modülü, WiFi ağınıza herhangi bir mikrodenetleyici erişimi verebilen dahili TCP / IP protokolüne sahip, kendi kendine yeten bir modüldür.
Özellikler:
- 802.11 b/g/n kablosuz ağ desteği
- Dahili 32-bit düşük güç tüketimli işlemci (CPU)
- Dahili 10-bit DAC (dijitalden analoga dönüştürücü)
- TCP/IP stack desteği
- 4MB SPI flash (program hafızası)
- Dahili PLL, regülatör ve güç yönetimi
- Anten diversity özelliği
- WPA/WPA2 destekli WiFi (2.4 GHz)
- STA/AP/STA+AP WiFi modları
- Android ve iOS cihazlar için SmartLink desteği
- SDIO 2.0, (H)SPI, UART, I2C, I2S, IRDA, PWM ve GPIO haberleşme desteği
- Derin uyku durumunda <10µA, güç kapalı durumda 5<µA güç tüketimi
- Uyandıktan sonra veri gönderme süresi <2ms
- Bekleme durumunda <1.0mW güç tüketimi (DTIM3)
- 802.11b modunda +20dBm RF çıkış gücü
- Çalışma sıcaklığı: -40ºC ~ 125ºC
ESP8266, bir uygulamayı barındırabilir veya başka bir uygulama işlemcisinden tüm Wi-Fi ağ işlevlerini kaldırabilir. Bu modül, arduino wifi shield gibi işlevsellik kazanmanızı sağlayan AT komutları ile birlikte gelir, ayrıca modüllerin bellek ve işlemcisi üzerinde kendi uygulamanızı yapmak için farklı yazılımlar yükleyebilirsiniz.
Bu modül, özel yazılımlar için kullanılabilecek 80Mhz düşük güçlü 32 bit işlemci içerir. Bu ayrıca herhangi bir harici denetleyici olmadan küçük web sayfalarını barındırabileceğiniz anlamına gelir. ESP8266, VoIP uygulamaları ve Bluetooth ortak kullanım arayüzleri için APSD'yi destekler, tüm çalışma koşullarında çalışmasına izin veren ve harici RF parçaları gerektirmeyen kendi kendini kalibre eden bir RF içerir.
ESP8266, düşük maliyet ve yüksek özellikleriyle dünyayı dönüştürüyor ve bu da onu Internet Of Things (IOT) için ideal bir modül haline getiriyor. Yerel ağınıza veya internete bir cihaz bağlamanız gereken herhangi bir uygulamada kullanılabilir.
ESP-12'de 7 GPIO bulunur.
Dikkat
- ESP8266 Modülü sadece 3.3V gerilim seviyesiyle uyumludur ve 5V cihazlarla doğrudan çalışmaz (hem seri hem de GPIO erişimi için). Eğer devreniz veya projeniz 3.3V uyumlu değilse bir çevirici kullanmanız gerekir. 3.3V yerine 5V uygulanırsa kart yanacaktır.
- ESP modülünüzü çalıştırmak için Arduino UNO üzerindeki 3.3V pimini kullanmayın. ESP, 3.3V pininin sağlayabildiğinden daha fazla akım çeker. Arduino 50mA maksimum akım verebilirken ESP 250mA akım çeker. En az 500mA akım verebilen kaynak kullanın. Mesela LM1117 3.3V Voltage Regulatorü. ESP modüllerinde bazı kişilerin 420mA'ya kadar yükselen akım çekimlerini fark ettiğinden emin olmak için en az 500mA sağlayabilen bir şey kullanın.
- RX ve TX pinleri takılı iken Arduino’ya kod atılamıyor, RX ve TX pinlerini çıkartıp kod attıktan sonra tekrar takmamız gerekmekte.
Reset pini Low konumda iken modüle reset atmakta, bu yüzden 10k lık bir direnç ile 5V’ a bağlanması olası sorunları en aza indirgemenize yardımcı olur. Son olarak da CH_PD pinine değinelim. Bu pin modülün hazır konuma geçmesi için anahtar görevi görür. Yani siz her şeyi bağlayıp bu pini boş bırakır yada Low konuma çekerseniz modül size cevap vermeyecektir. Size tavsiyem bu pini 10k ‘ lık bir direnç ile Arduino’ ya bağlamanızdır. Bu sayede pini modülün ne zaman çalışmaya başlayacağına karar verebilirsiniz.
Genel olarak, güç için bir VCC'niz ve ortak GND'niz var. Ayrıca data göndermek ve almak için TX ve RX’iniz de vardır. İki GPIO pininiz, sıfırlama pininiz ve bir CH_PD pininiz var. Bu kart, başka bir mikro denetleyiciye eklenecek şekilde tasarlanmıştır ve CH_PD pimini Yüksek'ten Düşük'e ayarlayarak açıp kapatabilme özelliği sunar. Benim durumumda, her zaman açık bırakacağım, bu yüzden sürekli yüksek tutuyorum.
GND | Güç kaynağından topraklama |
GPIO2 | Dijital I / O programlanabilir, boşta kalabilir |
GPIO0 |
Dijital G / Ç programlanabilir, BOOT modları için de kullanılır. Normal çalışma: 10kΩ direnç VEYA yüzer halde HIGH çekildi (hiçbir şeye bağlı değil) Yanıp sönüyor / yükleniyor: "FLASH" düğmesine basıldığında GND'ye bağlı. GPIO 0 normal çalışma için hiçbir şeye bağlanmamalıdır, yazılımını flaş etmek veya eskiz yüklemek istediğinizde manuel olarak GND'ye bağlayın. |
GPIO15 | 10kΩ dirençle LOW (GND'ye) |
RX | UART Alıcı kanalı |
TX | UART Verici kanal |
EN veya CH_PD | Açma / kapatma, doğrudan 3.3V'a (VCC) 10K direnç üzerinden çekilmelidir. Bu pini 10k ‘ lık bir direnç ile Arduino’ ya bağllarsanız modülün ne zaman çalışmaya başlayacağına karar verebilirsiniz. |
REST |
RST normalde 10kΩ'luk bir dirençle HIGH (VCC) çekildi, ancak “RESET” düğmesine basıldığında GND'ye bağlandı. VCC hattını söküp yeniden bağlayarak RST'nin yüksek çıkmasını ve ESP'yi açıp kapatmasını sağlar. Boşta kalabilir. |
VCC | 3.3v güç kaynağı |
Aşağıdaki gibi bir bağlantımız olmalı.
Arduino önyükleyicisini atlamak için Uno'daki sıfırlama pimini GND'ye bağlayabilirsiniz. Bu, Uno’nun TX’ine ve RX’ine Modül ile bağlanmanıza olanak sağlar. Uno’nun USB kablosu Uno’nun TX ve RX’ine doğru şekilde bağlandığında, bu hatlara gönderilen sinyaller doğrudan modüle geçer. İşin püf noktası, bu durumda, Uno'daki TX'in modüldeki TX'e ve RX'in Uno'dan Modül'deki RX'e bağlanmasını istiyoruz. Burada yaptığımız tek şey, TX hattını modüle genişletmek. Geçiş, bu durumda, USB bağdaştırıcısında zaten yönetilmiş. Sadece bu köprü modelinde TX’ten TX’e ve RX’den RX’e kullanılır.
Yukarıdaki Örnek Devrede:
VCC, breadboard pozitif hattına
GND'den breadboard negatifine
EN (veya CH_PD) 10kΩ dirençle (3.3V'a) HIGH
RST normalde 10kΩ'luk bir dirençle HIGH, ancak “RESET” düğmesine basıldığında GND'ye bağlandı
GPIO15, 10kΩ dirençle LOW (GND'ye)
GPIO0:
Normal çalışma: 10kΩ direnç VEYA yüzer halde HIGH (hiçbir şeye bağlı değil)
Yanıp sönüyor / yükleniyor: "FLASH" düğmesine basıldığında GND'ye bağlı
Düğmeleri kullanmak istemiyorsanız:
RST HIGH olmalıdır; ESP’nin sıfırlanması gerektiğinde GND’ye elle bağlayın ve bağlantıyı kesin; alternatif olarak VCC hattını söküp yeniden bağlayarak RST'nin HIGH olmasını ve ESP'yi açıp kapatmasını sağlayın.
GPIO0 normal çalışma için hiçbir şeye bağlanmamalıdır, firmware yazılımını flaş etmek veya kod yüklemek istediğinizde manuel olarak GND'ye bağlayın
ESP üzerindeki RX'ten Arduino'daki RX pinine (pim # 0)
RESET pimi GND pimine bağlanmalıdır (bu, Arduino'da seri com başlatma işleminde boardı sıfırlamayı devre dışı bırakır)
Her şeyi doğru bağladıysanız, sıfırladığınızda / yeniden başlattığınızda en azından ESP üzerindeki mavi LED'i görmelisiniz, Bazen yanmada bilir.
Serial Monitör İle Kontrol
Arduino IDE ve Seri Monitor'ü açın
Şimdi, ESP8266'nızla Seri Monitörden Arduino UNO üzerinden iletişim kurmaya hazır olmalısınız.
Tüm kullandığım ESP'lerim, AT komut kitaplığıyla önceden yüklenmiş olarak geldi. Bazıları ESP'lerinin başlangıçta üzerlerinde hiçbir şey bulunmadığını ve bir firmware'i veya diğerini flaş etmek zorunda olduklarını söylüyorlar.
Arduino IDE'yi açın, Arduino UNO'nuzun bağlı olduğu Port'u seçin ve ardından Seri Monitörü açın.
Seri Monitörün sağ alt köşesinde, baud hızı olarak 115200'ü seçin. Ayrıca "Both NL & CR" seçili olmalıdır.
Önceki adımdaki tüm bağlantıların doğru olduğundan emin olun - burada temel işlem yapmayı hedefliyoruz, yanıp sönmüyoruz, bu nedenle GPIO0 HIGH çekilmeli veya bağlantısı kesilmiş (boş) halde bırakılmalıdır.
ESP modülünü sıfırlayın / yeniden başlatın. Her şey yolundaysa, seri monitörde ilk önce "hazır" yazan bazı mumbo-jumbo karakterleri görmelisiniz. Bunu gösteriyorsa, birkaç komutu test etmeye hazırsınız, bu yüzden bir sonraki adıma geçin.
Dikkat
- Arduino RESET pimi GND pimine bağlanmalıdır (bu, Arduino'da seri com başlatma işleminde boardı sıfırlamayı devre dışı bırakır)
- Serial Monitörü her arduinoyu açıp kapattıktan sonra yeniden açın kapatın.
AT Komutları
Şimdi seri monitörde birkaç komut yazmaya hazırız. İşte kullanılan en yaygın komutların bir listesi. Komutları uygularken hata mesajı alırsanız sebebi komutu yazarken veya kopyala yapıştır yaparken arada boşluklar oluşması. Boşlukları silip yeniden deneyin.
Komut | Açıklama |
AT | Modülün düzgün bağlanıp bağlanmadığını ve çalışıp çalışmadığını kontrol ettikten sonra, modül bir onay ile cevap verecektir. |
AT+RST | Wifi modülünü sıfırlar. Programlanmadan önce veya sonra sıfırlamak iyi bir uygulamadır. |
AT+GMR | ESP8266'da yüklü ürün yazılımı sürümünü listeler. |
AT+CWLAP | Bölgede bulunan Erişim noktalarını (wifi ağları) ve sinyal güçlerini tespit eder. LAP Erişim Noktalarını Listele anlamına gelir |
AT+CWMODE? |
Modülün hangi wifi moduna ayarlanmış olduğunu söyleyecektir. 1, İSTASYON (diğer ağlara bağlanmak için kullanılır, sensör verilerini ölçmek ve bir web sitesine göndermek için kullandığınız şeydir), 2 Erişim Noktasıdır (kendi içinde bir wifi ağı) 3, hibrid bir İSTASYON ERİŞİM NOKTASI'dır. |
AT+CWMODE=1 | Wifi modunu ayarlar. Wifi modunu değiştirdikten sonra AT+RST ile sıfırlayın. |
AT+CWJAP? | Şu an bağlanılmış wifi ismi |
AT+CWJAP="SSID","Password" | İsmi ve şifresi verilen wifiye bağlan |
AT+CWSAP= <ssid>,<pwd>,<chl>, <ecn> | Parametreli bağlantı |
AT+CWQAP | Bağlantıyı kes |
AT+CIPSTART=? | Bağlantı yardımını görüntüler |
(CIPMUX=0) AT+CIPSTART = <type>,<addr>,<port> (CIPMUX=1) AT+CIPSTART= <id><type>,<addr>, <port> |
TCP veya UDP Bağlantısı |
AT+CIPMUX? | TCP, UDP hangisi aktif olduğunu gösterir |
AT+CIPMUX=0 AT+CIPMUX=1 |
0 ise sadece TCP, 1 ise TCP + UDP |
AT+CWLIF | |
AT+CIPSTATUS | TCP Bağlantı durumu |
(CIPMUX=0) AT+CIPSEND=<length> (CIPMUX=1) AT+CIPSEND= <id>,<length> |
Veri gönderme |
AT+CIPCLOSE=<id> or AT+CIPCLOSE | TCP, UDP Bağlantısını kapatma |
AT+CIPSERVER= <mode>[,<port>] | Server gibi çalıştırma |
AT+CIPSTO? AT+CIPSTO=<time> |
Server timeout süresini ayarlama, ilk komut şu anki değeri öğrenmek için kullanılır. |
AT+CIOBAUD? Supported: 9600, 19200, 38400, 74880, 115200, 230400, 460800, 921600 |
Bağlantı hızı, ilk komut şu anki değeri öğrenmek için kullanılır. |
AT+CIFSR | Kendi Ip adresini kontrol etmek için kullanılır. |
AT+CIUPDATE | Bulut üzerinden Firmware güncellemesi +CIPUPDATE:1 found server +CIPUPDATE:2 connect server +CIPUPDATE:3 got edition +CIPUPDATE:4 start update |
AT+CSYSWDTENABLE AT+CSYSWDTDISABLE |
Watchdog hata takipcisini açıp kapatma |
AT komutları ile daha derinlemesine gitmek istiyorsanız, tüm olası AT talimatlarını içeren resmi belge için buraya tıklayabilirsiniz.
Kodlamayla Kontrol
Şimdi Arduino üzerinden komutlar vererek örneğimizi ilerletelim.
RX, TX pinleri bağlandıktan sonra asla yeni bir program yükleyemezsiniz. Programlarken bu bacakları sökmelisiniz.
Normalde arduinodaki Serial Monitör kısmını arduino komutlarımızın sonuçlarını görmek için kullanıyoruz ve bu bir hardwareserial olayı. Şimdi sofware serial kımını ESPmiz için kullanacağız. Sonuçta iki serial elemanımız olacak.
HardwareSerial Arduino içerisinde ADC gibi bir modüldür, SoftwareSerial ise yazılımsal oluşturulmuştur. Yazılımsal oluşturulmuş olmasının dezavantajı olarak yüksek veri transfer hızlarında çalışamaz. Arduino ‘ nun kendi içerisindeki SoftwareSerial kütüphanesi ile kullanılabilecek en fazla haberleşme hızı Arduino’ nun web sitesinde de belirtildiği üzere 38400 baud ‘ dır
Arduino donanımı, 0 ve 1 pinlerinde (ayrıca USB bağlantısıyla bilgisayara da gider) seri haberleşme için yerleşik desteğe sahiptir. Yerel seri destek, UART adı verilen bir donanım parçası (çipte yerleşik) aracılığıyla gerçekleşir. Bu donanım, Atmega yongasının 64 byte seri arabellekte yer alır ve diğer görevlerde çalışırken bile seri iletişim almasını sağlar.
SoftwareSerial kütüphanesi, işlevselliği çoğaltmak için yazılımı kullanarak Arduino'nun diğer dijital pinlerinde seri iletişime izin vermek için geliştirilmiştir (bu nedenle "SoftwareSerial" adı). 115200 bps hıza kadar çoklu yazılım seri portlarına sahip olmak mümkündür. Bir parametre, bu protokolü gerektiren cihazlar için ters sinyalleri mümkün kılar.
Arduino SDKsının 1.0 ve sonraki sürümlerde bulunan SoftwareSerial sürümü, Mikal Hart'ın NewSoftSerial kütüphanesine dayanmaktadır.
Öncelikle, modül için software serial'i dahil etmemiz gerekiyor. Kütüphaneyi ekleyeceğiz ve değişkeni tanımlayacağız.
#define RX 10
#define TX 11
SoftwareSerial esp8266(RX,TX);
Kodlamayla kontrol ve Serial Monitörle kontrol arasındaki büyük fark ESP8266dan çıkan Rx'in Arduinonun Tx'ine, ESP8266dan çıkan Tx'in Arduinonun Rx'ine bağlanması gerekliliğidir.
Bundan sonra “esp8266” üzerinden Modül ile konuşacağız ve “Serial” (esp8266) üzerinden IDE ile konuşacağız.
Serial Monitör için bağlantıyı 9600 baud oranına, esp8266 bağlantısını da 115200 baud hızına ayarladığımızı unutmayın. IDE Seri Monitörünüzü doğru baud'a ayarladığınızdan ve esp8266 değerini daha önce onayladığınız modülün baud hızına ayarlayın.
Daha fazlasını ekleyelim ve daha önce yaptığımız komutları ileterek çalışıp çalışmadığını görelim.
#include <SoftwareSerial.h>
namespace {
const int EspRx = 2;
const int EspTx = 3;
String WifiAdi = "dulkadiroglu";
String Sifre = "12345678";
int countTrueCommand;
int countTimeCommand;
boolean found = false;
SoftwareSerial esp8266(EspRx, EspTx); //arduino ile capraz baglanmali
void sendCommand(String command, int maxTime, String readReplay2) {
int str_len = readReplay2.length() + 1;
char readReplay[str_len];
readReplay2.toCharArray(readReplay, str_len);
/*Serial.print(countTrueCommand);
Serial.print(". Komut: ");*/
Serial.print(command);
Serial.print(" ");
while (countTimeCommand < (maxTime * 1)) {
esp8266.println(command);//at+cipsend
if (esp8266.find(readReplay)) { //Beklenen cevap geldiyse
found = true;
break;
}
countTimeCommand++;
}
if (found == true){
Serial.println("[Komut Başarılı]");
countTrueCommand++;
countTimeCommand = 0;
} else {
Serial.println("[Komut BAŞARISIZ]");
countTrueCommand = 0;
countTimeCommand = 0;
}
found = false;
}
void WifiReset() {
/*esp8266.println("AT+RST"); //sendCommand'a Alternatif yöntem
delay(1000);
if (esp8266.find((char*)"OK")) {
//if (esp8266.find("OK")) { //Hata veren kullanım
Serial.println("Module Resetlendi");
}
else {
Serial.println("Module RESETLENMEDİ");
}*/
sendCommand("AT+RST", 5, "OK");
}
void printResponse() { //sendCommand'a Alternatif yöntem
while (esp8266.available()) {
Serial.println(esp8266.readStringUntil('n'));
}
}
void WifiBaglan() {
/*esp8266.println("AT+CWMODE=1");
delay(1000);
printResponse();
esp8266.println("AT+CWJAP="" + WifiAdi + "","" + Sifre + """);
delay(1000);
printResponse();*/
sendCommand("AT+CWMODE=1", 5, "OK");
sendCommand("AT+CWJAP="" + WifiAdi + "","" + Sifre + """, 20, "OK");
}
}
void setup() {
pinMode(Musluk, OUTPUT);
Serial.begin(9600);
esp8266.begin(115200);
//SaatiKur(); //internetten update eger saat yanlissa
rtc.writeProtect(false);
rtc.halt(false);
WifiReset();
WifiBaglan();
}
void loop() {
delay(1000);
//printTime();
Alarm();
//WifiKontrol();
//esp8266.println("AT+CIPMUX=1");
//delay(1000);
//printResponse();
}
Kaynaklar
- https://www.instructables.com/id/ESP-12E-ESP8266-With-Arduino-Uno-Getting-Connected/
- https://www.robotistan.com/esp-12e-esp8266-wifi-modul
- https://www.direnc.net/esp8266-12-serial-wifi-modul
- https://www.instructables.com/id/Getting-Started-with-the-ESP8266-ESP-12/
- http://www.elektrobot.net/arduino-ile-esp8266-kullanimi-ve-web-server/
- https://medium.com/@cgrant/using-the-esp8266-wifi-module-with-arduino-uno-publishing-to-thingspeak-99fc77122e82
- https://www.instructables.com/id/ESP-12E-ESP8266-With-Arduino-Uno-Getting-Connected/
- https://www.arduino.cc/en/Reference/softwareSerial