ESP32 dan AWS IoT Core

Pada postingan sebelumnya kita telah belajar menggunakan STM32 Nucleo untuk mengirim dan menerima data dari AWS IoT core maka pada kesempatan kali ini kita akan coba menggunakan board ESP32 serta menghubungkannya dengan AWS IoT. ESP32 ini sangat populer dikalangan para penghobi dan penggibah dunia mikrokontroller. Kita sebut penggibah karena para praktisi di dunia mikrokontroller banyak yg ingin board murah, mudah didapatkan dan fiturnya ga kaleng kaleng, contohnya seperti ESP32 ini sudah dilengkapi wifi dan bluetooth, kecepatan cukup memadai dan disupport oleh komunitas yang banyak, anda dapat dengan mudah mencari contoh contoh code untuk ESP32 ini di internet. ESP ini juga relatif murah dibanding dengan board lainnya seperti STM32, NXP, ataupun Infineon. Bagi para pemakai arduino juga akan cukup familiar karena bisa menggunakan IDE yang sama yaitu Arduino Sketch. Ok, kita langsung saja menyiapkan perlengkapan tempur kali ini, teman teman dapat mendownload arduino IDE sketch di link ini. Setelah terinstal teman teman dapat menambahkan board ESP32 melalui tools->Board Manager, atau memilihnya dari ESP32 Arduino yang tersedia. Disini saya menggunakan DOIT ESP32 DEVKITV1, saya beli di marketplace dengan harga sekitar 60 ribu. Tampilan boardnya adalah seperti di bawah ini

ESP32 Board

Board diatas dilengkapi dengan Power LED dan User LED dan juga micro USB untuk memprogram sekaligus dapat digunakan sebagai power inputnya. Untuk tutorial kali ini teman teman juga perlu untuk menambahkan library mqtt pada arduino IDE, caranya adalah buka Tools -> Manage Libraries, kemudian ketikkan PubSubClient dan klik tombol install. Library lainnya yang sifatnya opsional untuk diinstall adalah ArduinoJson, dengan library ini teman teman akan dimudahkan dalam membuat object json yang akan kita kirim ke AWS, cara menambahkannya juga sama yaitu melalui Manage Libraries seperti tampak di bawah ini

Menambahkan Library

Setelah terinstall teman teman dapat membuat project baru dengan mengklik New dan Copy Paste source code di bawah ini. Untuk payloadnya, apabila teman teman tidak ingin menggunakan ArduinoJson maka teman teman dapat membuat sendiri payloadnya secara manual.

#include <WifiClientSecure.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>

const char* ssid = "ssid_wifi_anda";
const char* password = "ssid_wifi_password";
const char* awsEndpoint = "isi_dengan_aws_endpoint_anda";

//variabls for blinking an LED with Millis
const int led = 2;   // Connected LED ESP32 Pin
int ledState = LOW;  // ledState used to set the LED

// Masukkan AWS Certificate anda di bawah ini
const char* certificate_pem_crt = \
"-----BEGIN CERTIFICATE-----\n" \
"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX3DQEB\n" \
"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n" \
"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n" \
......
"-----END CERTIFICATE-----\n";

// xxxxxxxxxx-private.pem.key
const char* private_pem_key = \

"-----BEGIN RSA PRIVATE KEY-----\n" \
"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n" \
"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n" \
......
"-----END RSA PRIVATE KEY-----\n";

// root ca

"-----BEGIN CERTIFICATE-----\n" \
"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n" \
"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n" \
"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n" \
......
"-----END CERTIFICATE-----\n";

WiFiClientSecure wiFiClient;
void msgReceived(char* topic, byte* payload, unsigned int len);
PubSubClient pubSubClient(awsEndpoint, 8883, msgReceived, wiFiClient); 

void setup() {
  pinMode(led, OUTPUT);
  Serial.begin(115200); delay(50); Serial.println();
  Serial.println("Madopick ESP32 AWS IoT Example");
  Serial.printf("SDK version: %s\r\n", ESP.getSdkVersion());
  Serial.printf("-------------------------------------\r\n");

  Serial.print("Connecting to AWS Endpoint via AP: "); 
  Serial.print(ssid);
  Serial.print("\r\n\n");
  WiFi.begin(ssid, password);
  WiFi.waitForConnectResult();
  while (WiFi.waitForConnectResult() != WL_CONNECTED) {
    Serial.println("Connection Failed! Rebooting...");
    delay(5000);
    ESP.restart();
  }
  
  if(WiFi.status() == WL_CONNECTED) { 
    Serial.println("\nconnected to Wifi AP");
  } else {
    Serial.println("Error TimeOut!");
  }  
  
  Serial.print("IP address: "); 
  Serial.println(WiFi.localIP());


  wiFiClient.setCACert(rootCA);
  wiFiClient.setCertificate(certificate_pem_crt);
  wiFiClient.setPrivateKey(private_pem_key);
}

unsigned long lastPublish;
int msgCount;

void loop() 
{
  pubSubCheckConnect();
  char pubData[128];

  float var1 =  random(55,77);    //random number
  float var2 =  random(77,99);
  sprintf(pubData,  "{\"uptime\":%lu,\"temp\":%f,\"humid\":%f}", millis() / 1000, var1, var2);

  StaticJsonDocument<200> doc;
  doc["sensor"]   = "gps";
  doc["time"]     = 1351824120;
  JsonArray data  = doc.createNestedArray("data");
  data.add(48.756080);
  data.add(2.302038);
  
  serializeJson(doc, pubData);

  if (millis() - lastPublish > 10000) {
    boolean rc = pubSubClient.publish("outTopic", pubData);
    Serial.print("Published, rc="); 
    Serial.print( (rc ? "OK: " : "FAILED: ") );
    Serial.println(pubData);
    Serial.printf("\r\n");
    lastPublish = millis();    

    ledState = not(ledState);
    digitalWrite(led, ledState);
  }
}

void msgReceived(char* topic, byte* payload, unsigned int length) {
  Serial.print("Message received on "); 
  Serial.print(topic); Serial.print(": ");
  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
  }
  Serial.println();
}

void pubSubCheckConnect() 
{
  if ( ! pubSubClient.connected()) 
  {
      Serial.print("PubSubClient connecting to: ");
      Serial.print(awsEndpoint);
      while ( ! pubSubClient.connected()) {
         Serial.print(".");
         pubSubClient.connect("ESPthingXXXX");
         delay(1000);
      }
      Serial.println(" connected");
      pubSubClient.subscribe("inTopic");
  }
  pubSubClient.loop();
}

Kode diatas membutuhkan beberapa parameter yang perlu teman teman isi seperti nama ssid dan password dari jaringan wifi yang teman teman miliki, kemudian aws endpoint serta AWS certificate (ada 3), jangan lupa gunakan character ‘\n’ pada akhir setiap baris certificate. Teman teman dapat juga mengganti mqtt topic sesuai yang diinginkan untuk publish maupun subscribenya (outTopic dan inTopic). Di bawah ini adalah screenshot koneksi esp32 (serial console teraterm) dengan aws console

AWS Console & ESP32 Console

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *