Tampilkan postingan dengan label Ilmu. Tampilkan semua postingan
Tampilkan postingan dengan label Ilmu. Tampilkan semua postingan

Membuat alat fotolisis air menggunakan cahaya atau laser di rumah

Membuat alat fotolisis air menggunakan cahaya atau laser di rumah mungkin sedikit lebih kompleks daripada metode elektrolisis sederhana, tetapi masih bisa dilakukan dengan alat dan bahan yang cukup terjangkau serta aman untuk digunakan. Berikut adalah panduan untuk membuat alat fotolisis air menggunakan cahaya UV yang relatif mudah diikuti:

Alat dan Bahan yang Diperlukan

  1. Sumber Cahaya UV: Lampu UV LED atau lampu UV fluoresen (panjang gelombang sekitar 254 nm).
  2. Wadah: Gelas atau botol plastik bening yang tahan UV.
  3. Air: Air murni atau air dengan sedikit elektrolit (seperti garam meja atau baking soda).
  4. Fotokatalis: Titanium dioksida (TiO₂) yang dapat dibeli sebagai bubuk atau sebagai lapisan pada kaca.
  5. Kabel Penghubung: Kabel dengan penjepit buaya atau kawat tembaga.
  6. Penjepit: Penjepit buaya untuk menghubungkan elektroda dengan sumber daya listrik.
  7. Penutup Wadah: Penutup plastik atau karet untuk menahan elektroda di tempatnya.
  8. Elektroda: Dua elektroda platina atau grafit.

Langkah-langkah Pembuatan

  1. Persiapan Fotokatalis:

    • Jika menggunakan bubuk TiO₂, campurkan sedikit dengan air untuk membuat suspensi.
    • Jika menggunakan kaca berlapis TiO₂, pastikan lapisan tersebut menghadap ke dalam wadah.
  2. Persiapan Wadah:

    • Isi wadah dengan air murni atau air dengan sedikit elektrolit (sekitar 1 sendok teh garam meja atau baking soda per 250 ml air).
  3. Penempatan Fotokatalis:

    • Jika menggunakan suspensi TiO₂, tuangkan suspensi tersebut ke dalam air di wadah.
    • Jika menggunakan kaca berlapis TiO₂, letakkan kaca di dalam wadah sehingga lapisan TiO₂ terendam dalam air.
  4. Penempatan Elektroda:

    • Masukkan elektroda ke dalam air, pastikan tidak saling bersentuhan.
    • Jika menggunakan penutup wadah, buat lubang untuk elektroda agar tetap di tempatnya.
  5. Menghubungkan Elektroda ke Sumber Daya Listrik:

    • Sambungkan kabel penghubung dengan penjepit buaya ke elektroda.
    • Hubungkan ujung lain kabel penghubung ke terminal positif dan negatif baterai atau adaptor DC.
  6. Proses Fotolisis:

    • Nyalakan sumber cahaya UV dan arahkan ke wadah sehingga sinar UV mengenai air yang mengandung fotokatalis.
    • Nyalakan sumber daya listrik jika digunakan.
    • Anda akan melihat gelembung gas mulai terbentuk di sekitar elektroda. Elektroda yang terhubung ke terminal negatif (katoda) akan menghasilkan gelembung hidrogen (H₂), sedangkan elektroda yang terhubung ke terminal positif (anoda) akan menghasilkan gelembung oksigen (O₂).

Keselamatan dan Tips

  • Keselamatan Cahaya UV: Hindari paparan langsung mata dan kulit ke cahaya UV. Gunakan kacamata pelindung dan pakaian yang menutupi kulit.
  • Keselamatan Listrik: Selalu berhati-hati saat bekerja dengan listrik. Gunakan tegangan rendah untuk menghindari risiko sengatan listrik.
  • Ventilasi: Pastikan area kerja memiliki ventilasi yang baik untuk menghindari penumpukan gas hidrogen dan oksigen yang mudah terbakar.

