Kirim data dari arduino ke webserver

 Kirim data dari arduino ke webserver


#include <EEPROM.h>
//#include <Ethernet.h> //Uno Mega
#include <UIPEthernet.h> //Nano /** the current address in the EEPROM (i.e. which byte we're going to write to next) **/
int address = 0;
byte value; int ledPin = 13; // LED connected to digital pin 13
int inPin = 7; // pushbutton connected to digital pin 7
int val = HIGH; // variable to store the read value
int valOld = HIGH; String inputString = ""; // a String to hold incoming data
bool stringComplete = false; // whether the string is complete int incomingByte = 0; // for incoming serial data
int LANcon = 0;
int LANPrint = 0; byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 169, 254, 222, 40 }; //assigned arduino LAN IP address
byte server[] = { 169, 254, 222, 37 }; // laptop running apache LAN IP address
EthernetClient client; //apache web server running on port 80 void setup()
{
pinMode(inPin, INPUT_PULLUP);
pinMode(ledPin, OUTPUT); // sets the digital pin 13 as output
inputString.reserve(200); Ethernet.begin(mac, ip);
Serial.begin(9600);
Serial.println("starting simple arduino client test");
Serial.println();
value = EEPROM.read(address);
Serial.println("");
Serial.print("Hardware ID: ");
Serial.print(value);
Serial.println();
Serial.println("999 -> Hardware ID");
Serial.println(" 0 -> test RESET");
Serial.println(" 1 -> test SET");
Serial.println(" >1 -> set Hardware ID");
Serial.println("");
Serial.println();
delay(1000); Serial.println("connecting..."); if (client.connect(server, 80)) {
Serial.println("connected");
Serial.println("");
client.println("GET /ardu/data.php?id=" + String(value) + "&st=2 HTTP/1.0"); //php page invoking my web service
client.println();
LANcon = 1;
} else {
Serial.println("connection failed");
}
} void TombolEvent(int st) { Serial.print("Send to server st= ");
Serial.println(st);
if (client.connect(server, 80)) {
Serial.println("connected");
Serial.println("");
client.println("GET /ardu/data.php?id=" + String(value) + "&st=" + String(st) + " HTTP/1.0"); //php page invoking my web service
client.println();
LANcon = 1;
} else {
Serial.println("connection failed");
}
}
void loop()
{ val = digitalRead(inPin);
digitalWrite(ledPin, val);
if (valOld != val) {
if (val == LOW) {
Serial.print("Tombol ");
Serial.print(value);
Serial.println(" -> SET!");
TombolEvent(1);
valOld = val;
} else if (val == HIGH) {
Serial.print("Tombol ");
Serial.print(value);
Serial.println(" -> RESET!");
TombolEvent(0);
valOld = val;
}
delay(500);
}
if (stringComplete) {
Serial.print("inputString: ");
Serial.print(inputString.toInt());
if (inputString.toInt() == 999) {
Serial.println(" Mem Read");
value = EEPROM.read(address);
Serial.print("Hardware ID: ");
Serial.println(value);
Serial.println("");
} else if (inputString.toInt() > 1) { Serial.println(" Mem Update");
for (int i = 0 ; i < EEPROM.length() ; i++) {
EEPROM.write(i, 0);
}
delay(100);
Serial.println("Mem clear");
int val = inputString.toInt();
EEPROM.write(address, val);
delay (100);
value = EEPROM.read(address);
Serial.print("Update Hardware ID to: ");
Serial.println(value);
Serial.println("");
} if (inputString.toInt() == 1) {
Serial.println("");
Serial.println("Serial -> SET!");
TombolEvent(1);
} else if (inputString.toInt() == 0) {
Serial.println("");
Serial.println("Serial -> RESET!");
TombolEvent(0);
} stringComplete = false;
inputString = "";
} if (client.available() && LANcon == 1) {
char c = client.read();
} if (!client.connected() && LANcon == 1) {
Serial.println("disconnecting.");
Serial.println("");
client.stop();
LANcon = 0;
}
} void serialEvent() {
while (Serial.available()) {
char inChar = (char)Serial.read();
inputString += inChar;
if (inChar == '\n') {
stringComplete = true;
}
}
}




 

Libraries

#include <SPI.h>
#include <EEPROM.h> #include <UIPEthernet.h>
  • SPI.h: Digunakan untuk komunikasi SPI.
  • EEPROM.h: Digunakan untuk membaca dan menulis pada EEPROM.
  • UIPEthernet.h: Digunakan untuk menghubungkan dan berkomunikasi melalui Ethernet untuk Arduino Nano.

Variables

int address = 0;
byte value; int ledPin = 13; int inPin = 7; int val = HIGH; int valOld = HIGH; String inputString = ""; bool stringComplete = false; int incomingByte = 0; int LANcon = 0; int LANPrint = 0; byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; byte ip[] = { 169, 254, 222, 40 }; byte server[] = { 169, 254, 222, 37 }; EthernetClient client;
  • address: Alamat EEPROM yang sedang diakses.
  • value: Nilai yang dibaca dari atau ditulis ke EEPROM.
  • ledPin: Pin untuk LED.
  • inPin: Pin untuk tombol input.
  • val dan valOld: Nilai saat ini dan sebelumnya dari tombol input.
  • inputString: String untuk menyimpan data serial yang masuk.
  • stringComplete: Menandakan apakah string yang masuk telah lengkap.
  • incomingByteLANconLANPrint: Variabel tambahan untuk pengelolaan data.
  • macipserver: Alamat MAC dan IP untuk koneksi Ethernet.
  • client: Objek untuk mengelola koneksi Ethernet.

Setup Function

void setup() {
pinMode(inPin, INPUT_PULLUP); pinMode(ledPin, OUTPUT); inputString.reserve(200); Ethernet.begin(mac, ip); Serial.begin(9600); Serial.println("starting simple arduino client test"); value = EEPROM.read(address); Serial.println(""); Serial.print("Hardware ID: "); Serial.print(value); Serial.println(); Serial.println("999 -> Hardware ID"); Serial.println(" 0 -> test RESET"); Serial.println(" 1 -> test SET"); Serial.println(" >1 -> set Hardware ID"); Serial.println(""); delay(1000); Serial.println("connecting..."); if (client.connect(server, 80)) { Serial.println("connected"); Serial.println(""); client.println("GET /ardu/data.php?id=" + String(value) + "&st=2 HTTP/1.0"); client.println(); LANcon = 1; } else { Serial.println("connection failed"); } }
  • Mengatur pin mode dan memulai koneksi Ethernet dan Serial.
  • Membaca nilai dari EEPROM dan menampilkannya.
  • Mencoba menghubungkan ke server dan mengirimkan permintaan HTTP GET.

