#include <DHT.h>
#include <WiFi.h>
#include <LiquidCrystal_I2C.h>
#include <ThingsBoard.h>
#include <Arduino_MQTT_Client.h>
#include "TinyGPS.h"
static const uint32_t GPSBaud = 9600;
// The TinyGPSPlus object
TinyGPSPlus gps;
// WiFi credentials
const char ssid[] = "Wokwi-GUEST";
const char password[] = "";
#define TB_SERVER "thingsboard.cloud"
#define TOKEN "ojq75jlcf5vzr391wf1t"
WiFiClient espClient;
Arduino_MQTT_Client mqttClient(espClient);
ThingsBoard tb(mqttClient);
// Pin definitions
#define DHTPIN 15 // Pin data pada sensor DHT22
#define DHTTYPE DHT22 // Tipe sensor DHT22
#define RELAY_PIN 18 // Pin kontrol pada relay
#define PULSE_PIN 35 // Pin pulse pin
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal_I2C lcd(0x27, 20, 4); // Alamat I2C dan ukuran LCD (20x4)
// Function to connect to WiFi
void connectToWiFi() {
Serial.println("Connecting to WiFi...");
WiFi.begin(ssid, password);
int attempts = 0;
while (WiFi.status() != WL_CONNECTED && attempts < 20) {
delay(500);
Serial.print(".");
attempts++;
}
if (WiFi.status() != WL_CONNECTED) {
Serial.println("\nFailed to connect to WiFi.");
} else {
Serial.println("\nConnected to WiFi");
}
}
void connectToThingsBoard() {
if (!tb.connected()) {
Serial.println("Connecting to ThingsBoard server");
if (!tb.connect(TB_SERVER, TOKEN)) {
Serial.println("Failed to connect to ThingsBoard");
} else {
Serial.println("Connected to ThingsBoard");
}
}
}
void sendDataToThingsBoard(float temp, float humidity, double latitude, double longitude, int heartRate) {
tb.sendTelemetryData("temperature", temp);
tb.sendTelemetryData("heartRate", heartRate);
tb.sendTelemetryData("humidity", humidity);
tb.sendTelemetryData("latitude", latitude);
tb.sendTelemetryData("longitude", longitude);
Serial.println("Data sent to ThingsBoard");
}
void setup() {
// Initialize serial communication
Serial.begin(9600);
Serial1.begin(GPSBaud);
// Initialize LCD
lcd.init();
lcd.backlight();
// Initialize DHT sensor
dht.begin();
// Initialize relay pin
pinMode(RELAY_PIN, OUTPUT);
// Connect to WiFi
connectToWiFi();
connectToThingsBoard();
}
void loop() {
// Delay between readings
delay(2000);
// Read temperature and humidity from DHT sensor
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
// Initialize latitude and longitude
double latitude = 0.0;
double longitude = 0.0;
while (Serial1.available() > 0){
if(gps.encode(Serial1.read())){
Serial.print(F("Location: "));
if (gps.location.isValid())
{
Serial.print(gps.location.lat(), 6);
Serial.print(F(","));
Serial.print(gps.location.lng(), 6);
}
else
{
Serial.print(F("INVALID"));
}
}
}
// if (gps.encode(Serial1.read()))
if (millis() > 5000 && gps.charsProcessed() < 10)
{
Serial.println(F("No GPS detected: check wiring."));
while(true);
}
// Check if readings are valid
if (!isnan(temperature) && !isnan(humidity)) {
// Read pulseValue from PULSE_PIN
int16_t pulseValue = analogRead(PULSE_PIN);
// Convert pulseValue to voltage
float voltage = pulseValue * (3.3 / 4095.0);
// Calculate heartRate from voltage
int heartRate = (voltage / 3.3) * 675;
// Determine normal or abnormal heart rate for a dog (example)
String heartRateStatus;
bool isHeartRateNormal = true;
if (heartRate >= 60 && heartRate <= 140) {
heartRateStatus = "Normal";
} else {
heartRateStatus = "Abnormal";
isHeartRateNormal = false;
}
// Print values to serial monitor
Serial.print("Suhu: ");
Serial.print(temperature);
Serial.print(" °C, Kelembaban: ");
Serial.print(humidity);
Serial.println(" %");
Serial.print("Heart Rate: ");
Serial.print(heartRate);
Serial.print(" BPM (");
Serial.print(heartRateStatus);
Serial.println(")");
// Display values on LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Suhu: ");
lcd.print(temperature);
lcd.print(" C");
lcd.setCursor(0, 1);
lcd.print("Kelembaban: ");
lcd.print(humidity);
lcd.print(" %");
lcd.setCursor(0, 2);
lcd.print("Lat: ");
lcd.print(latitude, 6);
lcd.setCursor(0, 3);
lcd.print("Lon: ");
lcd.print(longitude, 6);
lcd.setCursor(0, 4);
lcd.print("Heart: ");
lcd.print(heartRate);
lcd.print(" BPM (");
lcd.print(heartRateStatus);
lcd.print(")");
// Control relay based on temperature and heart rate
if (temperature > 28.0 || !isHeartRateNormal) {
digitalWrite(RELAY_PIN, HIGH); // Activate relay
Serial.println("Relay diaktifkan.");
} else {
digitalWrite(RELAY_PIN, LOW); // Deactivate relay
Serial.println("Relay dimatikan.");
}
// Reconnect to ThingsBoard if connection is lost
if (!tb.connected()) {
// connectToThingsBoard();
}
// Send data to ThingsBoard
// sendDataToThingsBoard(temperature, humidity, latitude, longitude, heartRate);
} else {
Serial.println("Gagal membaca data dari sensor DHT22!");
}
}