OTA aslında şu zamanlarda 7 den 70 e hepimizin kullandığı hatta günümüzün çoğu vaktini geçirdiğimiz akıllı telefonlarımızdan bilmekteyiz. Telefonlarımıza gelen sistem güncellemesinin OTA güncellemesi olduğunu duymuş muydunuz? İşte size şimdi OTA nedir onu anlatacağım.
OTA; Over The Air ifadesinin kısaltılmış halidir. En basit şekilde anlatmak gerekirse kablo kullanılması gerekmeden şebeke üzerinden elektronik cihazlarınıza güncelleme gönderilmesini sağlayan sistemdir. Mesela telefonunuza operatörünüz veya telefonunuzun üretici firması tarafından bildirim göndermesiyle her hangi bir şubeye gitmeden kendinizin yapabilmesini sağlar. Ayrıca bunu sadece telefon ile sınırlandırmak yanlış olur. Örnek olarak bir çok cihaz verilebilir (modemler, akıllı saatler, yeni nesil elektrikli arabalar). Mesela şimdi arabaları göz önüne alalım. Arabalarımızda artık internet bağlantısı bulunduğu için arabada ki herhangi bir arızayı da görebilmekteyiz. Arıza için otomobil firması arabayı geri çağırmak yerine ya da siz tamire götürmek yerine OTA ile uzaktan yeni güncellemeler yaparak sorunun çözüme ulaşması sağlanabilir. Bu da hem üretici için hem de kullanıcı için vakit kaybı olmamasının yanında maliyet olarak da külfet olmaktan çıkmaktadır.
Size başka bir örnek vermem gerekirse NodeMCU ile projeler gerçekleştiriyorsanız mesela akıllı ev eşyaları yaptınız kutu haline getirip kapattınız. Daha sonrasında değişiklik yapmak istediniz projenizde. NodeMCU ‘yu yerinden sökmek yerine kartınızı en başta programlarken bir kere OTA destekli yazılımı atarsanız bir daha bilgisayara bağlamanıza gerek kalmadan Wi-Fi üzerinden gönderebilirsiniz. Arduino İDE’de nasıl yapacağınızı şimdi anlatacağım.
İlk başta 1 kereye mahsus modülünüze kabloyla bağlayarak Basic OTA kodunu atmamız gerekiyor. Bu bizim daha sonrasında kablosuz bağlanmamızı sağlayacak.
//gerekli kütüphaneleri tanımladık.
//herhangi bir kütüphane yüklemenize gerek yok zaten bu kütüphaneler mevcutta var.
#include <ESP8266WiFi.h>
#include <ESP8266mDNS.h>
#include <WiFiUdp.h>
#include <ArduinoOTA.h>
//ağ bilgilerinizi girin
#ifndef STASSID
#define STASSID "ROBOLINK 2 DSL"
#define STAPSK "989814735"
#endif
const char* ssid = STASSID;
const char* password = STAPSK;
void setup() {
Serial.begin(115200);
Serial.println("Baslatiliyor");
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.waitForConnectResult() != WL_CONNECTED) {
Serial.println("Bağlantı hatası, yeniden başlıyor!!!");
delay(5000);//5sn bekle
ESP.restart();//sistemi yeniden başlat
}
//iletişim için gerekli port
// standart olarak 8266 portu gelir
// ArduinoOTA.setPort(8266); //komutu ile değiştirilebilir
// Sunucu ismi olarak esp8266-[ChipID] gelir
// ArduinoOTA.setHostname("myesp8266"); //komutu ile değiştirilebilir
// Standart olarak şifre sormaz ama sorması istenirse
// ArduinoOTA.setPassword("admin"); //komutu ile şifre belirlenebilir
// Aynı zamanda bu şifre MD5 kriptolama algoritması ile kriptolanabilir.
// MD5(admin) = 21232f297a57a5a743894a0e4a801fc3
// ArduinoOTA.setPasswordHash("21232f297a57a5a743894a0e4a801fc3");
//////////////////////////////////////////////////////////////////////////////////////
//daha sonra yeniden OTA kod atabilmek için gerekli OTA tanımlamalarını başlatmalıyız
ArduinoOTA.onStart([]() {
String type;
if (ArduinoOTA.getCommand() == U_FLASH) {
type = "sketch";
} else { // U_FS
type = "filesystem";
}
// NOT: FS kullandıysanız FS.end()komutu ile dosyayı kapatmalısınız
Serial.println("Start updating " + type);
});
ArduinoOTA.onEnd([]() {
Serial.println("\nEnd");
});
ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {
Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
});
ArduinoOTA.onError([](ota_error_t error) {
Serial.printf("Hata[%u]: ", error);
if (error == OTA_AUTH_ERROR) {
Serial.println("Yetki Hatası");
} else if (error == OTA_BEGIN_ERROR) {
Serial.println("Baslatma Basarisiz");
} else if (error == OTA_CONNECT_ERROR) {
Serial.println("Baglanti Basarisiz");
} else if (error == OTA_RECEIVE_ERROR) {
Serial.println("Veri Alinamadi");
} else if (error == OTA_END_ERROR) {
Serial.println("Sonlandirma Basarisiz");
}
});
ArduinoOTA.begin();//OTA'yi başlatıyor
Serial.println("Sistem Hazir");
Serial.print("IP Adresiniz: ");
Serial.println(WiFi.localIP());
}
void loop() {
ArduinoOTA.handle();//sonraki kod atma işlemleri için kullanmamız gerekiyor
}
Bu kodu ESP modülüne attıktan sonra bir led yakmayı deneyelim. Yeni bir kodu atacağınız zaman portunuzu OTA destekli ESP ile değiştirmeyi unutmayın.
ESP modülünüze güç verebileceğiniz herhangi bir elemanı ekleyin, ledinizin uzun bacağını (+) D0 pinine, kısa bacağını (-) modüldeki herhangi GND pinine bağlayın ve OTA’nın uzaktan neler yaptığını görün.
Led yakmak için gereken kod;
//gerekli kütüphaneleri tanımladık.
//herhangi bir kütüphane yüklemenize gerek yok zaten bu kütüphaneler mevcutta var.
#include <ESP8266WiFi.h>
#include <ESP8266mDNS.h>
#include <WiFiUdp.h>
#include <ArduinoOTA.h>
//ağ bilgilerinizi girin
const char* ssid = "********";
const char* password = "*********";
const int led = D0; // Ledimizi bağlayacağımız pini tanımladık
unsigned long oncekiZaman = 0; // son zaman bilgisini tutacağız
const long aralik = 5000; // milisaniye olarak ledin yanıp sönme aralığı
int ledDurumu = LOW; // ledin durumunu takip etmek için gerekli değişkenimiz
void setup() {
pinMode(led, OUTPUT); //pin modunu çıkış olarak tanımladık
Serial.begin(115200);
Serial.println("Başlatılıyor");
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.waitForConnectResult() != WL_CONNECTED) {
Serial.println("Bağlantı hatası, yeniden başlıyor!!!");
delay(5000); //5sn bekle
ESP.restart();//sistemi yeniden başlat
}
//iletişim için gerekli port
// standart olarak 8266 portu gelir
// ArduinoOTA.setPort(8266); //komutu ile değiştirilebilir
// Sunucu ismi olarak esp8266-[ChipID] gelir
// ArduinoOTA.setHostname("myesp8266"); //komutu ile değiştirilebilir
// Standart olarak şifre sormaz ama sorması istenirse
// ArduinoOTA.setPassword("admin"); //komutu ile şifre belirlenebilir
// Aynı zamanda bu şifre MD5 kriptolama algoritması ile kriptolanabilir.
// MD5(admin) = 21232f297a57a5a743894a0e4a801fc3
// ArduinoOTA.setPasswordHash("21232f297a57a5a743894a0e4a801fc3");
//////////////////////////////////////////////////////////////////////////////////////
//daha sonra yeniden OTA kod atabilmek için gerekli OTA tanımlamalarını başlatmalıyız
ArduinoOTA.onStart([]() {
String type;
if (ArduinoOTA.getCommand() == U_FLASH)
type = "sketch";
else // U_SPIFFS
type = "filesystem";
// NOT: FS kullandıysanız FS.end()komutu ile dosyayı kapatmalısınız
Serial.println("Start updating " + type);
});
ArduinoOTA.onEnd([]() {
Serial.println("\nEnd");
});
ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {
Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
});
ArduinoOTA.onError([](ota_error_t error) {
Serial.printf("Hata[%u]: ", error);
if (error == OTA_AUTH_ERROR) Serial.println("Yetki Hatası");
else if (error == OTA_BEGIN_ERROR) Serial.println("Baslatma Basarisiz");
else if (error == OTA_CONNECT_ERROR) Serial.println("Baglanti Basarisiz");
else if (error == OTA_RECEIVE_ERROR) Serial.println("Veri Alinamadi");
else if (error == OTA_END_ERROR) Serial.println("Sonlandirma Basarisiz");
});
ArduinoOTA.begin();//OTA'yi başlatıyor
Serial.println("Sistem Hazir");
Serial.print("IP Adresiniz: ");
Serial.println(WiFi.localIP());
}
void loop() {
ArduinoOTA.handle();//sonraki kod atma işlemleri için kullanmamız gerekiyor
//ledi yakıp söndürme işlemini delay kullanmadan millis() fonksiyonu ile zaman tutarak yapalım
unsigned long simdikiZaman = millis();
if (simdikiZaman - oncekiZaman >= aralik) {
// LED'i yaktığımız son zamanı kaydedelim
oncekiZaman = simdikiZaman;
// yanıksa söndür, sönükse yaktır diyelim
ledDurumu = not(ledDurumu);
// ve çıkışa yazdıralım:
digitalWrite(led, ledDurumu);
}
}
Yukarıda önemli olan bir kaç nokta var onlara değinmek isterim. Kablosuz olarak her kod güncellemesi yaptığınızda cihazın kodunuzu dinlemesi için içinde OTA yazılımı bulundurmanız gerekmektedir. Aksi takdirde cihazınız bunu anlamayacaktır. Turuncu ile yazdığım noktada led için gereken kodlar yazmakta.
OTA kullandığınız zaman bir önemli nokta daha var delay komutunu kullanmamanız gerekmektedir. Bunun sebebi delay komutu bekleme komutu olduğundan yeni yazılımı atmak istediğinizde kod duracağından sorun olacaktır. O yüzden delay komutu yerine millis fonksiyonunu kullanmamız gerekir. Onu da nasıl kullanacağınızı koda bakarak görebilirsiniz.
Bu yazının üşengeç olan geliştirmecilere ilham olacağını düşünüyorum. Artık modüllerinizi yerlerinden söküp bilgisayar bağlantısı ile uğraşmanıza gerek kalmayacak. Eğer sorularınız olursa aşağıya bırakabilirsiniz.
Hepinize iyi çalışmalar dilerim
🚀IOT Projelerini İncelemek için Robolink Akademi’yi ziyaret edebilirsiniz.