TombolEvent Function

void TombolEvent(int st) {
Serial.print("Send to server st= "); Serial.println(st); if (client.connect(server, 80)) { Serial.println("connected"); Serial.println(""); client.println("GET /ardu/data.php?id=" + String(value) + "&st=" + String(st) + " HTTP/1.0"); client.println(); LANcon = 1; } else { Serial.println("connection failed"); } }
  • Fungsi untuk mengirimkan status tombol ke server.

Loop Function

void loop() {
val = digitalRead(inPin); digitalWrite(ledPin, val); if (valOld != val) { if (val == LOW) { Serial.print("Tombol "); Serial.print(value); Serial.println(" -> SET!"); TombolEvent(1); valOld = val; } else if (val == HIGH) { Serial.print("Tombol "); Serial.print(value); Serial.println(" -> RESET!"); TombolEvent(0); valOld = val; } delay(500); } if (stringComplete) { Serial.print("inputString: "); Serial.print(inputString.toInt()); if (inputString.toInt() == 999) { Serial.println(" Mem Read"); value = EEPROM.read(address); Serial.print("Hardware ID: "); Serial.println(value); Serial.println(""); } else if (inputString.toInt() > 1) { Serial.println(" Mem Update"); for (int i = 0 ; i < EEPROM.length() ; i++) { EEPROM.write(i, 0); } delay(100); Serial.println("Mem clear"); int val = inputString.toInt(); EEPROM.write(address, val); delay (100); value = EEPROM.read(address); Serial.print("Update Hardware ID to: "); Serial.println(value); Serial.println(""); } if (inputString.toInt() == 1) { Serial.println(""); Serial.println("Serial -> SET!"); TombolEvent(1); } else if (inputString.toInt() == 0) { Serial.println(""); Serial.println("Serial -> RESET!"); TombolEvent(0); } stringComplete = false; inputString = ""; } if (client.available() && LANcon == 1) { char c = client.read(); } if (!client.connected() && LANcon == 1) { Serial.println("disconnecting."); Serial.println(""); client.stop(); LANcon = 0; } }
  • Memeriksa status tombol dan mengirimkan status ke server jika berubah.
  • Menangani input serial untuk membaca atau memperbarui nilai EEPROM.
  • Memeriksa koneksi ke server dan menutup koneksi jika tidak terhubung.

SerialEvent Function

void serialEvent() {
while (Serial.available()) { char inChar = (char)Serial.read(); inputString += inChar; if (inChar == '\n') { stringComplete = true; } } }
  • Mengumpulkan data dari Serial hingga menemukan karakter newline ('\n'), lalu menandai string lengkap.

Kesimpulan

Skrip ini berfungsi untuk:

  • Membaca dan menulis nilai pada EEPROM.
  • Menghubungkan ke server melalui Ethernet dan mengirimkan data berdasarkan status tombol.
  • Menangani input serial untuk mengontrol perangkat secara manual.




Terima kasih

Arduino dan dua 7-segment display dan dua IC shift register 74HC595

https://wokwi.com/projects/400666074265217025

Untuk menggunakan dua 7-segment display dengan dua IC shift register 74HC595, kita akan menghubungkan data dari kedua shift register ke segmen-segmen 7-segment display sesuai dengan urutan. Satu shift register akan mengendalikan satu 7-segment display.

Skema Koneksi

Koneksi Arduino ke 74HC595:

  • DS (Data) dari satu 74HC595 → Pin 11 Arduino
  • ST_CP (Latch) dari kedua 74HC595 → Pin 12 Arduino
  • SH_CP (Clock) dari kedua 74HC595 → Pin 13 Arduino
  • OE (Output Enable) dari kedua 74HC595 → GND
  • MR (Master Reset) dari kedua 74HC595 → VCC

Koneksi antar 74HC595:

  • Q7' dari 74HC595 pertama (pin 9) ke DS (Data) dari 74HC595 kedua

Koneksi 74HC595 ke 7-Segment Display:

  • 74HC595 pertama (untuk digit puluhan):

    • QA → Segment A dari 7-segment display pertama
    • QB → Segment B dari 7-segment display pertama
    • QC → Segment C dari 7-segment display pertama
    • QD → Segment D dari 7-segment display pertama
    • QE → Segment E dari 7-segment display pertama
    • QF → Segment F dari 7-segment display pertama
    • QG → Segment G dari 7-segment display pertama
  • 74HC595 kedua (untuk digit satuan):

    • QA → Segment A dari 7-segment display kedua
    • QB → Segment B dari 7-segment display kedua
    • QC → Segment C dari 7-segment display kedua
    • QD → Segment D dari 7-segment display kedua
    • QE → Segment E dari 7-segment display kedua
    • QF → Segment F dari 7-segment display kedua
    • QG → Segment G dari 7-segment display kedua

Kode Program

Berikut adalah program lengkap yang disempurnakan untuk mengendalikan dua 7-segment display menggunakan dua 74HC595:

#include <EEPROM.h>
// Pin untuk mengendalikan 74HC595 const int dataPin = 11; // DS const int latchPin = 12; // ST_CP const int clockPin = 13; // SH_CP // Pola bit untuk angka 0-9 untuk common anoda const byte digitPatterns[10] = { 0b11000000, // 0 0b11111001, // 1 0b10100100, // 2 0b10110000, // 3 0b10011001, // 4 0b10010010, // 5 0b10000010, // 6 0b11111000, // 7 0b10000000, // 8 0b10010000 // 9 }; // Fungsi untuk mengirim data ke 74HC595 void shiftOutData(byte data1, byte data2) { digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, MSBFIRST, data2); shiftOut(dataPin, clockPin, MSBFIRST, data1); digitalWrite(latchPin, HIGH); } // Fungsi untuk menampilkan angka pada kedua 7-segment display void displayNumber(int number) { int tens = number / 10; int ones = number % 10; shiftOutData(digitPatterns[tens], digitPatterns[ones]); } void setup() { pinMode(dataPin, OUTPUT); pinMode(latchPin, OUTPUT); pinMode(clockPin, OUTPUT); } void loop() { // Tampilkan angka 00 hingga 99 dengan jeda 1 detik for (int i = 0; i < 100; i++) { displayNumber(i); delay(1000); // Jeda 1 detik } }