Prinsip Kerja

  • Fotolisis Air: Cahaya UV diserap oleh fotokatalis (TiO₂), menghasilkan pasangan elektron-hole. Hole yang dihasilkan memecah molekul air menjadi proton (H⁺) dan oksigen (O₂), sementara elektron yang dihasilkan membantu membentuk gas hidrogen (H₂).
  • Reaksi umum: 2H2O(l)+cahayaUV2H2(g)+O2(g)2 H_2O (l) + cahaya UV \rightarrow 2 H_2 (g) + O_2 (g)

Proyek ini memberikan pemahaman dasar tentang fotolisis air dan dapat digunakan sebagai alat pengajaran yang efektif tentang prinsip dasar fotokimia dan reaksi kimia.


Semoga panduan ini membantu Anda dalam membuat alat fotolisis air sederhana menggunakan cahaya UV. 

Fotolisis Air dalam Fotosintesis: Proses Penting dalam Kehidupan Tumbuhan

Fotosintesis adalah proses vital bagi kehidupan tumbuhan dan banyak organisme lainnya di bumi. Salah satu tahap penting dalam fotosintesis adalah fotolisis air, di mana energi cahaya diserap oleh pigmen fotosintesis untuk memecah molekul air (H₂O). Proses ini terjadi dalam tilakoid di kloroplas tumbuhan dan alga selama tahap terang fotosintesis. Berikut adalah penjelasan rinci tentang fotolisis air.

Penyerapan Energi Cahaya

  1. Energi Cahaya Diserap oleh Klorofil:

    • Energi cahaya matahari diserap oleh pigmen fotosintesis, terutama klorofil, yang terdapat dalam membran tilakoid di dalam kloroplas.
    • Klorofil memiliki kemampuan untuk menyerap cahaya, terutama pada panjang gelombang biru dan merah, dan mentransfer energi ini ke pusat reaksi fotosistem II.
  2. Eksitasi Elektron:

    • Ketika klorofil menyerap energi cahaya, elektronnya menjadi tereksitasi (berenergi tinggi).
    • Elektron yang tereksitasi ini dipindahkan ke rantai transpor elektron, yaitu serangkaian molekul yang mentransfer elektron dari satu molekul ke molekul lainnya.

Pemecahan Molekul Air (Fotolisis)

  1. Terjadi di Fotosistem II:

    • Fotolisis air terjadi di fotosistem II, di mana air (H₂O) dipecah menjadi oksigen, proton, dan elektron.
    • Persamaan reaksi fotolisis air adalah sebagai berikut: 
    • Elektron yang dihasilkan dari pemecahan air ini menggantikan elektron yang hilang dari klorofil ketika tereksitasi oleh cahaya.
  2. Produksi Oksigen:

    • Oksigen yang dihasilkan dari pemecahan air dilepaskan sebagai produk sampingan. Inilah yang memberikan oksigen ke atmosfer, yang penting bagi kehidupan aerobik di bumi.

Penggunaan Proton dan Elektron

  1. Sintesis ATP:

    • Proton (H⁺) yang dihasilkan meningkatkan gradien proton di dalam tilakoid, yang kemudian digunakan oleh ATP sintase untuk menghasilkan ATP melalui proses yang dikenal sebagai fotofosforilasi.
  2. Reduksi NADP⁺:

    • Elektron yang dihasilkan melalui fotolisis air diangkut melalui rantai transpor elektron dan akhirnya digunakan untuk mereduksi NADP⁺ menjadi NADPH di fotosistem I.

Rangkuman Proses

  1. Penyerapan Cahaya: Energi cahaya diserap oleh klorofil dalam fotosistem II.
  2. Eksitasi Elektron: Energi cahaya mengeksitasi elektron dalam klorofil.
  3. Fotolisis Air: Air dipecah menjadi oksigen, proton, dan elektron.
  4. Produksi Oksigen: Oksigen dilepaskan ke atmosfer.
  5. Penggunaan Proton dan Elektron: Proton digunakan untuk sintesis ATP, dan elektron digunakan untuk mereduksi NADP⁺ menjadi NADPH.

Pentingnya Fotolisis Air

