Thingsboard merupakan sebuah platform IoT open-source yang memungkinkan anda untuk mengontrol ataupun memonitoring berbagai perangkat. Penggunaanya mudah, gratis dan bisa kita gunakan kapan dan di mana saja. Di dalamnya sudah disediakan beberapa contoh-contoh seperti kontrol GPIO Arduino, ESP8266, Raspberry Pi, monitoring suhu dan masih banyak lainnya.

Kali ini kita akan mencoba untuk mengontrol GPIO dengan Output LED dan nantinya bisa juga digunakan untuk relay.

Alat dan bahan

  • NodeMCU CH340, BELI
  • Lampu LED, BELI
  • Resistor 330 Ohm, BELI
  • Kabel Jumper secukupnya
  • Library ArduinoJson versi 5.8.0, download
  • Library PubSubClient, download

Masukkan libary pada Arduino IDE.

Rangkaian

Sketch Program

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

#define WIFI_AP "xxxx"
#define WIFI_PASSWORD "xxxxx"

#define TOKEN "bIJb6y59MR36Qfkdd"
#define GPIO0 0 //D3
#define GPIO2 2 //D4

#define GPIO0_PIN 3
#define GPIO2_PIN 5

char thingsboardServer[] = "demo.thingsboard.io";

WiFiClient wifiClient;

PubSubClient client(wifiClient);

int status = WL_IDLE_STATUS;

// We assume that all GPIOs are LOW
boolean gpioState[] = {false, false};

void setup() {
  Serial.begin(115200);
  // Set output mode for all GPIO pins
  pinMode(GPIO0, OUTPUT);
  pinMode(GPIO2, OUTPUT);
  delay(10);
  InitWiFi();
  client.setServer( thingsboardServer, 1883 );
  client.setCallback(on_message);
}

void loop() {
  if ( !client.connected() ) {
    reconnect();
  }

  client.loop();
}

// The callback for when a PUBLISH message is received from the server.
void on_message(const char* topic, byte* payload, unsigned int length) {

  Serial.println("On message");

  char json[length + 1];
  strncpy (json, (char*)payload, length);
  json[length] = '\0';

  Serial.print("Topic: ");
  Serial.println(topic);
  Serial.print("Message: ");
  Serial.println(json);

  // Decode JSON request
  StaticJsonBuffer<200> jsonBuffer;
  JsonObject& data = jsonBuffer.parseObject((char*)json);

  if (!data.success())
  {
    Serial.println("parseObject() failed");
    return;
  }

  // Check request method
  String methodName = String((const char*)data["method"]);

  if (methodName.equals("getGpioStatus")) {
    // Reply with GPIO status
    String responseTopic = String(topic);
    responseTopic.replace("request", "response");
    client.publish(responseTopic.c_str(), get_gpio_status().c_str());
  } else if (methodName.equals("setGpioStatus")) {
    // Update GPIO status and reply
    set_gpio_status(data["params"]["pin"], data["params"]["enabled"]);
    String responseTopic = String(topic);
    responseTopic.replace("request", "response");
    client.publish(responseTopic.c_str(), get_gpio_status().c_str());
    client.publish("v1/devices/me/attributes", get_gpio_status().c_str());
  }
}

String get_gpio_status() {
  // Prepare gpios JSON payload string
  StaticJsonBuffer<200> jsonBuffer;
  JsonObject& data = jsonBuffer.createObject();
  data[String(GPIO0_PIN)] = gpioState[0] ? true : false;
  data[String(GPIO2_PIN)] = gpioState[1] ? true : false;
  char payload[256];
  data.printTo(payload, sizeof(payload));
  String strPayload = String(payload);
  Serial.print("Get gpio status: ");
  Serial.println(strPayload);
  return strPayload;
}

void set_gpio_status(int pin, boolean enabled) {
  if (pin == GPIO0_PIN) {
    // Output GPIOs state
    digitalWrite(GPIO0, enabled ? HIGH : LOW);
    // Update GPIOs state
    gpioState[0] = enabled;
  } else if (pin == GPIO2_PIN) {
    // Output GPIOs state
    digitalWrite(GPIO2, enabled ? HIGH : LOW);
    // Update GPIOs state
    gpioState[1] = enabled;
  }
}

void InitWiFi() {
  Serial.println("Connecting to AP ...");
  // attempt to connect to WiFi network

  WiFi.begin(WIFI_AP, WIFI_PASSWORD);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("Connected to AP");
}


void reconnect() {
  // Loop until we're reconnected
  while (!client.connected()) {
    status = WiFi.status();
    if ( status != WL_CONNECTED) {
      WiFi.begin(WIFI_AP, WIFI_PASSWORD);
      while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
      }
      Serial.println("Connected to AP");
    }
    Serial.print("Connecting to ThingsBoard node ...");
    // Attempt to connect (clientId, username, password)
    if ( client.connect("ESP8266 Device", TOKEN, NULL) ) {
      Serial.println( "[DONE]" );
      // Subscribing to receive RPC requests
      client.subscribe("v1/devices/me/rpc/request/+");
      // Sending current GPIO status
      Serial.println("Sending current GPIO status ...");
      client.publish("v1/devices/me/attributes", get_gpio_status().c_str());
    } else {
      Serial.print( "[FAILED] [ rc = " );
      Serial.print( client.state() );
      Serial.println( " : retrying in 5 seconds]" );
      // Wait 5 seconds before retrying
      delay( 5000 );
    }
  }
}

Langkah-langkah

  1. Silahkan buat akun terlebih dahulu di thingsboard DISINI
  2. Isi nama dan email anda lanjut isi password.
  3. Kemudian Sign Up, nnti ada pesan masuk ke email untuk mengaktifkan thingsboard.
  4. Login menggunakan email dan password
  5. Masuk ke Device > Esp8266 Demo Devic > Manage Credentials> Copy Acces token dan pastekan pada sketch program di atas. lengkapnya lihat gambar di bawah.

  6. Kemudian upload sketch program di atas jangan lupa untuk mengisi nama wifi dan passwordnya.
  7. Jika sudah lanjut ke Thingsboard menu dashboard > Esp8266 Demo

Silahkan coba untuk menekan tombol kontrolnya, jika berhasil LED akan menyala/mati.

Anda juga bisa membagikan dashboard Control ini ke teman-teman anda dengan menjadikannya public.

Copy link public dan kirim ke temen anda. Dan sekarang silahkan coba pada jarak yang jauh, karena ini menggunakan jaringan internet maka jarak tidak mempengaruhi. Kontrol tetap bisa berfungsi. Semoga bermanfaat.

Kategori: NodeMCU

Tinggalkan Balasan

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

Scroll Up
id_IDIndonesian
en_USEnglish id_IDIndonesian