행복한 하루
아두이노 나노(Arduino Nano) 33 IoT Web Server에서 데이터 Json으로 출력하기 본문
아두이노 나노(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
'Embedded > Arduino' 카테고리의 다른 글
아두이노 나노(Arduino Nano)와 아두이노 나노 33 IoT에 FreeRTOS에서 올리기 (0) | 2021.08.23 |
---|---|
아두이노 나노(Arduino Nano) 33 IoT 고정 아이피(Static IP) 설정 방법 (0) | 2021.08.13 |
아두이노 나노(Arduino Nano 33 IoT) BLE를 이용한 자이로 센서(Gyroscope) 값 가져오기 – 3 (4) | 2021.08.04 |
아두이노 나노(Arduino Nano 33 IoT) BLE를 이용한 LED 제어 – 2 (0) | 2021.07.25 |
아두이노 나노(Arduino Nano 33 IoT) BLE 사용하기 – 1 (연결하기) (4) | 2021.07.24 |