ESP8266
Mengirim bacaan dari NodeMCU, Wemos D1 mini, atau papan ESP8266 lain dengan Arduino IDE, lewat HTTP atau MQTT. Kiriman HTTP terenkripsi dan sertifikat servernya diperiksa. MQTT bisa tanpa TLS di port 1883 (paling mudah, dan paling ringan untuk memori ESP8266) atau dengan TLS di port 8883.
Yang dibutuhkan
- Papan ESP8266, misalnya NodeMCU v2/v3 atau Wemos D1 mini.
- Kabel USB yang bisa membawa data.
- Arduino IDE versi 2.
- WiFi 2,4 GHz.
- Perangkat yang sudah dibuat di INCLUDE. Belum ada? Ikuti Perangkat rakitan sendiri, langkah 1.
1. Pasang dukungan ESP8266 di Arduino IDE
Buka File > Preferences.
Di Additional boards manager URLs, tempel (kalau sudah ada URL ESP32, pisahkan dengan koma):
https://arduino.esp8266.com/stable/package_esp8266com_index.jsonBuka Tools > Board > Boards Manager, cari
esp8266, pasang esp8266 by ESP8266 Community versi 3.x.
2. Ambil kodenya dari INCLUDE
- Buka perangkat Anda, tab Pengaturan, lalu Koneksi & Integrasi.
- Di Contoh kode, pilih HTTP dan tab ESP8266, lalu Salin.

