This tutorial will use the M5Core2 to obtain values from the ENV Unit (temperature, humidity, and pressure sensor) and upload them to AWS IoT Core. It exemplifies how to program a device to connect to the AWS cloud service platform, enabling data subscription and publication.
Before connecting, you must first register a new device through the AWS Management Console. Click here to access the AWS Management Console , and log in after creating an account.
Click AWS services
-> IoT Core
to enter the AWS IoT management page.
Click Manage
-> Things
-> Create things
to create a new device.
Create your device according to your needs. This example demonstrates creating a basic single thing
. For more details on device types, refer to the
AWS official documentation
.
Enter the device name, configure the device's group and category, then click Next
-> create certificate
-> configure device policy
-> finish creation
.
Upon completing the device creation, a page for downloading keys
and certificates
will pop up. Note: This page will only appear once. Please follow the prompt to download the Device certificate
, Public Key File
, and Private Key File
to your local machine. (These files will be used for communication authentication in subsequent steps.)
In this tutorial, we will use M5Core2 to obtain values from the ENV II Unit (temperature, humidity, and pressure sensor) and upload them to AWS-IoT-Core. Before beginning programming, we need to download AWS-IoT
related dependency libraries and example programs from Github
. You can directly download using the below git
commands (or click the provided link to visit the corresponding project address and download the zip package, which will need to be unzipped). Place the dependency libraries in the Arduino library management path (usually C:/Users/YourUserName/Documents/Arduino/libraries
).
git clone git@github.com:aws-samples/aws-iot-esp32-arduino-examples.git
git clone git@github.com:bblanchon/ArduinoJson.git
git clone git@github.com:256dpi/arduino-mqtt.git
git clone git@github.com:adafruit/Adafruit_BMP280_Library.git
git clone git@github.com:adafruit/Adafruit_Sensor.git
git clone git@github.com:m5stack/UNIT_ENV.git
Besides the previously downloaded libraries, you may also include different driver libraries based on the M5 device you are using. In this instance, we will incorporate M5Core2.h (suitable for CORE2 and CORE2 FOR AWS products). Other libraries related to M5Stack products can be found on the M5Stack official Github .
git clone git@github.com:m5stack/M5Core2.git
We can copy the basic-pubsub
example program from the aws-iot-esp32-arduino-examples
folder as a basic template for our program.
We usually create a secrets.h
in the project to store keys and certificates
, WIFI
information, which includes the following content.
Tips:**
1. Define the macro THINGNAME
as the name of our created device, which needs to match the name in the AWS Management Console
.
2. Open the keys and certificates obtained from creating the device in AWS IoT Core
with an editor, and copy and paste the content into the corresponding positions in the code.
Copy the Endpoint
field from AWS Management Console
-> Settings
.
#include <pgmspace.h>
#define SECRET
#define THINGNAME "ENV-TEST"
const char WIFI_SSID[] = "WIFI_SSID";
const char WIFI_PASSWORD[] = "WIFI_PASSWORD";
const char AWS_IOT_ENDPOINT[] = "xxxxx.amazonaws.com";
// Amazon Root CA 1
static const char AWS_CERT_CA[] PROGMEM = R"EOF(
-----BEGIN CERTIFICATE-----
MIIDQTCCAimgAwIBAgIT........................
-----END CERTIFICATE-----
)EOF";
// Device Certificate
static const char AWS_CERT_CRT[] PROGMEM = R"KEY(
-----BEGIN CERTIFICATE-----
MIIDWjCCAkKgAwIBAgIVA........................
-----END CERTIFICATE-----
)KEY";
// Device Private Key
static const char AWS_CERT_PRIVATE[] PROGMEM = R"KEY(
-----BEGIN RSA PRIVATE KEY-----
MIIEogIBAAKCAQEAq........................
-----END RSA PRIVATE KEY-----
)KEY";
Refer to the following program and use the Arduino IDE to compile and upload it to the device.
#include "secrets.h"
#include <WiFiClientSecure.h>
#include <MQTTClient.h>
#include <ArduinoJson.h>
#include "WiFi.h"
#include <M5Core2.h>
#include "Adafruit_Sensor.h"
#include "Adafruit_BMP280.h"
#include "SHT3X.h"
SHT3X sht30;
Adafruit_BMP280 bme;
float tmp = 0.0;
float hum = 0.0;
float pressure = 0.0;
// The MQTT topics that this device should publish/subscribe
#define AWS_IOT_PUBLISH_TOPIC "core2/env"
#define AWS_IOT_SUBSCRIBE_TOPIC "core2/msg"
WiFiClientSecure net = WiFiClientSecure();
MQTTClient client = MQTTClient(256);
void messageHandler(String &topic, String &payload) {
Serial.println("incoming: " + topic + " - " + payload);
}
void connectAWS()
{
WiFi.mode(WIFI_STA);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
Serial.println("Connecting to Wi-Fi");
while (WiFi.status() != WL_CONNECTED){
delay(500);
Serial.print(".");
}
// Configure WiFiClientSecure to use the AWS IoT device credentials
net.setCACert(AWS_CERT_CA);
net.setCertificate(AWS_CERT_CRT);
net.setPrivateKey(AWS_CERT_PRIVATE);
// Connect to the MQTT broker on the AWS endpoint we defined earlier
client.begin(AWS_IOT_ENDPOINT, 8883, net);
// Create a message handler
client.onMessage(messageHandler);
Serial.print("Connecting to AWS IOT");
while (!client.connect(THINGNAME)) {
Serial.print(".");
delay(100);
}
if(!client.connected()){
Serial.println("AWS IoT Timeout!");
return;
}
// Subscribe to a topic
client.subscribe(AWS_IOT_SUBSCRIBE_TOPIC);
Serial.println("AWS IoT Connected!");
}
void publishMessage()
{
pressure = bme.readPressure();
if(sht30.get()==0){
tmp = sht30.cTemp;
hum = sht30.humidity;
}
Serial.printf("Temperature: %2.2f*C Humidity: %0.2f%% Pressure: %0.2fPa\r\n", tmp, hum, pressure);
delay(100);
StaticJsonDocument<200> doc;
doc["tmp"] = tmp;
doc["hum"] = hum;
doc["pressure"] = pressure;
char jsonBuffer[512];
serializeJson(doc, jsonBuffer); // print to client
client.publish(AWS_IOT_PUBLISH_TOPIC, jsonBuffer);
}
void setup() {
M5.begin();
Wire.begin();
bme.begin(0x76);
connectAWS();
}
void loop() {
publishMessage();
client.loop();
delay(1000);
}
Click AWS Management Console
-> Test
to enter the online test page. This feature is used to test MQTT messages of devices in your AWS account. Click Additional configuration
to adjust the QoS level.
To publish a topic: Fill in the Topic
and `Message payload
, then click
Publish` to publish.
To subscribe to a topic: Fill in the Topic
and click Subscribe
. Click Additional configuration
to set the type of messages displayed; received messages will be shown in the console below the page.