Penjelasan Kode

  • Pin Setup: dataPin, latchPin, dan clockPin adalah pin-pin Arduino yang terhubung ke pin-pin yang sesuai di kedua IC 74HC595.
  • Array digitPatterns: Menyimpan pola bit untuk menyalakan segmen-segmen pada 7-segment display common anoda untuk angka 0 hingga 9.
  • Fungsi shiftOutData: Mengirimkan dua byte data ke dua IC 74HC595, yang masing-masing mengendalikan satu 7-segment display. data1 mengendalikan digit puluhan (74HC595 pertama) dan data2 mengendalikan digit satuan (74HC595 kedua).
  • Fungsi displayNumber: Mengambil angka yang akan ditampilkan, membaginya menjadi digit puluhan dan satuan, dan mengirimkan pola bit yang sesuai ke IC 74HC595.
  • Setup dan Loop: Mengatur pin-pin sebagai output dan menjalankan loop yang menampilkan angka dari 00 hingga 99 dengan jeda 1 detik di antara setiap angka.

Dengan program ini, kedua 7-segment display akan menampilkan angka dari 00 hingga 99 secara berurutan dengan jeda 1 detik di antara setiap angka. Pastikan untuk memeriksa koneksi pin dengan benar agar program ini berjalan dengan baik.

Arduino Mega sebagai web server untuk menampilkan angka di 7 segment

Berikut adalah langkah-langkah untuk membuat sebuah sistem berbasis Arduino Mega yang memenuhi ketentuan yang diberikan:

  1. Membuat server web pada Arduino Mega:

    • Arduino Mega akan menggunakan modul Ethernet atau WiFi untuk membuat server web yang bisa diakses oleh klien melalui browser.
  2. Memungkinkan klien mengisi dan meng-update variabel:

    • Gunakan formulir HTML yang memungkinkan klien untuk mengisi nilai variabel.
    • Arduino Mega akan menangani pengiriman data dari formulir ini dan menyimpan nilai-nilai ini ke EEPROM.
  3. Menyimpan data ke EEPROM:

    • Gunakan library EEPROM untuk menyimpan dan mengambil nilai variabel dari EEPROM.
  4. Menampilkan isi EEPROM ke 7-segment display:

    • Gunakan shift register 74HC595 dan driver ULN2003 untuk mengontrol 7-segment display dari Arduino Mega.

#include <SPI.h>
#include <Ethernet.h>
#include <EEPROM.h>
// Setting MAC address and IP address for Ethernet module
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192, 168, 1, 177);
EthernetServer server(80);
const int numVariables = 15;
int variables[numVariables];
// Pin definitions for 74HC595
const int latchPin = 5;
const int clockPin = 6;
const int dataPin = 7;
void setup() {
  // Initialize Ethernet
  Ethernet.begin(mac, ip);
  server.begin();
  
  // Initialize pins for 74HC595
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  // Read variables from EEPROM
  for (int i = 0; i < numVariables; i++) {
    variables[i] = EEPROM.read(i);
  }
  Serial.begin(9600);
}
void loop() {
  // Check for incoming client connections
  EthernetClient client = server.available();
  if (client) {
    handleClient(client);
  }
  // Display variables on 7-segment display
  displayVariables();
}
void handleClient(EthernetClient client) {
  boolean currentLineIsBlank = true;
  String request = "";
  while (client.connected()) {
    if (client.available()) {
      char c = client.read();
      request += c;
      if (c == '\n' && currentLineIsBlank) {
        // Process the request and update EEPROM if needed
        processRequest(request);
        // Send the HTML page
        sendHtmlPage(client);
        break;
      }
      if (c == '\n') {
        currentLineIsBlank = true;
      } else if (c != '\r') {
        currentLineIsBlank = false;
      }
    }
  }
  delay(1);
  client.stop();
}
void processRequest(String request) {
  if (request.indexOf("GET /update?") >= 0) {
    int indexStart = request.indexOf('?') + 1;
    int indexEnd = request.indexOf(' ', indexStart);
    String params = request.substring(indexStart, indexEnd);
    int varIndex = 0;
    while (params.length() > 0 && varIndex < numVariables) {
      int delimiterIndex = params.indexOf('&');
      String param = (delimiterIndex > 0) ? params.substring(0, delimiterIndex) : params;
      int equalsIndex = param.indexOf('=');
      if (equalsIndex > 0) {
        int value = param.substring(equalsIndex + 1).toInt();
        variables[varIndex] = value;
        EEPROM.write(varIndex, value);
      }
      params = (delimiterIndex > 0) ? params.substring(delimiterIndex + 1) : "";
      varIndex++;
    }
  }
}
void sendHtmlPage(EthernetClient client) {
  client.println("HTTP/1.1 200 OK");
  client.println("Content-Type: text/html");
  client.println("Connection: close");
  client.println();
  client.println("<!DOCTYPE html>");
  client.println("<html>");
  client.println("<head><title>Arduino Mega Control</title></head>");
  client.println("<body><h1>Update Variables</h1>");
  client.println("<form action=\"/update\" method=\"GET\">");
  for (int i = 0; i < numVariables; i++) {
    client.print("Variable ");
    client.print(i);
    client.print(": <input type=\"text\" name=\"var");
    client.print(i);
    client.print("\" value=\"");
    client.print(variables[i]);
    client.println("\"><br>");
  }
  client.println("<input type=\"submit\" value=\"Update\">");
  client.println("</form></body></html>");
}
void displayVariables() {
  for (int i = 0; i < numVariables; i++) {
    displayNumber(variables[i]);
    delay(500);
  }
}
void displayNumber(int number) {
  byte segments = getSegments(number);
  digitalWrite(latchPin, LOW);
  shiftOut(dataPin, clockPin, MSBFIRST, segments);
  digitalWrite(latchPin, HIGH);
}
byte getSegments(int number) {
  switch (number) {
    case 0: return B00111111;
    case 1: return B00000110;
    case 2: return B01011011;
    case 3: return B01001111;
    case 4: return B01100110;
    case 5: return B01101101;
    case 6: return B01111101;
    case 7: return B00000111;
    case 8: return B01111111;
    case 9: return B01101111;
    default: return B00000000; // Blank for non-decimal digits
  }
}



Penjelasan Kode:

  • Server Web: Kode ini membuat server web menggunakan modul Ethernet pada Arduino Mega. Server web mendengarkan permintaan HTTP dari klien.
  • Mengupdate Variabel: Klien dapat mengisi nilai variabel melalui formulir HTML yang dikirimkan ke Arduino. Nilai ini kemudian disimpan ke EEPROM.
  • Tampilan 7-Segment: Menggunakan shift register 74HC595 untuk mengontrol tampilan 7-segment. Fungsi displayNumber() menampilkan angka pada 7-segment.

Kebutuhan:

  • Arduino Mega
  • Modul Ethernet (misal: W5100 atau ENC28J60) atau WiFi (misal: ESP8266)
  • Shift register 74HC595
  • Driver ULN2003
  • 7-segment display

