Blog Archive

Arduino Indonesia. Gambar tema oleh Storman. Diberdayakan oleh Blogger.

Supported by Electronics 3 in 1

1. Jasa pencetakan PCB single layer dengan harga paling murah.

(Metode Pembuatan dengan Transfer Toner)
>PCB design sendiri (siap cetak) : Rp.150,-/Cm2
>PCB design dari kami : Rp.250,-/Cm2

(Metode Sablon Full Masking dan Silk Screen minimal pemesanan 100 Pcs)
>PCB design sendiri (siap cetak) : Rp.200,-/Cm2
>PCB design dari kami : Rp.250,-/Cm2

2. Jasa perancangan, perakitan, dan pembuatan trainer pembelajaran elektronika untuk SMK dan Mahasiswa.

3. Jasa perancangan, perakitan, dan pembuatan berbagai macam kontroller, sensor, aktuator, dan tranduser.
>Design Rangkaian / Sistem Elektronika
>Design Rangkaian / Sistem Instrumentasi
>Design Rangkaian / Sistem Kendali
>Kerjasama Riset (data atau peralatan)
>Kerjasama Produksi Produk-Produk KIT Elektronika
>Produksi Instrumentasi Elektronika

4. Jasa Pembuatan Proyek, Tugas Akhir, Tugas Laboratorium, PKM, Karya Ilmiah, SKRIPSI, dll

Like My Facebook

Popular Posts

Rabu, 03 Desember 2025

Panduan Lengkap Memulai MQTT di Raspberry Pi Pico W dengan MicroPython

Panduan ini memberikan pembahasan lengkap tentang penggunaan protokol MQTT pada Raspberry Pi Pico yang diprogram menggunakan MicroPython. MQTT merupakan protokol komunikasi ringan yang banyak digunakan pada sistem Home Automation dan aplikasi IoT untuk menghubungkan berbagai perangkat secara efisien. Dalam tutorial ini, Anda akan mempelajari cara memilih dan mengonfigurasi broker MQTT, serta cara melakukan operasi publish dan subscribe pesan MQTT menggunakan Raspberry Pi Pico.

Pengenalan MQTT

MQTT (Message Queuing Telemetry Transport) adalah protokol komunikasi berbasis messaging yang dirancang untuk perangkat berspesifikasi terbatas dan jaringan dengan bandwidth rendah. Protokol ini sangat ideal untuk kebutuhan pertukaran data antar perangkat IoT secara efisien dan real-time. Mekanisme kerja MQTT menggunakan model publish–subscribe: setiap perangkat dapat melakukan publish pesan pada topik tertentu, dan semua perangkat yang melakukan subscribe pada topik tersebut akan menerima pesan yang dipublikasikan.

Aplikasi utama MQTT mencakup pengiriman perintah untuk mengendalikan output, membaca serta mempublikasikan data dari node sensor, dan berbagai skenario komunikasi IoT lainnya.

 

Baca juga: Panduan Lengkap Mengirim Email via SMTP pada Raspberry Pi Pico W (MicroPython) 

Konsep Dasar MQTT

Dalam protokol MQTT, terdapat beberapa konsep fundamental yang perlu dipahami, yaitu:

- Publish/Subscribe

- Messages

- Topics

- Broker

Publish/Subscribe

Konsep pertama adalah mekanisme publish–subscribe. Pada sistem ini, sebuah perangkat dapat melakukan publish pesan pada topik tertentu, atau melakukan subscribe ke topik tertentu untuk menerima pesan yang dikirimkan oleh perangkat lain melalui topik tersebut.



Sebagai contoh sederhana:

- Perangkat 1 melakukan publish pada suatu topik;

- Perangkat 2 melakukan subscribe pada topik yang sama;

- Maka, Perangkat 2 akan menerima pesan yang dipublikasikan oleh Perangkat 1.

MQTT Messages

Messages adalah data yang dipertukarkan antar perangkat. Isi pesan dapat berupa instruksi untuk mengendalikan output, ataupun data terukur seperti hasil pembacaan sensor dan informasi lainnya.

Topics

Konsep penting berikutnya adalah topics. Topic digunakan untuk menentukan alur pesan—baik untuk menunjukkan minat terhadap pesan yang masuk maupun untuk menentukan lokasi publikasi pesan.

Struktur topic direpresentasikan sebagai rangkaian string yang dipisahkan oleh garis miring (`/`). Setiap garis miring menunjukkan satu level hierarki topik. Misalnya, untuk membuat topik pengendalian lampu pada ruang kerja rumah, Anda dapat menggunakan struktur topik seperti berikut:

 

Catatan: penamaan topik bersifat case-sensitive, sehingga perbedaan huruf besar dan huruf kecil akan membuat setiap topik dianggap sebagai entitas yang berbeda. 

Jika Anda ingin menyalakan lampu di ruang kerja menggunakan MQTT, Anda dapat membayangkan skenario operasional seperti berikut:

- Sebuah perangkat melakukan publish pesan on atau off pada topik `home/office/lamp`.

- Perangkat lain yang berfungsi sebagai pengendali lampu—misalnya Raspberry Pi Pico atau papan mikrokontroler lain—melakukan subscribe pada topik yang sama: `home/office/lamp`.

- Ketika pesan baru dipublikasikan pada topik tersebut, Pico akan menerima instruksi on atau off dan kemudian menjalankan aksi yang sesuai untuk menyalakan atau mematikan lampu.

 

Perangkat yang melakukan publish dapat berupa mikrokontroler lain atau platform Home Automation yang mendukung MQTT, seperti Node-RED, Home Assistant, Adafruit IO, Domoticz, maupun OpenHAB.

