Senin, 25 Agustus 2025

UJI WEMOS DASAR :



 

https://www.projectguideline.com/using-arduino-ide-for-doing-esp8266-wemos-d1-mini-wifi-projects/ 


//Pilih Board:
//Arduino IDE → Tools → Board → Boards Manager…
//Install “ESP8266 by ESP8266 Community” (kalau belum).
//Tools → Board → pilih “LOLIN (WEMOS) D1 R2 & mini”.


const int outputPin1 = D5;  // GPIO14
const int outputPin2 = D6;  // GPIO12
const int outputPin3 = D7;  // GPIO13

int statusFlag = 1;

void setup() {
  Serial.begin(115200);
  pinMode(outputPin1, OUTPUT);
  pinMode(outputPin2, OUTPUT);
  pinMode(outputPin3, OUTPUT);

  digitalWrite(outputPin1, LOW);
  digitalWrite(outputPin2, LOW);
  digitalWrite(outputPin3, LOW);

  Serial.println("Ready. Ketik A/B/C/D/E/F.");
}

void loop() {
  if (Serial.available() > 0) {
    char cmd = Serial.read();
    handleCommand(cmd);
  }
}

void pulsePin(int pin, unsigned long ms) {
  digitalWrite(pin, HIGH);
  delay(ms);
  digitalWrite(pin, LOW);
}

void handleCommand(char cmd) {
  if ((cmd == 'A') && statusFlag == 1) {//RECORD outputPin1
    statusFlag = 1;
    digitalWrite(outputPin1, HIGH);
    pulsePin(outputPin1, 2000);
    Serial.println("sukses menerima A");
  }
  else if ((cmd == 'B') && statusFlag == 1) {//NYANYI outputPin2
    statusFlag = 1;
    digitalWrite(outputPin2, HIGH);
    pulsePin(outputPin2, 2000);
    Serial.println("sukses menerima B");
  }
  else if ((cmd == 'C') && statusFlag == 1) {//SPEAKER Standby: outputPin3
    statusFlag = 1;
    digitalWrite(outputPin3, HIGH);
    Serial.println("sukses menerima C");
    delay(100);
  }
  else if (cmd == 'D') { // speaker Tidak Aktif (power ke speaker off):outputPin3
    statusFlag = 0;
    digitalWrite(outputPin3, LOW);  
    Serial.println("sukses menerima D");
    delay(100);
  }
  else if (cmd == 'E') { // kembali ke default, speaker standby ON(power ke speaker on)
    statusFlag = 1;                 
    digitalWrite(outputPin3, HIGH);
    Serial.println("sukses menerima E");
    delay(100);
  }
  else if (cmd == 'F') {
    statusFlag = 0;                  // Speaker  Off/Tidak Aktif(power ke speaker off)
    digitalWrite(outputPin3, LOW);
    Serial.println("sukses menerima F");
    delay(100);
  }
  else {
    // abaikan selain A..F (kecuali newline)
    if (cmd != '\r' && cmd != '\n') {
      Serial.print("Perintah tidak dikenal: ");
      Serial.println(cmd);
    }
  }
}






Rabu, 04 Juni 2025

Arduino Web Server FULLY CODE

 #include <WiFi.h>
#include <WebServer.h>

//http://192.168.1.10/send?char=B

const char* ssid = "CapiBara";
const char* password = "77779999";
String  gtw = "192.168.1.1";

WebServer server(80);

String lastReceivedFromAndroid = "";
String charToSendToAndroid = "Z";

void handleSend() {
  if (server.hasArg("char")) {
    lastReceivedFromAndroid = server.arg("char");
    Serial.println("Received from Android: " + lastReceivedFromAndroid);

    // Contoh: ubah respons
    if (lastReceivedFromAndroid == "A") {charToSendToAndroid = "X";}
    else if (lastReceivedFromAndroid == "B") {charToSendToAndroid = "Y";}
    else if (lastReceivedFromAndroid == "C") {charToSendToAndroid = "Z";}
    else{charToSendToAndroid = "@"+lastReceivedFromAndroid+"#";}

    server.send(200, "text/plain", "OK");
  } else {
    server.send(400, "text/plain", "Missing char param");
  }
}