Fotolisis air adalah langkah penting dalam fotosintesis karena:

  • Menyediakan elektron yang diperlukan untuk rantai transpor elektron.
  • Menghasilkan oksigen sebagai produk sampingan yang dilepaskan ke atmosfer.
  • Membantu dalam sintesis ATP dan NADPH, yang digunakan dalam siklus Calvin untuk mensintesis gula dari karbon dioksida dan air, yang merupakan sumber energi dan bahan bangunan bagi tumbuhan dan organisme lainnya.

Dengan memahami proses fotolisis air, kita dapat lebih menghargai bagaimana tumbuhan menggunakan energi matahari untuk memecah molekul air, menghasilkan oksigen yang kita hirup, dan menghasilkan energi kimia yang mereka butuhkan untuk tumbuh dan berkembang.


Semoga artikel ini memberikan wawasan baru tentang pentingnya fotolisis air dalam fotosintesis.

Memisahkan Hidrogen dan Oksigen dari Air Menggunakan Sinar Laser

Pemecahan hidrogen dan oksigen dari air menggunakan sinar laser adalah teknik canggih yang memerlukan pemahaman mendalam tentang fisika dan kimia. Proses ini secara umum dikenal sebagai "fotolisis" air. Berikut adalah penjelasan tentang bagaimana hal ini bisa dilakukan.

Persiapan dan Langkah-langkah

  1. Persiapan Larutan Air: Gunakan air murni sebagai bahan baku. Kadang-kadang, elektrolit seperti asam sulfat (H₂SO₄) ditambahkan untuk meningkatkan konduktivitas air.

  2. Sinar Laser: Pilih sinar laser dengan panjang gelombang tertentu untuk memecah molekul air (H₂O) menjadi hidrogen (H₂) dan oksigen (O₂). Laser UV sering digunakan karena energi fotonnya cukup tinggi untuk memutus ikatan kimia dalam molekul air.

  3. Absorpsi Foton oleh Molekul Air: Ketika sinar laser diarahkan ke air, foton dari sinar laser akan diserap oleh molekul air. Energi foton ini cukup untuk memutus ikatan antara atom hidrogen dan oksigen dalam molekul air.

  4. Pembentukan Radikal Bebas: Proses ini menghasilkan radikal bebas, yaitu atom hidrogen dan oksigen yang belum stabil dan sangat reaktif. Radikal bebas ini kemudian bergabung untuk membentuk molekul hidrogen (H₂) dan oksigen (O₂).

  5. Koleksi Gas: Gas hidrogen dan oksigen yang dihasilkan kemudian dikumpulkan. Karena hidrogen adalah gas yang sangat ringan dan mudah terlepas ke udara, sistem pengumpulan yang baik diperlukan untuk menghindari kehilangan gas.

Langkah-langkah Terperinci

  1. Penyiapan Sumber Laser: Pilih sumber laser yang sesuai, misalnya laser UV dengan panjang gelombang sekitar 193 nm (nanometer) yang cukup energik untuk memutus ikatan O-H dalam air.

  2. Menyiapkan Reaktor: Gunakan reaktor khusus yang bisa menahan paparan sinar laser dan memfasilitasi pemisahan serta pengumpulan gas hidrogen dan oksigen.

  3. Pengaturan Intensitas dan Fokus Laser: Pastikan sinar laser terfokus pada area tertentu di dalam air untuk efisiensi pemecahan molekul.

  4. Pengumpulan dan Penyimpanan Gas: Pasang sistem pengumpulan gas untuk memisahkan dan menyimpan gas hidrogen dan oksigen yang dihasilkan.

Keamanan dan Teknologi

Perlu dicatat bahwa proses ini membutuhkan perangkat dan teknologi canggih serta peralatan keamanan yang sesuai karena melibatkan energi tinggi dan gas yang mudah terbakar. Dalam praktiknya, metode ini lebih sering digunakan dalam penelitian dan laboratorium dibandingkan aplikasi komersial.

Dengan teknologi yang tepat, proses pemisahan ini dapat dilakukan secara efisien dan aman. Menjadi salah satu metode yang menjanjikan untuk produksi hidrogen sebagai sumber energi masa depan yang bersih.


Semoga artikel ini bermanfaat dan memberikan wawasan baru tentang teknologi pemisahan hidrogen dan oksigen dari air menggunakan sinar laser.

