프로그래밍/ESP32와 아두이노

[아두이노#555] ESP32를 MQTT프로토콜을 이용해서 스마트폰으로 제어해보기!(녹칸다ESP32#5)

덕력킹 2023. 4. 19. 23:00
반응형

https://youtube.com/live/YgOKdlwLTH4

[아두이노#555] ESP32를 MQTT프로토콜을 이용해서 스마트폰으로 제어해보기!(녹칸다ESP32#5)

녹칸다의 ESP32시리즈이다!
제목 그대로 과거의 녹칸다는 IoT보드로 ESP8266보드만 활용했다!
ESP32에 대한 수요도 늘어나는것 같고 제일 중요한 것은 지금의 녹칸다가 ESP32보드가 필요하게 되었다!
ESP8266으로 만들어진 예제들을 ESP32버전으로 바꾸는게 주요 주제라고 할 수 있다!
그와 동시에 약간의 설명도 첨가해서 이것저것 예제를 만들어보도록 하자!
(ESP8266과 ESP32의 차이점을 강조해서 진행해보도록함!)
(근데 거의 80~90%는 거기서 거기인듯!)

이번편은 기존 녹칸다가 ESP8266으로 만들어두었던 MQTT 예제를 ESP32버전으로 바꾸는 작업을 진행해보도록 한다!(사실 헤더파일만 교체하면 바로 작동된다)
ESP32를 WiFi에 연결하고 MQTT프로토콜을 이용해서 제어하거나 센서값을 측정해낼 수 있다!

이때 ESP32는 MQTT클라이언트로 동작하고 서버를 MQTT 브로커라고 부른다!
MQTT서버도 직접 구현하면 좋겠지만 일단 외국에서 무료로 서비스하는 MQTT브로커를 활용하도록 한다!
(ESP8266때도 그렇게 했었다)
자신감이 생기면 서버도 직접 설치해서 작동시켜보도록 하자!

MQTT는 클라이언트끼리의 통신이다!
그러므로 스마트폰이든 PC는 MQTT클라이언트를 구현해낼 수 있다면 ESP32를 원격으로 제어가 가능하다!
그리고 외국의 MQTT서버를 활용하기 때문에 집밖에서 집안에 있는 ESP32를 컨트롤 하는게 가능하다!
(단, TOPIC이 단순하면 나만 제어가능한게 아니라 누구든 제어할 수 있다)
(단, 외국에서 제공하던 서버가 갑자기 서비스를 종료하면 사용이 불가능하다)

이번 555편에서는 같은 개념으로 MQTT를 적용해보고자 한다!
1.ESP32보드에 MQTT프로토콜을 이용해서 스마트폰으로 제어하기!
2.ESP32보드 여러대에 MQTT프로토콜을 이용해서 1:N 제어해보기!
3.ESP32보드가 보드를 제어해보기!(보드가 보드를 제어하기)

ESP8266때 하긴했지만 MQTT에 전반적인 개념을 습득하고 어떻게 하면 ESP32를 그와 동일하게 작동시킬 수 있을지 함께 알아보도록 하자!

 

(참고자료1 ESP32핀맵)
https://docs.espressif.com/projects/esp-idf/en/latest/esp32/hw-reference/esp32/user-guide-devkitm-1.html
(참고자료2 INPUT_PULLUP가능핀)
불가능 34,35,2,36,39
가능 32, 33,25,26,14,27,12,13,22,23,19,21,5,18,16,17,4,15
(참고자료3 ESP32의 I2C핀)
SDA : 21
SCL : 22
(참고자료4 ESP32의 SPI핀)
SCK : 18
MOSI : 23
MISO : 19
CS : 5
(참고자료5 ESP32의 Serial핀)
RX : 16
TX : 17

(참고자료6 ESP8266에 MQTT로 스마트폰제어하기#178)
https://bota.tistory.com/1417
(참고자료7 ESP8266보드끼리 MQTT로제어하기#209)
https://bota.tistory.com/1451
(참고자료8 C#윈폼에서 MQTT로 ESP8266제어하기#104)
https://bota.tistory.com/1527

(깨알지식)
1.MQTT는 5가지 용어만 알고있으면 된다!(브로커/broker, 발행/publish, 구독/subscribe, 토픽/topic, 페이로드/payload)
2.A,B,C 3개의 MQTT클라이언트 단말이 있을때 A가 "ABC"라는 topic으로 브로커에게 발행을할때 B가 "ABC"라는 토픽을 구독신청해놓았다면 B가 A가보낸 payload를 수신하게된다! 그리고 A가 "DEF"라는 토픽에 payload를 담아서 브로커에게 전송하면 C가 "DEF"라는 토픽을 구독신청 해놓았을때 C가 수신하게된다! 그리고 B와 C가 "123"이라는 토픽을 둘다 구독신청해놓은 상태일때 A가 "123"이라는 토픽으로 발행하게되면 둘다 동시에 받게된다!
3.ESP32에 MQTT를 적용하기 위해서는 pubsubclient라이브러리가 필요하다!
4.MQTT에 사용하는 서버도 내가 직접 구현할 수 있으면 구현하는게 좋다! 그러나 브로커를 내가 직접 설치하지 않고 외국에서 무료로 서비스하는 MQTT브로커를 활용하도록 하겠다! 그리고 그 브로커의 주소가 broker.mqtt-dashboard.com 이것이다!
5.MQTT에서 구독(subscribe)신청은 ESP32가 MQTT서버에게 신청을 통해서 가능한 것이고 ESP32가 MQTT서버에 접속한다음 구독등록을 해야한다!(접속이 완료된후 구독신청을 하는것)
6.접속이 끊어졌을때 끊어지기 직전에 신청해놓은 구독TOPIC은 무효이다! 재접속을 하면 구독신청을 새로해야한다! 서버 입장에서는 재접속한 클라이언트는 직전에 연결되어있던 클라이언트와 서로다른녀석이다!
7.현재 스마트폰에 들어갈 MQTT앱은 우리가 직접 구현이 불가능하기 때문에 앱스토어에서 가장 대표적인 MQTT DASH라는것을 다운로드 받아서 활용해보도록한다! 지금 녹칸다가 할 설명은 그 앱을 사용하는 방법과 관련이있다!
8.특별하지 않으면 MQTT는 문자열단위로 데이터를 주고받는다!
9.MQTT수신부에 payload가 byte배열이기때문에 배열의 문법을 따라야한다!
10.MQTT에 client.publish함수의 payload부분은 char배열(char*)이 들어가야한다!
11.아두이노의 String하고 char*은 서로 다른 것이다!
12.String을 char*로 바꾸는 함수가 있다!(.c_str())

(예제)
1.스마트폰에서 보낸 메시지를 ESP32에 시리얼모니터에서 출력하고 ESP32에서 2초간격으로 전송하는 메시지를 스마트폰에 출력하시오!

555-1(기본적인송수신확인).txt
0.00MB

2.ESP32의 15번핀에 LED를 1개 연결하고 스마트폰이 문자 0을 전송하면 LED를 끄고 문자 1을 전송하면 LED를 켜는 예시를 보이시오!

555-2(led1개를제어하는예시).txt
0.00MB

3.ESP32의 15번핀과 2번핀에 LED를 연결하고 스마트폰에서 아래와 같은 명령을 보낼때 제어되도록 하시오!
   0 : LED1을 OFF
   1 : LED1을 ON
   2 : LED2를 OFF
   3 : LED2를 ON

555-3(LED2개를제어하는예제).txt
0.00MB

4.(예제3에서) 온습도센서(DHT-11)를 4번핀에 연결하고 측정값을 CSV형식으로 스마트폰으로 전송하시오!

555-4(온습도센서값전송하기).txt
0.00MB

5.(예제3에서) ESP32보드 3대에 LED를 동일하게 연결한다음 topic을 서로 다르게해서 스마트폰에서 3대의 ESP32보드를 개별적으로 제어하는 예시를 보이시오!
  보드1의 수신 토픽 : nockanda/esp1/input
  보드2의 수신 토픽 : nockanda/esp2/input
  보드3의 수신 토픽 : nockanda/esp3/input

555-5-1(1호기).txt
0.00MB
555-5-2(2호기).txt
0.00MB
555-5-3(3호기).txt
0.00MB

6.(예제3에서) ESP32보드 2대를 각각 1호기와 2호기라고 할때 1호는 예제 3을 그대로 유지하면서 버튼 2개를 각각 18번과 19번에 연결한다! 2호기에도 LED가 2개가 연결되어있고 1호기에서 18번버튼을 누르면 2호기의 1번 LED가 토글된다! 1호기의 19번버튼을 누르면 2호기의 2번LED가 토글되도록 하시오!
  2호기가 1호기로부터 1을 전송받으면 LED 1번이 토글된다!
  2호기가 1호기로부터 2를 전송받으면 LED 2번이 토글된다!

555-6-1(1호기).txt
0.00MB
555-6-2(2호기).txt
0.00MB

7.(예제4번에서) ESP32보드 2대를 각각 1호기와 2호기라고 할때 1호기는 예제 4번과 동일하게 온습도센서와 LED2개를 연결하고 2호기는 LED2개와 1602LCD를 연결한다! 1호기에서 publish한 온습도값을 2호기에서 수신해서 시리얼모니터에 출력하시오!(led2개를 각각 제어하는 예시는 그대로두고 온습도센서값만 1호기에서 2호기로 넘겨서 시리얼모니터에 출력)

555-7-1(1호기).txt
0.00MB
555-7-2(2호기).txt
0.00MB

8.ESP32보드에 15번핀에 LED가 1개 있을때 스마트폰에서 LED가 작동되는 시간을 밀리초단위로 전송하면 LED가 해당되는 시간만큼 켜졌다가 꺼지도록 하시오!.

555-8(LED가일정시간켜졌다가꺼진다).txt
0.00MB

반응형