STM32F746 및 X-NUCLEO-IKS01A3를 사용한 머신챗(Machinechat)

소프트웨어

프로젝트 부품

아두이노에서, “Additional boards manager URLs:” 필드에 다음 링크를 사용하여 STM32 지원을 추가합니다.

https://github.com/stm32duino/BoardManagerFiles/raw/master/STM32/package_stm_index.json

아두이노 Library Manager를 통해 다음 라이브러리를 추가합니다:

다음 라이브러리 종속 항목(library dependency) 설치를 승인합니다:

Lab1

STM32H746을 USB 커넥터(CN1)를 통해 PC에 연결하고 아두이노의 Blink 예제를 활용하여 보드를 프로그래밍할 수 있는지 확인합니다. 이 코드는 LD1을 깜박일 것입니다.

void setup() {
  // initialize digital pin LED_BUILTIN as an output
  pinMode(LED_BUILTIN, OUTPUT);
};

void loop() {
  digitalWrite(LED_BUILTIN, HIGH);
  delay(500);
  digitalWrite(LED_BUILTIN, LOW);
  delay(500);
}

전체 소스:

검증 및 업로드:
LD1이 깜박여야 합니다.

Lab2

STM32H746에는 STM32Ethernet 라이브러리를 통해 활성화 할 수 있는 온보드 이더넷이 있습니다. Ethernet.begin()으로 이 라이브러리를 초기화한 다음 Ethernet.localIP()를 사용하여 새 IP 주소를 디버그 터미널에 프린트합니다. 이 예제에서 IP 주소는 로컬 DHCP 서버로부터 얻어야 합니다.

LwIP.h와 STM32Ethernet.h 헤더 파일을 추가합니다:

#include <LwIP.h>
#include <STM32Ethernet.h>

디버깅을 위해 직렬 포트를 활성화합니다:

  // Open serial communications and wait for port to open:
  Serial.begin(115200);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }

이더넷 라이브러리를 초기화합니다.

  // give the ethernet module time to boot up:
  delay(1000);

  // start the Ethernet connection:
  Ethernet.begin();

  // print the Ethernet board/shield's IP address:
  Serial.print("My IP address: ");
  Serial.println(Ethernet.localIP());

전체 소스

검증 및 업로드:
아두이노의 직렬 모니터가 IP 주소를 전달해야 합니다.

My IP address: 192.168.3.229

Lab3

다음으로, Ethernet.linkStatus()를 사용하여 활성 링크가 있는지 확인합니다. LED는 연결이 활성화 되어야만 켜질 것입니다. 이더넷 케이블을 제거하여 시험합니다.

void loop() {
  if (Ethernet.linkStatus() == LinkON) {
    Serial.println("Link status: On");

    digitalWrite(LED_BUILTIN, HIGH);
  }
  else if (Ethernet.linkStatus() == LinkOFF) {
    Serial.println("Link status: Off");

    digitalWrite(LED_BUILTIN, LOW);
  } 
  delay(500); 
}

전체 소스

검증 및 업로드:
아두이노의 직렬 모니터가 LD1의 상태와 일치하는 링크 상태를 전달해야 하며, 확인은 이더넷 케이블을 뽑아 봅니다.

My IP address: 192.168.3.229
Link status: On
Link status: On
Link status: Off
Link status: Off
Link status: On

Lab4

STTS751 센서를 추가합니다.

#include <STTS751Sensor.h>

STTS751Sensor *STTS751_Temp;
  // Initialize I2C bus.
  Wire.begin();

  // Initialize STTS751 Sensor 
  STTS751_Temp = new STTS751Sensor (&Wire);
  STTS751_Temp->Enable();