void handleStatus() {
  server.send(200, "text/plain", charToSendToAndroid);
  Serial.println("Sent to Android: " + charToSendToAndroid);
}

void setup() {
  Serial.begin(115200);
  WiFi.begin(ssid, password);

  Serial.print("Connecting");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("\nConnected to WiFi. IP: ");
  Serial.println(WiFi.localIP());
  gtw= WiFi.gatewayIP().toString();
  Serial.print("Gateway (Access Point IP): ");
  Serial.println(gtw);

  server.on("/send", handleSend);
  server.on("/status", handleStatus);
  server.begin();
}

void loop() {
  server.handleClient();
}

=======

UJI:http://192.168.1.10/send?char=B



Respon: http://192.168.1.10/status



package com.appsensor.geminillmjava;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class WebServerAA extends AppCompatActivity {
//http://192.168.1.10/send?char=B
private TextView txtheader;
private EditText etQuestion;
private Button btnSubmit;
private TextView tvAnswer;

String IP="http://192.168.1.3/";
private final android.os.Handler handler = new android.os.Handler();
private final int POLLING_INTERVAL = 2000; // tiap 2 detik
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.geminillm);

setTitle("WebServer Android Arduino");
txtheader = findViewById(R.id.tvTitle);
txtheader.setText("Aplikasi RX / TX Pesan AA");

etQuestion = findViewById(R.id.etQuestion);
etQuestion.setText(IP+"A");
btnSubmit = findViewById(R.id.btnSubmit);
btnSubmit.setText("Sent WebServer");
tvAnswer = findViewById(R.id.tvAnswer);
tvAnswer.setText("");

btnSubmit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String question = etQuestion.getText().toString().trim();
if (!question.isEmpty()) {
String[]parts=question.split("/");
if(parts.length>1) {
IP = parts[0];
String message = parts[parts.length - 1];
sendCharToESP32(message);
}
else{
Toast.makeText(WebServerAA.this, "Gunakan Pola IP/PESAN, \nmisal: http://192.168.1.3/", Toast.LENGTH_SHORT).show();
}
} else {
Toast.makeText(WebServerAA.this, "Pesan tidak boleh kosong!", Toast.LENGTH_SHORT).show();
}
}
});

tvAnswer.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
getCharFromESP32();
}
});
startAutoPolling();
}


private final Runnable pollingRunnable = new Runnable() {
@Override
public void run() {
getCharFromESP32(); // Panggil fungsi yang sudah ada
handler.postDelayed(this, POLLING_INTERVAL); // Jadwalkan lagi
}
};

private void startAutoPolling() {
handler.postDelayed(pollingRunnable, POLLING_INTERVAL);
}

private void stopAutoPolling() {
handler.removeCallbacks(pollingRunnable);
}
@Override
protected void onPause() {
super.onPause();
stopAutoPolling();
}
@Override
protected void onResume() {
super.onResume();
startAutoPolling();
}





public void sendCharToESP32(String character) {
String url = IP+"send?char=" + character;

new Thread(() -> {
try {
URL obj = new URL(url);
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
con.getInputStream().close(); // Eksekusi
} catch (Exception e) {
e.printStackTrace();
}
}).start();
}

public void getCharFromESP32() {
String url = IP+"status";

new Thread(() -> {
try {
HttpURLConnection con = (HttpURLConnection) new URL(url).openConnection();
con.setRequestMethod("GET");

BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
String response = in.readLine();
in.close();

runOnUiThread(() -> {
tvAnswer.setText("ESP32 Sent: " + response);
});

} catch (Exception e) {
e.printStackTrace();
}
}).start();
}

}


<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp"
tools:context=".GeminiLLMJava">

<TextView
android:id="@+id/tvTitle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="Asisten Pribadi ISTN Kampus DKI Jakarta"
android:textSize="20sp"
android:textStyle="bold"
android:gravity="center"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:layout_marginBottom="16dp"/>

