행복한 하루

아두이노 나노(Arduino Nano) 33 IoT Web Server에서 데이터 Json으로 출력하기 본문

Embedded/Arduino

아두이노 나노(Arduino Nano) 33 IoT Web Server에서 데이터 Json으로 출력하기

변화의 물결 2021. 8. 14. 00:03

 

 

안녕하세요.

  

 아두이노 나노 33 IoT로 웹서버를 만들어 보았다면, 아두이노 IoT에서 취득한 센서 정보를 어떻게 가져갈까 고민을 하게 될 겁니다. 그래서 웹 데이터를 Json형태로 바꿔 출력해주고 다른 응용프로그램에서 웹주소로 접속해서 Json으로 가져오면 되겠다 생각하였습니다.

 아두이노 IoT에서 가스 센싱 한 값을 Json으로 인코딩하고 웹서버로 출력해주고 파이썬에서 Json 데이터로 읽어오는 테스트를 하였습니다.

 

  이전 "아두이노 나노(Arduino Nano) 33 IoT 고정 아이피 설정 방법"에서 SimpleWebServerWIFI 예제에 Json 코드를 추가하는 형태로 하였습니다.


1. Json사전 준비

 - 이미 Json 사용해보았다면 이 과정은 넘어가도 좋습니다. "툴->라이브러리 관리"로 들어가서 arduinoJson으로 검색합니다. 최신 버전 6.x로 설치해줍니다. 버전 5.x 와 차이가 있기 때문에 이전 json 라이브러리를 사용하셨던 분은 확인이 조금 필요해 보입니다.

 

2. Json 데이터 코드 추가

 - Json 라이브러리를 사용하기 위해서 헤더 파일을 추가해줍니다. 

#include <ArduinoJson.h>

 

 - 아날로그 데이터를 수신하기 위해서 핀을 설정해줍니다. 

int SMOKE_PIN_A0 = A0;
int IO_PIN0 = 9;

void setup() {
  Serial.begin(9600);      // initialize serial communication
  pinMode(SMOKE_PIN_A0, INPUT);
  pinMode(IO_PIN0, OUTPUT);
  ...
}

 

 - 취득한 센서 값을 Json 값으로 만들어 줍니다. 

void loop() {
...
      if (client.available()) {
      ...
        DynamicJsonDocument doc(200);
        doc["rssi"] = WiFi.RSSI();  // 수신감도
        doc["gas"] = getGAS_SENSOR(); // 가스값 출력
        serializeJson(doc, client);

        // The HTTP response ends with another blank line:
        client.println();
       }

 

 - 가스 센서(아날로그) 값을 받는 함수를 구현합니다. 

int getGAS_SENSOR() {
  int analogSensor = analogRead(SMOKE_PIN_A0);

  Serial.print("GAS Pin A0: ");
  Serial.println(analogSensor);

  delay(50);

  return analogSensor;
} //getGAS_SENSOR()

3. ArduinoJson version 5 형식으로 할 경우 발생하는 에러

 - 만약 변수 선언 시 version 5형식으로 했다면 에러가 발생하고 업그레이드 확인하라고 나옵니다.

 예) StaticJsonBuffer<256> jsonBuffer;

 https://arduinojson.org/v6/doc/upgrade/

 - ArduinoJson 6로 변경합니다.

StaticJsonDocument<256> doc;

 

 - 예) 출력 코드 수정할 부분

// ArduinoJson 5

obj.printTo(Serial);

 

//With ArduinoJson 6, you call the function serializeJson() and pass the JsonArray, JsonObject, or the JsonDocument.

 

// ArduinoJson 6

serializeJson(doc, Serial);

 

- 결과적으로 https://arduinojson.org/v6/doc/upgrade/ 사이트에 마지막 Summary 부분을 부분을 보면 ArduinoJson 5과 ArduinoJson 6 차이를 빠르게 알 수 있습니다. 코드가 좀 더 간결해졌습니다.

 

 4. 실행 결과

 - 웹서버 주소로 이동하면 RSSI 값과 가스센서의 아날로그 값이 Json 형태로 나오는 것을 알 수 있습니다. 그리고 리플래쉬(Refresh)를 누르면 수신감도와 가스센서 값이 변화하는 것을 볼 수 있습니다.

 

 

 - 아두이노 웹서버로 접속한 결과 

5. 응용 프로그램에서 값 수신하기

 - 파이썬을 이용해서 간단하게 아두이노 33 IoT Web Server 내용을 가져옵니다. PyCharm 프로그램을 이용해서 파이썬 프로그램을 작성했습니다. 다른 파이썬 프로그램 이용해서 테스트 보시면 됩니다. 

 - responseJson.get() 함수에서 키값을 넣으면 키 값(gas)에 대한 값을 확인할 수 있습니다.

 

 

import json
from urllib.request import urlopen

def getGas(ip):
    response = urlopen("http://" + ip).read().decode('utf-8')
    responseJson = json.loads(response)
    return responseJson.get("gas")

if __name__ == '__main__':
    print(getGas("192.168.0.110"))

 

감사합니다.

 

 

<참고 사이트>

1. ArduinoJson 데이터의 Decoding / Encoding 예제

https://fishpoint.tistory.com/5079?category=626454

2. Migrating from version 5 to 6

https://arduinojson.org/v6/doc/upgrade/

3. 파이썬으로 JSON 파싱 하기

https://m.blog.naver.com/shino1025/221272830091  

 

 

Comments