MKR WiFi 1010 및 Sensirion SHT31 센서를 사용하는 Machinechat

요약

이 프로젝트는 Seeed의 SHT31 센서 보드로부터 온도와 습도를 읽을 수 있도록 아두이노 MKR WiFi 1010 보드를 설정하고 와이파이를 사용하여 센서 데이터를 Machinechat의 JDEI One IoT 데이타 수집기에 HTTP post합니다. JEDI One은 라즈베리 파이 4로 구동됩니다

image

image

하드웨어

소프트웨어

  • JEDI One
    JEDI One은 바로 사용할 수 있는 IoT 데이터 관리 소프트웨어 솔루션입니다. 기능에는 센서, 장치 및 기계로부터 데이터 수집, 직관적인 실시간 및 과거 데이터와 시스템 뷰 대시보드 구축, 데이터를 모니터링하여 자동으로 데이터 조건에 응답하는 규칙 생성, 이메일과 SMS로 경고 알림 수신 등이 있습니다.

  • 아두이노
    아두이노는 사용하기 쉬운 하드웨어와 소프트웨어에 기반한 오픈 소스 전자 장치 플랫폼입니다.

구현

이 프로젝트에서, MKR WiFi 1010은 SHT31 센서에 연결하고 센서와의 통신에는 I2C를 사용합니다. 전기적 연결은 아래와 같습니다:

MKR WiFi 1010 핀 SHT31 센서 핀
VCC (3.3V) VCC
GND GND
12 SCL SCL
11 SDA SDA

MKR WiFi 1010과 SHT31 센서 어플리케이션 설정

1 - MKR WiFi 1010에 아두이노를 설정합니다. 링크 참조: Getting started with the MKR WiFi 1010

2 - 애플리케이션에 필요한 라이브러리를 설치합니다. 아두이노의 Library Manager를 통해 아래 라이브러리를 추가합니다:

3 - 코드 검토 (파일명: MKR1010wifi_sht31rev1.ino)

초기 설정 및 와이파이 네트워크 연결

#include <Arduino.h>
#include <WiFiNINA.h>
#include <ArduinoHttpClient.h>
#include "arduino_secrets.h" 
#include <Wire.h>
#include "SHT31.h"

// Create a unique ID for the data from MKRWiFi1010 running this code
const char* jediID = "MKR1010WiFiSensor_SHT31";

//include Json library
#include <ArduinoJson.h>

///////please enter your sensitive data in the Secret tab/arduino_secrets.h
char ssid[] = SECRET_SSID;        // your network SSID (name)
char pass[] = SECRET_PASS;    // your network password (use for WPA, or use as key for WEP)
int status = WL_IDLE_STATUS;     // the Wifi radio's status

// IP address of server or Raspberry Pi running Machinechat JEDI software
// If you changed the JEDI port number, replace 8100 with the new port
char serverAddress[] = "192.168.1.7";  // server address
int port = 8100;

WiFiClient client;
HttpClient http = HttpClient(client, serverAddress, port);
 
SHT31 sht31 = SHT31();
 
void setup() {  
  Serial.begin(9600);
  while(!Serial);
  Serial.println("begin...");  
  sht31.begin();  

  // attempt to connect to Wifi network:
  WiFi.begin(ssid, pass);  
  Serial.print("Attempting to connect to network: ");
  Serial.println(ssid);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
 
  // you're connected now, so print out the data:
  Serial.println("You're connected to the network");
  Serial.println("----------------------------------------");
  printData();
  Serial.println("----------------------------------------");
}
// wifi network info
void printData() {
  Serial.println("Board Information:");
  // print your board's IP address:
  IPAddress ip = WiFi.localIP();
  Serial.print("IP Address: ");
  Serial.println(ip);
  Serial.println();
  Serial.println("Network Information:");
  Serial.print("SSID: ");
  Serial.println(WiFi.SSID());
  // print the received signal strength:
  long rssi = WiFi.RSSI();
  Serial.print("signal strength (RSSI):");
  Serial.println(rssi);
  byte encryption = WiFi.encryptionType();
  Serial.print("Encryption Type:");
  Serial.println(encryption, HEX);
  Serial.println();
}

센서 데이터를 JSON 형식으로 설정하고 HTTP post를 사용하여 JEDI One으로 전송

Set up sensor data in JSON format and send to JEDI One using HTTP post

void loop() {
  // prep for sending HTTP to JEDI One
  String postData1; //Json string 

  // SHT31 sensor info
  float tempC = sht31.getTemperature();
  float humid = sht31.getHumidity();
  Serial.print("Temp = "); 
  Serial.print(tempC);
  Serial.println(" C"); 
  Serial.print("Hum = "); 
  Serial.print(humid);
  Serial.println("%"); 
  Serial.println();
  
  //Following code creates the serialized JSON string to send to JEDI One
  //using ArduinoJson library
  StaticJsonDocument <200> doc;
  JsonObject context = doc.createNestedObject("context");
  context["target_id"] = String(jediID);
  JsonObject data = doc.createNestedObject("data");
  data["tempC"] = tempC;
  data["humi"] = humid;
  serializeJson(doc, postData1);
  Serial.println(postData1);    //debug, can be commented out

  //HTTP post code start
  if (WiFi.status() == WL_CONNECTED) {
    //format http post to be compatible with JEDI one
    String contentType = "application/json";
    http.post("/v1/data/mc", contentType, postData1);
    // read the status code and body of the response
    int statusCode = http.responseStatusCode();
    String response = http.responseBody();
    Serial.print("Status code: ");
    Serial.println(statusCode);
    Serial.print("Response: ");
    Serial.println(response);
  } else {
    Serial.println("Error in WiFi connection");
  }
  
  delay(10000); //delay between sensor measurements
}

MKR WiFi 1010 SHT31 센서 어플리케이션의 최신 소스 코드는 아래 링크의 github에 있습니다:

JEDI One 설정

1 - Machinechat의 JEDI One이 라즈베리 파이에 아직 설치되지 않은 경우 아래를 참조하십시오:

2 - JEDI One 대시보드 설정

JEDI One에서, “Dashboards” 탭을 선택한 다음 "+"를 선택하여 새 차트를 추가하고 설정합니다.

차트 이름을 지정하고, "Chart Type"을 선택, "Source"는 MKR1010WiFiSensor_SHT31를 선택, "Property"는 humi 또는 tempC를 선택, 그리고 "Units"과 "Refresh Interval"을 입력합니다. 완료되면 대시보드는 아래와 비슷하게 보일 것입니다.

결론

Machinechat의 JEDI One 데이터 관리 소프트웨어와 라즈베리 파이의 조합의 결과는 저렴한 독립형의 사용하기 쉬운 IoT 데이터 관리 플랫폼입니다. MKR WiFi 1010과 같은 아두이노 하드웨어 플랫폼에 기반한 센서는 저렴하고 JEDI One을 추가해 구현하기 쉽습니다.

참고 자료



영문 원본: Machinechat with MKRWiFi1010 and Sensirion SHT31 sensor