아두이노 우노 R4 - MQTT

이번 튜토리얼에서는 Arduino UNO R4를 사용하여 MQTT 프로토콜을 통해 MQTT 브로커로 데이터를 보내고 받는 방법을 배웁니다. 다음 사항을 다룰 것입니다:

아두이노 UNO R4 MQTT

우리는 두 가지 예시를 살펴볼 것입니다:

Hardware Preparation

1×Arduino UNO R4 WiFi Amazon
1×USB Cable Type-C 쿠팡 | Amazon
1×(Recommended) Screw Terminal Block Shield for Arduino UNO R4 쿠팡 | Amazon
1×(Recommended) Breadboard Shield For Arduino UNO R4 쿠팡 | Amazon
1×(Recommended) Enclosure For Arduino UNO R4 Amazon
1×(Recommended) Power Splitter For Arduino UNO R4 Amazon
공개: 이 섹션에서 제공된 링크 중 일부는 제휴 링크입니다. 이 링크를 통해 구매한 경우 추가 비용없이 수수료를 받을 수 있습니다. 지원해 주셔서 감사합니다.

아두이노 UNO R4 및 MQTT에 대하여

Arduino UNO R4를 프로그래밍하여 MQTT 브로커(또는 MQTT 서버)를 통해 데이터를 송수신하는 방법을 배울 것입니다. MQTT 브로커는 다음과 같습니다.

  • 인터넷에 있는 MQTT 브로커(예: Mosquitto 또는 AWS IoT).
  • 컴퓨터에 설정된 MQTT 브로커(예: Mosquitto 또는 HiveMQ).
  • Raspberry Pi에서 실행 중인 MQTT 브로커(예: Mosquitto).
  • 클라우드에 있는 MQTT 브로커(예: AWS EC2의 Mosquitto 또는 HiveMQ).

이 가이드에서는 Arduino UNO R4가 온라인 Mosquitto 브로커에 연결할 수 있는지부터 확인합니다. Arduino UNO R4는 인터넷을 통해 이 브로커로 메시지를 보내고 받을 것입니다.

다음으로, 컴퓨터에 Mosquitto 브로커를 설치할 것입니다. 그 후, Arduino UNO R4를 우리 컴퓨터의 MQTT 브로커에 연결할 것입니다. 이를 통해 이 로컬 브로커를 통해 데이터를 송수신할 것입니다.

Arduino UNO R4를 온라인 MQTT 브로커에 연결하기

이 섹션에서는 Mosquitto에서 제공하는 온라인 MQTT 서비스인 test.mosquitto.org에 Arduino UNO R4를 연결하는 방법을 이해할 것입니다. 이 서비스는 오직 테스트 용도로만 제공된다는 점을 기억하세요.

아두이노 UNO R4 코드

이 Arduino UNO R4 코드는 다음과 같은 작업을 수행합니다:

  • MQTT 브로커에 연결
  • 토픽 구독
  • 구독한 동일한 토픽에 정기적으로 메시지 전송