Broker

Broker MQTT bertugas menerima seluruh pesan yang masuk, memfilter pesan berdasarkan topik, menentukan klien mana yang memiliki minat terhadap pesan tersebut, lalu mendistribusikan pesan itu kepada semua klien yang melakukan subscribe pada topik terkait.



Terdapat beberapa opsi broker MQTT yang dapat digunakan, antara lain:

- Cloud MQTT Broker – Anda dapat memanfaatkan layanan broker komersial seperti HiveMQ. Solusi ini tidak memerlukan instalasi atau konfigurasi lokal; cukup membuat akun dan layanan langsung dapat digunakan (solusi ini yang akan digunakan dalam tutorial ini).

- Local MQTT Broker – Anda dapat menginstal broker MQTT secara lokal pada komputer atau Raspberry Pi. Mosquitto MQTT broker yang dijalankan di Raspberry Pi merupakan pilihan populer dalam berbagai proyek IoT skala hobi dan juga menjadi solusi yang paling sering kami gunakan.

- Cloud-Hosted MQTT Broker Mandiri – Alternatif lainnya adalah menginstal broker MQTT pada server cloud milik Anda sendiri, sehingga Anda memiliki kontrol penuh terhadap konfigurasi dan pengelolaan layanan.

Ringkasan:

- MQTT adalah protokol komunikasi yang sangat efektif untuk proyek Internet of Things.

- Dalam MQTT, perangkat dapat melakukan publish pesan pada topik tertentu, dan perangkat lain dapat melakukan subscribe untuk menerima pesan pada topik tersebut.

- Penggunaan MQTT selalu memerlukan keberadaan sebuah broker yang berperan menerima seluruh pesan, memprosesnya, lalu mendistribusikannya kepada perangkat yang berlangganan.

Menyiapkan MQTT Broker

Untuk menggunakan protokol MQTT, Anda memerlukan sebuah broker. Broker bertugas menerima seluruh pesan MQTT yang dipublikasikan dan mendistribusikannya kepada klien yang berlangganan.

Opsi MQTT Broker

Terdapat berbagai solusi broker MQTT yang dapat dipilih. Berikut beberapa opsi yang umum digunakan:

- Mosquitto MQTT Broker pada Raspberry Pi

Merupakan broker open-source yang dapat diinstal secara lokal pada perangkat Raspberry Pi (komputer Raspberry Pi, bukan Pico). Opsi ini sangat populer untuk proyek IoT skala hobi dan telah terbukti stabil pada berbagai implementasi.

- Mosquitto MQTT Broker pada Server Cloud

Pilihan ini memungkinkan broker Anda dapat diakses dari mana saja, ideal bila Anda memerlukan konektivitas jarak jauh yang tidak terbatas pada jaringan lokal.

- HiveMQ Broker

Layanan cloud untuk MQTT yang siap digunakan tanpa instalasi. Anda hanya perlu membuat akun dan memilih paket layanan. Mereka juga menyediakan paket gratis yang cukup untuk sebagian besar proyek IoT berbasis hobi.

 

Untuk mempermudah proses, panduan ini menggunakan HiveMQ karena Anda tidak perlu melakukan instalasi maupun konfigurasi manual seperti pada Mosquitto. Cukup membuat akun, membuat cluster, dan broker langsung siap digunakan. Namun, jika Anda ingin menggunakan Mosquitto atau broker lain, tidak menjadi masalah kode yang digunakan tetap kompatibel selama Anda memasukkan detail broker dengan benar.

 

Apa pun broker MQTT yang dipilih, pastikan Anda telah memiliki informasi berupa URL MQTT, username, dan password sebelum melanjutkan ke bagian berikutnya.

Konfigurasi HiveMQ MQTT Broker

Pada bagian ini, Anda akan mempelajari langkah-langkah untuk menyiapkan broker MQTT menggunakan HiveMQ.

1. Buat akun terlebih dahulu. Kunjungi situs hivemq.com lalu klik opsi Start Free.

2. Setelah itu, pilih paket layanan HiveMQ Cloud.

 


3. Masuk (login) ke akun Anda atau buat akun baru, kemudian lengkapi informasi profil yang diminta.

4. Setelah berhasil masuk, sebuah cluster baru biasanya akan dibuat secara otomatis. Klik Manage Cluster untuk mulai melakukan konfigurasi.

 


5.Salin Cluster URL dan simpan di tempat yang aman karena informasi ini akan digunakan pada tahap berikutnya.

 


6. Buka tab Access Management pada bagian atas antarmuka.

7. Isi formulir dengan username dan password. Pastikan kredensial ini dicatat, karena diperlukan untuk menghubungkan perangkat ke MQTT broker. Atur izin akses menjadi Publish dan Subscribe.

8. Terakhir, klik Create Credential untuk menyimpan konfigurasi.


Jika kredensial berhasil dibuat, maka MQTT broker Anda telah selesai dikonfigurasi dan siap digunakan.


Sebelum melanjutkan ke bagian berikutnya, pastikan Anda telah menyiapkan informasi berikut:

- MQTT Server:

  - Cluster URL (jika menggunakan HiveMQ)

  - Alamat IP atau URL broker MQTT (jika menggunakan layanan lain)

- MQTT Username

- MQTT Password

Menginstal Modul MQTT untuk MicroPython

Untuk menulis program MicroPython yang mendukung komunikasi MQTT, kita akan menggunakan dua modul, yaitu umqtt.simple.py dan umqtt.robust.py. Ikuti langkah-langkah berikut untuk mengunggah modul tersebut ke Raspberry Pi Pico. Dengan Raspberry Pi Pico terhubung ke komputer dan tersambung ke Thonny IDE, buka menu View > Files.

 