3. Isi WiFi dan bacaan sensor
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClientSecure.h>
#include <time.h>
const char* WIFI_SSID = "your-wifi";
const char* WIFI_PASSWORD = "your-password";
const char* URL = "https://app.include.co.id/api/v1/YOUR_DEVICE_TOKEN/telemetry";
// Root certificates for app.include.co.id (Let's Encrypt ISRG Root X1 and X2).
const char ROOT_CA[] PROGMEM = R"PEM(
-----BEGIN CERTIFICATE-----
MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw
TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh
cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4
WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu
ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY
MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc
h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+
0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U
A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW
T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH
B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC
B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv
KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn
OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn
jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw
qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI
rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV
HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq
hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL
ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ
3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK
NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5
ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur
TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC
jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc
oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq
4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA
mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d
emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIICGzCCAaGgAwIBAgIQQdKd0XLq7qeAwSxs6S+HUjAKBggqhkjOPQQDAzBPMQsw
CQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2gg
R3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBYMjAeFw0yMDA5MDQwMDAwMDBaFw00
MDA5MTcxNjAwMDBaME8xCzAJBgNVBAYTAlVTMSkwJwYDVQQKEyBJbnRlcm5ldCBT
ZWN1cml0eSBSZXNlYXJjaCBHcm91cDEVMBMGA1UEAxMMSVNSRyBSb290IFgyMHYw
EAYHKoZIzj0CAQYFK4EEACIDYgAEzZvVn4CDCuwJSvMWSj5cz3es3mcFDR0HttwW
+1qLFNvicWDEukWVEYmO6gbf9yoWHKS5xcUy4APgHoIYOIvXRdgKam7mAHf7AlF9
ItgKbppbd9/w+kHsOdx1ymgHDB/qo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0T
AQH/BAUwAwEB/zAdBgNVHQ4EFgQUfEKWrt5LSDv6kviejM9ti6lyN5UwCgYIKoZI
zj0EAwMDaAAwZQIwe3lORlCEwkSHRhtFcP9Ymd70/aTSVaYgLXTWNLxBo1BfASdW
tL4ndQavEi51mI38AjEAi/V3bNTIZargCyzuFJ0nN6T5U6VR5CmD1/iQMVtCnwr1
/q4AaOeMSQ+2b1tbFfLn
-----END CERTIFICATE-----
)PEM";
BearSSL::X509List roots(ROOT_CA);
BearSSL::WiFiClientSecure tls;
void setup() {
Serial.begin(115200);
WiFi.mode(WIFI_STA);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) delay(500);
Serial.println("WiFi connected");
// Certificate checks need the real time.
configTime(0, 0, "pool.ntp.org", "time.google.com");
while (time(nullptr) < 1700000000) delay(500);
tls.setTrustAnchors(&roots);
}
void loop() {
float temperature = 25.4; // replace with your sensor reading
float humidity = 61;
String body = "{\"temperature\": " + String(temperature, 1) +
", \"humidity\": " + String(humidity, 0) + "}";
HTTPClient http;
http.begin(tls, URL);
http.addHeader("Content-Type", "application/json");
int status = http.POST(body);
Serial.printf("HTTP %d %s\n", status, http.getString().c_str());
http.end();
delay(10000);
}- Isi
WIFI_SSIDdanWIFI_PASSWORD. - Ganti nilai
temperaturedanhumiditydengan bacaan sensor Anda. - Biarkan
ROOT_CAdan bagianconfigTimeapa adanya.
Bedanya dengan ESP32: ESP8266 hanya bisa memeriksa sertifikat kalau tahu tanggal hari ini. Karena itu program mengambil jam dari pool.ntp.org dulu, dan baru mengirim sesudahnya. Kalau jaringan Anda memblokir NTP (port UDP 123), program berhenti di langkah itu.
4. Unggah dan periksa
- Tools > Board > esp8266 > NodeMCU 1.0 (ESP-12E Module), atau LOLIN(WEMOS) D1 R2 & mini untuk Wemos.
- Tools > Port: pilih port papan.
- Tekan Upload, lalu buka Serial Monitor dengan 115200 baud.
Kalau berhasil:
WiFi connected
HTTP 202 {"ok":true}Lewat MQTT
- Pasang library PubSubClient by Nick O'Leary dari Tools > Manage Libraries.
- Di Contoh kode, pilih MQTT, tab ESP8266, lalu Salin.
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
// MQTT on port 1883, the simplest way: no certificate needed.
// For an encrypted connection, choose port 8883 (TLS) instead.
const char* WIFI_SSID = "your-wifi";
const char* WIFI_PASSWORD = "your-password";
const char* HOST = "app.include.co.id";
const int PORT = 1883;
const char* DEVICE_ID = "YOUR_DEVICE_ID";
const char* DEVICE_TOKEN = "YOUR_DEVICE_TOKEN";
const char* TOPIC = "includeapps/YOUR_ORG_ID/YOUR_SOLUTION_SLUG/YOUR_DEVICE_ID/telemetry";
WiFiClient net;
PubSubClient mqtt(net);
void connectMqtt() {
while (!mqtt.connected()) {
if (mqtt.connect(DEVICE_ID, DEVICE_ID, DEVICE_TOKEN)) {
Serial.println("MQTT connected");
} else {
Serial.printf("MQTT failed, state %d, retrying\n", mqtt.state());
delay(5000);
}
}
}
void setup() {
Serial.begin(115200);
WiFi.mode(WIFI_STA);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) delay(500);
Serial.println("WiFi connected");
mqtt.setServer(HOST, PORT);
mqtt.setBufferSize(512);
}
void loop() {
connectMqtt();
mqtt.loop();
float temperature = 25.4; // replace with your sensor reading
float humidity = 61;
String payload = "{\"temperature\": " + String(temperature, 1) +
", \"humidity\": " + String(humidity, 0) + "}";
bool sent = mqtt.publish(TOPIC, payload.c_str());
Serial.println(sent ? "sent" : "send failed");
delay(10000);
}Sketsa ini memakai port 1883, tanpa sertifikat dan tanpa NTP. Di Serial Monitor: WiFi connected, MQTT connected, lalu sent tiap 10 detik.
Dengan TLS (port 8883)
Pilih port 8883 (TLS) di Contoh kode. Seperti versi HTTP, sketsanya mengambil jam dari NTP lalu memeriksa sertifikat server:
#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>
#include <PubSubClient.h>
#include <time.h>
const char* WIFI_SSID = "your-wifi";
const char* WIFI_PASSWORD = "your-password";
const char* HOST = "app.include.co.id";
const int PORT = 8883;
const char* DEVICE_ID = "YOUR_DEVICE_ID";
const char* DEVICE_TOKEN = "YOUR_DEVICE_TOKEN";
const char* TOPIC = "includeapps/YOUR_ORG_ID/YOUR_SOLUTION_SLUG/YOUR_DEVICE_ID/telemetry";
// Root certificates for app.include.co.id (Let's Encrypt ISRG Root X1 and X2).
const char ROOT_CA[] PROGMEM = R"PEM(
-----BEGIN CERTIFICATE-----
MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw
TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh
cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4
WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu
ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY
MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc
h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+
0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U
A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW
T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH
B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC
B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv
KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn
OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn
jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw
qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI
rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV
HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq
hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL
ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ
3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK
NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5
ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur
TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC
jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc
oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq
4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA
mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d
emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIICGzCCAaGgAwIBAgIQQdKd0XLq7qeAwSxs6S+HUjAKBggqhkjOPQQDAzBPMQsw
CQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2gg
R3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBYMjAeFw0yMDA5MDQwMDAwMDBaFw00
MDA5MTcxNjAwMDBaME8xCzAJBgNVBAYTAlVTMSkwJwYDVQQKEyBJbnRlcm5ldCBT
ZWN1cml0eSBSZXNlYXJjaCBHcm91cDEVMBMGA1UEAxMMSVNSRyBSb290IFgyMHYw
EAYHKoZIzj0CAQYFK4EEACIDYgAEzZvVn4CDCuwJSvMWSj5cz3es3mcFDR0HttwW
+1qLFNvicWDEukWVEYmO6gbf9yoWHKS5xcUy4APgHoIYOIvXRdgKam7mAHf7AlF9
ItgKbppbd9/w+kHsOdx1ymgHDB/qo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0T
AQH/BAUwAwEB/zAdBgNVHQ4EFgQUfEKWrt5LSDv6kviejM9ti6lyN5UwCgYIKoZI
zj0EAwMDaAAwZQIwe3lORlCEwkSHRhtFcP9Ymd70/aTSVaYgLXTWNLxBo1BfASdW
tL4ndQavEi51mI38AjEAi/V3bNTIZargCyzuFJ0nN6T5U6VR5CmD1/iQMVtCnwr1
/q4AaOeMSQ+2b1tbFfLn
-----END CERTIFICATE-----
)PEM";
BearSSL::X509List roots(ROOT_CA);
BearSSL::WiFiClientSecure tls;
PubSubClient mqtt(tls);
void connectMqtt() {
while (!mqtt.connected()) {
if (mqtt.connect(DEVICE_ID, DEVICE_ID, DEVICE_TOKEN)) {
Serial.println("MQTT connected");
} else {
Serial.printf("MQTT failed, state %d, retrying\n", mqtt.state());
delay(5000);
}
}
}
void setup() {
Serial.begin(115200);
WiFi.mode(WIFI_STA);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) delay(500);
Serial.println("WiFi connected");
// Certificate checks need the real time.
configTime(0, 0, "pool.ntp.org", "time.google.com");
while (time(nullptr) < 1700000000) delay(500);
tls.setTrustAnchors(&roots);
mqtt.setServer(HOST, PORT);
mqtt.setBufferSize(512);
}
void loop() {
connectMqtt();
mqtt.loop();
float temperature = 25.4; // replace with your sensor reading
float humidity = 61;
String payload = "{\"temperature\": " + String(temperature, 1) +
", \"humidity\": " + String(humidity, 0) + "}";
bool sent = mqtt.publish(TOPIC, payload.c_str());
Serial.println(sent ? "sent" : "send failed");
delay(10000);
}Membaca sensor sungguhan
ESP8266 punya satu pin analog, A0, dengan rentang 0 sampai 1023. Contoh untuk sensor kelembapan tanah analog:
float soil = analogRead(A0) * 100.0 / 1023.0; // persen, 0 = keringLalu kirim dengan kunci yang sesuai, misalnya "{\"soil_moisture\": " + String(soil, 0) + "}".
Kalau tidak berhasil
| Di Serial Monitor | Artinya |
|---|---|
Berhenti sebelum WiFi connected | Nama atau kata sandi WiFi salah, atau WiFi-nya 5 GHz. |
Berhenti sesudah WiFi connected | Jam belum didapat dari NTP. Coba jaringan lain atau hotspot ponsel. |
HTTP -1 | Tidak tersambung ke server, atau sertifikat ditolak. Periksa ROOT_CA utuh. |
HTTP 401 | Token salah. Salin ulang kode dari Koneksi & Integrasi. |
MQTT failed, state 4 atau 5 | Device ID atau Device Token salah. |
| Papan restart terus | Daya kurang. Pakai port USB lain atau catu daya 5 V 1 A. |
Lihat juga Data belum masuk.

