Mustafa Ergül

GENEL

ESP32-WROOM ve ST7789 ile Python MQTT Arayüzü Kullanarak Ekran Kontrolü ve İki Yönlü İletişim

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ığı:

  1. 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.
  2. 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.
  3. 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.

GİTHUB KODLARI

Leave a Reply

Your email address will not be published. Required fields are marked *