Sebuah panel samping baru akan muncul dan menampilkan seluruh berkas yang berada pada sistem file Raspberry Pi Pico.

Klik kanan pada bagian Raspberry Pi Pico di panel tersebut, kemudian pilih New directory…

Buat direktori baru dengan nama umqtt, lalu klik OK.

 


Direktori baru tersebut akan muncul pada panel samping kiri.



Klik kanan pada folder umqtt, lalu pilih New file…

Buat berkas baru dengan nama simple.py.”

 


Salin kode simple.py ke dalam berkas baru tersebut. Kode untuk modul ini dapat Anda ambil dari pustaka resmi umqtt atau repositori MicroPython yang relevan.

 

# forked from: https://github.com/micropython/micropython-lib/tree/master/micropython/umqtt.simple

import usocket as socket

import ustruct as struct

from ubinascii import hexlify



class MQTTException(Exception):

    pass



class MQTTClient:

    def __init__(

        self,

        client_id,

        server,

        port=0,

        user=None,

        password=None,

        keepalive=0,

        ssl=False,

        ssl_params={},

    ):

        if port == 0:

            port = 8883 if ssl else 1883

        self.client_id = client_id

        self.sock = None

        self.server = server

        self.port = port

        self.ssl = ssl

        self.ssl_params = ssl_params

        self.pid = 0

        self.cb = None

        self.user = user

        self.pswd = password

        self.keepalive = keepalive

        self.lw_topic = None

        self.lw_msg = None

        self.lw_qos = 0

        self.lw_retain = False


    def _send_str(self, s):

        self.sock.write(struct.pack("!H", len(s)))

        self.sock.write(s)


    def _recv_len(self):

        n = 0

        sh = 0

        while 1:

            b = self.sock.read(1)[0]

            n |= (b & 0x7F) << sh

            if not b & 0x80:

                return n

            sh += 7


    def set_callback(self, f):

        self.cb = f


    def set_last_will(self, topic, msg, retain=False, qos=0):

        assert 0 <= qos <= 2

        assert topic

        self.lw_topic = topic

        self.lw_msg = msg

        self.lw_qos = qos

        self.lw_retain = retain


    def connect(self, clean_session=True):

        self.sock = socket.socket()

        addr = socket.getaddrinfo(self.server, self.port)[0][-1]

        self.sock.connect(addr)

        if self.ssl:

            import ssl


            self.sock = ssl.wrap_socket(self.sock, **self.ssl_params)

        premsg = bytearray(b"\x10\0\0\0\0\0")

        msg = bytearray(b"\x04MQTT\x04\x02\0\0")


        sz = 10 + 2 + len(self.client_id)

        msg[6] = clean_session << 1

        if self.user is not None:

            sz += 2 + len(self.user) + 2 + len(self.pswd)

            msg[6] |= 0xC0

        if self.keepalive:

            assert self.keepalive < 65536

            msg[7] |= self.keepalive >> 8

            msg[8] |= self.keepalive & 0x00FF

        if self.lw_topic:

            sz += 2 + len(self.lw_topic) + 2 + len(self.lw_msg)

            msg[6] |= 0x4 | (self.lw_qos & 0x1) << 3 | (self.lw_qos & 0x2) << 3

            msg[6] |= self.lw_retain << 5


        i = 1

        while sz > 0x7F:

            premsg[i] = (sz & 0x7F) | 0x80

            sz >>= 7

            i += 1

        premsg[i] = sz


        self.sock.write(premsg, i + 2)

        self.sock.write(msg)

        # print(hex(len(msg)), hexlify(msg, ":"))

        self._send_str(self.client_id)

        if self.lw_topic:

            self._send_str(self.lw_topic)

            self._send_str(self.lw_msg)

        if self.user is not None:

            self._send_str(self.user)

            self._send_str(self.pswd)

        resp = self.sock.read(4)

        assert resp[0] == 0x20 and resp[1] == 0x02

        if resp[3] != 0:

            raise MQTTException(resp[3])

        return resp[2] & 1


    def disconnect(self):

        self.sock.write(b"\xe0\0")

        self.sock.close()


    def ping(self):

        self.sock.write(b"\xc0\0")


    def publish(self, topic, msg, retain=False, qos=0):

        pkt = bytearray(b"\x30\0\0\0")

        pkt[0] |= qos << 1 | retain

        sz = 2 + len(topic) + len(msg)

        if qos > 0:

            sz += 2

        assert sz < 2097152

        i = 1

        while sz > 0x7F:

            pkt[i] = (sz & 0x7F) | 0x80

            sz >>= 7

            i += 1

        pkt[i] = sz

        # print(hex(len(pkt)), hexlify(pkt, ":"))

        self.sock.write(pkt, i + 1)

        self._send_str(topic)

        if qos > 0:

            self.pid += 1

            pid = self.pid

            struct.pack_into("!H", pkt, 0, pid)

            self.sock.write(pkt, 2)

        self.sock.write(msg)

        if qos == 1:

            while 1:

                op = self.wait_msg()

                if op == 0x40:

                    sz = self.sock.read(1)

                    assert sz == b"\x02"

                    rcv_pid = self.sock.read(2)

                    rcv_pid = rcv_pid[0] << 8 | rcv_pid[1]

                    if pid == rcv_pid:

                        return

        elif qos == 2:

            assert 0


    def subscribe(self, topic, qos=0):

        assert self.cb is not None, "Subscribe callback is not set"

        pkt = bytearray(b"\x82\0\0\0")

        self.pid += 1

        struct.pack_into("!BH", pkt, 1, 2 + 2 + len(topic) + 1, self.pid)

        # print(hex(len(pkt)), hexlify(pkt, ":"))

        self.sock.write(pkt)

        self._send_str(topic)

        self.sock.write(qos.to_bytes(1, "little"))

        while 1:

            op = self.wait_msg()

            if op == 0x90:

                resp = self.sock.read(4)

                # print(resp)

                assert resp[1] == pkt[2] and resp[2] == pkt[3]

                if resp[3] == 0x80:

                    raise MQTTException(resp[3])

                return


    # Wait for a single incoming MQTT message and process it.

    # Subscribed messages are delivered to a callback previously

    # set by .set_callback() method. Other (internal) MQTT

    # messages processed internally.

    def wait_msg(self):

        res = self.sock.read(1)

        self.sock.setblocking(True)

        if res is None:

            return None

        if res == b"":

            raise OSError(-1)

        if res == b"\xd0":  # PINGRESP

            sz = self.sock.read(1)[0]

            assert sz == 0

            return None

        op = res[0]

        if op & 0xF0 != 0x30:

            return op

        sz = self._recv_len()

        topic_len = self.sock.read(2)

        topic_len = (topic_len[0] << 8) | topic_len[1]

        topic = self.sock.read(topic_len)

        sz -= topic_len + 2

        if op & 6:

            pid = self.sock.read(2)

            pid = pid[0] << 8 | pid[1]

            sz -= 2

        msg = self.sock.read(sz)

        self.cb(topic, msg)

        if op & 6 == 2:

            pkt = bytearray(b"\x40\x02\0\0")

            struct.pack_into("!H", pkt, 2, pid)

            self.sock.write(pkt)

        elif op & 6 == 4:

            assert 0

        return op


    # Checks whether a pending message from server is available.

    # If not, returns immediately with None. Otherwise, does

    # the same processing as wait_msg.

    def check_msg(self):

        self.sock.setblocking(False)

        return self.wait_msg()

 