Catatan:

  • Pastikan menghubungkan pin modul Ethernet/WiFi dengan benar ke Arduino Mega.
  • Pastikan koneksi rangkaian 7-segment display dengan 74HC595 dan ULN2003 sudah benar.

Tahap II

Untuk memastikan bahwa nilai yang dimasukkan atau diubah oleh klien akan ditampilkan kembali dari EEPROM setelah formulir dikirimkan, kita harus memastikan bahwa nilai di EEPROM diperbarui setelah permintaan POST diproses dan kemudian menampilkan nilai terbaru di halaman web.

Berikut adalah pembaruan program untuk menangani permintaan POST dengan benar dan menampilkan kembali nilai dari EEPROM setelah klien mengirim atau mengubah nilai:


#include <SPI.h>
#include <Ethernet.h>
#include <EEPROM.h>

// Setting MAC address and IP address for Ethernet module
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192, 168, 1, 177);

EthernetServer server(80);

const int numVariables = 12;
int variables[numVariables];

// Pin definitions for 74HC595
const int latchPin = 5;
const int clockPin = 6;
const int dataPin = 7;

void setup() {
  // Initialize Ethernet
  Ethernet.begin(mac, ip);
  server.begin();
  
  // Initialize pins for 74HC595
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);

  // Read variables from EEPROM
  for (int i = 0; i < numVariables; i++) {
    variables[i] = EEPROM.read(i);
  }

  Serial.begin(9600);
}

void loop() {
  // Check for incoming client connections
  EthernetClient client = server.available();
  if (client) {
    handleClient(client);
  }

  // Display variables on 7-segment display
  displayVariables();
}

void handleClient(EthernetClient client) {
  boolean currentLineIsBlank = true;
  String request = "";
  boolean isPost = false;

  while (client.connected()) {
    if (client.available()) {
      char c = client.read();
      request += c;

      if (c == '\n' && currentLineIsBlank) {
        // If POST request, process the data
        if (isPost) {
          processPostData(request);
        }
        // Send the HTML page
        sendHtmlPage(client);

        break;
      }
      if (c == '\n') {
        currentLineIsBlank = true;
      } else if (c != '\r') {
        currentLineIsBlank = false;
      }

      if (request.indexOf("POST /submit") >= 0) {
        isPost = true;
      }
    }
  }
  delay(1);
  client.stop();
}

void processPostData(String request) {
  int indexStart = request.indexOf("\r\n\r\n") + 4;
  String data = request.substring(indexStart);

  int varIndex = 0;
  while (data.length() > 0 && varIndex < numVariables) {
    int delimiterIndex = data.indexOf('&');
    String param = (delimiterIndex > 0) ? data.substring(0, delimiterIndex) : data;
    int equalsIndex = param.indexOf('=');

    if (equalsIndex > 0) {
      int value = param.substring(equalsIndex + 1).toInt();
      variables[varIndex] = value;
      EEPROM.write(varIndex, value);
    }

    data = (delimiterIndex > 0) ? data.substring(delimiterIndex + 1) : "";
    varIndex++;
  }
}

void sendHtmlPage(EthernetClient client) {
  // Update the variables array with the latest values from EEPROM
  for (int i = 0; i < numVariables; i++) {
    variables[i] = EEPROM.read(i);
  }

  client.println("HTTP/1.1 200 OK");
  client.println("Content-Type: text/html");
  client.println("Connection: close");
  client.println();
  client.println("<!DOCTYPE html>");
  client.println("<html lang=\"id\">");
  client.println("<head>");
  client.println("<meta charset=\"UTF-8\">");
  client.println("<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">");
  client.println("<title>Input Memori Arduino</title>");
  client.println("<style>");
  client.println("body {font-family: Arial, sans-serif; background-color: #f2f2f2; display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0;}");
  client.println(".container {background-color: white; padding: 20px; border-radius: 8px; box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); max-width: 600px; width: 100%;}");
  client.println("h1 {text-align: center; color: #333;}");
  client.println("form {display: grid; grid-template-columns: repeat(3, 1fr); gap: 20px;}");
  client.println("label {margin-bottom: 5px; color: #555;}");
  client.println(".input-group {display: flex; flex-direction: column;}");
  client.println("input[type=\"number\"] {padding: 10px; border: 1px solid #ddd; border-radius: 4px; box-sizing: border-box; width: 100%;}");
  client.println("input[type=\"submit\"] {grid-column: span 3; padding: 10px; background-color: #4CAF50; border: none; border-radius: 4px; color: white; font-size: 16px; cursor: pointer;}");
  client.println("input[type=\"submit\"]:hover {background-color: #45a049;}");
  client.println("</style>");
  client.println("</head>");
  client.println("<body>");
  client.println("<div class=\"container\">");
  client.println("<h1>Input Data Angka</h1>");
  client.println("<form action=\"/submit\" method=\"post\">");

  client.print("<div class=\"input-group\">");
  client.print("<label for=\"value1\">Tanggal:</label>");
  client.print("<input type=\"number\" id=\"value1\" name=\"value1\" value=\"");
  client.print(variables[0]);
  client.print("\" required>");
  client.println("</div>");

  client.print("<div class=\"input-group\">");
  client.print("<label for=\"value2\">Bulan:</label>");
  client.print("<input type=\"number\" id=\"value2\" name=\"value2\" value=\"");
  client.print(variables[1]);
  client.print("\" required>");
  client.println("</div>");

  client.print("<div class=\"input-group\">");
  client.print("<label for=\"value3\">Tahun:</label>");
  client.print("<input type=\"number\" id=\"value3\" name=\"value3\" value=\"");
  client.print(variables[2]);
  client.print("\" required>");
  client.println("</div>");

  for (int i = 3; i < numVariables; i++) {
    client.print("<div class=\"input-group\">");
    client.print("<label for=\"value");
    client.print(i + 1);
    client.print("\">Angka ");
    client.print(i + 1);
    client.print(":</label>");
    client.print("<input type=\"number\" id=\"value");
    client.print(i + 1);
    client.print("\" name=\"value");
    client.print(i + 1);
    client.print("\" value=\"");
    client.print(variables[i]);
    client.println("\" required>");
    client.println("</div>");
  }

  client.println("<input type=\"submit\" value=\"Kirim\">");
  client.println("</form>");
  client.println("</div>");
  client.println("</body>");
  client.println("</html>");
}

void displayVariables() {
  for (int i = 0; i < numVariables; i++) {
    displayNumber(variables[i]);
    delay(500);
  }
}

void displayNumber(int number) {
  byte segments = getSegments(number);
  digitalWrite(latchPin, LOW);
  shiftOut(dataPin, clockPin, MSBFIRST, segments);
  digitalWrite(latchPin, HIGH);
}

byte getSegments(int number) {
  switch (number) {
    case 0: return B00111111;
    case 1: return B00000110;
    case 2: return B01011011;
    case 3: return B01001111;
    case 4: return B01100110;
    case 5: return B01101101;
    case 6: return B01111101;
    case 7: return B00000111;
    case 8: return B01111111;
    case 9: return B01101111;
    default: return B00000000; // Blank for non-decimal digits
  }
}



Penjelasan Perubahan:

  1. Membaca EEPROM Setelah POST:

    • Setelah processPostData(request) memproses data POST, fungsi sendHtmlPage(client) membaca nilai terbaru dari EEPROM sebelum mengirim halaman HTML.
  2. Memperbarui Nilai dari EEPROM:

    • Pada sendHtmlPage, pembacaan nilai dari EEPROM dilakukan kembali untuk memastikan bahwa nilai terbaru dari EEPROM ditampilkan di halaman HTML.

Dengan perubahan ini, nilai yang baru dimasukkan atau diubah oleh klien akan langsung disimpan di EEPROM dan kemudian ditampilkan kembali pada form HTML saat halaman dimuat ulang. Hal ini memastikan bahwa klien melihat nilai terbaru yang disimpan di EEPROM.

Tahap III

Untuk mengakomodasi input 2 digit dan menampilkan nilai 2 digit pada 7-segment, kita perlu melakukan beberapa perubahan pada kode Arduino. Berikut adalah kode yang telah disesuaikan dengan input 2 digit dan menampilkan nilai pada 7-segment:



#include <SPI.h>
#include <Ethernet.h>
#include <EEPROM.h>

// Setting MAC address and IP address for Ethernet module
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192, 168, 1, 177);