/* * 이 Arduino UNO R4 코드는 newbiely.kr 에서 개발되었습니다 * 이 Arduino UNO R4 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino-uno-r4/arduino-uno-r4-mqtt */ #include <WiFiS3.h> #include <MQTTClient.h> #include <ArduinoJson.h> const char WIFI_SSID[] = "YOUR_WIFI_SSID"; // CHANGE TO YOUR WIFI SSID const char WIFI_PASSWORD[] = "YOUR_WIFI_PASSWORD"; // CHANGE TO YOUR WIFI PASSWORD const char MQTT_BROKER_ADRRESS[] = "test.mosquitto.org"; // CHANGE TO MQTT BROKER'S ADDRESS const int MQTT_PORT = 1883; const char MQTT_CLIENT_ID[] = "YOUR-NAME-arduino-uno-r4"; // CHANGE IT AS YOU DESIRE const char MQTT_USERNAME[] = ""; // CHANGE IT IF REQUIRED, empty if not required const char MQTT_PASSWORD[] = ""; // CHANGE IT IF REQUIRED, empty if not required // The MQTT topics that Arduino should publish/subscribe const char PUBLISH_TOPIC[] = "YOUR-NAME-arduino-uno-r4/loopback"; // CHANGE IT AS YOU DESIRE const char SUBSCRIBE_TOPIC[] = "YOUR-NAME-arduino-uno-r4/loopback"; // CHANGE IT AS YOU DESIRE const int PUBLISH_INTERVAL = 5000; // 5 seconds WiFiClient network; MQTTClient mqtt = MQTTClient(256); unsigned long lastPublishTime = 0; void setup() { Serial.begin(9600); int status = WL_IDLE_STATUS; while (status != WL_CONNECTED) { Serial.print("Arduino UNO R4 - Attempting to connect to SSID: "); Serial.println(WIFI_SSID); // Connect to WPA/WPA2 network. Change this line if using open or WEP network: status = WiFi.begin(WIFI_SSID, WIFI_PASSWORD); // wait 5 seconds for connection: delay(5000); } // print your board's IP address: Serial.print("IP Address: "); Serial.println(WiFi.localIP()); connectToMQTT(); } void loop() { mqtt.loop(); if (millis() - lastPublishTime > PUBLISH_INTERVAL) { sendToMQTT(); lastPublishTime = millis(); } } void connectToMQTT() { // Connect to the MQTT broker mqtt.begin(MQTT_BROKER_ADRRESS, MQTT_PORT, network); // Create a handler for incoming messages mqtt.onMessage(messageHandler); Serial.print("Arduino UNO R4 - Connecting to MQTT broker"); while (!mqtt.connect(MQTT_CLIENT_ID, MQTT_USERNAME, MQTT_PASSWORD)) { Serial.print("."); delay(100); } Serial.println(); if (!mqtt.connected()) { Serial.println("Arduino UNO R4 - MQTT broker Timeout!"); return; } // Subscribe to a topic, the incoming messages are processed by messageHandler() function if (mqtt.subscribe(SUBSCRIBE_TOPIC)) Serial.print("Arduino UNO R4 - Subscribed to the topic: "); else Serial.print("Arduino UNO R4 - Failed to subscribe to the topic: "); Serial.println(SUBSCRIBE_TOPIC); Serial.println("Arduino UNO R4 - MQTT broker Connected!"); } void sendToMQTT() { StaticJsonDocument<200> message; message["timestamp"] = millis(); message["data"] = analogRead(0); // Or you can read data from other sensors char messageBuffer[512]; serializeJson(message, messageBuffer); mqtt.publish(PUBLISH_TOPIC, messageBuffer); Serial.println("Arduino UNO R4 - sent to MQTT:"); Serial.print("- topic: "); Serial.println(PUBLISH_TOPIC); Serial.print("- payload:"); Serial.println(messageBuffer); } void messageHandler(String &topic, String &payload) { Serial.println("Arduino UNO R4 - received from MQTT:"); Serial.println("- topic: " + topic); Serial.println("- payload:"); Serial.println(payload); }

Detailed Instructions

다음 지침을 단계별로 따르세요:

  • Arduino Uno R4 WiFi/Minima를 처음 사용하는 경우, Arduino IDE에서 Arduino Uno R4 WiFi/Minima 환경 설정하기에 대한 튜토리얼을 참조하십시오.
  • USB 케이블을 사용하여 Arduino Uno R4 보드를 컴퓨터에 연결합니다.
  • 컴퓨터에서 Arduino IDE를 실행합니다.
  • 적절한 Arduino Uno R4 보드(예: Arduino Uno R4 WiFi)와 COM 포트를 선택합니다.
  • Arduino IDE 왼쪽에 있는 "라이브러리 매니저" 아이콘을 클릭하여 엽니다.
  • 검색 상자에 MQTT를 입력하고 Joel Gaehwiler의 MQTT 라이브러리를 검색합니다.
  • Install 버튼을 클릭하여 MQTT 라이브러리를 추가합니다.
Arduino UNO R4 MQTT 라이브러리
  • 검색 상자에 ArduinoJson을 입력하고 Benoit Blanchon의 ArduinoJson 라이브러리를 찾습니다. 그런 다음, Install 버튼을 클릭하여 라이브러리를 설치하세요.
아두이노 UNO R4 Json 라이브러리
  • 코드를 복사하여 Arduino IDE에서 엽니다.
  • 코드에서 WiFi 세부 정보(SSID 및 비밀번호)를 본인의 것으로 변경하세요.
  • 코드에서 'YOUR-NAME'을 세 번 찾게 됩니다. 이를 자신의 이름이나 문자(공백 없이)로 변경하세요. 이 변경은 동일 코드를 실행하는 여러 사용자로 인한 충돌을 방지하기 위해 중요합니다.
  • Arduino IDE에서 Upload 버튼을 클릭하여 코드를 Arduino UNO R4에 업로드하세요.
  • 시리얼 모니터를 엽니다.
  • 시리얼 모니터에서 결과를 확인하세요.