Setelah menyalin kode ke dalam berkas simple.py, simpan perubahan tersebut.

Jika Anda membuka dan mengembangkan folder umqtt, Anda akan melihat bahwa berkas simple.py telah tersimpan di dalamnya.



Klik kanan kembali pada folder umqtt, lalu buat berkas baru dengan memilih New file…

Beri nama berkas tersebut robust.py.”


 

Salin kode robust.py ke dalam berkas baru tersebut. Kode modul ini dapat diperoleh dari pustaka umqtt atau repositori resmi MicroPython yang menyediakan implementasi modul MQTT.

 

# forked from: https://github.com/micropython/micropython-lib/tree/master/micropython/umqtt.robust

import utime

from . import simple



class MQTTClient(simple.MQTTClient):

    DELAY = 2

    DEBUG = False


    def delay(self, i):

        utime.sleep(self.DELAY)


    def log(self, in_reconnect, e):

        if self.DEBUG:

            if in_reconnect:

                print("mqtt reconnect: %r" % e)

            else:

                print("mqtt: %r" % e)


    def reconnect(self):

        i = 0

        while 1:

            try:

                return super().connect(False)

            except OSError as e:

                self.log(True, e)

                i += 1

                self.delay(i)


    def publish(self, topic, msg, retain=False, qos=0):

        while 1:

            try:

                return super().publish(topic, msg, retain, qos)

            except OSError as e:

                self.log(False, e)

            self.reconnect()


    def wait_msg(self):

        while 1:

            try:

                return super().wait_msg()

            except OSError as e:

                self.log(False, e)

            self.reconnect()


    def check_msg(self, attempts=2):

        while attempts:

            self.sock.setblocking(False)

            try:

                return super().wait_msg()

            except OSError as e:

                self.log(False, e)

            self.reconnect()

            attempts -= 1

 

Setelah menyalin kode ke dalam berkas robust.py, simpan perubahan tersebut. Pada tahap ini, folder umqtt seharusnya sudah berisi berkas simple.py dan robust.py.



Modul-modul yang diperlukan untuk komunikasi MQTT telah berhasil diunggah ke Raspberry Pi Pico.

Membuat Berkas Konfigurasi

Selanjutnya, kita akan membuat berkas konfigurasi untuk menyimpan informasi SSID, password Wi-Fi, serta detail broker MQTT seperti URL, username, dan password.

Buat berkas baru bernama config.py di Thonny IDE, kemudian salin kode berikut ke dalamnya:

 

wifi_ssid = 'REPLACE_WITH_YOUR_SSID'

wifi_password = 'REPLACE_WITH_YOUR_PASSWORD'

mqtt_server = b'MQTT_BROKER_URL'

mqtt_username = b'BROKER_USERNAME'

mqtt_password = b'BROKER_PASSWORD'

 

Sesuaikan nilai variabel dengan detail konfigurasi milik Anda.

Jika Anda menggunakan broker Mosquitto lokal, cukup masukkan alamat IP broker tanpa menambahkan nomor port. Contohnya:

 

mqtt_server = b'192.168.1.79'

 

Setelah itu, buka File > Save As…, pilih Raspberry Pi Pico, lalu simpan berkas tersebut dengan nama config.py (timpa jika sudah ada berkas dengan nama yang sama). Pastikan berkas ini disimpan pada direktori utama Raspberry Pi Pico, not di dalam folder umqtt.

Mempublikasikan Pesan MQTT

Pada contoh berikut, Anda akan mempelajari cara melakukan publish pesan MQTT pada sebuah topik menggunakan Raspberry Pi Pico. Sebagai ilustrasi, kita akan mengirim data suhu, kelembapan, dan tekanan dari sensor BME280. Anda juga dapat menggunakan sensor lain atau nilai acak untuk keperluan pengujian konsep. Sebelum melanjutkan, pastikan bahwa:

- Anda telah menghubungkan sensor BME280 ke Raspberry Pi Pico menggunakan GPIO 4 (SDA) dan GPIO 5 (SCL).

- Anda telah mengunggah modul BME280.py agar Pico dapat berkomunikasi dengan sensor. Ikuti panduan pemasangan pustaka BME280 sesuai tutorial yang direkomendasikan.

Kode berikut mengambil data dari sensor BME280 dan mempublikasikan hasil pembacaannya ke beberapa topik MQTT yang berbeda.

 

# Rui Santos & Sara Santos - Random Nerd Tutorials

# Complete project details at https://RandomNerdTutorials.com/raspberry-pi-pico-w-mqtt-micropython/


from machine import Pin, I2C

from time import sleep

import network

from umqtt.simple import MQTTClient

import config

import BME280


# Constants for MQTT Topics

MQTT_TOPIC_TEMPERATURE = 'pico/temperature'

MQTT_TOPIC_PRESSURE = 'pico/pressure'

MQTT_TOPIC_HUMIDITY = 'pico/humidity'


# MQTT Parameters

MQTT_SERVER = config.mqtt_server

MQTT_PORT = 0

MQTT_USER = config.mqtt_username

MQTT_PASSWORD = config.mqtt_password

MQTT_CLIENT_ID = b"raspberrypi_picow"

MQTT_KEEPALIVE = 7200

MQTT_SSL = True   # set to False if using local Mosquitto MQTT broker

MQTT_SSL_PARAMS = {'server_hostname': MQTT_SERVER}


# Initialize I2C communication

i2c = I2C(id=0, scl=Pin(5), sda=Pin(4), freq=10000)


# Initialize BME280 sensor

bme = BME280.BME280(i2c=i2c, addr=0x76)


def get_sensor_readings():

    temp = bme.temperature[:-1]

    hum = bme.humidity[:-1]

    pres = bme.pressure[:-3]

    return temp, hum, pres


def initialize_wifi(ssid, password):

    wlan = network.WLAN(network.STA_IF)

    wlan.active(True)


    # Connect to the network

    wlan.connect(ssid, password)


    # Wait for Wi-Fi connection

    connection_timeout = 10

    while connection_timeout > 0:

        if wlan.status() >= 3:

            break

        connection_timeout -= 1

        print('Waiting for Wi-Fi connection...')

        sleep(1)


    # Check if connection is successful

    if wlan.status() != 3:

        return False

    else:

        print('Connection successful!')

        network_info = wlan.ifconfig()

        print('IP address:', network_info[0])

        return True


def connect_mqtt():

    try:

        client = MQTTClient(client_id=MQTT_CLIENT_ID,

                            server=MQTT_SERVER,

                            port=MQTT_PORT,

                            user=MQTT_USER,

                            password=MQTT_PASSWORD,

                            keepalive=MQTT_KEEPALIVE,

                            ssl=MQTT_SSL,

                            ssl_params=MQTT_SSL_PARAMS)

        client.connect()

        return client

    except Exception as e:

        print('Error connecting to MQTT:', e)

        raise  # Re-raise the exception to see the full traceback


def publish_mqtt(topic, value):

    client.publish(topic, value)

    print(topic)

    print(value)

    print("Publish Done")


try:

    if not initialize_wifi(config.wifi_ssid, config.wifi_password):

        print('Error connecting to the network... exiting program')

    else:

        # Connect to MQTT broker, start MQTT client

        client = connect_mqtt()

        while True:

            # Read sensor data

            temperature, humidity, pressure = get_sensor_readings()


            # Publish as MQTT payload

            publish_mqtt(MQTT_TOPIC_TEMPERATURE, str(temperature))

            publish_mqtt(MQTT_TOPIC_PRESSURE, str(pressure))

            publish_mqtt(MQTT_TOPIC_HUMIDITY, str(humidity))


            # Delay 10 seconds

            sleep(10)


except Exception as e:

print('Error:', e)

 

Cara Kerja Kode

Pada contoh ini, kita menggunakan beberapa topik MQTT untuk mempublikasikan data sensor, yaitu:

- pico/temperature — untuk data suhu

- pico/humidity — untuk data kelembapan

- pico/pressure — untuk data tekanan udara

Alur kerja untuk mempublikasikan data adalah sebagai berikut:

1. Raspberry Pi Pico terhubung ke jaringan internet.

2. Pico melakukan koneksi ke broker MQTT.

3. Setelah koneksi berhasil, perangkat dapat mengirimkan pesan MQTT secara berkala.

Mari kita lihat penjelasan setiap bagian kode.

Mengimpor Library

Pertama, kita mengimpor pustaka yang diperlukan. Modul Pin dan I2C dari machine digunakan untuk berkomunikasi dengan perangkat keras, sedangkan BME280 digunakan untuk mengakses sensor BME280. Modul network diperlukan untuk koneksi Wi-Fi, dan kelas MQTTClient dari umqtt.simple digunakan untuk menjalankan fungsi-fungsi MQTT.

 

from machine import Pin, I2C

from time import sleep

import network

from umqtt.simple import MQTTClient

import config

import BME280

 

Pada variabel berikut, kita mendefinisikan topik MQTT yang akan digunakan sebagai tujuan publikasi pesan (hasil pembacaan sensor).

 

# Constants for MQTT Topics

MQTT_TOPIC_TEMPERATURE = 'pico/temperature'

MQTT_TOPIC_PRESSURE = 'pico/pressure'

MQTT_TOPIC_HUMIDITY = 'pico/humidity'

 