EthernetServer server(80);

const int numVariables = 12;
int variables[numVariables];

// Pin definitions for 74HC595
const int latchPin = 5;
const int clockPin = 6;
const int dataPin = 7;

void setup() {
  // Initialize Ethernet
  Ethernet.begin(mac, ip);
  server.begin();
  
  // Initialize pins for 74HC595
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);

  // Read variables from EEPROM
  for (int i = 0; i < numVariables; i++) {
    variables[i] = EEPROM.read(i);
  }

  Serial.begin(9600);
}

void loop() {
  // Check for incoming client connections
  EthernetClient client = server.available();
  if (client) {
    handleClient(client);
  }

  // Display variables on 7-segment display
  displayVariables();
}

void handleClient(EthernetClient client) {
  boolean currentLineIsBlank = true;
  String request = "";
  boolean isPost = false;

  while (client.connected()) {
    if (client.available()) {
      char c = client.read();
      request += c;

      if (c == '\n' && currentLineIsBlank) {
        // If POST request, process the data
        if (isPost) {
          processPostData(request);
        }
        // Send the HTML page
        sendHtmlPage(client);

        break;
      }
      if (c == '\n') {
        currentLineIsBlank = true;
      } else if (c != '\r') {
        currentLineIsBlank = false;
      }

      if (request.indexOf("POST /submit") >= 0) {
        isPost = true;
      }
    }
  }
  delay(1);
  client.stop();
}

void processPostData(String request) {
  int indexStart = request.indexOf("\r\n\r\n") + 4;
  String data = request.substring(indexStart);

  int varIndex = 0;
  while (data.length() > 0 && varIndex < numVariables) {
    int delimiterIndex = data.indexOf('&');
    String param = (delimiterIndex > 0) ? data.substring(0, delimiterIndex) : data;
    int equalsIndex = param.indexOf('=');

    if (equalsIndex > 0) {
      int value = param.substring(equalsIndex + 1).toInt();
      variables[varIndex] = value;
      EEPROM.write(varIndex, value);
    }

    data = (delimiterIndex > 0) ? data.substring(delimiterIndex + 1) : "";
    varIndex++;
  }
}