COM6
Send
IP Address: 192.168.0.2 Arduino UNO R4 - Connecting to MQTT broker Arduino UNO R4 - Subscribed to the topic: YOUR-NAME-arduino-uno-r4/loopback Arduino UNO R4 - MQTT broker Connected! Arduino UNO R4 - sent to MQTT: - topic: YOUR-NAME-arduino-uno-r4/loopback - payload:{"timestamp":11757,"data":255} Arduino UNO R4 - received from MQTT: - topic: YOUR-NAME-arduino-uno-r4/loopback - payload: {"timestamp":11757,"data":255} Arduino UNO R4 - sent to MQTT: - topic: YOUR-NAME-arduino-uno-r4/loopback - payload:{"timestamp":16896,"data":259} Arduino UNO R4 - received from MQTT: - topic: YOUR-NAME-arduino-uno-r4/loopback - payload: {"timestamp":16896,"data":259}
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

Arduino UNO R4는 MQTT 브로커에게 메시지를 보낸 후 동일한 메시지를 다시 받습니다. 이는 메시지를 보낸 주제로부터 메시지를 수신하도록 설정되어 있기 때문입니다. Arduino UNO R4가 자신의 메시지를 수신하지 않도록 하려면 전송 및 수신에 다른 주제를 사용하면 됩니다.

아두이노 UNO R4를 PC에 설치된 MQTT 브로커에 연결하기

모스키토 MQTT 브로커 설치하기

  • C: 드라이브가 아니라 D: 드라이브에 설치하세요. 이는 가능한 문제를 피하는 데 도움이 됩니다.

모스키토 MQTT 브로커 실행

이제 다음 단계들을 통해 MQTT 브로커가 제대로 작동하는지 확인해 봅시다:

  • Mosquitto를 설치한 폴더로 이동합니다. 예를 들어 D:\Draft\mosquitto와 같이 이동합니다. test.conf라는 파일을 만들고, 다음 세부 사항을 그 파일에 붙여넣은 후, 이 폴더에 파일을 저장합니다.
listener 1883 allow_anonymous true
  • 컴퓨터에서 명령 프롬프트를 관리자 권한으로 엽니다. 이를 "브로커 창"이라고 부릅니다. 튜토리얼을 완료할 때까지 이 창을 닫지 않도록 주의하세요.
윈도우 명령 프롬프트 관리자
  • 다음 명령어들을 순서대로 실행하십시오:
cd /d D:\Draft\mosquitto mosquitto -v -c test.conf
  • 당신은 알아차릴 것입니다:
Command Prompt
Microsoft Windows [Version 10.0.19045.3930] (c) Microsoft Corporation. All rights reserved. C:\WINDOWS\system32>cd /d D:\Draft\mosquitto D:\Draft\mosquitto>mosquitto -v -c test.conf 1710918939: mosquitto version 2.0.18 starting 1710918939: Config loaded from test.conf. 1710918939: Opening ipv6 listen socket on port 1883. 1710918939: Opening ipv4 listen socket on port 1883. 1710918939: mosquitto version 2.0.18 running
  • 컴퓨터에서 관리자 권한으로 새 명령 프롬프트를 엽니다.
  • 컴퓨터의 IP 주소를 찾으려면 다음 명령을 실행하세요:
ipconfig
Command Prompt
C:\WINDOWS\system32>ipconfig Windows IP Configuration Ethernet adapter: Subnet Mask . . . . . . . . . . . : 255.0.0.0 IPv4 Address. . . . . . . . . . . : 192.168.0.11 Subnet Mask . . . . . . . . . . . : 255.255.255.0 Default Gateway . . . . . . . . . :
  • 향후 참조를 위해 IP 주소를 기록해 주세요. 제공된 예시: 192.168.0.11.

모스키토 브로커가 작동하는지 테스트하십시오.

  • 컴퓨터에서 관리자 권한으로 다른 명령 프롬프트를 엽니다. 이를 "구독자 창"이라고 부릅니다.
  • 주제를 구독하려면 "당신의 IP 주소"를 실제 IP 주소로 바꾸면서 다음 명령어를 하나씩 입력하세요:
cd /d D:\Draft\mosquitto mosquitto_sub -h 192.168.0.11 -p 1883 -t arduino-uno-r4/send
  • 관리자 권한으로 컴퓨터에서 추가 명령 프롬프트를 엽니다. 이를 발행자 창이라고 명명합니다.
  • 동일한 주제에 메시지를 발행하려면 다음 명령을 차례로 실행하세요 (IP 주소로 대체하십시오):
cd /d D:\Draft\mosquitto mosquitto_pub -h 192.168.0.11 -p 1883 -t arduino-uno-r4/send -m "Hello, MQTT!"
  • 알림:
Command Prompt
Microsoft Windows [Version 10.0.19045.3930] (c) Microsoft Corporation. All rights reserved. C:\WINDOWS\system32>cd /d D:\Draft\mosquitto D:\Draft\mosquitto>mosquitto_pub -h 192.168.0.11 -p 1883 -t arduino-uno-r4/send -m "Hello, MQTT!" D:\Draft\mosquitto>

메시지는 다음과 같이 구독자 창으로 전송됩니다:

Command Prompt
Microsoft Windows [Version 10.0.19045.3930] (c) Microsoft Corporation. All rights reserved. C:\WINDOWS\system32>cd /d D:\Draft\mosquitto D:\Draft\mosquitto>mosquitto_sub -h 192.168.0.11 -p 1883 -t arduino-uno-r4/send Hello, MQTT!

당신의 PC에 Mosquitto MQTT 브로커를 성공적으로 설치했습니다. 브로커 창, 구독자 창, 그리고 발행자 창 세 창을 닫지 마십시오. 우리는 다음에 그것들을 사용할 것입니다.

아두이노 UNO R4 코드

다음 코드는 Arduino UNO R4용이며 다음 작업을 수행합니다:

  • MQTT 브로커에 연결
  • 주제에 구독
  • 다른 주제로 정기적으로 메시지 전송
/* * 이 Arduino UNO R4 코드는 newbiely.kr 에서 개발되었습니다 * 이 Arduino UNO R4 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino-uno-r4/arduino-uno-r4-mqtt */ #include <WiFiS3.h> #include <MQTTClient.h> #include <ArduinoJson.h> const char WIFI_SSID[] = "YOUR_WIFI_SSID"; // CHANGE TO YOUR WIFI SSID const char WIFI_PASSWORD[] = "YOUR_WIFI_PASSWORD"; // CHANGE TO YOUR WIFI PASSWORD //const char MQTT_BROKER_ADRRESS[] = "test.mosquitto.org"; // CHANGE TO MQTT BROKER'S ADDRESS const char MQTT_BROKER_ADRRESS[] = "192.168.0.11"; // CHANGE TO MQTT BROKER'S IP ADDRESS const int MQTT_PORT = 1883; const char MQTT_CLIENT_ID[] = "arduino-uno-r4"; // CHANGE IT AS YOU DESIRE const char MQTT_USERNAME[] = ""; // CHANGE IT IF REQUIRED, empty if not required const char MQTT_PASSWORD[] = ""; // CHANGE IT IF REQUIRED, empty if not required // The MQTT topics that Arduino should publish/subscribe const char PUBLISH_TOPIC[] = "arduino-uno-r4/send"; // CHANGE IT AS YOU DESIRE const char SUBSCRIBE_TOPIC[] = "arduino-uno-r4/receive"; // CHANGE IT AS YOU DESIRE const int PUBLISH_INTERVAL = 5000; // 5 seconds WiFiClient network; MQTTClient mqtt = MQTTClient(256); unsigned long lastPublishTime = 0; void setup() { Serial.begin(9600); int status = WL_IDLE_STATUS; while (status != WL_CONNECTED) { Serial.print("Arduino UNO R4 - Attempting to connect to SSID: "); Serial.println(WIFI_SSID); // Connect to WPA/WPA2 network. Change this line if using open or WEP network: status = WiFi.begin(WIFI_SSID, WIFI_PASSWORD); // wait 10 seconds for connection: delay(10000); } // print your board's IP address: Serial.print("IP Address: "); Serial.println(WiFi.localIP()); connectToMQTT(); } void loop() { mqtt.loop(); if (millis() - lastPublishTime > PUBLISH_INTERVAL) { sendToMQTT(); lastPublishTime = millis(); } } void connectToMQTT() { // Connect to the MQTT broker mqtt.begin(MQTT_BROKER_ADRRESS, MQTT_PORT, network); // Create a handler for incoming messages mqtt.onMessage(messageHandler); Serial.print("Arduino UNO R4 - Connecting to MQTT broker"); while (!mqtt.connect(MQTT_CLIENT_ID, MQTT_USERNAME, MQTT_PASSWORD)) { Serial.print("."); delay(100); } Serial.println(); if (!mqtt.connected()) { Serial.println("Arduino UNO R4 - MQTT broker Timeout!"); return; } // Subscribe to a topic, the incoming messages are processed by messageHandler() function if (mqtt.subscribe(SUBSCRIBE_TOPIC)) Serial.print("Arduino UNO R4 - Subscribed to the topic: "); else Serial.print("Arduino UNO R4 - Failed to subscribe to the topic: "); Serial.println(SUBSCRIBE_TOPIC); Serial.println("Arduino UNO R4 - MQTT broker Connected!"); } void sendToMQTT() { StaticJsonDocument<200> message; message["timestamp"] = millis(); message["data"] = analogRead(0); // Or you can read data from other sensors char messageBuffer[512]; serializeJson(message, messageBuffer); mqtt.publish(PUBLISH_TOPIC, messageBuffer); Serial.println("Arduino UNO R4 - sent to MQTT:"); Serial.print("- topic: "); Serial.println(PUBLISH_TOPIC); Serial.print("- payload:"); Serial.println(messageBuffer); } void messageHandler(String &topic, String &payload) { Serial.println("Arduino UNO R4 - received from MQTT:"); Serial.println("- topic: " + topic); Serial.println("- payload:"); Serial.println(payload); // You can process the incoming data as json object, then control something /* StaticJsonDocument<200> doc; deserializeJson(doc, payload); const char* message = doc["message"]; */ }

