PROGRAM
//------------------------------------------------------------------------------
// Library File
#include "esp_timer.h"
#include "WiFi.h"
#include "WiFiClient.h"
#include "WebServer.h"
#include "HX711.h"
//----------------------------------------------------
// Difinisikan PIN
#define BUZZER 23
#define HX_OUT 19
#define HX_SCK 18
#define SW_UP 22
#define SW_DOWN 21
#define SW_RIGHT 16
#define SW_LEFT 4
#define LED 15
#define STEP1 13
#define DIR1 12
#define STEP2 14
#define DIR2 27
#define MTRA 25
#define MTRB 33
#define MPWM 26
#define PC Serial
// Difinisikan Nilai / Logika
#define ON 1
#define OFF 0
#define PRESSED 0
#define UNPRESSED 1
#define MAX_SPEED_CRANE 2000 // Delay
#define MIN_SPEED_CRANE 10000 // SEmakin kecil sematin kenceng
#define HX_CALIBRATE 125
//----------------------------------------------------
// Variable Global
int speed_crane = 50, speed_catrol = 50, load, limit_load = 500;
int motor_pwm;
bool button_up = 1, button_down = 1, button_right = 1;
bool button_pullup = 1, button_pulldown = 1, button_left = 1;
double tick_load, stepper_delay;
hw_timer_t* Mytimer = NULL;
//----------------------------------------------------
// Variable Setting
const char* ap_ssid = "RivoCrane";
const char* ap_pass = "1234567890";
IPAddress ap_ip(10, 10, 10, 10);
IPAddress ap_gateway(10, 10, 10, 1);
IPAddress ap_subnet(255, 255, 255, 0);
WebServer server(80);
HX711 loadcell;
//------------------------------------------------------------------------------
void IRAM_ATTR periodeInterrupt() {
// Motor Stepper
static double tick_motor, tick_switch;
stepper_delay = map(speed_crane, 0, 100, MIN_SPEED_CRANE, MAX_SPEED_CRANE);
// Tentukan Arah Putaran Motor
if (button_up == PRESSED) digitalWrite(DIR1, ON);
else if (button_down == PRESSED) digitalWrite(DIR1, OFF);
if (button_right == PRESSED) digitalWrite(DIR2, ON);
else if (button_left == PRESSED) digitalWrite(DIR2, OFF);
// Limit Switch
if (millis() - tick_switch > 100) {
if (digitalRead(SW_UP) == PRESSED && button_up == PRESSED) speed_crane = 0;
else if (digitalRead(SW_DOWN) == PRESSED && button_down == PRESSED) speed_crane = 0;
else if (digitalRead(SW_RIGHT) == PRESSED && button_right == PRESSED) speed_crane = 0;
else if (digitalRead(SW_LEFT) == PRESSED && button_left == PRESSED) speed_crane = 0;
else tick_switch = millis();
// Jalankan Motor Stepper
if (speed_crane > 0) {
if (micros() - tick_motor > stepper_delay * 2) {
tick_motor = micros();
} else if (micros() - tick_motor < stepper_delay) {
if (button_up == PRESSED || button_down == PRESSED) digitalWrite(STEP1, ON);
if (button_right == PRESSED || button_left == PRESSED) digitalWrite(STEP2, ON);
} else if (micros() - tick_motor > stepper_delay) {
if (button_up == PRESSED || button_down == PRESSED) digitalWrite(STEP1, OFF);
if (button_right == PRESSED || button_left == PRESSED) digitalWrite(STEP2, OFF);
}
//------------------------------------------------------------------------------
void setup() {
// Mulai Serial ke PC
PC.begin(9600); // Baudrate 9600
// TImer Interupt
Mytimer = timerBegin(0, 80, true);
timerAttachInterrupt(Mytimer, &periodeInterrupt, true);
timerAlarmWrite(Mytimer, 1000, true); // per 1 micro second
timerAlarmEnable(Mytimer);
// Mulai HX711
loadcell.begin(HX_OUT, HX_SCK);
loadcell.set_scale(HX_CALIBRATE);
loadcell.tare();
// Pin Mode
pinMode(BUZZER, OUTPUT);
pinMode(LED, OUTPUT);
pinMode(STEP1, OUTPUT);
pinMode(STEP2, OUTPUT);
pinMode(DIR1, OUTPUT);
pinMode(DIR2, OUTPUT);
pinMode(MTRA, OUTPUT);
pinMode(MTRB, OUTPUT);
pinMode(MPWM, OUTPUT);
pinMode(SW_UP, INPUT_PULLUP);
pinMode(SW_DOWN, INPUT);
pinMode(SW_LEFT, INPUT_PULLUP);
pinMode(SW_RIGHT, INPUT_PULLUP);
ledcSetup(0, 5000, 8);
ledcAttachPin(MPWM, 0);
// AP Mode Server
WiFi.mode(WIFI_AP); // Mode AP
WiFi.softAPConfig(ap_ip, ap_gateway, ap_subnet); // Setting IP AP
WiFi.softAP(ap_ssid, ap_pass); // Set AP SSID dan Pass
server.on("/", handleIndex); // GET Handle root / Index
server.begin(); // Start SErver
beep(3, 100);
//------------------------------------------------------------------------------
void loop() {
if (millis() - tick_load > 1000) {
load = loadcell.get_units(1);
tick_load = millis();
// Jika Limit Bata Beban
if (load > limit_load) {
while (1) {
// Baca Loadcell
load = loadcell.get_units(1);
// Jika sudah kurang dari 10 gram
if (load <= 10) {
// Keluar
break;
digitalWrite(BUZZER, ON);
// Motor Turun
digitalWrite(MTRA, OFF);
digitalWrite(MTRB, ON);
ledcWrite(0, 255);
// Jeda
delay(100);
// Motor Stop
digitalWrite(MTRA, OFF);
digitalWrite(MTRB, OFF);
ledcWrite(0, 0);
digitalWrite(BUZZER, OFF);
// Motor DC
motor_pwm = map(speed_catrol, 0, 100, 190, 255);
if (button_pullup == PRESSED) {
digitalWrite(MTRA, ON);
digitalWrite(MTRB, OFF);
ledcWrite(0, motor_pwm);
} else if (button_pulldown == PRESSED) {
digitalWrite(MTRA, OFF);
digitalWrite(MTRB, ON);
ledcWrite(0, motor_pwm);
} else {
digitalWrite(MTRA, OFF);
digitalWrite(MTRB, OFF);
ledcWrite(0, 0);
debugPC(100);
server.handleClient();
//------------------------------------------------------------------------------
FUNGSI
//------------------------------------------------------------------------------
// Handle Akses Index, baca segala bentuk POST / GET
void handleIndex() {
if (server.arg("up") != "") button_up = server.arg("up").toInt();
if (server.arg("down") != "") button_down = server.arg("down").toInt();
if (server.arg("left") != "") button_left = server.arg("left").toInt();
if (server.arg("right") != "") button_right = server.arg("right").toInt();
if (server.arg("pullup") != "") button_pullup = server.arg("pullup").toInt();
if (server.arg("pulldown") != "") button_pulldown = server.arg("pulldown").toInt();
if (server.arg("speed_crane") != "") {
if (server.arg("speed_crane").toInt() != speed_crane) speed_crane = server.arg("speed_crane").toInt();
if (server.arg("speed_catrol") != "") {
if (server.arg("speed_catrol").toInt() != speed_catrol) speed_catrol = server.arg("speed_catrol").toInt();
if (server.arg("limit_load") != "") {
if (server.arg("limit_load").toInt() != limit_load) limit_load = server.arg("limit_load").toInt();
if (server.arg("tare") != "") {
if (server.arg("tare").toInt() == PRESSED) {
PC.println("TARE");
loadcell.tare();
}
String json = "{";
json += "\"speed_crane\":" + String(speed_crane) + ",";
json += "\"speed_catrol\":" + String(speed_catrol) + ",";
json += "\"load\":" + String(load) + ",";
json += "\"limit_load\":" + String(limit_load) + "";
json += "}";
server.send(200, "application/json", json);
//----------------------------------------------------------------------------------
void beep(int counting, int wait) {
if (counting == 0) counting = 1;
for (int i = 0; i < counting; i++) {
digitalWrite(BUZZER, ON);
delay(wait);
digitalWrite(BUZZER, OFF);
delay(wait);
//------------------------------------------------------------------------------
void debugPC(int interval_debug) {
static double tick_debug;
if (millis() - tick_debug > interval_debug) {
PC.print("Speed Crane: ");
PC.print(speed_crane);
PC.print(", Speed Catrol: ");
PC.print(speed_catrol);
PC.print(", Load: ");
PC.print(load);
PC.print(", Limit Load: ");
PC.print(limit_load);
// PC.print("us, Up: ");
// PC.print(button_up);
// PC.print(", Down: ");
// PC.print(button_down);
// PC.print(", Left: ");
// PC.print(button_left);
// PC.print(", Right: ");
// PC.print(button_right);
// PC.print(", Pull Up: ");
// PC.print(button_pullup);
// PC.print(", Pull Down: ");
// PC.print(button_pulldown);
Serial.print(F(", SW UP: "));
Serial.print(digitalRead(SW_UP));
Serial.print(F(", SW DN: "));
Serial.print(digitalRead(SW_DOWN));
Serial.print(F(", SW LF: "));
Serial.print(digitalRead(SW_LEFT));
Serial.print(F(", SW RG: "));
Serial.print(digitalRead(SW_RIGHT));
PC.println();
tick_debug = millis();
}
//------------------------------------------------------------------------------