void sendHtmlPage(EthernetClient client) {
  // Update the variables array with the latest values from EEPROM
  for (int i = 0; i < numVariables; i++) {
    variables[i] = EEPROM.read(i);
  }

  client.println("HTTP/1.1 200 OK");
  client.println("Content-Type: text/html");
  client.println("Connection: close");
  client.println();
  client.println("<!DOCTYPE html>");
  client.println("<html lang=\"id\">");
  client.println("<head>");
  client.println("<meta charset=\"UTF-8\">");
  client.println("<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">");
  client.println("<title>Input Memori Arduino</title>");
  client.println("<style>");
  client.println("body {font-family: Arial, sans-serif; background-color: #f2f2f2; display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0;}");
  client.println(".container {background-color: white; padding: 20px; border-radius: 8px; box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); max-width: 600px; width: 100%;}");
  client.println("h1 {text-align: center; color: #333;}");
  client.println("form {display: grid; grid-template-columns: repeat(3, 1fr); gap: 20px;}");
  client.println("label {margin-bottom: 5px; color: #555;}");
  client.println(".input-group {display: flex; flex-direction: column;}");
  client.println("input[type=\"number\"] {padding: 10px; border: 1px solid #ddd; border-radius: 4px; box-sizing: border-box; width: 100%;}");
  client.println("input[type=\"submit\"] {grid-column: span 3; padding: 10px; background-color: #4CAF50; border: none; border-radius: 4px; color: white; font-size: 16px; cursor: pointer;}");
  client.println("input[type=\"submit\"]:hover {background-color: #45a049;}");
  client.println("</style>");
  client.println("</head>");
  client.println("<body>");
  client.println("<div class=\"container\">");
  client.println("<h1>Input Data Angka</h1>");
  client.println("<form action=\"/submit\" method=\"post\">");

  client.print("<div class=\"input-group\">");
  client.print("<label for=\"value1\">Tanggal:</label>");
  client.print("<input type=\"number\" id=\"value1\" name=\"value1\" value=\"");
  client.print(formatNumber(variables[0]));
  client.print("\" min=\"0\" max=\"99\" required>");
  client.println("</div>");

  client.print("<div class=\"input-group\">");
  client.print("<label for=\"value2\">Bulan:</label>");
  client.print("<input type=\"number\" id=\"value2\" name=\"value2\" value=\"");
  client.print(formatNumber(variables[1]));
  client.print("\" min=\"0\" max=\"99\" required>");
  client.println("</div>");

  client.print("<div class=\"input-group\">");
  client.print("<label for=\"value3\">Tahun:</label>");
  client.print("<input type=\"number\" id=\"value3\" name=\"value3\" value=\"");
  client.print(formatNumber(variables[2]));
  client.print("\" min=\"0\" max=\"99\" required>");
  client.println("</div>");

  for (int i = 3; i < numVariables; i++) {
    client.print("<div class=\"input-group\">");
    client.print("<label for=\"value");
    client.print(i + 1);
    client.print("\">Angka ");
    client.print(i + 1);
    client.print(":</label>");
    client.print("<input type=\"number\" id=\"value");
    client.print(i + 1);
    client.print("\" name=\"value");
    client.print(i + 1);
    client.print("\" value=\"");
    client.print(formatNumber(variables[i]));
    client.println("\" min=\"0\" max=\"99\" required>");
    client.println("</div>");
  }

  client.println("<input type=\"submit\" value=\"Kirim\">");
  client.println("</form>");
  client.println("</div>");
  client.println("</body>");
  client.println("</html>");
}

String formatNumber(int num) {
  if (num < 10) {
    return "0" + String(num);
  } else {
    return String(num);
  }
}

void displayVariables() {
  for (int i = 0; i < numVariables; i++) {
    displayNumber(variables[i]);
    delay(500);
  }
}

void displayNumber(int number) {
  int tens = number / 10;
  int ones = number % 10;

  byte segmentsTens = getSegments(tens);
  byte segmentsOnes = getSegments(ones);

  digitalWrite(latchPin, LOW);
  shiftOut(dataPin, clockPin, MSBFIRST, segmentsOnes);
  shiftOut(dataPin, clockPin, MSBFIRST, segmentsTens);
  digitalWrite(latchPin, HIGH);
}

byte getSegments(int number) {
  switch (number) {
    case 0: return B00111111;
    case 1: return B00000110;
    case 2: return B01011011;
    case 3: return B01001111;
    case 4: return B01100110;
    case 5: return B01101101;
    case 6: return B01111101;
    case 7: return B00000111;
    case 8: return B01111111;
    case 9: return B01101111;
    default: return B00000000; // Blank for non-decimal digits
  }
}




Perubahan yang Dilakukan:

  1. HTML Form dan Script:
    • Formulir HTML diperbarui untuk menerima input yang terdiri dari 2 digit (0-99).
    • Kode Arduino memproses input ini dan menyimpannya di dalam EEPROM.
    • Fungsi formatNumber ditambahkan untukmengubah angka menjadi format dua digit dengan menambahkan nol di depan jika angka kurang dari 10.
  2. Fungsi formatNumber:
    • Fungsi formatNumber ditambahkan untuk memastikan bahwa setiap nilai angka yang ditampilkan dalam formulir HTML memiliki dua digit. Jika angka kurang dari 10, fungsi ini akan menambahkan "0" di depannya.
  3. Menampilkan Nilai pada 7-Segment:
    • Fungsi displayNumber diperbarui untuk menangani dua digit dari setiap variabel. Variabel dibagi menjadi puluhan dan satuan.
    • Segmen untuk setiap digit dihitung menggunakan fungsi getSegments dan diubah menjadi nilai biner yang sesuai dengan 7-segment display.

Dengan perubahan ini, Anda dapat memastikan bahwa input yang diterima dari formulir HTML memiliki dua digit dan nilai ini ditampilkan dengan benar pada 7-segment display.

Pastikan untuk memasukkan semua kode ini ke dalam proyek Arduino Anda dan menghubungkan secara fisik dengan komponen yang sesuai (misalnya, Ethernet Shield dan 74HC595 untuk display 7-segment). Setelah diunggah, periksa koneksi jaringan dan buka alamat IP yang sesuai untuk melihat antarmuka HTML yang diterapkan.


Tahap IV

Untuk meningkatkan input group pada nilai Tahun menjadi 4 digit pada formulir HTML, kita perlu memperluas rentang nilai yang dapat dimasukkan oleh pengguna dan memastikan bahwa nilai yang ditampilkan di 7-segment display juga sesuai dengan format ini. Berikut adalah langkah-langkah yang diperlukan:


#include <SPI.h>
#include <Ethernet.h>
#include <EEPROM.h>

// Setting MAC address and IP address for Ethernet module
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192, 168, 1, 177);

EthernetServer server(80);

const int numVariables = 12;
int variables[numVariables];

// Pin definitions for 74HC595
const int latchPin = 5;
const int clockPin = 6;
const int dataPin = 7;

void setup() {
  // Initialize Ethernet
  Ethernet.begin(mac, ip);
  server.begin();
  
  // Initialize pins for 74HC595
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);

  // Read variables from EEPROM
  for (int i = 0; i < numVariables; i++) {
    variables[i] = EEPROM.read(i);
  }

  Serial.begin(9600);
}

void loop() {
  // Check for incoming client connections
  EthernetClient client = server.available();
  if (client) {
    handleClient(client);
  }

  // Display variables on 7-segment display
  displayVariables();
}

void handleClient(EthernetClient client) {
  boolean currentLineIsBlank = true;
  String request = "";
  boolean isPost = false;

  while (client.connected()) {
    if (client.available()) {
      char c = client.read();
      request += c;

      if (c == '\n' && currentLineIsBlank) {
        // If POST request, process the data
        if (isPost) {
          processPostData(request);
        }
        // Send the HTML page
        sendHtmlPage(client);

        break;
      }
      if (c == '\n') {
        currentLineIsBlank = true;
      } else if (c != '\r') {
        currentLineIsBlank = false;
      }

      if (request.indexOf("POST /submit") >= 0) {
        isPost = true;
      }
    }
  }
  delay(1);
  client.stop();
}

void processPostData(String request) {
  int indexStart = request.indexOf("\r\n\r\n") + 4;
  String data = request.substring(indexStart);

  int varIndex = 0;
  while (data.length() > 0 && varIndex < numVariables) {
    int delimiterIndex = data.indexOf('&');
    String param = (delimiterIndex > 0) ? data.substring(0, delimiterIndex) : data;
    int equalsIndex = param.indexOf('=');

    if (equalsIndex > 0) {
      int value = param.substring(equalsIndex + 1).toInt();
      variables[varIndex] = value;
      EEPROM.write(varIndex, value);
    }

    data = (delimiterIndex > 0) ? data.substring(delimiterIndex + 1) : "";
    varIndex++;
  }
}