Wireless Router Mode vs Access Point Mode

Perbedaan antara Mode Titik Akses (Access Point Mode) dan Mode Router terletak pada fungsi dan cara mereka menangani lalu lintas jaringan. Berikut penjelasan masing-masing mode:

Mode Titik Akses (Access Point Mode)

  1. Fungsi:

    • Memperluas jaringan yang sudah ada.
    • Mengubah jaringan kabel menjadi jaringan nirkabel.
    • Berfungsi sebagai jembatan antara jaringan kabel dan nirkabel.
  2. Manajemen Jaringan:

    • Bergantung pada router utama untuk DHCP dan manajemen jaringan.
    • Tidak melakukan NAT (Network Address Translation).
  3. Pengaturan:

    • Terhubung ke router utama melalui kabel Ethernet.
    • Biasanya digunakan untuk meningkatkan cakupan Wi-Fi di area dengan sinyal yang lemah.
  4. Penggunaan:

    • Cocok untuk memperluas cakupan nirkabel dari jaringan yang sudah ada tanpa membuat segmen jaringan baru.

Mode Router

  1. Fungsi:

    • Membuat dan mengelola jaringan baru.
    • Bertindak sebagai perangkat utama yang menangani semua lalu lintas jaringan, termasuk routing, DHCP, dan NAT.
  2. Manajemen Jaringan:

    • Menyediakan layanan DHCP untuk memberikan alamat IP ke perangkat.
    • Mengelola fungsi keamanan dan routing jaringan.
  3. Pengaturan:

    • Terhubung langsung ke modem atau sumber internet.
    • Mengatur pengaturan seperti SSID, kata sandi, dan opsi keamanan secara mandiri.
  4. Penggunaan:

    • Cocok untuk membangun jaringan baru di mana perangkat TP-Link menjadi router utama yang terhubung langsung ke internet.

Ringkasan

  • Mode Titik Akses (Access Point Mode): Memperluas jaringan yang sudah ada dengan menyediakan akses nirkabel tanpa membuat segmen jaringan baru. Bergantung pada router utama untuk penugasan IP dan routing.
  • Mode Router: Membuat dan mengelola jaringan baru dengan rentang IP-nya sendiri dan menangani routing, DHCP, serta keamanan.

Memahami mode-mode ini membantu dalam mengonfigurasi perangkat TP-Link sesuai dengan kebutuhan jaringan Anda, apakah Anda sedang memperluas jaringan yang sudah ada atau menyiapkan yang baru.



Contoh produk Wireless dari TP-Link
 
https://www.tp-link.com/id/support/faq/2420/

When configuring TP-Link wireless router as a wireless access point, many customers would doubt the main differences between Wireless Router Mode and Access Point Mode. This article will help you make it clear.

First of all, the list below will let you figure out which functions can be supported by Router Mode/ Wireless Access Point Mode:

Note: It’s suggested to check the exact functions on the router’s Web UI as functions under AP mode may vary from different TP-Link devices.


Aktivasi Starlink

Jika belum memiliki Starlink, silakan kunjungi www.starlink.com untuk membeli perangkat keras Starlink.

Aktivasi adalah mengatur dan menghubungkan Kit Starlink Anda.

Jika telah membeli Starlink dari peritel resmi atau pihak ketiga, ikuti langkah-langkah berikut untuk menambahkan Starlink Anda ke akun baru atau ke akun yang sudah ada.

1. Buka www.starlink.com/activate

2. Masukkan Pengidentifikasi Starlink

3. Klik Akun Baru

4. Klik Akun yang Sudah Ada jika Anda sudah memiliki akun.

5.Masukkan Alamat Anda

6.Pilih Layanan

Masukkan Informasi Kontak dan Penagihan Anda

7.Pilih “Buat Pesanan”. Layanan akan segera diaktifkan setelah Anda membuat pesanan. Laporan layanan Starlink Anda akan dibuat secara otomatis setiap 30 hari.

Daftar singkatan dan istilah dalam jaringan fiber optik

