Bu yazıda, Python kullanarak MQTT arayüzü üzerinden ESP32-WROOM mikrodenetleyicisi ile ST7789 ekranı nasıl kontrol ettiğimi anlatacağım. Projemde, MQTT mesajlarıyla ekran üzerinde görüntüleri kontrol ediyor ve aynı zamanda ESP32’nin donanımsal bilgilerini alıyorum.
Proje Hakkında
Projem, Wi-Fi ağına bağlı bir ESP32-WROOM cihazının, MQTT protokolü üzerinden ST7789 ekranına komutlar göndermesi ve cihazdan bilgi alması üzerine kuruludur. Python ile geliştirdiğim arayüz sayesinde, ekranda görüntü gösterme, ekranı temizleme gibi işlemleri gerçekleştirebiliyorum. Ayrıca, CPU, XTAL ve APB frekansları gibi donanımsal bilgileri de MQTT mesajları aracılığıyla alabiliyorum.
ESP32 ve ST7789 ile İki Yönlü Haberleşme
Bu projede ESP32 mikrodenetleyicisi, WiFi üzerinden bir MQTT sunucusuna bağlanarak veri gönderip alabiliyor. Kullanılan ekran ST7789 modelidir ve bu ekran üzerinde belirli komutlarla görüntüler gösterilip kaldırılabiliyor.
Kullanılan Kütüphaneler
- WiFi.h: ESP32’nin WiFi ağına bağlanmasını sağlar.
- PubSubClient.h: MQTT protokolünü kullanarak ESP32’nin bir broker ile haberleşmesini sağlar.
- Wire.h: I2C iletişimi için gerekli kütüphane.
- TFT_eSPI.h: ST7789 ekranını kontrol etmek için kullanılır.
Donanım ve Bağlantı Ayarları
WiFi SSID ve şifre bilgileri kodun başında tanımlanır. MQTT broker sunucusuna bağlanmak için IP adresi ve port bilgisi girilir. Bu projede kullanılan MQTT sunucusu yerel ağda, 192.168.1.41
IP adresindedir.
MQTT Mesajlarıyla Kontrol
ESP32, “CONTROL” isimli bir MQTT konusu üzerinden mesaj alır. Eğer gelen mesaj “play” ise, ekranda bir resim gösterilir. Eğer mesaj “stop” ise, ekran temizlenir. Bu sayede, uzaktan bir cihaz ile ekrana müdahale edilebilmektedir.
void callback(char* topic, byte* message, uint16_t length) {
mess = "";
for (uint16_t i = 0; i < length; i++) {
mess += (char)message[i];
}
if (String(topic) == "CONTROL") {
if(mess == "play"){
tft.fillScreen(TFT_BLACK);
tft.pushImage(0,0,240,240,mercy);
Serial.println("Displaying the image");
}
else if(mess == "stop"){
tft.fillScreen(TFT_BLACK);
Serial.println("Image removed");
}
}
}
Bu fonksiyon, MQTT sunucusundan gelen mesajı alır ve içeriğine göre ekranı kontrol eder.
ESP32’nin Bilgileri Göndermesi
ESP32, her 5 saniyede bir işlemci ve kristal frekanslarını, ayrıca hall sensöründen aldığı ölçümü MQTT sunucusuna gönderir. Bu bilgiler CPU, XTAL, APB ve HALL konularında yayınlanır.
long now = millis();
if (now - lastMsg > 5000) {
lastMsg = now;
Freq = getCpuFrequencyMhz();
sprintf(dgr,"%d",Freq);
client.publish("CPU",dgr);
Freq = getXtalFrequencyMhz();
sprintf(dgr,"%d",Freq);
client.publish("XTAL",dgr);
Freq = getApbFrequency();
sprintf(dgr,"%d",Freq);
client.publish("APB",dgr);
measurement = hallRead();
sprintf(dgr,"%d",measurement);
client.publish("HALL",dgr);
}
Bu kod, ESP32’nin belirli sistem bilgilerini MQTT sunucusuna gönderir ve sensör verilerini izlemeyi sağlar.
Başlık: Python ile MQTT Arayüzü Kullanarak ESP32-WROOM ve ST7789 ile Ekran Kontrolü
Merhaba, ben Mustafa ERGÜL. Bu yazıda, Python ve MQTT kullanarak ESP32-WROOM ile ST7789 ekranını nasıl kontrol ettiğimi detaylandıracağım. Projemde, ESP32 cihazının ekranında görüntü kontrolü yapmak için Python ile yazdığım bir MQTT arayüzü kullandım. Bu yazıda, Python kodunun nasıl çalıştığını ve ESP32 tarafındaki MQTT işleyişini de açıklayacağım.
Bu projeyi geliştirirken amacım, iki yönlü MQTT tabanlı bir iletişim kurarak hem ESP32’yi kontrol etmek hem de mikrodenetleyici üzerinde çeşitli işlemler gerçekleştirmekti. Python ile oluşturduğum basit bir GUI (Grafik Kullanıcı Arayüzü) üzerinden ekranı kontrol edebiliyorum. Ekranda bir resim görüntüleyip, ekrandaki içeriği temizlemek gibi işlevleri bu arayüz ile kolayca yapıyorum.
Projede Kullanılan Python Kodunun Açıklaması
Projede Python dilini kullanarak MQTT tabanlı bir kontrol arayüzü geliştirdim. Arayüz PyQt5 ile oluşturuldu ve paho-mqtt
modülü ile MQTT protokolü kullanılarak ESP32’ye mesajlar gönderildi.
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton
import paho.mqtt.client as mqtt
class MQTTApp(QWidget):
def init(self):
super().init()
self.initUI() # Arayüzün başlangıç ayarları
# MQTT client nesnesi oluşturuyoruz
self.client = mqtt.Client()
# MQTT broker'ına bağlanıyoruz
self.client.connect("192.168.1.41", 1883, 60)
self.client.loop_start() # MQTT döngüsü başlatılıyor
def initUI(self):
# Ana pencereyi ve düğmeleri oluşturuyoruz
layout = QVBoxLayout()
self.play_button = QPushButton('Play') # 'Play' düğmesi oluşturuldu
self.play_button.clicked.connect(self.send_play) # Düğmeye tıklayınca fonksiyon çalışacak
layout.addWidget(self.play_button)
self.stop_button = QPushButton('Stop') # 'Stop' düğmesi oluşturuldu
self.stop_button.clicked.connect(self.send_stop) # Düğmeye tıklayınca fonksiyon çalışacak
layout.addWidget(self.stop_button)
self.setLayout(layout)
self.setWindowTitle('MQTT App')
self.show()
# Play mesajı gönderildiğinde çalışacak fonksiyon
def send_play(self):
self.client.publish("CONTROL", "play") # 'CONTROL' konusuna 'play' mesajı gönderiyoruz
# Stop mesajı gönderildiğinde çalışacak fonksiyon
def send_stop(self):
self.client.publish("CONTROL", "stop") # 'CONTROL' konusuna 'stop' mesajı gönderiyoruz
if name == 'main':
app = QApplication(sys.argv)
ex = MQTTApp()
sys.exit(app.exec_())
Kodun Çalışma Mantığı:
- MQTT Bağlantısı:
- Bu kodda ilk olarak
mqtt.Client()
sınıfı ile bir MQTT client (istemci) oluşturuyorum. Bu client, ESP32’ye mesaj göndermek ve mesaj almak için kullanılacak. self.client.connect("192.168.1.41", 1883, 60)
ile ESP32’nin bağlı olduğu yerel MQTT broker’a bağlanıyoruz. Burada, IP adresi ve port numarası belirtiliyor (1883, MQTT’nin varsayılan portudur).self.client.loop_start()
fonksiyonu, MQTT istemcisinin sürekli dinleme ve veri gönderme işlemini başlatıyor.
- Bu kodda ilk olarak
- Grafik Arayüz:
- PyQt5 ile basit bir GUI (arayüz) oluşturuyorum.
QPushButton
kullanarak iki düğme (Play ve Stop) ekliyorum. - “Play” düğmesine tıklandığında,
send_play
fonksiyonu çalışıyor ve MQTT üzerinden “play” mesajı, “CONTROL” konusuna gönderiliyor. - “Stop” düğmesine tıklandığında ise
send_stop
fonksiyonu devreye giriyor ve “stop” mesajı gönderiliyor.
- PyQt5 ile basit bir GUI (arayüz) oluşturuyorum.
- Mesaj Gönderme:
- Her iki düğmenin de işlevi, ESP32’ye MQTT üzerinden komut göndermek. Bu komutlar ESP32’deki callback fonksiyonunda karşılık buluyor ve ST7789 ekranında uygun işlem gerçekleştiriliyor. Mesela “play” mesajı geldiğinde ekranda bir resim gösteriliyor, “stop” mesajı geldiğinde ekran temizleniyor.
Python Kodunun ESP32 Tarafındaki İşleyişi
Daha önce paylaştığım ESP32 kodunda, callback
fonksiyonu içinde gelen mesajlar işleniyor. Python arayüzünden gelen “play” ve “stop” mesajları burada yorumlanarak ekran kontrolü sağlanıyor.
void callback(char* topic, byte* message, uint16_t length) {
String mess = "";
for (uint16_t i = 0; i < length; i++) {
mess += (char)message[i]; // Mesajı stringe dönüştürüyoruz
}
if (String(topic) == "CONTROL") {
if(mess == "play") {
tft.fillScreen(TFT_BLACK); // Ekranı temizliyoruz
tft.pushImage(0, 0, 240, 240, mercy); // Resmi gösteriyoruz
Serial.println("Resim gösteriliyor");
}
else if(mess == "stop") {
tft.fillScreen(TFT_BLACK); // Ekranı temizliyoruz
Serial.println("Resim kaldırıldı");
}
}
}
Bu fonksiyon ile Python arayüzünden gönderilen mesajlar işleniyor ve ST7789 ekranda gerekli işlemler yapılıyor.
Sonuç
Bu proje ile, Python ve MQTT kullanarak ESP32 ile iki yönlü bir iletişim kurmayı başardım. Python üzerinden basit bir arayüz kullanarak ekranı kontrol edebilmek, özellikle IoT projelerinde esneklik ve pratiklik sağlıyor. Projeyi geliştirirken hem MQTT protokolünü daha iyi anlamış oldum hem de ESP32 üzerinde ST7789 gibi bir ekranı nasıl kontrol edebileceğimi öğrendim.
Bu tür projelerde Python ile hızlıca MQTT tabanlı arayüzler geliştirerek cihazlarınızı kontrol edebilir ve onlardan veri alabilirsiniz. Python ile MQTT kullanarak oluşturduğum bu arayüz, projemin hem daha kullanışlı hem de dinamik olmasını sağladı.
Eğer sizin de ESP32 ve benzeri cihazlarla IoT projeleri yapma planınız varsa, bu yaklaşımı kullanarak farklı cihazlar üzerinde kontrol mekanizmaları geliştirebilirsiniz.