Pada bagian berikut, kita menetapkan parameter MQTT yang diperlukan untuk melakukan koneksi ke broker MQTT. Nilai seperti URL server, username, dan password diambil langsung dari berkas config.py.

 

# MQTT Parameters

MQTT_SERVER = config.mqtt_server

MQTT_PORT = 0

MQTT_USER = config.mqtt_username

MQTT_PASSWORD = config.mqtt_password

MQTT_CLIENT_ID = b"raspberrypi_picow"

MQTT_KEEPALIVE = 7200

MQTT_SSL = True

MQTT_SSL_PARAMS = {'server_hostname': MQTT_SERVER}

 

Parameter `MQTT_CLIENT_ID` harus berupa identitas unik yang digunakan untuk mengidentifikasi klien MQTT secara individual. Anda bebas memberikan nama apa pun, asalkan tidak sama dengan `client_id` klien lain yang terhubung ke broker Anda. Dalam contoh ini, kami menggunakan `raspberrypi_picow`.

 

MQTT_CLIENT_ID = b"raspberrypi_picow"

 

Jika Anda menggunakan broker Mosquitto lokal, atur parameter `MQTT_SSL` menjadi False.

 

MQTT_SSL = False

  

Pada bagian berikut, kita melakukan inisialisasi sensor BME280 dan mendefinisikan fungsi `get_sensor_readings()` yang bertugas mengambil data dari sensor tersebut serta mengembalikan nilai suhu, kelembaban, dan tekanan udara.

 

# Initialize I2C communication

i2c = I2C(id=0, scl=Pin(5), sda=Pin(4), freq=10000)


# Initialize BME280 sensor

bme = BME280.BME280(i2c=i2c, addr=0x76)


def get_sensor_readings():

    temp = bme.temperature[:-1]

    hum = bme.humidity[:-1]

    pres = bme.pressure[:-3]

return temp, hum, pres

 

Initialize Wi-Fi

Fungsi `initialize_wifi()` bertugas mengonfigurasi dan menghubungkan Raspberry Pi Pico ke jaringan nirkabel. Proses inisialisasi Wi-Fi ini wajib dilakukan agar perangkat dapat terhubung ke broker MQTT dan melakukan pertukaran data secara real-time.

 

def initialize_wifi(ssid, password):

    wlan = network.WLAN(network.STA_IF)

    wlan.active(True)


    # Connect to the network

    wlan.connect(ssid, password)


    # Wait for Wi-Fi connection

    connection_timeout = 10

    while connection_timeout > 0:

        if wlan.status() >= 3:

            break

        connection_timeout -= 1

        print('Waiting for Wi-Fi connection...')

        sleep(1)


    # Check if connection is successful

    if wlan.status() != 3:

        return False

    else:

        print('Connection successful!')

        network_info = wlan.ifconfig()

        print('IP address:', network_info[0])

        return True

 

Connect to MQTT

Fungsi `connect_mqtt()` menangani proses koneksi ke broker MQTT dengan memanfaatkan parameter konfigurasi broker yang telah ditentukan sebelumnya, sehingga perangkat dapat melakukan publikasi dan langganan pesan secara efektif.

 

def connect_mqtt():

    try:

        client = MQTTClient(client_id=MQTT_CLIENT_ID,

                            server=MQTT_SERVER,

                            port=MQTT_PORT,

                            user=MQTT_USER,

                            password=MQTT_PASSWORD,

                            keepalive=MQTT_KEEPALIVE,

                            ssl=MQTT_SSL,

                            ssl_params=MQTT_SSL_PARAMS)

        client.connect()

        return client

    except Exception as e:

        print('Error connecting to MQTT:', e)

        raise  # Re-raise the exception to see the full traceback

 

Publish MQTT Messages

Fungsi `publish_mqtt()` digunakan untuk mengirim payload ke topik tertentu pada broker MQTT. Cukup berikan nama topik dan data yang akan dikirim sebagai argumen agar pesan dapat dipublikasikan dengan benar.

 

def publish_mqtt(topic, value):

    client.publish(topic, value)

    print(topic)

    print(value)

print("Publish Done")

 

Publishing Sensor Readings

Setelah seluruh fungsi dan parameter dikonfigurasi, perangkat dapat mulai terhubung ke jaringan dan broker MQTT untuk mengirim data sensor.

Langkah pertama adalah melakukan koneksi Wi-Fi menggunakan SSID dan kata sandi yang diambil dari berkas `config.py`.

 

try:

    if not initialize_wifi(config.wifi_ssid, config.wifi_password):

        print('Error connecting to the network... exiting program')

 

Jika koneksi Wi-Fi berhasil, langkah berikutnya adalah melakukan inisiasi koneksi ke broker MQTT.

else:

 

    # Connect to MQTT broker, start MQTT client

client = connect_mqtt()

 

Setelah koneksi berhasil, modul mengambil data terbaru dari sensor dan menyimpannya ke dalam variabel temperature, humidity, dan pressure.

 

# Read sensor data

temperature, humidity, pressure = get_sensor_readings()

 

Terakhir, fungsi publish_mqtt() digunakan untuk mengirim data sensor ke topik masing-masing. Karena payload MQTT harus berupa string, nilai pembacaan sensor perlu dikonversi terlebih dahulu menggunakan fungsi str().

 

# Publish as MQTT payload

publish_mqtt(MQTT_TOPIC_TEMPERATURE, str(temperature))

publish_mqtt(MQTT_TOPIC_PRESSURE, str(pressure))

publish_mqtt(MQTT_TOPIC_HUMIDITY, str(humidity))

 

Pembacaan sensor diperbarui dan dikirim ke broker setiap interval 10 detik.

sleep(10)

