#include <WiFi.h>
#include <HTTPClient.h>
#include <LiquidCrystal_I2C.h>
#include "HX711.h"
#include <ESP32Servo.h>
#include <Arduino_JSON.h>
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* serverName = "https://pembelianberasotomatisus-default-rtdb.firebaseio.com/sensor.json";
//const char* serverName2 = "https://pembelianberasotomatisus-default-rtdb.firebaseio.com/actuator.json";
#define I2C_ADDR 0x27
#define LCD_COLUMNS 20
#define LCD_LINES 4
#define ECHO_PIN 15
#define TRIG_PIN 2
#define tarebutton 19
#define LOADCELL_DOUT_PIN 27 //2
#define LOADCELL_SCK_PIN 14 //4
HX711 scale;
Servo myservo;
LiquidCrystal_I2C LCD = LiquidCrystal_I2C(0x27, 20, 4);
unsigned long myoffset,refval;
int pos = 0;
int statusbeli = 0;
int beratbeli = 0;
String myjson;
//String nilais;
int nilai;
void setup() {
Serial.begin(115200);
pinMode(LED_BUILTIN, OUTPUT);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(tarebutton, INPUT);
myservo.attach(4);
LCD.init();
LCD.backlight();
byte buttonstat;
Serial.println("Initializing the scale");
scale.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN);
Serial.println("pastikan beban tidak ada (0 kg) lalu tekan tombol");
do
{
buttonstat=digitalRead(tarebutton);
}
while(buttonstat==HIGH);
delay(300);
Serial.println("tunggu....");
myoffset=scale.read_average(20);
Serial.print("nilai offset: ");
Serial.println(myoffset);
Serial.println("berikan beban standar (1 kg) lalu tekan tombol");
do
{
buttonstat=digitalRead(tarebutton);
}
while(buttonstat==HIGH);
delay(300);
Serial.println("tunggu....");
refval=scale.read_average(20);
Serial.print("nilai referensi: ");
Serial.println(refval);
WiFi.begin(ssid, password);
Serial.println("Connecting");
while(WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
LCD.setCursor(0, 0);
LCD.print("Menghubungkan...");
}
Serial.println("");
Serial.print("Connected to WiFi network with IP Address: ");
Serial.println(WiFi.localIP());
Serial.println("Timer set to 5 seconds (timerDelay variable), it will take 5 seconds before publishing the first reading.");
}
float readDistanceCM() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
int duration = pulseIn(ECHO_PIN, HIGH);
return duration * 0.034 / 2;
}
void loop() {
unsigned long adcave;
float distance = readDistanceCM();
adcave=scale.read_average(1);
float berat=(adcave-myoffset)/(refval-myoffset);
Serial.println("Berat = "+String(berat) +" grams");
Serial.print("Measured distance: ");
Serial.println(distance,1);
//Serial.print("Scale: ");
//Serial.println(berat,1);
LCD.setCursor(0, 0);
LCD.print("Kapasitas:");
LCD.setCursor(0, 1);
LCD.print((100-distance),1);
LCD.setCursor(4, 1);
LCD.print("%");
//ini utk menulis ke firebase
myjson = "{\"beratbeli\": " + String(beratbeli) + ", \"distance\": " + String(distance) + ", \"statusbeli\": " + String(statusbeli) + "}";
if(WiFi.status()== WL_CONNECTED)
{
HTTPClient http;
http.begin(serverName);
int httpResponseCode = http.PUT(myjson);
LCD.setCursor(0, 2);
LCD.print("Mengirim Data...");
if (httpResponseCode>0)
{
Serial.print("HTTP Response code: ");
Serial.println(httpResponseCode);
String payload = http.getString();
Serial.println(payload);
}
else
{
Serial.print("Error code: ");
Serial.println(httpResponseCode);
}
http.end();
}
else
{
Serial.println("WiFi Disconnected");
}
while (statusbeli==0){
// ini utk membaca dari firebase
if(WiFi.status()== WL_CONNECTED)
{
int httpResponseCode = 0;
HTTPClient http;
http.begin(serverName);
LCD.setCursor(0, 2);
LCD.print("Menerima Data...");
while(httpResponseCode<=0){
http.begin(serverName);
httpResponseCode = http.GET();
Serial.print("Respon code baca: ");
Serial.println(httpResponseCode);
LCD.setCursor(0, 2);
LCD.print("Menerima Gagal");
}
if (httpResponseCode>0)
{ LCD.setCursor(0, 2);
LCD.print("Menerima Berhasil");
String payload = http.getString();
Serial.println(payload);
JSONVar myObject = JSON.parse(payload);
if (JSON.typeof(myObject) == "undefined")
{
Serial.println("Parsing input failed!");
return;
}
JSONVar keys = myObject.keys();
Serial.print("keys: ");
Serial.println(keys);
JSONVar value = myObject[keys[2]];
String nilais = value;
nilai = nilais.toInt();
statusbeli = nilai;
Serial.print("statusbeli: ");
Serial.println(statusbeli);
value = myObject[keys[0]];
Serial.print("value: ");
Serial.println(value);
String nilais2 = value;
nilai = nilais2.toInt();
Serial.print("beratbeli: ");
Serial.println(nilai);
if(statusbeli==1)
{
beratbeli =nilai;
Serial.println(beratbeli);
LCD.setCursor(0, 2);
LCD.print("Pembelian");
LCD.setCursor(11, 2);
LCD.print(nilai);
}
else
{
beratbeli = 0;
Serial.println(beratbeli);
}
}
else
{
Serial.print("Error code: ");
Serial.println(httpResponseCode);
Serial.println("Proses diulang");
}
http.end();
}
else
{
Serial.println("WiFi Disconnected");
}
}
if(statusbeli == 1){
for (pos = 0; pos <= 180; pos += 1) {
myservo.write(pos);
delay(10);
}
while(berat<= beratbeli){
berat = scale.get_units()/420;
Serial.print("Berat Pembelian: ");
Serial.println(berat,1);
LCD.setCursor(0, 0);
LCD.print("Berat : ");
LCD.setCursor(0, 1);
LCD.print(berat);
LCD.setCursor(0, 2);
LCD.print("Pembelian Proses");
}
for (pos = 180; pos >= 0; pos -= 1) {
myservo.write(pos);
delay(10);
}
while(berat!= 0){
berat = scale.get_units()/420;
Serial.print("Berat Pembelian: ");
Serial.println(berat,1);
LCD.setCursor(0, 0);
LCD.print("Berat : ");
LCD.setCursor(0, 1);
LCD.print(berat);
LCD.setCursor(0, 2);
LCD.print("Pembelian Selesai");
LCD.setCursor(0, 3);
LCD.print("Ambil Beras Anda");
}
LCD.clear();
statusbeli =0;
beratbeli = 0;
}
// delay(100);
}