소프트웨어
프로젝트 부품
아두이노에서, “Additional boards manager URLs:” 필드에 다음 링크를 사용하여 STM32 지원을 추가합니다.
https://github.com/stm32duino/BoardManagerFiles/raw/master/STM32/package_stm_index.json
아두이노 Library Manager를 통해 다음 라이브러리를 추가합니다:
다음 라이브러리 종속 항목(library dependency) 설치를 승인합니다:
- STM32duino LwIP
- STM32duino LSM6DSO
- STM32duino LIS2DW12
- STM32duino LIS2MDL
- STM32duino HTS221
- STM32duino LPS22HH
- STM32duino STTS751
- STM32duino LSM6DSOX
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"