Pengujian Kode

Jalankan skrip tersebut pada Raspberry Pi Pico Anda. Perangkat akan melakukan koneksi ke jaringan dan mulai mengirimkan pesan ke broker setiap 10 detik.





Selanjutnya, kita dapat memverifikasi apakah pesan berhasil diterima oleh klien MQTT yang berlangganan pada topik terkait. HiveMQ menyediakan antarmuka Web Client yang memungkinkan Anda melakukan subscribe dan publish ke berbagai topik untuk keperluan pengujian.

Buka cluster HiveMQ Anda, lalu pilih tab Web Client. Masukkan username dan password MQTT broker Anda, kemudian klik Connect Client.


Langganilah topik yang digunakan Raspberry Pi Pico untuk mengirimkan data. Masukkan pico/temperature, kemudian klik +Subscribe untuk mulai memantau pesan yang diterbitkan.

 

Ulangi langkah yang sama untuk topik pico/humidity dan pico/pressure.


 

Setelah berlangganan ke topik-topik tersebut, gulir halaman ke bagian bawah. Anda seharusnya mulai melihat pesan MQTT yang dikirim oleh Raspberry Pi Pico.


Dan itu saja. Anda telah berhasil mempublikasikan pesan MQTT menggunakan Raspberry Pi Pico. Sekarang, Anda dapat menggunakan klien MQTT lain untuk melakukan subscribe pada topik yang sama dan menerima data tersebut. Misalnya, Anda bisa menggunakan Node-RED nodes atau Adafruit IO widget untuk menampilkan data dalam bentuk grafik atau indikator.

 

Selain itu, perangkat mikrokontroler lain juga dapat berlangganan topik yang sama untuk menerima data bisa berupa Raspberry Pi Pico lain, ESP32, ESP8266, atau papan mikrokontroler lainnya.

Subscribe ke Topik MQTT

Untuk menunjukkan cara melakukan subscribe ke topik MQTT menggunakan Raspberry Pi Pico, kita akan membuat contoh sederhana. Dalam contoh ini, Pico akan melakukan subscribe pada topik pico/le. Kemudian, melalui HiveMQ Web Client, kita akan mempublikasikan pesan ON dan OFF pada topik tersebut. Raspberry Pi Pico akan menerima pesan dan mengendalikan LED sesuai instruksi.


Berikut alur kerja untuk melakukan subscribe ke topik MQTT:

1. Hubungkan Raspberry Pi Pico ke jaringan internet.

2. Lakukan koneksi ke broker MQTT.

3. Subscribe ke topik MQTT yang diinginkan.

4. Buat dan tetapkan fungsi callback yang akan dijalankan setiap kali pesan diterima.

5. Buat loop yang secara terus-menerus memeriksa pesan MQTT baru.

Kode berikut ini melakukan subscribe ke topik pico/led dan mengendalikan LED sesuai dengan pesan yang diterima.

 

# Rui Santos & Sara Santos - Random Nerd Tutorials

# Complete project details at https://RandomNerdTutorials.com/raspberry-pi-pico-w-mqtt-micropython/


from machine import Pin

from time import sleep

import network

from umqtt.simple import MQTTClient

import config


# Define LED

led = Pin('LED', Pin.OUT)


# Constants for MQTT Topics

MQTT_TOPIC_LED = 'pico/led'


# MQTT Parameters

MQTT_SERVER = config.mqtt_server

MQTT_PORT = 0

MQTT_USER = config.mqtt_username

MQTT_PASSWORD = config.mqtt_password

MQTT_CLIENT_ID = b'raspberrypi_picow'

MQTT_KEEPALIVE = 7200

MQTT_SSL = True   # set to False if using local Mosquitto MQTT broker

MQTT_SSL_PARAMS = {'server_hostname': MQTT_SERVER}


# Init Wi-Fi Interface

def initialize_wifi(ssid, password):

    wlan = network.WLAN(network.STA_IF)

    wlan.active(True)


    # Connect to the network

    wlan.connect(ssid, password)


    # Wait for Wi-Fi connection

    connection_timeout = 10

    while connection_timeout > 0:

        if wlan.status() >= 3:

            break

        connection_timeout -= 1

        print('Waiting for Wi-Fi connection...')

        sleep(1)


    # Check if connection is successful

    if wlan.status() != 3:

        return False

    else:

        print('Connection successful!')

        network_info = wlan.ifconfig()

        print('IP address:', network_info[0])

        return True


# Connect to MQTT Broker

def connect_mqtt():

    try:

        client = MQTTClient(client_id=MQTT_CLIENT_ID,

                            server=MQTT_SERVER,

                            port=MQTT_PORT,

                            user=MQTT_USER,

                            password=MQTT_PASSWORD,

                            keepalive=MQTT_KEEPALIVE,

                            ssl=MQTT_SSL,

                            ssl_params=MQTT_SSL_PARAMS)

        client.connect()

        return client

    except Exception as e:

        print('Error connecting to MQTT:', e)


# Subcribe to MQTT topics

def subscribe(client, topic):

    client.subscribe(topic)

    print('Subscribe to topic:', topic)

    

# Callback function that runs when you receive a message on subscribed topic

def my_callback(topic, message):

    # Perform desired actions based on the subscribed topic and response

    print('Received message on topic:', topic)

    print('Response:', message)

    # Check the content of the received message

    if message == b'ON':

        print('Turning LED ON')

        led.value(1)  # Turn LED ON

    elif message == b'OFF':

        print('Turning LED OFF')

        led.value(0)  # Turn LED OFF

    else:

        print('Unknown command')

    

