Embedded/Arduino

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

변화의 물결1 2024. 7. 3. 00:20

 

 

안녕하세요.

  

 아두이노 나노 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  

 

 

반응형