Detailed Instructions

  • 위의 코드를 복사하여 Arduino IDE에서 엽니다.
  • 코드에서 WiFi 세부 정보(SSID 및 비밀번호)를 본인 것으로 변경합니다.
  • 코드에서 MQTT 브로커 주소(도메인 이름 또는 IP 주소)를 변경합니다.
  • Arduino IDE에서 Upload 버튼을 클릭하여 Arduino UNO R4에 코드를 전송합니다.

아두이노 UNO R4에서 MQTT를 통해 PC로 메시지 보내기

Arduino UNO R4는 arduino-uno-r4/send라는 MQTT 토픽에 정보를 보냅니다. 컴퓨터에서는 Subscriber Window가 해당 토픽을 구독하여 데이터를 수신합니다.

  • 시리얼 모니터를 열어 아두이노 UNO R4가 주기적으로 토픽에 메시지를 보내는 것을 확인하세요.
COM6
Send
IP Address: 192.168.0.2 Arduino UNO R4 - Connecting to MQTT broker Arduino UNO R4 - Subscribed to the topic: arduino-uno-r4/receive Arduino UNO R4 - MQTT broker Connected! Arduino UNO R4 - sent to MQTT: - topic: arduino-uno-r4/send - payload:{"timestamp":10708,"data":311} Arduino UNO R4 - sent to MQTT: - topic: arduino-uno-r4/send - payload:{"timestamp":15837,"data":298} Arduino UNO R4 - sent to MQTT: - topic: arduino-uno-r4/send - payload:{"timestamp":20965,"data":291} Arduino UNO R4 - sent to MQTT: - topic: arduino-uno-r4/send - payload:{"timestamp":26094,"data":286}
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  
  • 구독자 창을 보면 Arduino UNO R4에서 보낸 메시지가 다음과 같이 표시되는 것을 알 수 있습니다.
Command Prompt
Microsoft Windows [Version 10.0.19045.3930] (c) Microsoft Corporation. All rights reserved. C:\WINDOWS\system32>cd /d D:\Draft\mosquitto D:\Draft\mosquitto>mosquitto_sub -h 192.168.0.11 -p 1883 -t arduino-uno-r4/send Hello, MQTT! {"timestamp":10708,"data":311} {"timestamp":15837,"data":298} {"timestamp":20965,"data":291} {"timestamp":26094,"data":286}

PC에서 Arduino UNO R4로 메시지를 MQTT를 통해 보내기

Arduino UNO R4는 arduino-uno-r4/receive 주제로부터 메시지를 수신하도록 설정되어 있습니다. PC의 Publisher 창에서 Arduino UNO R4와 통신하기 위해 이 주제로 메시지를 보냅니다.

  • Arduino UNO R4가 구독한 주제에 메시지를 보내려면 출판자 창에서 이 명령을 사용하십시오:
mosquitto_pub -h 192.168.0.11 -p 1883 -t arduino-uno-r4/receive -m "Hello, Arduino UNO R4!"
  • Arduino UNO R4가 이 메시지를 수신하는 것을 시리얼 모니터에서 확인할 수 있습니다.
COM6
Send
Arduino UNO R4 - received from MQTT: - topic: arduino-uno-r4/receive - payload: Hello, Arduino UNO R4!
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

Video Tutorial

비디오 제작은 시간이 많이 걸리는 작업입니다. 비디오 튜토리얼이 학습에 도움이 되었다면, YouTube 채널 을 구독하여 알려 주시기 바랍니다. 비디오에 대한 높은 수요가 있다면, 비디오를 만들기 위해 노력하겠습니다.

※ OUR MESSAGES

  • Please feel free to share the link of this tutorial. However, Please do not use our content on any other websites. We invested a lot of effort and time to create the content, please respect our work!