STM32F746とX-NUCLEO-IKS01A3を使用したMachinechat

RobertCNelson Applications Engineer

ソフトウェア

プロジェクトハードウェア

Arduino IDEの「Additional Boards Managers URLs」フィールドに次のリンクを使用して、STM32のサポートを追加します。

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

Arduinoのライブラリマネージャからこれらのライブラリを追加します。

これらのライブラリ依存関係のインストールを承認します。

Lab1

STM32H746をUSBコネクタ(CN1)経由でPCに接続し、簡単なLED点滅デモを使用してボードをプログラムできることを確認しましょう。このコードは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);
}

Full Source:

ベリファイしてアップロードします。
LD1が点滅します。

Lab2

STM32H746にはオンボードEthernetが搭載されており、STM32Ethernetライブラリを通じて有効にすることができます。Ethernet.begin()を使用してこのライブラリを初期化し、次にEthernet.localIP()を使用して新しいIP アドレスをデバッグ端末に出力します。この例では、ローカルDHCPサーバからIPアドレスを取得する必要があります。

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
  }

Ethernetライブラリを初期化します。

  // 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());

Full Source

ベリファイしてアップロードすると、Arduinoシリアル モニタがIPアドレスを報告します

My IP address: 192.168.3.229

Lab3

次に、Ethernet.linkStatus()を使って、アクティブなリンクがあることを確認します。LEDが点灯するのは、アクティブな接続があるときだけです。Ethernetケーブルを取り外してテストします。

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); 
}

Full Source

ベリファイしてアップロードすると、ArduinoのシリアルモニタにLD1と一致するリンクステータスが表示されるので、Ethernetケーブルを抜いて確認します。

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(" |");

Full Source

ベリファイしてアップロードすると、Arduinoのシリアル モニタに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(" |");

Full Source

ベリファイしてアップロードすると、Arduinoのシリアルモニタに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(" |");

Full Source

ベリファイしてアップロードすると、Arduinoシリアルモニタに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);

Full Source

ベリファイしてアップロードすると、Arduinoのシリアルモニタに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);
}

Full Source

ベリファイしてアップロードすると、Arduinoのシリアルモニタがサーバ応答コードを報告します。

Status code: 200
Response: "Data sent successfully"




オリジナル・ソース(English)