void sendHtmlPage(EthernetClient client) {
  // Update the variables array with the latest values from EEPROM
  for (int i = 0; i < numVariables; i++) {
    variables[i] = EEPROM.read(i);
  }

  client.println("HTTP/1.1 200 OK");
  client.println("Content-Type: text/html");
  client.println("Connection: close");
  client.println();
  client.println("<!DOCTYPE html>");
  client.println("<html lang=\"id\">");
  client.println("<head>");
  client.println("<meta charset=\"UTF-8\">");
  client.println("<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">");
  client.println("<title>Input Memori Arduino</title>");
  client.println("<style>");
  client.println("body {font-family: Arial, sans-serif; background-color: #f2f2f2; display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0;}");
  client.println(".container {background-color: white; padding: 20px; border-radius: 8px; box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); max-width: 600px; width: 100%;}");
  client.println("h1 {text-align: center; color: #333;}");
  client.println("form {display: grid; grid-template-columns: repeat(3, 1fr); gap: 20px;}");
  client.println("label {margin-bottom: 5px; color: #555;}");
  client.println(".input-group {display: flex; flex-direction: column;}");
  client.println("input[type=\"number\"] {padding: 10px; border: 1px solid #ddd; border-radius: 4px; box-sizing: border-box; width: 100%;}");
  client.println("input[type=\"submit\"] {grid-column: span 3; padding: 10px; background-color: #4CAF50; border: none; border-radius: 4px; color: white; font-size: 16px; cursor: pointer;}");
  client.println("input[type=\"submit\"]:hover {background-color: #45a049;}");
  client.println("</style>");
  client.println("</head>");
  client.println("<body>");
  client.println("<div class=\"container\">");
  client.println("<h1>Input Data Angka</h1>");
  client.println("<form action=\"/submit\" method=\"post\">");

  client.print("<div class=\"input-group\">");
  client.print("<label for=\"value1\">Tanggal:</label>");
  client.print("<input type=\"number\" id=\"value1\" name=\"value1\" value=\"");
  client.print(formatNumber(variables[0]));
  client.print("\" min=\"0\" max=\"99\" required>");
  client.println("</div>");

  client.print("<div class=\"input-group\">");
  client.print("<label for=\"value2\">Bulan:</label>");
  client.print("<input type=\"number\" id=\"value2\" name=\"value2\" value=\"");
  client.print(formatNumber(variables[1]));
  client.print("\" min=\"0\" max=\"99\" required>");
  client.println("</div>");

  client.print("<div class=\"input-group\">");
  client.print("<label for=\"value3\">Tahun:</label>");
  client.print("<input type=\"number\" id=\"value3\" name=\"value3\" value=\"");
  client.print(formatNumber(variables[2]));
  client.print("\" min=\"0\" max=\"9999\" required>");
  client.println("</div>");

  for (int i = 3; i < numVariables; i++) {
    client.print("<div class=\"input-group\">");
    client.print("<label for=\"value");
    client.print(i + 1);
    client.print("\">Angka ");
    client.print(i + 1);
    client.print(":</label>");
    client.print("<input type=\"number\" id=\"value");
    client.print(i + 1);
    client.print("\" name=\"value");
    client.print(i + 1);
    client.print("\" value=\"");
    client.print(formatNumber(variables[i]));
    client.println("\" min=\"0\" max=\"99\" required>");
    client.println("</div>");
  }

  client.println("<input type=\"submit\" value=\"Kirim\">");
  client.println("</form>");
  client.println("</div>");
  client.println("</body>");
  client.println("</html>");
}

String formatNumber(int num) {
  if (num < 10) {
    return "0" + String(num);
  } else {
    return String(num);
  }
}

void displayVariables() {
  for (int i = 0; i < numVariables; i++) {
    displayNumber(variables[i]);
    delay(500);
  }
}

void displayNumber(int number) {
  int thousands = number / 1000;
  int hundreds = (number / 100) % 10;
  int tens = (number / 10) % 10;
  int ones = number % 10;

  byte segmentsThousands = getSegments(thousands);
  byte segmentsHundreds = getSegments(hundreds);
  byte segmentsTens = getSegments(tens);
  byte segmentsOnes = getSegments(ones);

  digitalWrite(latchPin, LOW);
  shiftOut(dataPin, clockPin, MSBFIRST, segmentsOnes);
  shiftOut(dataPin, clockPin, MSBFIRST, segmentsTens);
  shiftOut(dataPin, clockPin, MSBFIRST, segmentsHundreds);
  shiftOut(dataPin, clockPin, MSBFIRST, segmentsThousands);
  digitalWrite(latchPin, HIGH);
}

byte getSegments(int number) {
  switch (number) {
    case 0: return B00111111; // 0
    case 1: return B00000110; // 1
    case 2: return B01011011; // 2
    case 3: return B01001111; // 3
    case 4: return B01100110; // 4
    case 5: return B01101101; // 5
    case 6: return B01111101; // 6
    case 7: return B00000111; // 7
    case 8: return B01111111; // 8
    case 9: return B01101111; // 9
    default: return 0;
  }
}

Penjelasan Tambahan:

  1. Fungsi getSegments:

    • Fungsi ini mengembalikan byte yang mewakili konfigurasi segmen-segmen yang perlu dinyalakan untuk menampilkan digit tertentu pada 7-segment display. Setiap case dari switch statement ini mewakili angka dari 0 sampai 9.
  2. Fungsi displayVariables:

    • Fungsi ini memanggil displayNumber untuk setiap variabel dalam array variables. Ini akan menampilkan nilai yang disimpan dalam EEPROM ke 7-segment display dengan jeda waktu setiap 500 ms.
  3. Fungsi displayNumber:

    • Fungsi ini menerima nilai number, kemudian membaginya menjadi ribuan, ratusan, puluhan, dan satuan. Setiap digit kemudian dikonversi menjadi konfigurasi segmen menggunakan getSegments. Nilai-nilai ini kemudian ditransmisikan ke 74HC595 menggunakan shiftOut function untuk ditampilkan pada 7-segment display.

Pastikan Anda telah melakukan koneksi yang benar antara pin Arduino dan 74HC595, serta antara 74HC595 dan 7-segment display. Juga pastikan bahwa perangkat keras (seperti Ethernet Shield) tersambung dengan benar untuk mengakses halaman HTML dari Arduino. Dengan ini, Anda dapat menampilkan formulir HTML yang diperbarui dengan input untuk Tanggal, Bulan, Tahun, dan angka lainnya dengan format dua digit pada antarmuka web.



Lapis Aspal Beton (laston)

Lapis Aspal beton adalah beton aspal yang 
bergradasi menerus, lapis aspal beton (laston) juga
sering disebutl dengan AC (Asphal Concrete), dan 
karakteristik beton aspal yang terpenting pada 
campuran ini adalah stabilitas. Tebal minimum Laston 
berkisar antara 4-6 cm, (Sukirman,2003).

Sebagaimana dengan penjelasan di atas fungsi 
dari AC (Asphal Concrete) adalah sebagai berikut: 
1. Sebagai pendukung beban lalu lintas. 
2. Sebagai pelindung konstruksi di bawahnya dari 
kerusakan akibat pengaruh air dan cuaca. 
3. Menyediakan permukaan jalan yang rata dan licin. 

Sesuai dengan fungsinya Laston mempunyai 3 
macam campuran yaitu: 
1. Laston sebagai lapisan aus, dikenal dengan nama 
AC-WC (Asphal Concrete-Wearing Course). Tebal 
nominal minimum AC-WC adalah 4 cm. 
2. Laston sebagai lapis pengikat, dikenal dengan nama 
AC-BC (Asphal Concrete- Binder Course). Tebal 
nominal minimum AC-BC adalah 5 cm. 
3. Lataston sebagai lapisan pondasi, dikenal dengan 
nama AC-Base (Asphal Concrete- Base). Tebal 
nominal minimum adalah 6 cm. 

Sedangkan sifat dari AC (Asphal Concrete) 
adalah: 
1. Tahan terhadap keausan akibat beban lalu lintas 
2. Kedap air 
3. Mempunyai nilai struktural 
4. Mempunyai stabilitas yang tinggi 
5. Peka terhadap penyimpangan dan pelaksanaan 
Bahan Asphal Concrete ( AC ) terdiri dari agregat 
kasar, agregat halus, filler (jika diperlukan), dan aspal 
keras

Isi Pasal 333 KUHP

Isi Pasal 333 KUHP Tentang Penyekapan dan Penculikan 

Berikut ini isi Pasal 333 KUHP tentang penyekapan dan penculikan secara lengkap: 
(1) Barang siapa dengan sengaja dan melawan hukum merampas kemerdekaan seseorang, atau meneruskan perampasan kemerdekaan yang demikian, diancam dengan pidana penjara paling lama delapan tahun. 
(2) Jika perbuatan itu mengakibatkan luka-luka berat maka yang bersalah diancam dengan pidana penjara paling lama sembilan tahun. 
(3) Jika mengakibatkan mati diancam dengan pidana penjara paling lama dua belas tahun. 
(4) Pidana yang ditentukan dalam pasal ini diterapkan juga bagi orang yang dengan sengaja dan melawan hukum memberi tempat untuk perampasan kemerdekaan.

Tidak datang pada saat dipanggil sebagai saksi.

Pasal 224 KUHP
Barang siapa dipanggil sebagai saksi, ahli atau juru bahasa menurut undang-undang dengan sengaja tidak memenuhi kewajiban berdasarkan undang-undang yang harus dipenuhinya, diancam:
1. dalam perkara pidana, dengan pidana penjara paling lama 9 bulan;
2. dalam perkara lain, dengan pidana penjara paling lama 6 bulan.
 
Pasal 285 UU 1/2023
Setiap orang yang secara melawan hukum tidak datang pada saat dipanggil sebagai saksi, ahli, atau juru bahasa, atau tidak memenuhi suatu kewajiban yang harus dipenuhi sesuai dengan ketentuan peraturan perundang-undangan, dipidana dengan:
1. pidana penjara paling lama 9 bulan atau pidana denda paling banyak kategori II yaitu Rp10 juta, bagi perkara pidana; atau
2. pidana penjara paling lama 6 bulan atau pidana denda paling banyak kategori II yaitu Rp10 juta, bagi perkara lain.

Google Analytics 4 (GA4)

Google Analytics 4 (GA4) adalah versi terbaru dari platform analitik web yang disediakan oleh Google. GA4 dirancang untuk memberikan pemahaman yang lebih mendalam tentang perilaku pengguna di situs web dan aplikasi, dengan fokus pada analisis data pengguna lintas platform. Berikut adalah beberapa hal penting tentang Google Analytics 4:

1. **Pemantauan Lintas Platform**: Salah satu fitur utama GA4 adalah kemampuannya untuk melacak pengguna lintas platform, termasuk situs web dan aplikasi mobile dalam satu tampilan analitik. Ini membantu pemilik bisnis memahami bagaimana pengguna berinteraksi dengan merek mereka di berbagai perangkat.

2. **Perilaku Pengguna Lebih Mendalam**: GA4 menempatkan lebih banyak fokus pada pemahaman tentang perilaku pengguna. Ini memungkinkan pemilik situs untuk melihat perjalanan pengguna dari awal hingga akhir, termasuk tindakan seperti klik, scroll, dan interaksi lainnya yang tidak terbatas pada halaman tertentu.

3. **Model Pemahaman Pengguna**: GA4 memanfaatkan teknologi machine learning untuk menghasilkan model pemahaman pengguna yang lebih baik. Ini membantu dalam memprediksi tindakan pengguna berdasarkan data historis, yang dapat membantu dalam meningkatkan personalisasi pengalaman pengguna.

4. **Event Tracking yang Lebih Fleksibel**: GA4 memperkenalkan pendekatan yang lebih fleksibel dalam melacak acara (events) di situs web atau aplikasi Anda. Anda dapat dengan mudah menentukan acara yang ingin Anda lacak, seperti tindakan pengguna tertentu, dan menganalisisnya lebih detail.

5. **Integrasi Data Pihak Ketiga**: GA4 memudahkan integrasi dengan sumber data pihak ketiga, seperti data dari sistem manajemen relasi pelanggan (CRM) atau platform periklanan. Ini membantu Anda mendapatkan pemahaman yang lebih holistik tentang pelanggan Anda.

6. **Data Pribadi dan Privasi**: GA4 lebih memperhatikan privasi pengguna dengan mematuhi pedoman pengumpulan data yang lebih ketat. Ini penting mengingat perubahan regulasi privasi data seperti GDPR dan CCPA.

7. **Raportase dan Visualisasi yang Lebih Baik**: GA4 memiliki fitur visualisasi dan pelaporan yang lebih kuat, yang membantu Anda menjelajahi data Anda dengan lebih baik dan membuat keputusan berdasarkan wawasan yang didapatkan.

8. **Migrasi dari Universal Analytics**: Meskipun GA4 adalah platform yang berbeda, Google menyediakan panduan untuk memudahkan migrasi dari Universal Analytics ke GA4 agar Anda dapat memanfaatkan fitur-fitur terbaru.

Google Analytics 4 adalah alat analitik web yang kuat yang dirancang untuk memberikan pemahaman yang lebih baik tentang pengguna Anda dan membantu Anda mengambil tindakan yang lebih cerdas berdasarkan data tersebut. Hal ini sangat penting dalam era digital untuk memahami dan meningkatkan kinerja bisnis online Anda.

Google Analytics 4 telah menggantikan Universal Analytics. Mulai 1 Juli 2023, properti Universal Analytics standar akan berhenti memproses data.

Pi Coin

Pi Coin adalah cryptocurrency yang dikembangkan oleh tim di Stanford University. Berikut adalah penjelasan spesifik tentang Pi Coin: ### 1. ...