#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include "time.h"
#include <WiFi.h>
WiFiClient client;
#include "DHT.h"
#define TOKEN "BBUS-8CtThy12HXCSozWf5VhiRLHIa3pRIX" // Ganti dengan token Ubidots Anda.
#define DEVICE_NAME "wokwi" // Ganti dengan nama perangkat Ubidots Anda.
#define NTP_SERVER "pool.ntp.org"
#define GMT_OFFSET_SEC 7 * 3600
#define DAYLIGHT_OFFSET_SEC 0
#define DHT_TYPE DHT22
#define DHT_PIN 13
DHT dht(DHT_PIN, DHT_TYPE);
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
#define SCREEN_ADDRESS 0x3C
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
byte panjang, lebar;
int16_t x, y;
uint16_t w, h;
const int LED_PIN = 12;
const char* WIFI_NAME = "Wokwi-GUEST";
const char* WIFI_PASSWORD = "";
const char* HTTP_SERVER = "industrial.api.ubidots.com"; // Ganti dengan server Ubidots yang benar.
const uint16_t HTTP_PORT = 80;
byte trigPin1 = 17;
byte echoPin1 = 16;
#define SOUND_SPEED 0.034
float jarakcm1, humidity, temperature;
bool statusSwitch;
byte pinSwitch = 12;
void setup() {
Serial.begin(115200);
pinMode(pinSwitch, INPUT_PULLUP);
pinMode(trigPin1, OUTPUT);
pinMode(echoPin1, INPUT);
Serial.println("ESP32 Wokwi Monitoring Send Data to Ubidots");
display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS);
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.getTextBounds("ESP32", 0, 0, &x, &y, &w, &h);
panjang = (SCREEN_WIDTH - w) / 2;
display.setCursor(panjang, 0);
display.print("ESP32");
display.display();
delay(500);
// ... (Sama seperti bagian sebelumnya untuk menampilkan teks MONITORING dan TO UBIDOTS)
// Inisialisasi DHT22
dht.begin();
display.clearDisplay();
display.getTextBounds("CHECK WIFI", 0, 0, &x, &y, &w, &h);
panjang = (SCREEN_WIDTH - w) / 2;
display.setCursor(panjang, 0);
display.print("CHECK WIFI");
display.display();
WiFi.mode(WIFI_STA);
WiFi.begin(WIFI_NAME, WIFI_PASSWORD);
unsigned long waktu = millis();
while (WiFi.status() != WL_CONNECTED && millis() - waktu < 30000) {
delay(250);
Serial.println("Wifi not connected");
}
display.getTextBounds("Connected!", 0, 0, &x, &y, &w, &h);
panjang = (SCREEN_WIDTH - w) / 2;
display.setCursor(panjang, 30);
display.print("Connected!");
display.display();
Serial.println("Wifi connected !");
Serial.println("Local IP: " + WiFi.localIP().toString());
configTime(GMT_OFFSET_SEC, DAYLIGHT_OFFSET_SEC, NTP_SERVER);
struct tm timeinfo;
getLocalTime(&timeinfo);
delay(2000);
display.clearDisplay();
display.setTextSize(1);
display.setCursor(0, 20);
display.print("Temp");
display.setCursor(0, 35);
display.print("Humid");
display.setCursor(30, 20);
display.print(":");
display.setCursor(30, 35);
display.print(":");
display.setCursor(30, 50);
display.print(":");
display.display();
}
void loop() {
printLocalTime();
getDistance();
getDataDHT();
statusSwitch = digitalRead(pinSwitch);
displayData();
if (!client.connect(HTTP_SERVER, HTTP_PORT)) {
Serial.println("Connection to host failed");
delay(100);
return;
}
Serial.println("Connected to server successful!");
sendData();
delay(5000);
}
void printLocalTime() {
struct tm timeinfo;
if (!getLocalTime(&timeinfo)) {
Serial.println("Failed to obtain time");
return;
}
Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S");
display.fillRect(0, 0, 128, 15, SSD1306_BLACK);
display.setCursor(0, 0);
display.print(&timeinfo, "%m/%d/%Y %H:%M");
display.display();
}
void displayData() {
Serial.print("Status Switch = ");
Serial.println(statusSwitch);
Serial.print("Temperature = ");
Serial.println(temperature);
Serial.print("Humidity = ");
Serial.println(humidity);
display.fillRect(35, 20, 20, 44, SSD1306_BLACK);
display.setCursor(40, 20);
display.print(temperature, 1);
display.setCursor(40, 35);
display.print(humidity);
if (temperature < 20) {
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.getTextBounds("memanaskan", 0, 0, &x, &y, &w, &h);
panjang = (SCREEN_WIDTH - w) / 2;
display.setCursor(panjang, 0);
display.print("memanaskan");
display.setTextSize(1);
display.setCursor(0, 25);
display.setTextColor(SSD1306_WHITE);
display.display();
}
if (statusSwitch == 1)
display.fillCircle(105, 40, 20, SSD1306_WHITE);
else {
display.fillCircle(105, 40, 20, SSD1306_BLACK);
display.drawCircle(105, 40, 20, SSD1306_WHITE);
}
display.display();
}
void sendData() {
String requestBody = "";
requestBody = "{\"temperature\":" + String(temperature, 2);
requestBody += ",\"switch\":" + String(statusSwitch);
requestBody += ",\"humidity\":" + String(humidity, 1) + "}";
Serial.println(requestBody);
Serial.println("---");
Serial.println("Sending HTTP request...");
client.print(F("POST /api/v1.6/devices/"));
client.print(DEVICE_NAME);
client.println(F(" HTTP/1.1"));
client.println(F("User-Agent: ESP32/1.0"));
client.print(F("X-Auth-Token: "));
client.println(TOKEN);
client.println(F("Connection: close"));
client.println(F("Content-Type: application/json"));
client.print(F("Content-Length: "));
client.println(requestBody.length());
client.print(F("Host: "));
client.println(HTTP_SERVER);
client.println();
client.println(requestBody);
client.println();
Serial.println("Reading response...");
while (client.connected()) {
String line = client.readStringUntil('\n');
if (line == "\r") {
break;
}
}
String response = client.readStringUntil('\n');
Serial.println(response);
Serial.println("Closing connection");
client.stop();
}
void getDistance() {
unsigned long durasi = 0;
digitalWrite(trigPin1, LOW);
delayMicroseconds(2);
digitalWrite(trigPin1, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin1, LOW);
durasi = pulseIn(echoPin1, HIGH);
jarakcm1 = durasi * SOUND_SPEED / 2;
}
void getDataDHT() {
humidity = dht.readHumidity();
temperature = dht.readTemperature();
}