try:

    # Initialize Wi-Fi

    if not initialize_wifi(config.wifi_ssid, config.wifi_password):

        print('Error connecting to the network... exiting program')

    else:

        # Connect to MQTT broker, start MQTT client

        client = connect_mqtt()

        client.set_callback(my_callback)

        subscribe(client, MQTT_TOPIC_LED)

        

        # Continuously checking for messages

        while True:

            sleep(5)

            client.check_msg()

            print('Loop running')

except Exception as e:

print('Error:', e)

 

Jika Anda menggunakan broker Mosquitto lokal, pastikan parameter `MQTT_SSL` diatur menjadi False.

 

MQTT_SSL = False

 

Subscribe ke Topik MQTT

Kita membuat fungsi bernama `subscribe()` yang menerima dua argumen: klien MQTT dan topik yang ingin dijadikan langganan (subscribe).

 

def subscribe(client, topic):

    client.subscribe(topic)

print('Subscribe to topic:', topic)

 

Fungsi Callback

Kita perlu membuat fungsi callback yang akan dijalankan setiap kali pesan baru diterima pada topik yang telah dilanggan. Argumen topic dan message akan secara otomatis diteruskan ke fungsi saat fungsi tersebut dipanggil.

 

def my_callback(topic, message):

    # Perform desired actions based on the subscribed topic and response

    print('Received message on topic:', topic)

    print('Response:', message)

    # Check the content of the received message

    if message == b'ON':

        print('Turning LED ON')

        led.value(1)  # Turn LED ON

    elif message == b'OFF':

        print('Turning LED OFF')

        led.value(0)  # Turn LED OFF

    else:

        print('Unknown command')

 

Dalam fungsi ini, kita memeriksa isi pesan yang diterima. Jika pesan bernilai ON, maka LED bawaan Raspberry Pi Pico akan dinyalakan.

 

if message == b'ON':

    print('Turning LED ON')

led.value(1)  # Turn LED ON

 

Jika pesan bernilai OFF, LED akan dimatikan.

 

elif message == b'OFF':

    print('Turning LED OFF')

    led.value(0)  # Turn LED OFF

 

Apabila pesan yang diterima bukan ON atau OFF, maka akan ditampilkan teks Unknown command.

else:

 

print('Unknown command')

 

Koneksi ke Wi-Fi, Broker MQTT, dan Pemantauan Pesan

Untuk melakukan subscribe ke broker MQTT dan secara terus-menerus memantau pesan yang masuk, langkah pertama adalah memastikan Raspberry Pi Pico terhubung ke jaringan internet. Baris kode berikut bertugas melakukan inisialisasi dan koneksi ke jaringan Wi-Fi:

 

try:

    # Initialize Wi-Fi

    if not initialize_wifi(config.wifi_ssid, config.wifi_password):

        print('Error connecting to the network... exiting program')

 

Jika koneksi berhasil, Raspberry Pi Pico akan terhubung ke broker MQTT.

 

client = connect_mqtt()

 

Selanjutnya, tetapkan fungsi callback menggunakan `set_callback()`, dengan argumen fungsi callback yang telah dibuat sebelumnya, yaitu `my_callback`.

 

client.set_callback(my_callback)

 

Kemudian, lakukan subscribe ke topik MQTT. Dalam contoh ini, kita hanya melakukan subscribe pada `MQTT_TOPIC_LED`, namun Anda dapat berlangganan ke beberapa topik sekaligus.

 

subscribe(client, MQTT_TOPIC_LED)

 

Buat while loop untuk secara terus-menerus memeriksa pesan yang masuk menggunakan metode `check_msg()`.

 

while True:

    sleep(5)

    client.check_msg()

    print('Loop running')

 

Anda juga dapat menambahkan tugas lain dalam loop tersebut. Pada contoh ini, pemeriksaan pesan baru dilakukan setiap lima detik, namun interval dapat disesuaikan tergantung frekuensi penerimaan pesan yang diharapkan.

Pengujian Kode

Jalankan skrip yang telah dibuat pada Raspberry Pi Pico. Perangkat akan terhubung ke jaringan internet dan melakukan subscribe ke topik MQTT yang telah ditentukan.



Selanjutnya, kita akan mempublikasikan beberapa pesan pada topik pico/led untuk mengendalikan LED melalui HiveMQ Web Client.

Buka HiveMQ Web Client pada cluster Anda, masukkan username dan password MQTT broker, lalu klik Connect Client.

 

Gulir halaman ke bagian Publish Message.

Masukkan pico/led pada kolom Topic Name, kemudian ketik ON pada kolom Message.


Terakhir, klik tombol Publish.

Raspberry Pi Pico akan menerima pesan tersebut dan menyalakan LED bawaan sesuai instruksi.



Kembali ke HiveMQ Web Client dan kirim pesan OFF.



Raspberry Pi Pico akan menerima pesan tersebut dan mematikan LED bawaan.

 


Anda telah berhasil melakukan subscribe ke topik MQTT dan mengeksekusi tugas sesuai dengan pesan yang diterima. Kini, alih-alih menggunakan HiveMQ Web Client, Anda dapat memanfaatkan platform Home Automation atau IoT lain yang mendukung MQTT untuk membuat antarmuka web dengan tombol atau saklar yang mengirimkan pesan MQTT.

 

Baca juga: Cara Membuat Web Server Asinkron di Raspberry Pi Pico W Menggunakan MicroPython 











Siap Untuk Membuat Proyek Impianmu Menjadi Kenyataan?

Klik di sini untuk chat langsung via WhatsApp dan dapatkan dukungan langsung dari tim ahli kami! 

 

0 on: "Panduan Lengkap Memulai MQTT di Raspberry Pi Pico W dengan MicroPython"