Berikut adalah daftar singkatan dan istilah yang sering digunakan dalam jaringan fiber optik:

Daftar Singkatan dalam Jaringan Fiber Optik:

  • BTS: Base Transceiver Station
  • BoQ: Bill of Quantity
  • CPE: Customer Premise Equipment
  • CT: Central Terminal
  • EMP: Electronic Marking Post
  • FITL: Fiber In The Loop
  • FO: Fiber Optic
  • FTTB: Fiber To The Building
  • FTTC: Fiber To The Curb
  • FTTH: Fiber To The Home
  • FTTZ: Fiber To The Zone
  • GPON: Gigabit Passive Optical Network
  • HDPE: High Density Polyethylene
  • HRB: High Rise Building
  • IKG: Instalasi Kabel Gedung
  • IKK: Instalasi Kabel Kawasan
  • IKP: Instalasi Kabel Pelanggan
  • IKR: Instalasi Kabel Rumah
  • IPTV: Internet Protocol Television
  • IPDSLAM: Internet Protocol Digital Subscriber Line Access Multiplexer
  • JARLOKAF: Jaringan Lokal Akses Fiber
  • JARLOKAT: Jaringan Lokal Akses Tembaga
  • KAF: Kabel Akses Fiber Optik
  • KLPA: Kabinet Luar untuk Perangkat Aktif
  • LOS: Line Of Sight
  • MEA: Metro Ethernet Access
  • MSAN: Multi Service Access Network
  • ODC: Optical Distribution Cabinet
  • ODF: Optical Distribution Frame
  • ODN: Optical Distribution Network
  • ODP: Optical Distribution Point
  • OLT: Optical Line Terminal
  • ONT: Optical Network Termination
  • ONU: Optical Network Unit
  • OSP: Outside Plant
  • OTB: Optical Termination Block
  • OTP: Optical Termination Premises
  • PPJAFO: Panduan Pemasangan Jaringan Akses Fiber Optik
  • PPJT: Panduan Pemasangan Jaringan Telekomunikasi
  • PVC: Poly Vinyl Chloride
  • PON: Passive Optical Network
  • PS: Passive Splitter
  • RT: Remote Terminal
  • SC: Standard Connector
  • SIP: Session Initiation Protocol
  • ST: Straight Tip
  • STB: Set Top Box
  • STEL: Standar Telekomunikasi
  • STO: Sentral Telepon Otomat