<com.google.android.material.textfield.TextInputLayout
android:id="@+id/tilQuestion"
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:hint="Masukkan pertanyaan Anda"
app:layout_constraintTop_toBottomOf="@id/tvTitle"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:layout_marginTop="16dp">

<com.google.android.material.textfield.TextInputEditText
android:id="@+id/etQuestion"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="top|start"
android:inputType="textMultiLine"
android:maxLines="6"
android:minLines="3" />
</com.google.android.material.textfield.TextInputLayout>

<Button
android:id="@+id/btnSubmit"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="Tanyakan ke AI"
app:layout_constraintTop_toBottomOf="@id/tilQuestion"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:layout_marginTop="16dp" />

<TextView
android:id="@+id/tvAnswerLabel"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="Jawaban AI:"
android:textSize="16sp"
android:textStyle="bold"
app:layout_constraintTop_toBottomOf="@id/btnSubmit"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:layout_marginTop="24dp" />

<ScrollView
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintTop_toBottomOf="@id/tvAnswerLabel"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:layout_marginTop="8dp">

<TextView
android:id="@+id/tvAnswer"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/rounded_border"
android:padding="12dp"
android:text="Jawaban akan muncul di sini..."
android:textSize="16sp"
android:textColor="@android:color/black"
android:fontFamily="monospace"
android:lineSpacingExtra="4dp"
android:scrollbars="vertical" />
</ScrollView>

</androidx.constraintlayout.widget.ConstraintLayout>

Senin, 10 Maret 2025

arduino rfid

 #include <Wire.h> 
#include <WiFiClientSecure.h>  
#include <WiFi.h>
#include <HTTPClient.h>  

byte sda = 5;
byte rst = 15;
#include <KRrfid.h>
#define RED_LED 26
#define GREEN_LED 27
#define buzzer 4
#define YELLOW_LED 12  //cadangan,,...
const int button1Pin = 32;
int st_ok = 0, count = 0;

//=============================================
#include <NTPClient.h>
#include <WiFiUdp.h>
// WiFi Credentials
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);  // LCD 20x4

//const char* ssid = "-";
//const char* password = "-";
const char* ssid = "-";
const char* password = "12345678";

const char* serverURL = "https://lp2maray.com/sentWA.php?psn=";
const char* serverName ="https://script.google.com/macros/s/AKfycbx4-EwSjyguE2p0LFiuF9zjvcw0JOVW4ejqq8W8weSM6Q4d4DRLykRWxWAwJv_gTe8AStT/exec";
String sts = "Masuk"; 
String tanggal="";
String jam="";
String tgl="";
String RFID="RFID01"; 
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "pool.ntp.org", 7 * 3600, 60000); // Zona waktu GMT+7 (Indonesia)

void setup() {
  Serial.begin(115200);
  lcd.init();
  lcd.backlight();
  rfidBegin();

  // Inisialisasi LED
  pinMode(button1Pin, INPUT_PULLUP);
  pinMode(RED_LED, OUTPUT);
  pinMode(YELLOW_LED, OUTPUT);
  pinMode(GREEN_LED, OUTPUT);
  pinMode(buzzer, OUTPUT); 
  // Sambungkan ke WiFi
  lcd.setCursor(0, 0);
  lcd.print("Connecting...");
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
  delay(1000);
  Serial.println("Connecting to WiFi...");
   timeClient.begin();
  } 

  lcd.clear();
  lcd.print("WiFi Connected");
  delay(2000);
  lcd.clear();
}
 
