#include <ArduinoJson.h>
#include <PubSubClient.h>
#include <WiFi.h>
#include "device_config.h"
#include "thingsboard_config.h"
// WiFi
#define WIFI_AP "Wokwi-GUEST"
#define WIFI_PASSWORD ""
// Initialize the Ethernet client object
WiFiClient espClient;
PubSubClient pubsub_client(espClient);
// Sensors object
DHT dht(DHTPIN, DHTTYPE);
unsigned long lastSend;
int status = WL_IDLE_STATUS;
char clientId[50];
void setup_wifi() { //perintah koneksi wifi
delay(10);
// We start by connecting to a WiFi network
Serial.println();
Serial.print("Connecting to ");
Serial.println(WIFI_AP);
WiFi.mode(WIFI_STA);
WiFi.begin(WIFI_AP, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
randomSeed(micros());
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
void mqttReconnect() {
while (!pubsub_client.connected()) {
Serial.print("Attempting MQTT connection...");
long r = random(1000);
sprintf(clientId, "clientId-%ld", r);
if (pubsub_client.connect(clientId, TB_DEVICE_TOKEN, TB_DEVICE_PASSWORD)) {
Serial.print(clientId);
Serial.println(" connected");
} else {
Serial.print("failed, rc=");
Serial.print(pubsub_client.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}
void getAndSendTemperatureAndHumidityData()
{
Serial.println("Collecting temperature data.");
// Reading temperature or humidity takes about 250 milliseconds!
float humidity = dht.readHumidity();
// Read temperature as Celsius (the default)
float temperature = dht.readTemperature();
// Check if any reads failed and exit early (to try again).
if (isnan(humidity) || isnan(temperature)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
Serial.println("Sending data to ThingsBoard:");
Serial.print("Humidity: ");
Serial.print(humidity);
Serial.print(" %\t");
Serial.print("Temperature: ");
Serial.print(temperature);
Serial.println(" *C ");
StaticJsonDocument<32> doc;
doc["temperature"] = temperature;
doc["humidity"] = humidity;
char buffer[256];
size_t n = serializeJson(doc, buffer);
pubsub_client.publish(TB_TOPIC, buffer, n);
}
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
Serial.println("Preparing Device!");
setup_wifi();
pubsub_client.setServer(TB_MQTT_SERVER, TB_MQTT_PORT);
initializeSensorMode();
dht.begin();
lastSend=0;
}
void loop() {
status = WiFi.status();
if ( status != WL_CONNECTED) {
while ( status != WL_CONNECTED) {
Serial.print("Attempting to connect to WPA SSID: ");
Serial.println(WIFI_AP);
// Connect to WPA/WPA2 network
status = WiFi.begin(WIFI_AP, WIFI_PASSWORD);
delay(500);
}
Serial.println("Connected to AP");
}
if (!pubsub_client.connected()) {
mqttReconnect();
}
if ( millis() - lastSend > 1000 ) { // Update and send only after 1 seconds
getAndSendTemperatureAndHumidityData();
lastSend = millis();
}
pubsub_client.loop();
}