ARDUINO 장치 연결하기 (MQTT Ethernet 활용)
Arduino 장치를 연결하는 다양한 방식 중 MQTT 통신을 활용한 네트워크(Network) 방식으로 통신하는 샘플을 소개합니다.
1. 아두이노 코딩하기
1) 아두이노 IDE를 활용하여 코딩한다.
#include <ESP8266WiFi.h> #include <PubSubClient.h> WiFiClient espClient; PubSubClient client(espClient); // Wi-fi 설정 const char* ssid = "AAAA"; const char* password = "14571769"; // MQTT 설정 const char* mqttServer = "192.168.43.228"; //Enter Your mqttServer address const int mqttPort = 1883; //Port number unsigned long previous_time = 0; #define interval 1000 int FAN = D7; int SENSOR = D1; char state = 0; int fanState = 0; int sensorState = 0; char MQTT_data_send[30] = ""; void setup() { delay(1000);
Serial.begin(115200);
pinMode(FAN, OUTPUT); pinMode(SENSOR, INPUT); WiFi.begin(ssid, password);
// Wi-fi와 연결을 시도한다. // 연결이 되지 않았을 경우 재시도한다. while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.println("Connecting to WiFi.."); }
Serial.print("Connected to WiFi :"); Serial.println(WiFi.SSID());
client.setServer(mqttServer, mqttPort); client.setCallback(MQTTcallback);
// MQTT 서버와 연결을 시도한다. // 연결이 되지 않았을 경우 재시도한다. while (!client.connected()) { Serial.println("Connecting to MQTT..."); if (client.connect("ESP8266")) { Serial.println("connected"); } else { Serial.print("failed with state "); Serial.println(client.state()); //If you get state 5: mismatch in configuration delay(2000); } } //해당 Topic을 구독한다. client.subscribe("xisom/fan"); } // 구독한 Topic에 메세지가 올 경우 void MQTTcallback(char* topic, byte* payload, unsigned int length) {
String message; for (int i = 0; i < length; i++) { message = message + (char)payload[i]; //Conver *byte to String }
//받은 메세지에 따라 팬 상태를 변경한다. if(message == "0") { if(fanState == 0) return; fanState = 0; digitalWrite(FAN,fanState); } else if(message == "1") { if(fanState == 1) return; fanState = 1; digitalWrite(FAN,fanState); } } void loop() { client.loop(); if (millis() - previous_time >= interval) { // 근접센서 상태를 읽는다. sensorState = digitalRead(SENSOR); if(sensorState == 0) sprintf(MQTT_data_send, "%d", 1); else if (sensorState == 1) sprintf(MQTT_data_send, "%d", 0); // 해당 Topic에 메세지를 보낸다. client.publish("xisom/proximity", MQTT_data_send);
// 팬 상태를 읽는다. fanState = digitalRead(FAN); sprintf (MQTT_data_send, "%d", fanState); // 해당 Topic에 메세지를 보낸다. client.publish("xisom/fan", MQTT_data_send);
state = ~state; previous_time = millis(); } } |
2. X-SCADA 화면 구성하기
1) 다양한 이미지(Images)와 텍스트(Text), 레이블(Label) 등을 이용하여 화면을 구성한다.
3. X-SCADA 장치 및 태그 설정하기
1) 장치 탐색기(Device Explorer)에서 마우스 오른쪽 클릭 후 장치 추가(New Device)를 클릭한다.
2) 생성된 장치의 속성(Properties)에서 이름(Name)을 설정한 뒤 마우스 오른쪽 클릭 후 네트워크 연결 추가(New Network)를 클릭한다.
3) 속성(Preperties) > 일반(General) > 프로토콜(Protocol)에서 “MQTT Subscriber”를 선택한다.
4) 아두이노 장치의 설정에 맞게 MQTT, 원격지주소(RemoteAddress) 등을 설정한다.
5) 태그 탐색기(Tag Explorer)에서 디지털 태그(Digital Tag)를 2개 생성한 뒤 아래와 같이 설정한다.
- Fan (Digital Tag) : 장치(Device) = Arduino_MQTT , 장치내 주소(DeviceAddress) = xisom/fan
- Proximity (Digital Tag) : 장치(Device) = Arduino_MQTT , 장치내 주소(DeviceAddress) = xisom/proximity
- 연결한 장치와 장치내 주소는 아두이노 설정에 따라 달라질 수 있음
4. X-SCADA 동작 및 효과 설정하기
1) Proximity Sensor의 램프 이미지 더블클릭 후 점멸 효과(Blink)를 추가한 뒤 아래와 같이 설정한다.
2) Fan 이미지에는 애니메이션(Animation) > 회전 효과(Rotation)를 아래와 같이 설정한다.
3) Proximity Sensor의 레이블(Label) 선택 후 속성(Properties)에서 바인딩 태그(Binding Tag)를 설정한다.
4) Fan의 레이블(Label) 선택 후 속성(Properties)에서 바인딩 태그(Binding Tag)를 설정한 뒤, 더블클릭 후 아래와 같이 클릭 – 태그값 설정(Click – Tag Value)을 설정한다.
5. 프로젝트 실행하기
1) 프로젝트 저장 후 X-SCADA Viewer로 실행한다.
2) 아두이노 실습 키트의 예시 (와이파이(Wi-Fi)를 통한 MQTT 통신 모습)