//################################################
void loop() { 
      int jamNow=waktu();
      getTAG();
        if (digitalRead(button1Pin) == HIGH) {
              sts = "MASUK  "; 
              if(jamNow>12){sts= " IZIN  "; }
smasuk();
          }
        else if (digitalRead(button1Pin) == LOW) {
              sts = "PULANG "; 
              spulang();
          }
       
        String pesan1="ABSEN ="+sts         ;
        String pesan2="TAP KARTU  !!!        ";
        lihat0(pesan1,pesan2);   
      
        if (TAG != "") { 
          Serial.print("TAG :");
          Serial.println(TAG);
          String input = TAG;
          input.trim();
          CEK(input);
        }
      else if (Serial.available() > 0) {
          String input = Serial.readStringUntil('\n');   
          input.trim();   
          CEK(input);
        } 
      delay(500);
}
//################################################
void CEK(String input){
  if (input == "RFID01" || input == "395593") {sendWA("2401001","A","OPS","083842690xxx"); }
  else if (input == "RFID02" || input == "2250103") {sendWA("2401002","D","Marketing","08896699xx"); }
  else if (input == "RFID03" || input == "2765740") {sendWA("2401002","D","Marketing","082125745xxx"); }
  else if (input == "RFID04" || input == "7511215528") {sendWA("2401002","D","Marketing","083842690xxx"); }
  //dst
    
  else {buzdeny();}  // Jika TAG tidak valid
  TAG = "";
  input="";
}
void sendWA(String kode,String nama,String divisi,String hp){
          buzacc();
          skirim();
          String pesan1="ABSENSI:"+sts+"       ";
          nama.toUpperCase();
          sts.trim();
          String pesan2="Yth "+nama            ;
          
          lihat(pesan1,pesan2); 
          String pesan="Yth "+nama+"/"+kode+" ("+divisi+"), Absen "+sts+" Anda Sukses disimpan...";
          sendCondition(pesan,hp);
          sendXLS(kode, nama, divisi,hp); 
  }
//==============================================================
void sendXLS(String kode,String nama,String divisi,String hp){
  if (WiFi.status() == WL_CONNECTED) {
    HTTPClient http;
    http.begin(serverName);
    http.addHeader("Content-Type", "application/json");

    String jsonData = "{\"tanggal\":\""+tanggal+"\", \"jam\":\""+jam+"\", \"kode\":\""+kode+"\", \"nama\":\""+nama+"\", \"divisi\":\""+divisi+"\", \"hp\":\""+hp+"\", \"status\":\""+sts+"\"}";   
    Serial.println(jsonData);
    int httpResponseCode = http.POST(jsonData); 
    if (httpResponseCode > 0) {
      if (httpResponseCode == HTTP_CODE_MOVED_PERMANENTLY || httpResponseCode == HTTP_CODE_FOUND) {
        String newLocation = http.getLocation();
        Serial.println("Redirected to: " + newLocation);
        http.end(); // End the current connection
        http.begin(newLocation);
        http.addHeader("Content-Type", "application/json");
        httpResponseCode = http.POST(jsonData);
        if (httpResponseCode > 0) {
          String response = http.getString();
          Serial.println(httpResponseCode);
          Serial.println(response);
        } else {
          Serial.println("Error on sending POST after redirect: " + String(httpResponseCode));
        }
      } else {
        String response = http.getString();
        Serial.println(httpResponseCode);
        Serial.println(response);
      }
    } else {
      Serial.println("Error on sending POST: " + String(httpResponseCode));
    }
    http.end();
  } else {
    Serial.println("WiFi Disconnected");
  }
  delay(5000); // process 5 seconds
}

//==============================================================
void sendCondition(String pesan, String hp) {
  if (WiFi.status() == WL_CONNECTED) {
    HTTPClient http; 
    String fullURL = serverURL  + urlencode(pesan) + "&ph=" + urlencode(hp);
    Serial.println("Request URL: " + fullURL);
    http.begin(fullURL); 
    int httpResponseCode = http.GET();
    if (httpResponseCode > 0) {
      Serial.print("HTTP Response Code: ");
      Serial.println(httpResponseCode);
      String response = http.getString();
      Serial.println("Response: " + response);
    } else {
      Serial.print("Error sending GET: ");
      Serial.println(http.errorToString(httpResponseCode).c_str());
    }
    http.end();
  } else {
    Serial.println("WiFi Disconnected");
  }
  delay(3000);
}