Daftar Istilah dalam Jaringan Fiber Optik:

  • Aerial Distribusi: Kabel udara fiber optik yang diterminasi di ODC dan ODP.
  • Aerial Drop: Kabel udara fiber optik yang diterminasi di ODP dan OTP.
  • Jaringan Akses: Seluruh jaringan transmisi antara sentral lokal dan terminal pelanggan.
  • Jaringan Lokal Akses Fiber: Sekumpulan jaringan akses yang menggunakan kabel fiber optik.
  • Kabel Distribusi: Kabel fiber optik yang diterminasi di ODC dan ODP.
  • Kabel Drop: Kabel fiber optik yang diterminasi di ODP dan OTP.
  • Kabel Feeder: Kabel fiber optik yang diterminasi di ODF dan ODC.
  • Kabel Indoor: Kabel fiber optik yang diterminasi di OTP dan roset optik.
  • Kabel Duct: Kabel tanah yang dalam pemasangannya harus diletakkan dalam pipa-pipa di bawah permukaan tanah (STEL-K008 dan STEL-K009).
  • Kabel Tanam Langsung: Kabel tanah yang dalam pemasangannya ditanam secara langsung di bawah permukaan tanah (STEL-K007).
  • ODC (Optical Distribution Cabinet): Tempat terminasi antara kabel feeder dan kabel distribusi.
  • Optical Distribution Frame (ODF): Titik terminasi kabel fiber optik, sebagai tempat peralihan dari kabel fiber optik outdoor dengan kabel fiber optik indoor dan sebaliknya. Fungsi lainnya sebagai titik koneksi perangkat ke ODN dan sebagai titik cross connect antara ODF-ODF. Wujud dari ODF adalah berbentuk rak dan dipasang di sisi sentral maupun di sisi pelanggan (HRB).
  • Optical Distribution Network (ODN): Suatu jaringan transmisi kabel fiber optik antara perangkat OLT dan ONU.
  • Optical Line Terminal (OLT): Jenis perangkat aktif yang merupakan subsistem dari Optical Access Network yang berdasarkan teknologi PON, berfungsi sebagai antarmuka sentral dengan jaringan yang dihubungkan ke satu atau lebih jaringan distribusi optik.
  • Optical Management: Sistem pendukung kegiatan operasi pemeliharaan dengan kemampuan untuk mengukur serta memonitor fluktuasi.
  • Optical Network Unit (ONU): Jenis perangkat aktif yang merupakan subsistem dari Optical Access Network yang berdasarkan teknologi PON, berfungsi sebagai antarmuka pengguna dengan jaringan yang dihubungkan ke satu jaringan distribusi optik (ODN). Perangkat aktif yang ditempatkan di sisi jaringan/FTTC atau di sisi pelanggan (FTTB/FTTH) yang masih membutuhkan perangkat tambahan untuk tiap layanan.
  • ONT (Optical Network Termination): Perangkat aktif yang ditempatkan di sisi pelanggan dan telah dilengkapi port-port layanan (RJ-11, RJ-45, RF).
  • OTP (Optical Termination Premises): Tempat terminasi antara kabel drop dan kabel indoor.
  • Optical Rosset: Perangkat tempat terminasi antara kabel indoor dan patchcord atau pig tail yang tersambung ke terminal ONT (Optical Network Terminal).
  • PIT: Lubang yang dibuat dengan ukuran tertentu sesuai kebutuhan yang digunakan untuk keperluan pekerjaan boring atau tempat jalur masuk kabel drop ke pelanggan.
  • Passive Optical Network (PON): Salah satu jenis teknologi akses fiber optik yang menggunakan konfigurasi Point to Multipoint.
  • Passive Splitter (PS): Suatu perangkat pasif dalam suatu jaringan PON yang berfungsi sebagai pencabangan dari satu saluran fiber optik menjadi beberapa saluran fiber optik dan umumnya diletakkan antara OLT dan ONU.
  • Patchcord: Seutas fiber optik berisi satu core atau lebih yang mempunyai pelindung fiber sendiri dan dilengkapi dua konektor pada kedua ujungnya.
  • Pigtail: Seutas fiber optik berisi satu core yang mempunyai pelindung fiber sendiri dan dilengkapi hanya satu konektor pada salah satu ujungnya

 

Naegleria fowleri - Amuba Pemakan Otak

    Naegleria fowleri adalah amuba yang tumbuh subur di danau air tawar hangat, sungai, dan sumber air panas. Amuba ini juga dapat ditemukan di air keran, menurut Pusat Pengendalian dan Pencegahan Penyakit (CDC) AS.

    Amuba tersebut dapat menyebabkan infeksi otak jika air yang mengandungnya masuk ke otak melalui hidung. Infeksi otak seperti ini jarang terjadi, tetapi hampir selalu berakibat fatal dengan tingkat kematian sebesar 97 persen, menurut otoritas AS.

    Infeksi otak yang disebabkan oleh Naegleria fowleri biasanya terjadi setelah seseorang berenang atau menyelam di danau, sungai, atau air tawar lainnya selama bulan-bulan musim panas. Infeksi sering terjadi saat cuaca panas dalam jangka waktu lama, yang mengakibatkan suhu air menjadi lebih tinggi dan permukaan air menjadi lebih rendah.

    Beberapa infeksi terjadi ketika orang menggunakan air keran yang mengandung Naegleria fowleri untuk membilas sinus atau membersihkan saluran hidung mereka. Dalam kasus yang sangat langka, orang terinfeksi akibat air rekreasi seperti tempat bermain air dan taman selancar yang tidak memiliki cukup klorin.

    Anda tidak dapat tertular infeksi Naegleria fowleri dari menelan air yang mengandung amuba. Anda juga tidak dapat tertular infeksi ini dari orang lain atau menularkannya kepada orang lain.

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.



Pi Coin

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