#include <DHTesp.h> // DHT for ESP32 library
#include <WiFi.h> // WiFi control for ESP32
#include <ThingsBoard.h> // ThingsBoard SDK
#include <HTTPClient.h>
// WiFi access point
#define WIFI_AP_NAME "Wokwi-GUEST"
// WiFi password
#define WIFI_PASSWORD ""
// thingspeak params
String response;
float poidsValue;
const char* createdAt ;
const char* entryId ;
const char* temperature ;
const char* humidity ;
const char* pressure ;
const char* brightness ;
const char* radiation ;
const char* windSpeed;
const char* windDirection ;
const char* rainfall ;
const char* thingspeakApiKey = "66P1FE4DF32TTGKU";
const int fieldNumber = 1; // Ganti dengan nomor lapangan (field) yang ingin Anda baca
const char* server = "api.thingspeak.com";
//#define TOKEN "O6Bm0tyPiW2Z068zfUEZ"
//#define THINGSBOARD_SERVER "83.212.98.154"
#define TOKEN "iips5q9x422c3cf72mg6"
#define THINGSBOARD_SERVER "demo.thingsboard.io"
// Baud rate for debug serial
#define SERIAL_DEBUG_BAUD 115200
// Initialize ThingsBoard client
WiFiClient espClient;
// Initialize ThingsBoard instance
ThingsBoard tb(espClient);
// the Wifi radio's status
int status = WL_IDLE_STATUS;
// DHT object
DHTesp dht;
// ESP32 pin used to query DHT22
#define DHT_PIN 15
// Main application loop delay
int quant = 20;
// Period of sending a temperature/humidity data.
int send_delay = 16000;
// Time passed after temperature/humidity data was sent, milliseconds.
int send_passed = 0;
// Setup an application
void setup() {
// Initialize serial for debugging
Serial.begin(SERIAL_DEBUG_BAUD);
WiFi.begin(WIFI_AP_NAME, WIFI_PASSWORD);
InitWiFi();
// Initialize temperature sensor
dht.setup(DHT_PIN, DHTesp::DHT22);
}
// Main application loop
void loop() {
delay(quant);
send_passed += quant;
// Reconnect to WiFi, if needed
if (WiFi.status() != WL_CONNECTED) {
reconnect();
return;
}
// Reconnect to ThingsBoard, if needed
if (!tb.connected()) {
// Connect to the ThingsBoard
Serial.print("Connecting to: ");
Serial.print(THINGSBOARD_SERVER);
Serial.print(" with token ");
Serial.println(TOKEN);
if (!tb.connect(THINGSBOARD_SERVER, TOKEN)) {
Serial.println("Failed to connect");
return;
}
}
// Check if it is a time to send DHT22 temperature and humidity
if (send_passed > send_delay) {
Serial.println("Sending data...");
getdatafromthingspeak();
tb.sendTelemetryData("temperature",String(temperature));
tb.sendTelemetryData("humidity",String(humidity));
tb.sendTelemetryData("pressure",String(pressure));
tb.sendTelemetryData("brightness",String(brightness));
tb.sendTelemetryData("radiation",String(radiation));
tb.sendTelemetryData("windSpeed",String(windSpeed));
tb.sendTelemetryData("windDirection",String(windDirection));
tb.sendTelemetryData("rainfall",String(rainfall));
// }
send_passed = 0;
}
// Process messages
tb.loop();
}
void InitWiFi()
{
Serial.println("Connecting to AP ...");
// attempt to connect to WiFi network
WiFi.begin(WIFI_AP_NAME, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("Connected to AP");
}
void reconnect() {
// Loop until we're reconnected
status = WiFi.status();
if ( status != WL_CONNECTED) {
WiFi.begin(WIFI_AP_NAME, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("Connected to AP");
}
}
void getdatafromthingspeak() {
// Siapkan URL untuk membaca data dari Thingspeak
String url = "https://api.thingspeak.com/channels/1477769/feeds.json?api_key=" + String(thingspeakApiKey) + "&results=2";
// Buat objek HTTPClient untuk mengirim permintaan HTTP
HTTPClient http;
http.begin(server, 80, url); // Inisialisasi permintaan HTTP dengan URL Thingspeak
// Kirim permintaan GET ke URL Thingspeak
int httpCode = http.GET();
// Periksa kode respons HTTP
if (httpCode == HTTP_CODE_OK) {
String response = http.getString();
// Parse the JSON response
DynamicJsonDocument jsonDoc(2048); // Adjust the buffer size as needed
DeserializationError error = deserializeJson(jsonDoc, response);
if (!error) {
// Extract and print the entire JSON data
Serial.println("Data from Thingspeak:");
Serial.println(response);
// // Extract individual data points
// JsonObject channel = jsonDoc["channel"];
// const char* channelLatitude = channel["latitude"];
// const char* channelLongitude = channel["longitude"];
JsonArray feeds = jsonDoc["feeds"];
for (JsonObject feed : feeds) {
createdAt = feed["created_at"];
entryId = feed["entry_id"];
temperature = feed["field1"];
humidity = feed["field2"];
pressure = feed["field3"];
brightness = feed["field4"];
radiation = feed["field5"];
windSpeed = feed["field6"];
windDirection = feed["field7"];
rainfall = feed["field8"];
// Print the extracted values
Serial.println("Temperature (°C): " + String(temperature));
Serial.println("Humidity (%): " + String(humidity));
Serial.println("Pressure (hPa): " + String(pressure));
Serial.println("Brightness (Lux): " + String(brightness));
Serial.println("Radiation (W/m2): " + String(radiation));
Serial.println("Wind Speed (m/s): " + String(windSpeed));
Serial.println("Wind Direction (°): " + String(windDirection));
Serial.println("Rainfall (mm): " + String(rainfall));
}
} else {
Serial.println("Error parsing JSON");
}
} else {
Serial.println("Error reading data from Thingspeak");
}
// Akhiri permintaan HTTP
http.end();
// Tunggu beberapa saat sebelum membaca data lagi (sesuai dengan interval yang Anda inginkan)
delay(1000);
}