String urlencode(String str) {
  String encodedString = "";
  char c;
  char code0;
  char code1;
  char code2;
  for (int i = 0; i < str.length(); i++) {
    c = str.charAt(i);
    if (c == ' ') {
      encodedString += '+';
    } else if (isalnum(c)) {
      encodedString += c;
    } else {
      code1 = (c & 0xf) + '0';
      if ((c & 0xf) > 9) {
        code1 = (c & 0xf) - 10 + 'A';
      }
      c = (c >> 4) & 0xf;
      code0 = c + '0';
      if (c > 9) {
        code0 = c - 10 + 'A';
      }
      code2 = '\0';
      encodedString += '%';
      encodedString += code0;
      encodedString += code1;
    }
  }
  return encodedString;
}
 
void buzacc() {
  digitalWrite(buzzer, HIGH);
  delay(100);
  digitalWrite(buzzer, LOW);
  delay(100);
  digitalWrite(buzzer, HIGH);
  delay(100);
  digitalWrite(buzzer, LOW);
  delay(100);
}
void buzdeny() {
  digitalWrite(buzzer, HIGH);
  delay(1000);
  digitalWrite(buzzer, LOW);
}

void lihat(String pesan1, String pesan2){
  lcd.setCursor(0, 0);
  lcd.print("ABSENSI              ");
  lcd.setCursor(0, 1);
  lcd.print(tanggal + " | " + jam);  // Tanggal dan waktu
  lcd.setCursor(0, 2);
  lcd.print(pesan1);   // Pesan pertama, misalnya "ABSEN = Masuk"
  lcd.setCursor(0, 3);
  lcd.print(pesan2);   // Pesan kedua, misalnya "Yth [Nama]"
  delay(5000); // Display for 5 seconds
}

void lihat0(String pesan1, String pesan2){
  lcd.setCursor(0, 0);
  lcd.print("NINJA EXPRES        ");   // Tampilkan nama aplikasi
  lcd.setCursor(0, 1);
  lcd.print(tanggal + " | " + jam);  // Tanggal dan waktu
  lcd.setCursor(0, 2);
  lcd.print("SILAHKAN TAB KARTU");    // Instruksi untuk men-tap kartu
  lcd.setCursor(0, 3);
  lcd.print("Status: " + sts);        // Status absen (Masuk / Pulang)
  delay(500); // Display for 500ms
}

void smasuk(){
   digitalWrite(RED_LED, LOW);
   digitalWrite(YELLOW_LED, LOW);
   digitalWrite(GREEN_LED, HIGH);  
}
void spulang(){
   digitalWrite(RED_LED, HIGH);
   digitalWrite(YELLOW_LED, LOW);
   digitalWrite(GREEN_LED, LOW);  
}

void skirim(){
  Serial.println("Tanggal: " + tanggal+" ("+tgl+")");
  Serial.println("Jam: " + jam);
   digitalWrite(RED_LED, LOW);
   digitalWrite(YELLOW_LED, HIGH);
   digitalWrite(GREEN_LED, LOW);  
}

int waktu(){
  timeClient.update(); // Update waktu dari server NTP

  time_t rawTime = timeClient.getEpochTime(); // Waktu epoch
  struct tm* timeInfo = localtime(&rawTime);
  int year = timeInfo->tm_year + 1900;
  int month = timeInfo->tm_mon + 1;
  int day = timeInfo->tm_mday;
  int hour = timeInfo->tm_hour;
  int minute = timeInfo->tm_min;
  int second = timeInfo->tm_sec;

  char bufferTGL[5]; // Format: DD/MM
  char bufferTanggal[11]; // Format: YYYY-MM-DD
  char bufferJam[9];      // Format: HH:MM:SS

  sprintf(bufferTanggal, "%04d-%02d-%02d", year, month, day);
  sprintf(bufferJam, "%02d:%02d:%02d", hour, minute, second);
  sprintf(bufferTGL, "%02d/%02d", day, month);

  tanggal = String(bufferTanggal);
  jam = String(hour) + ":" + String(minute) + ":" + String(second);
  tgl = String(bufferTGL);

  String pesan1 = " " + tgl + " : " + jam + " ";
  String pesan2 = "ABSEN = " + sts;
  lihat0(pesan1, pesan2);  // Update tampilan dengan tanggal, jam, dan status absen
return hour;
}