void loop() {
  //Read STTS751 Temperature
  float STTS751_tempC = 0;
  STTS751_Temp->GetTemperature(&STTS751_tempC);
  float STTS751_tempF = (STTS751_tempC * 1.8) + 32.0F;

  Serial.print(" | Temp[F]: ");
  Serial.print(STTS751_tempF, 2);
  Serial.println(" |");

전체 소스

검증 및 업로드:
아두이노의 직렬 모니터에 이제는 STTS751의 온도 데이터가 포함되어야 합니다.

My IP address: 192.168.3.229
 | Temp[F]: 74.30 |
Link status: On
 | Temp[F]: 74.30 |
Link status: On

Lab5

HTS221 센서를 추가합니다.

#include <HTS221Sensor.h>

HTS221Sensor *HTS221_HumTemp;
  // Initialize HTS221 Sensor 
  HTS221_HumTemp = new HTS221Sensor (&Wire);
  HTS221_HumTemp->Enable();
  // Read HTS221 Humidity and Temperature
  float HTS221_humidity = 0, HTS221_tempC = 0;
  HTS221_HumTemp->GetHumidity(&HTS221_humidity);
  HTS221_HumTemp->GetTemperature(&HTS221_tempC);
  float HTS221_tempF = (HTS221_tempC * 1.8) + 32.0F;

  Serial.print(" | Temp[F]: ");
  Serial.print(STTS751_tempF, 2);
  Serial.print(" | Temp[F]: ");
  Serial.print(HTS221_tempF, 2);
  Serial.print("| Hum[%]: ");
  Serial.print(HTS221_humidity, 2); 
  Serial.println(" |");

전체 소스

검증 및 업로드:
아두이노의 직렬 모니터에 이제는 HTS221의 온도와 습도 데이터가 포함되어야 합니다.

My IP address: 192.168.3.229
 | Temp[F]: 74.07 | Temp[F]: 72.32| Hum[%]: 41.20 |
Link status: On
 | Temp[F]: 74.19 | Temp[F]: 72.32| Hum[%]: 41.20 |
Link status: On

Lab6

LPS22HH 센서를 추가합니다.

#include <LPS22HHSensor.h>

LPS22HHSensor *LPS22HH_PressTemp;
  // Initialize LPS22HH Sensor 
  LPS22HH_PressTemp= new LPS22HHSensor(&Wire);
  LPS22HH_PressTemp->Enable();
  // Read LPS22HH Pressure and Temperature.
  float LPS22HH_pressure = 0, LPS22HH_tempC = 0;
  LPS22HH_PressTemp->GetPressure(&LPS22HH_pressure);
  LPS22HH_PressTemp->GetTemperature(&LPS22HH_tempC);
  float LPS22HH_tempF = (LPS22HH_tempC * 1.8) + 32.0F;

  Serial.print(" | Temp[F]: ");
  Serial.print(STTS751_tempF, 2);
  Serial.print(" | Temp[F]: ");
  Serial.print(HTS221_tempF, 2);
  Serial.print(" | Temp[F]: ");
  Serial.print(LPS22HH_tempF , 2);
  Serial.print("| Hum[%]: ");
  Serial.print(HTS221_humidity, 2); 
  Serial.print(" | Pres[hPa]: ");
  Serial.print(LPS22HH_pressure, 2); 
  Serial.println(" |");

전체 소스

검증 및 업로드:
아두이노의 직렬 모니터에 이제는 LPS22HH의 온도와 압력 데이터가 포함되어야 합니다.

My IP address: 192.168.3.229
 | Temp[F]: 73.96 | Temp[F]: 72.14 | Temp[F]: 74.35| Hum[%]: 41.30 | Pres[hPa]: 979.12 |
Link status: On
 | Temp[F]: 73.96 | Temp[F]: 72.14 | Temp[F]: 74.35| Hum[%]: 41.30 | Pres[hPa]: 978.99 |
Link status: On

Lab7

Json 데이터 객체를 생성합니다.

#include <ArduinoJson.h>
// Create a unique ID for the data from each STM32 running this code
const char* jediID = "STM32F7_IKSO1A3";
void loop() {
  String postData;

  StaticJsonDocument <200> doc;
  
  JsonObject context = doc.createNestedObject("context");
  context["target_id"] = String(jediID);

  JsonObject data = doc.createNestedObject("data");
  data["HTS221_humidity"] = HTS221_humidity;
  data["HTS221_tempF"] = HTS221_tempF;
  data["LPS22HH_pressure"] = LPS22HH_pressure;
  data["LPS22HH_tempF"] = LPS22HH_tempF;
  data["STTS751_tempF"] = STTS751_tempF;

  serializeJson(doc, postData);

  //This prints the JSON to the serial monitor screen
  Serial.println(postData);

전체 코드

검증 및 업로드:
아두이노의 직렬 모니터에 이제는 Json 데이터 객체가 포함되어야 합니다.

{"context":{"target_id":"STM32F7_IKSO1A3"},"data":{"HTS221_humidity":41,"HTS221_tempF":72.14,"LPS22HH_pressure":978.8882,"LPS22HH_tempF":74.39,"STTS751_tempF":73.9625}}

Lab8

Json 데이터 객체를 전송합니다.

#include <ArduinoHttpClient.h>
char serverAddress[] = "192.168.3.104";  // server address
int port = 8100;

// initialize the library instance:
EthernetClient eth;
HttpClient client = HttpClient(eth, serverAddress, port);
  if (Ethernet.linkStatus() == LinkON) {
    Serial.println("Link status: On");

    digitalWrite(LED_BUILTIN, HIGH);

    String contentType = "application/json";

    client.post("/v1/data/mc", contentType, postData);

    // read the status code and body of the response
    int statusCode = client.responseStatusCode();
    String response = client.responseBody();
  
    Serial.print("Status code: ");
    Serial.println(statusCode);
    Serial.print("Response: ");
    Serial.println(response);
  }
  else if (Ethernet.linkStatus() == LinkOFF) {
    Serial.println("Link status: Off");

    digitalWrite(LED_BUILTIN, LOW);
  }  
  delay(500);
}

전체 소스

검증 및 업로드:
아두이노의 직렬 모니터로 이제는 서버 응답 코드가 전달됩니다.

Status code: 200
Response: "Data sent successfully"


영문 원본: Machinechat with STM32F746 and X-NUCLEO-IKS01A3