#define M5STACK_MPU6886 //IMUを使う場合は,#include よりも前に,この#defineを置く. #include #include #include #include //WiFi Definition #define WIFI_SSID "ここにWiFiのSSID名を記入" #define WIFI_PASSWORD "ここにWifiのパスワードを記入" //AWS Definition #define AWS_ENDPOINT "ここにコピーしたAWS IoTのエンドポイントを入力" #define MQTT_PORT 8883 #define PUBLISH_TOPIC DEVICE_NAME "/publish" #define SUBSCRIBE_TOPIC DEVICE_NAME "/subscribe" //Device Difinition #define DEVICE_NAME "m5stack" #define QOS 0 // 温度 float temp = 0.0F; //加速度 float accX = 0.0F; // Define variables for storing inertial sensor data float accY = 0.0F; float accZ = 0.0F; void callback(char *, byte *, unsigned int); WiFiClientSecure https_client; PubSubClient mqtt_client(https_client); //証明書類ここから. //ファイル名:AmazonRootCA1.cer static const char AWS_IOT_ROOT_CA[] PROGMEM = R"EOF( //ここに証明書の文字列をコピー )EOF"; //ファイル名:XXXXXXXXXX-certificate.pem.crt static const char AWS_IOT_DEVICE_CERT[] PROGMEM = R"KEY( //ここに証明書の文字列をコピー )KEY"; //ファイル名:XXXXXXXXXX-private.pem.key static const char AWS_IOT_DEVICE_PRIVATE_KEY[] PROGMEM = R"KEY( //ここに証明書の文字列をコピー )KEY"; //証明書類ここまで. // WiFi接続 void connect_wifi() { M5.Lcd.print("WiFi Connecting to "); M5.Lcd.println(""); WiFi.begin(WIFI_SSID, WIFI_PASSWORD); while (WiFi.status() != WL_CONNECTED) { M5.Lcd.print("."); delay(500); } M5.Lcd.println("Connected"); M5.Lcd.printf("IPv4: %s", WiFi.localIP().toString().c_str()); M5.Lcd.println(""); } // AWS IoT 接続 bool connect_awsiot() { https_client.setCACert(AWS_IOT_ROOT_CA); https_client.setCertificate(AWS_IOT_DEVICE_CERT); https_client.setPrivateKey(AWS_IOT_DEVICE_PRIVATE_KEY); mqtt_client.setServer(AWS_ENDPOINT, MQTT_PORT); mqtt_client.setCallback(callback); while (!mqtt_client.connected()) { M5.Lcd.println("MQTT connection..."); if (mqtt_client.connect(DEVICE_NAME)) { M5.Lcd.println("Connected"); mqtt_client.subscribe(SUBSCRIBE_TOPIC, QOS); M5.Lcd.println("Subscribed."); delay(1000); return true; } else { M5.Lcd.printf("Failed, rc=%d", mqtt_client.state()); M5.Lcd.println(""); return false; } } } void publish() { // メッセージ用文字列作成処理-----ここから---------- String msg = "{\n"; msg +="\"temp\": "; //キー(ここではtemp)とコロンを設定. "temp":としてmsgに格納される. msg += temp; //値を追加 msg += ","; //区切りのカンマ msg +="\"accZ\": "; msg += accZ; msg += "\n}"; // メッセージ用文字列作成処理----ここまで---------- mqtt_client.publish(PUBLISH_TOPIC, (char*) msg.c_str()); } void callback(char *topic, byte *payload, unsigned int length) { } void setup() { M5.Lcd.setTextSize(2);//フォントサイズを少し大きく. M5.begin(); M5.IMU.Init(); //IMUの初期化 // WiFi 接続 connect_wifi(); if (connect_awsiot()) { // AWS IoT 接続 delay(500); // Set Screen M5.begin(); M5.Power.begin(); } } void loop() { //温度センサの値取得と摂氏単位変換 static uint16_t result; Wire.beginTransmission(0x5A); // Send Initial Signal and I2C Bus Address 发送初始信号和I2C总线地址 Wire.write(0x07); // Send data only once and add one address automatically. 只发送一次数据,并自动添加一个地址。 Wire.endTransmission(false); // Stop signal 停止信号 Wire.requestFrom(0x5A, 2); // Get 2 consecutive data from 0x5A, and the data is stored only. 从0x5A中获取2个连续的数据,并且只存储这些数据。 result = Wire.read(); // Receive DATA 接收数据 result |= Wire.read() << 8; // Receive DATA 接收数据 temp = result * 0.02 - 273.15; //加速度センサの値取得 M5.IMU.getAccelData(&accX,&accY,&accZ); //Stores the triaxial accelerometer. //双方の値,表示 M5.Lcd.setCursor(0, 120); M5.Lcd.printf("accX, accY, accZ"); M5.Lcd.setCursor(0, 140); M5.Lcd.printf("%5.2f %5.2f %5.2f G", accX, accY, accZ);//加速度 M5.Lcd.setCursor(70, 180); M5.Lcd.printf("Temp:%.3f",temp); //温度 // Publish Message mqtt_client.loop(); publish(); delay(10000); }