Sabtu, 04 Januari 2025

RUNEVERY

byte sda = D8;
byte rst = D0;

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C LCD = LiquidCrystal_I2C(0x27, 16, 2);

#include<KRrfid.h>
#include <Servo.h>
Servo servo;
#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClient.h>
WiFiClientSecure secured_client;
const char* ssid = "4G";
const char* password = "98765432";
const char* server = "192.168.1.1/simpan.php?";

String idrf = "", payload;
int st_ok = 0, count = 0;

int buka = 0, tutup = 180;


void setup() {
  Serial.begin(9600);
  LCD.init();
  LCD.backlight();
  LCD.setCursor(0, 0);
  LCD.print("Connecting to ");
  LCD.setCursor(0, 1);
  LCD.print("WiFi ");
  servo.attach(D4);
  servo.write (tutup);
  rfidBegin();
  Serial.print("Menghubungkan ke Wi-Fi: ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.print(".");
  }
  Serial.println("\nWi-Fi terhubung.");
  LCD.setCursor(0, 0);
  LCD.print("Selamat Datang   ");
  LCD.setCursor(0, 1);
  LCD.print("Tap Kartu        ");
}

void loop() {
  getTAG();
  if (TAG != "") {
    Serial.print("TAG :");
    Serial.println(TAG);
    idrf = TAG;
    LCD.setCursor(0, 0);
    LCD.print("Send data       ");
    LCD.setCursor(0, 1);
    LCD.print("                ");
    //    SendData();
    if (idrf == "1817713031") {
      st_ok = 1;
      servo.write (buka);
      LCD.setCursor(0, 0);
      LCD.print("ACC             ");
      LCD.setCursor(0, 1);
      LCD.print("Pintu terbuka!!!");
      count = 0;
    }
    TAG = "";
  }


  if (runEvery2(1000) && st_ok == 1) {
    count++;
    if (count >= 6) {
      LCD.setCursor(0, 0);
      LCD.print("Selamat Datang   ");
      LCD.setCursor(0, 1);
      LCD.print("Tap Kartu        ");
      count = 0;
      idrf = "";
      st_ok = 0;
    }
    else if (count >= 4) {
      LCD.setCursor(0, 0);
      LCD.print("                 ");
      LCD.setCursor(0, 1);
      LCD.print("Pintu tertutup   ");
      servo.write (tutup);
    }
    Serial.println(count);
  }
}

void SendData() {
  if (WiFi.status() == WL_CONNECTED) {
    WiFiClient client;
    HTTPClient http;
    String url = String(server) + "id=" + String(idrf);
    Serial.println( url);
    http.begin(client, url);
    int httpResponseCode = http.GET();
    if (httpResponseCode > 0) {
      Serial.print("HTTP Response code: ");
      Serial.println(httpResponseCode);
      payload = http.getString();
      payload.trim();
      Serial.println(payload);

      if (payload == "1") {
        LCD.setCursor(0, 0);
        LCD.print("ACC             ");
        LCD.setCursor(0, 1);
        LCD.print("Pintu terbuka   ");
        servo.write (buka);
        st_ok = 1;
        count = 0;
      } else {
        LCD.setCursor(0, 0);
        LCD.print("Gagal           ");
        LCD.setCursor(0, 1);
        LCD.print("                ");
        delay(1000);
      }
    } else {
      Serial.print("Error code: ");
      Serial.println(httpResponseCode);
    }
    http.end();
  } else {
    Serial.println("WiFi Disconnected");
  }
}

boolean runEvery2(unsigned long interval)
{
  static unsigned long previousMillis = 0;
  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= interval)
  {
    previousMillis = currentMillis;
    return true;
  }
  return false;