#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <WiFi.h> // Library untuk Wi-Fi
#include <WebServer.h> // Library untuk WebServer
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// Ganti dengan kredensial Wi-Fi Anda
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// Deklarasi WebServer di port 80
WebServer server(80);
const int stepAngleButton = 4;
const int directionPin = 16;
const int pulsePin = 5;
const int stepsPerRevolution = 1000; // Jumlah langkah per putaran penuh motor
const int pulseInterval = 2000; // Interval delay untuk pulse (dalam mikrodetik)
const unsigned char cat_bitmap1 [] PROGMEM = { /* Data bitmap untuk gambar 1 */ };
const unsigned char cat_bitmap2 [] PROGMEM = { /* Data bitmap untuk gambar 2 */ };
const unsigned char cat_bitmap3 [] PROGMEM = { /* Data bitmap untuk gambar 3 */ };
const unsigned char cat_bitmap4 [] PROGMEM = { /* Data bitmap untuk gambar 4 */ };
const unsigned char cat_bitmap5 [] PROGMEM = { /* Data bitmap untuk gambar 5 */ };
const unsigned char cat_bitmap6 [] PROGMEM = { /* Data bitmap untuk gambar 6 */ };
const unsigned char cat_bitmap7 [] PROGMEM = { /* Data bitmap untuk gambar 7 */ };
const unsigned char cat_bitmap8 [] PROGMEM = { /* Data bitmap untuk gambar 8 */ };
const unsigned char thank_you_bitmap [] PROGMEM = { /* Data bitmap untuk gambar "thank you" */ };
const unsigned char* bitmaps[] = {
cat_bitmap1, cat_bitmap2, cat_bitmap3, cat_bitmap4,
cat_bitmap5, cat_bitmap6, cat_bitmap7, cat_bitmap8
};
void setup() {
Serial.begin(115200);
// Inisialisasi koneksi Wi-Fi
WiFi.begin(ssid, password);
// Tunggu hingga terhubung ke Wi-Fi
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.print(".");
}
// Jika sudah terhubung, cetak alamat IP
Serial.println("");
Serial.println("Connected to WiFi");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
pinMode(stepAngleButton, INPUT_PULLUP);
pinMode(directionPin, OUTPUT);
pinMode(pulsePin, OUTPUT);
digitalWrite(directionPin, LOW); // Set initial direction
digitalWrite(pulsePin, LOW); // Set initial pulse to LOW
// Inisialisasi OLED
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for (;;);
}
display.clearDisplay();
display.drawBitmap((SCREEN_WIDTH - 128) / 2, (SCREEN_HEIGHT - 64) / 2, cat_bitmap1, 128, 64, SSD1306_WHITE);
display.display();
// Setup routing untuk web server
server.on("/", handleRoot);
server.on("/step", handleStepCommandFromWeb);
// Mulai server
server.begin();
}
void loop() {
// Menangani klien server web
server.handleClient();
// Periksa tombol fisik
bool buttonPressed = (digitalRead(stepAngleButton) == LOW);
if (buttonPressed) {
handleStepCommand();
delay(200); // Delay untuk debouncing tombol
}
}
void handleStepCommand() {
Serial.println("Step command received");
digitalWrite(directionPin, HIGH); // Set motor direction
// Tampilkan gambar kucing dari cat_bitmap1 hingga cat_bitmap8
for (int i = 0; i < 8; i++) {
display.clearDisplay();
display.drawBitmap((SCREEN_WIDTH - 128) / 2, (SCREEN_HEIGHT - 64) / 2, bitmaps[i], 128, 64, SSD1306_WHITE);
display.display();
delay(100); // Tampilkan setiap gambar selama 100 ms
}
Serial.println(F("Gambar selesai 1-8"));
Serial.println(F("Motor mulai berputar"));
// Putar motor stepper satu putaran penuh
for (int i = 0; i < stepsPerRevolution; i++) {
digitalWrite(pulsePin, HIGH);
delayMicroseconds(pulseInterval);
digitalWrite(pulsePin, LOW);
delayMicroseconds(pulseInterval);
}
Serial.println(F("Motor selesai berputar"));
// Tampilkan gambar kucing dari cat_bitmap8 hingga cat_bitmap1
for (int i = 7; i >= 0; i--) {
display.clearDisplay();
display.drawBitmap((SCREEN_WIDTH - 128) / 2, (SCREEN_HEIGHT - 64) / 2, bitmaps[i], 128, 64, SSD1306_WHITE);
display.display();
delay(100); // Tampilkan setiap gambar selama 100 ms
}
Serial.println(F("Gambar selesai 8-1"));
// Tampilkan gambar "thank you" dan berkedip 5 kali selama 3 detik
for (int blink = 0; blink < 5; blink++) {
display.clearDisplay(); // Clear display for blinking effect
display.display();
delay(300); // Blink off time
display.drawBitmap((SCREEN_WIDTH - 128) / 2, (SCREEN_HEIGHT - 64) / 2, thank_you_bitmap, 128, 64, SSD1306_WHITE);
display.display();
delay(300); // Blink on time
}
Serial.println(F("Thank you message selesai"));
// Tampilkan kembali gambar kucing pertama setelah animasi "thank you" selesai
display.clearDisplay();
display.drawBitmap((SCREEN_WIDTH - 128) / 2, (SCREEN_HEIGHT - 64) / 2, cat_bitmap1, 128, 64, SSD1306_WHITE);
display.display();
Serial.println(F("Kembali ke gambar 1"));
}
void handleRoot() {
String html = "<html><body>";
html += "<h1>Motor Control</h1>";
html += "<p><a href=\"/step\">Start Motor</a></p>";
html += "</body></html>";
server.send(200, "text/html", html);
}
void handleStepCommandFromWeb() {
String html = "<html><body>";
html += "<h1>Motor Command Sent</h1>";
html += "<p>Motor is running...</p>";
html += "<a href=\"/\">Back to Home</a>";
html += "</body></html>";
handleStepCommand(); // Panggil fungsi untuk memutar motor dan menampilkan gambar
server.send(200, "text/html", html);
}