//insert OLED library
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
//insert OLED screen library
#include <Adafruit_SSD1306.h>
//insert HX711 library
#include "HX711.h"
//insert Keypad Library
#include <Keypad.h>
//Initialize OLED screen
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
//variables for centering OLED display
byte panjang, lebar;
int16_t x, y;
uint16_t w, h;
//initialize HX711 object
// HX711 circuit wiring
const int LOADCELL_DOUT_PIN = 12;
const int LOADCELL_SCK_PIN = 13;
HX711 scale;
float calibration_factor = -1365; // for me this vlaue works just perfect 419640
//initialize Keypad
#define row_num 4 //Four rows
#define col_num 4 //four columns
const uint8_t ledPins[] = {15, 2, 4, 5, 18, 19};
const int numLed = sizeof(ledPins) / sizeof(ledPins[0]);
char keys[row_num][col_num]={
{ '1', '2', '3', 'A' },
{ '4', '5', '6', 'B' },
{ '7', '8', '9', 'C' },
{ '*', '0', '#', 'D' }
};
byte row_pins[row_num]={36, 39, 34, 35};
byte col_pins[col_num]={16, 4, 2, 15};
String password="11111";
String input="";
Keypad mykeypad=Keypad(makeKeymap(keys),row_pins,col_pins,row_num,col_num);
//Variable will not change for
const int ST2buttonPin = 26; // the number of the pushbutton pin
const int RT1buttonPin = 27;
const int GT1buttonPin = 14;
const int ST2ledPinR = 25; // the number of the LED pin
const int ST2ledPinG = 33; // led R: Unavailable, Led G: Available
const int ST2ledPinB = 32; // Led B: Reserved
const int RT1ledPinR = 19;
const int RT1ledPinG = 18;
const int RT1ledPinB = 5;
const int GT1ledPinR = 4;
const int GT1ledPinG = 2;
const int GT1ledPinB = 15;
// variables will change:
int ST2ledState = LOW; // the current state of LED
int ST2lastButtonState; // the previous state of button
int ST2currentButtonState; // the current state of button
int RT1ledState = LOW; // the current state of LED
int RT1lastButtonState; // the previous state of button
int RT1currentButtonState; // the current state of button
int GT1ledState = LOW; // the current state of LED
int GT1lastButtonState; // the previous state of button
int GT1currentButtonState; // the current state of button
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
Serial.println("Welcome to Library Reservation System ");
// init LED
pinMode(ST2buttonPin, INPUT_PULLUP); // set ESP32 pin to input pull-up mode
pinMode(RT1buttonPin, INPUT_PULLUP);
pinMode(GT1buttonPin, INPUT_PULLUP);
pinMode(ST2ledPinR, OUTPUT); // set ESP32 pin to output mode
pinMode(ST2ledPinG, OUTPUT);
pinMode(ST2ledPinB, OUTPUT);
pinMode(RT1ledPinR, OUTPUT);
pinMode(RT1ledPinG, OUTPUT);
pinMode(RT1ledPinB, OUTPUT);
pinMode(GT1ledPinR, OUTPUT);
pinMode(GT1ledPinG, OUTPUT);
pinMode(GT1ledPinB, OUTPUT);
// Set All the Table into Available State (Green LED)
digitalWrite(ST2ledPinG, HIGH);
digitalWrite(RT1ledPinG, HIGH);
digitalWrite(GT1ledPinG, HIGH);
//init push button
ST2currentButtonState = digitalRead(ST2buttonPin);
RT1currentButtonState = digitalRead(RT1buttonPin);
GT1currentButtonState = digitalRead(GT1buttonPin);
//init display OLED
display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS);
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE); // Draw white text
//INIT HX711
Serial.println("init HX711");
display.clearDisplay();
display.getTextBounds("WELCOME", 0, 0, &x, &y, &w, &h); //untuk mendapatkan jumlah piksel dalam lebar dan tinggi untuk tulisan WELCOME
panjang = (SCREEN_WIDTH - w) / 2; // Untuk menentukan penempatan piksel pertama
lebar = (SCREEN_HEIGHT - h) / 2;
display.setCursor(panjang, lebar); // kursor diletakkan pada rata tengah kolom 0
display.print("WELCOME");
display.display();
scale.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN);
scale.set_scale();
scale.tare(); //Reset the scale to 0
long zero_factor = scale.read_average(); //Get a baseline reading
delay(1000);
//ready to go
display.clearDisplay();
display.getTextBounds("Ready!!!", 0, 0, &x, &y, &w, &h); //untuk mendapatkan jumlah piksel dalam lebar dan tinggi untuk tulisan WELCOME
panjang = (SCREEN_WIDTH - w) / 2; // Untuk menentukan penempatan piksel pertama
lebar = (SCREEN_HEIGHT - h) / 2;
display.setCursor(panjang, lebar); // kursor diletakkan pada rata tengah kolom 0
display.print("Ready!!!");
display.display();
Serial.println("Ready To Go");
delay(1000);
//display
display.clearDisplay();
display.getTextBounds("ST 1", 0, 0, &x, &y, &w, &h); //untuk mendapatkan jumlah piksel dalam lebar dan tinggi untuk tulisan WELCOME
panjang = (SCREEN_WIDTH - w) / 2; // Untuk menentukan penempatan piksel pertama
display.setCursor(panjang, 0); // kursor diletakkan pada rata tengah kolom 0
display.print("ST 1");
display.getTextBounds("AVAILABLE", 0, 0, &x, &y, &w, &h); //untuk mendapatkan jumlah piksel dalam lebar dan tinggi untuk tulisan WELCOME
panjang = (SCREEN_WIDTH - w) / 2; // Untuk menentukan penempatan piksel pertama
display.setCursor(panjang, 25); // kursor diletakkan pada rata tengah kolom 0
display.print("AVAILABLE");
display.display();
}
void loop() {
// get keys
char key= mykeypad.getKey();
// Serial.println(key);
if(key){
// if '#' pressesd, check password
//lcd.clear();
///lcd_print(0, 0, String(key));
if(key == '#'){
Serial.println();
if(input.compareTo(password) == 0){
Serial.println("Access granted, welcome!...");
while(true);
}
else{
Serial.println("Access denined...");
Serial.print("Try again!....");
}
input="";
}
else if(key == '*'){
input ="";
Serial.println();
Serial.print("Password cleared, enter again: ");
}
else{
input.concat(key);
Serial.print(key);
}
}
unsigned int ADC = scale.get_units();
float weight = float(ADC) / 2100.00 * 5.00;
Serial.print("ADC = ");
Serial.print(ADC);
Serial.print(", weight = ");
Serial.println(weight);
ST2lastButtonState = ST2currentButtonState; // save the last state
ST2currentButtonState = digitalRead(ST2buttonPin); // read new state
RT1lastButtonState = RT1currentButtonState; // save the last state
RT1currentButtonState = digitalRead(RT1buttonPin); // read new state
GT1lastButtonState = GT1currentButtonState; // save the last state
GT1currentButtonState = digitalRead(GT1buttonPin); // read new state
String endReserveTime = "14:00:00"; //variable to display Reservation ended time
if(weight >= 2.00) {
display.clearDisplay();
display.setTextSize(2);
display.getTextBounds("ST 1", 0, 0, &x, &y, &w, &h); //untuk mendapatkan jumlah piksel dalam lebar dan tinggi untuk tulisan WELCOME
panjang = (SCREEN_WIDTH - w) / 2; // Untuk menentukan penempatan piksel pertama
display.setCursor(panjang, 0); // kursor diletakkan pada rata tengah kolom 0
display.print("ST 1");
display.setTextSize(1);
display.getTextBounds("UNAVAILABLE", 0, 0, &x, &y, &w, &h); //untuk mendapatkan jumlah piksel dalam lebar dan tinggi untuk tulisan WELCOME
panjang = (SCREEN_WIDTH - w) / 2; // Untuk menentukan penempatan piksel pertama
display.setCursor(panjang, 20); // kursor diletakkan pada rata tengah kolom 0
display.print("UNAVAILABLE");
display.setTextSize(1);
display.getTextBounds("WILL AVAILABLE AT", 0, 0, &x, &y, &w, &h); //untuk mendapatkan jumlah piksel dalam lebar dan tinggi untuk tulisan WELCOME
panjang = (SCREEN_WIDTH - w) / 2; // Untuk menentukan penempatan piksel pertama
display.setCursor(panjang, 30); // kursor diletakkan pada rata tengah kolom 0
display.print("WILL AVAILABLE AT");
display.setTextSize(2);
display.getTextBounds("00:00:00", 0, 0, &x, &y, &w, &h); //untuk mendapatkan jumlah piksel dalam lebar dan tinggi untuk tulisan WELCOME
panjang = (SCREEN_WIDTH - w) / 2; // Untuk menentukan penempatan piksel pertama
display.setCursor(panjang, 50); // kursor diletakkan pada rata tengah kolom 0
display.print(endReserveTime);
display.display();
}
else if(weight < 2.00) {
display.clearDisplay();
display.setTextSize(2);
display.getTextBounds("ST 1", 0, 0, &x, &y, &w, &h); //untuk mendapatkan jumlah piksel dalam lebar dan tinggi untuk tulisan WELCOME
panjang = (SCREEN_WIDTH - w) / 2; // Untuk menentukan penempatan piksel pertama
display.setCursor(panjang, 0); // kursor diletakkan pada rata tengah kolom 0
display.print("ST 1");
display.getTextBounds("AVAILABLE", 0, 0, &x, &y, &w, &h); //untuk mendapatkan jumlah piksel dalam lebar dan tinggi untuk tulisan WELCOME
panjang = (SCREEN_WIDTH - w) / 2; // Untuk menentukan penempatan piksel pertama
display.setCursor(panjang, 25); // kursor diletakkan pada rata tengah kolom 0
display.print("AVAILABLE");
display.display();
}
if(ST2lastButtonState == HIGH && ST2currentButtonState == LOW) {
Serial.println("The button ST2 is pressed");
// toggle state of LED
ST2ledState = !ST2ledState;
// control LED arccoding to the toggled state
digitalWrite(ST2ledPinR, ST2ledState);
digitalWrite(ST2ledPinG, !ST2ledState);
}
if(RT1lastButtonState == HIGH && RT1currentButtonState == LOW){
Serial.println("The button RT1 is pressed");
// toggle state of LED
RT1ledState = !RT1ledState;
// control LED arccoding to the toggled state
digitalWrite(RT1ledPinR, RT1ledState);
digitalWrite(RT1ledPinG, !RT1ledState);
}
if(GT1lastButtonState == HIGH && GT1currentButtonState == LOW){
Serial.println("The button GT1 is pressed");
// toggle state of LED
GT1ledState = !GT1ledState;
// control LED arccoding to the toggled state
digitalWrite(GT1ledPinR, GT1ledState);
digitalWrite(GT1ledPinG, !GT1ledState);
}
delay(100);
}
//void lcd_print(int x, int y, String message) {
// lcd.setCursor(x, y);
// lcd.print(message);
//}
/*
//DISPLAY WEIGHT IN OLED
String teks = String(weight, 2);
display.fillRect(0, 25, 128, 25, 0);
display.getTextBounds(teks.c_str(), 0, 0, &x, &y, &w, &h); //untuk mendapatkan jumlah piksel dalam lebar dan tinggi untuk tulisan WELCOME
panjang = (SCREEN_WIDTH - w) / 2; // Untuk menentukan penempatan piksel pertama
display.setCursor(panjang, 25); // kursor diletakkan pada rata tengah kolom 0
display.print(teks);
display.display();
delay(2000); // delay every 2 seconds
*/
/*
ST2lastButtonState = ST2currentButtonState; // save the last state
ST2currentButtonState = digitalRead(ST2buttonPin); // read new state
if(ST2lastButtonState == HIGH && ST2currentButtonState == LOW) {
Serial.println("The button ST2 is pressed");
// toggle state of LED
ST2ledState = !ST2ledState;
// control LED arccoding to the toggled state
digitalWrite(ST2ledPinR, ST2ledState);
}
delay(100);
*/
Single Table 2
R:25 G:33 B:32
Round Table 1
R:19 G:18 B:5
Group Table 1
R:4 G:2 B:15
ST2
26
RT1
27
RT2
14
DT:12 SCK:13