Program ESP32 untuk Multiplexer 64 Channel dengan FIFO dan Web Interface

Program ESP32  untuk Multiplexer 64 Channel dengan FIFO dan Web Interface + LCD:


```cpp

#include <Wire.h>

#include <LiquidCrystal_I2C.h>

#include <SD.h>

#include <SPI.h>

#include <WiFi.h>

#include <WebServer.h>

#include <ArduinoJson.h>


// Konfigurasi Hardware

#define MUX_S0 13

#define MUX_S1 12

#define MUX_S2 14

#define MUX_S3 27

#define MUX_SIG 36

#define SD_CS 5


// Konfigurasi LCD I2C

#define LCD_ADDRESS 0x27

#define LCD_COLS 16

#define LCD_ROWS 2


// Konfigurasi Threshold

#define ACTIVE_THRESHOLD 2000

#define DEBOUNCE_TIME 100


// Konfigurasi FIFO

#define MAX_FIFO_ENTRIES 10


// Konfigurasi WiFi

const char* ssid = "YourSSID";

const char* password = "YourPassword";


// Struktur Data Channel

struct Channel {

  int id;

  String name;

  int value;

  bool active;

  unsigned long timestamp;

};


// FIFO

Channel fifo[MAX_FIFO_ENTRIES];

int fifoCount = 0;


// Variabel Global

Channel channels[64];

WebServer server(80);

LiquidCrystal_I2C lcd(LCD_ADDRESS, LCD_COLS, LCD_ROWS);


void setup() {

  Serial.begin(115200);

  

  // Inisialisasi Pin

  pinMode(MUX_S0, OUTPUT);

  pinMode(MUX_S1, OUTPUT);

  pinMode(MUX_S2, OUTPUT);

  pinMode(MUX_S3, OUTPUT);

  pinMode(MUX_SIG, INPUT);

  

  // Inisialisasi LCD

  lcd.init();

  lcd.backlight();

  lcd.clear();

  lcd.setCursor(0, 0);

  lcd.print("Initializing...");

  

  // Inisialisasi SD Card

  if (!SD.begin(SD_CS)) {

    lcd.clear();

    lcd.print("SD Card Failed");

    while (1);

  }

  

  // Baca file channels.csv

  if (!loadChannelNames()) {

    lcd.clear();

    lcd.print("Channel CSV Error");

    while (1);

  }

  

  // Hubungkan ke WiFi

  WiFi.begin(ssid, password);

  lcd.clear();

  lcd.print("Connecting WiFi");

  

  while (WiFi.status() != WL_CONNECTED) {

    delay(500);

    lcd.print(".");

  }

  

  lcd.clear();

  lcd.print("WiFi Connected");

  lcd.setCursor(0, 1);

  lcd.print(WiFi.localIP());

  delay(2000);

  

  // Setup Web Server

  setupWebServer();

  

  // Tampilkan konfigurasi sistem

  printSystemConfig();

}


void loop() {

  server.handleClient();

  

  // Baca semua channel

  readAllChannels();

  

  // Update FIFO

  updateFifo();

  

  // Update LCD

  updateLcd();

  

  // Kirim data FIFO ke Serial jika perlu

  if (Serial.available()) {

    if (Serial.read() == 'f') {

      sendFifoToSerial();

    }

  }

  

  delay(50);

}


// Fungsi untuk membaca nilai dari multiplexer

int readMux(int channel) {

  digitalWrite(MUX_S0, bitRead(channel, 0));

  digitalWrite(MUX_S1, bitRead(channel, 1));

  digitalWrite(MUX_S2, bitRead(channel, 2));

  digitalWrite(MUX_S3, bitRead(channel, 3));

  return analogRead(MUX_SIG);

}


// Baca semua 64 channel

void readAllChannels() {

  for (int i = 0; i < 64; i++) {

    channels[i].value = readMux(i);

    channels[i].active = (channels[i].value > ACTIVE_THRESHOLD);

    channels[i].timestamp = millis();

  }

}


// Update FIFO dengan data channel aktif

void updateFifo() {

  // Hapus entri yang tidak aktif lagi

  for (int i = 0; i < fifoCount; i++) {

    int channelId = fifo[i].id;

    if (!channels[channelId].active) {

      // Geser semua entri setelahnya ke depan

      for (int j = i; j < fifoCount - 1; j++) {

        fifo[j] = fifo[j + 1];

      }

      fifoCount--;

      i--; // Periksa lagi posisi ini karena ada pergeseran

    }

  }

  

  // Tambahkan channel aktif baru ke FIFO

  for (int i = 0; i < 64; i++) {

    if (channels[i].active) {

      bool alreadyInFifo = false;

      

      // Cek apakah channel sudah ada di FIFO

      for (int j = 0; j < fifoCount; j++) {

        if (fifo[j].id == i) {

          alreadyInFifo = true;

          // Update nilai dan timestamp

          fifo[j].value = channels[i].value;

          fifo[j].timestamp = channels[i].timestamp;

          break;

        }

      }

      

      // Jika belum ada di FIFO dan masih ada slot

      if (!alreadyInFifo && fifoCount < MAX_FIFO_ENTRIES) {

        fifo[fifoCount].id = i;

        fifo[fifoCount].name = channels[i].name;

        fifo[fifoCount].value = channels[i].value;

        fifo[fifoCount].active = true;

        fifo[fifoCount].timestamp = channels[i].timestamp;

        fifoCount++;

      }

    }

  }

  

  // Urutkan FIFO berdasarkan timestamp (terlama pertama)

  sortFifoByTimestamp();

}


// Urutkan FIFO berdasarkan timestamp

void sortFifoByTimestamp() {

  for (int i = 0; i < fifoCount - 1; i++) {

    for (int j = i + 1; j < fifoCount; j++) {

      if (fifo[i].timestamp > fifo[j].timestamp) {

        Channel temp = fifo[i];

        fifo[i] = fifo[j];

        fifo[j] = temp;

      }

    }

  }

}


// Load nama channel dari SD card

bool loadChannelNames() {

  File file = SD.open("/channels.csv");

  if (!file) {

    return false;

  }

  

  while (file.available()) {

    String line = file.readStringUntil('\n');

    line.trim();

    

    int commaPos = line.indexOf(',');

    if (commaPos == -1) continue;

    

    String idStr = line.substring(0, commaPos);

    String name = line.substring(commaPos + 1);

    

    int id = idStr.toInt();

    if (id >= 0 && id < 64) {

      channels[id].id = id;

      channels[id].name = name;

    }

  }

  

  file.close();

  return true;

}


// Update tampilan LCD

void updateLcd() {

  static unsigned long lastUpdate = 0;

  if (millis() - lastUpdate < 1000) return;

  lastUpdate = millis();

  

  // Hitung channel aktif

  int activeChannels = 0;

  for (int i = 0; i < 64; i++) {

    if (channels[i].active) activeChannels++;

  }

  

  lcd.clear();

  lcd.setCursor(0, 0);

  lcd.print("Active: ");

  lcd.print(activeChannels);

  

  lcd.setCursor(0, 1);

  lcd.print("FIFO: ");

  lcd.print(fifoCount);

}


// Setup Web Server

void setupWebServer() {

  server.on("/", HTTP_GET, []() {

    String html = "<html><head><title>ESP32 Multiplexer Monitor</title>";

    html += "<style>table {border-collapse: collapse;} th, td {border: 1px solid #ddd; padding: 8px;}</style>";

    html += "</head><body>";

    html += "<h1>Active Channels</h1>";

    html += "<table><tr><th>ID</th><th>Name</th><th>Value</th><th>Active</th><th>Timestamp</th></tr>";

    

    for (int i = 0; i < fifoCount; i++) {

      html += "<tr>";

      html += "<td>" + String(fifo[i].id) + "</td>";

      html += "<td>" + fifo[i].name + "</td>";

      html += "<td>" + String(fifo[i].value) + "</td>";

      html += "<td>" + String(fifo[i].active ? "Yes" : "No") + "</td>";

      html += "<td>" + String(fifo[i].timestamp) + "</td>";

      html += "</tr>";

    }

    

    html += "</table>";

    html += "<h2>Upload New channels.csv</h2>";

    html += "<form method='POST' action='/upload' enctype='multipart/form-data'>";

    html += "<input type='file' name='csvfile' accept='.csv'>";

    html += "<input type='submit' value='Upload'>";

    html += "</form>";

    html += "<h2>Download Current channels.csv</h2>";

    html += "<a href='/download'>Download channels.csv</a>";

    html += "</body></html>";

    

    server.send(200, "text/html", html);

  });

  

  server.on("/download", HTTP_GET, []() {

    File file = SD.open("/channels.csv");

    if (file) {

      server.sendHeader("Content-Type", "text/csv");

      server.sendHeader("Content-Disposition", "attachment; filename=channels.csv");

      server.streamFile(file, "text/csv");

      file.close();

    } else {

      server.send(404, "text/plain", "File not found");

    }

  });

  

  server.on("/upload", HTTP_POST, []() {

    server.send(200, "text/plain", "Upload complete. Please restart the device.");

  }, []() {

    HTTPUpload& upload = server.upload();

    if (upload.status == UPLOAD_FILE_START) {

      SD.remove("/channels.csv");

      File file = SD.open("/channels.csv", FILE_WRITE);

      file.close();

    } else if (upload.status == UPLOAD_FILE_WRITE) {

      File file = SD.open("/channels.csv", FILE_APPEND);

      if (file) {

        file.write(upload.buf, upload.currentSize);

        file.close();

      }

    } else if (upload.status == UPLOAD_FILE_END) {

      // Validasi format file

      if (!validateCsvFormat()) {

        SD.remove("/channels.csv");

        server.send(400, "text/plain", "Invalid CSV format");

      }

    }

  });

  

  server.begin();

}


// Validasi format CSV

bool validateCsvFormat() {

  File file = SD.open("/channels.csv");

  if (!file) return false;

  

  bool valid = true;

  int lineCount = 0;

  

  while (file.available() && valid) {

    String line = file.readStringUntil('\n');

    line.trim();

    

    if (line.length() > 0) {

      int commaPos = line.indexOf(',');

      if (commaPos == -1) {

        valid = false;

        break;

      }

      

      String idStr = line.substring(0, commaPos);

      int id = idStr.toInt();

      if (id < 0 || id >= 64) {

        valid = false;

        break;

      }

      

      lineCount++;

    }

  }

  

  file.close();

  return valid && (lineCount == 64);

}


// Debug: Print konfigurasi sistem

void printSystemConfig() {

  Serial.println("System Configuration:");

  Serial.println("---------------------");

  Serial.println("Multiplexer Pins:");

  Serial.print("S0-S3: "); Serial.print(MUX_S0); Serial.print(", "); Serial.print(MUX_S1);

  Serial.print(", "); Serial.print(MUX_S2); Serial.print(", "); Serial.println(MUX_S3);

  Serial.print("SIG: "); Serial.println(MUX_SIG);

  Serial.print("SD CS: "); Serial.println(SD_CS);

  Serial.print("LCD Address: 0x"); Serial.println(LCD_ADDRESS, HEX);

  Serial.print("Active Threshold: "); Serial.println(ACTIVE_THRESHOLD);

  Serial.print("Max FIFO Entries: "); Serial.println(MAX_FIFO_ENTRIES);

  Serial.println("---------------------");

}


// Kirim data FIFO ke Serial Monitor

void sendFifoToSerial() {

  Serial.println("Current FIFO Contents:");

  Serial.println("ID\tName\t\tValue\tActive\tTimestamp");

  Serial.println("-----------------------------------------------");

  

  for (int i = 0; i < fifoCount; i++) {

    Serial.print(fifo[i].id); Serial.print("\t");

    Serial.print(fifo[i].name); 

    if (fifo[i].name.length() < 8) Serial.print("\t");

    Serial.print("\t");

    Serial.print(fifo[i].value); Serial.print("\t");

    Serial.print(fifo[i].active ? "Yes" : "No"); Serial.print("\t");

    Serial.println(fifo[i].timestamp);

  }

  

  Serial.println("-----------------------------------------------");

}

```


## Penjelasan Program:


1. **Konfigurasi Hardware**:

   - Menggunakan 4 pin kontrol (S0-S3) untuk multiplexer CD74HC4067

   - Pin GPIO36 (MUX_SIG) untuk membaca sinyal analog

   - SD card dihubungkan via SPI dengan CS pin GPIO5

   - LCD I2C di alamat 0x27 dengan ukuran 16x2


2. **FIFO (Antrian Data Channel Aktif)**:

   - Menyimpan hingga 10 entri (MAX_FIFO_ENTRIES)

   - Setiap entri berisi: ID, nama, nilai, status aktif, dan timestamp

   - Hanya menyimpan channel dengan nilai > ACTIVE_THRESHOLD (2000)

   - Menghapus entri saat channel tidak aktif lagi

   - Mengurutkan berdasarkan timestamp (fungsi sortFifoByTimestamp)


3. **Web Interface**:

   - Menampilkan tabel channel aktif di root path ("/")

   - Memungkinkan upload file CSV baru via form POST

   - Menyediakan link untuk download file channels.csv saat ini

   - Validasi format CSV saat upload (fungsi validateCsvFormat)


4. **Pembacaan MUX & Channel**:

   - Membaca semua 64 channel secara berurutan (fungsi readAllChannels)

   - Menggunakan threshold 2000 (ACTIVE_THRESHOLD) untuk deteksi aktif

   - Nama channel dimuat dari file channels.csv di SD card (fungsi loadChannelNames)


5. **LCD Display**:

   - Baris pertama menampilkan jumlah channel aktif

   - Baris kedua menampilkan jumlah data di FIFO

   - Diupdate setiap 1 detik (fungsi updateLcd)


6. **Fungsi Tambahan**:

   - `printSystemConfig()` untuk debugging konfigurasi sistem

   - `sendFifoToSerial()` untuk mengirim data FIFO ke serial monitor (dipicu dengan mengirim 'f' ke serial)

   - Validasi format CSV saat upload


## Instruksi Penggunaan:


1. Buat file channels.csv di SD card dengan format:

   ```

   0,Channel 1

   1,Channel 2

   ...

   63,Channel 64

   ```


2. Upload program ke ESP32


3. Hubungkan hardware sesuai konfigurasi pin


4. Akses antarmuka web melalui IP yang ditampilkan di LCD


5. Untuk debugging, buka Serial Monitor dan ketik 'f' untuk melihat isi FIFO


Program ini akan secara otomatis mendeteksi channel aktif, menyimpannya dalam FIFO, dan menampilkannya di LCD serta antarmuka web. 

Pi Coin

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


### 1. **Apa Itu Pi Network?**

   - **Peluncuran**: Pi Network diluncurkan pada Maret 2019.

   - **Tujuan**: Menciptakan sistem mata uang digital yang dapat diakses oleh siapa saja, terutama yang tidak memiliki akses ke perangkat keras yang mahal untuk menambang.


### 2. **Cara Kerja**

   - **Model Konsensus**: Menggunakan model konsensus yang dikenal sebagai **Stellar Consensus Protocol (SCP)**, yang memungkinkan pengguna untuk memvalidasi transaksi tanpa memerlukan energi besar seperti di jaringan Bitcoin.

   - **Menambang**: Pengguna dapat "menambang" Pi Coin melalui aplikasi seluler tanpa menggunakan daya komputasi yang intensif. Proses ini melibatkan konfirmasi identitas dan interaksi dengan pengguna lain.


### 3. **Koin dan Ekonomi**

   - **Pasokan Terbatas**: Total pasokan Pi Coin akan dibatasi, meskipun jumlah pastinya belum diumumkan secara resmi.

   - **Distribusi**: Koin didistribusikan kepada pengguna berdasarkan partisipasi dalam jaringan dan aktivitas mereka.


### 4. **Status Saat Ini**

   - **Belum Terdaftar di Bursa**: Hingga saat ini, Pi Coin belum terdaftar di bursa cryptocurrency besar, sehingga nilai pasarnya belum ditentukan secara resmi.

   - **Mainnet**: Peluncuran mainnet (jaringan utama) masih ditunggu, di mana pengguna akan dapat melakukan transaksi nyata dengan Pi Coin.


### 5. **Komunitas dan Adopsi**

   - **Komunitas Aktif**: Pi Network memiliki komunitas besar di seluruh dunia, dengan banyak pengguna aktif dalam menambang dan mempromosikan proyek ini.

   - **Rencana Masa Depan**: Pengembang berencana untuk meningkatkan adopsi dan kegunaan Pi Coin melalui berbagai aplikasi di ekosistem mereka.


### 6. **Risiko dan Pertimbangan**

   - **Volatilitas**: Seperti cryptocurrency lainnya, nilai Pi Coin akan sangat fluktuatif setelah diluncurkan.

   - **Regulasi**: Masa depan proyek ini juga akan dipengaruhi oleh regulasi di berbagai negara.

Tentu! Berikut adalah beberapa aspek tambahan yang lebih spesifik tentang Pi Coin:


### 7. **Fitur Utama**

   - **Aksesibilitas**: Pi Coin dirancang untuk bisa diakses oleh siapa saja dengan smartphone, tanpa memerlukan perangkat keras yang mahal.

   - **Keamanan**: Menggunakan mekanisme keamanan yang memanfaatkan jaringan pengguna untuk memverifikasi transaksi, mengurangi risiko serangan.


### 8. **Proses Menambang**

   - **Penggunaan Aplikasi**: Pengguna harus mengunduh aplikasi Pi Network di smartphone mereka dan memulai sesi penambangan setiap 24 jam.

   - **Kontribusi Sosial**: Selain menambang, pengguna juga dapat meningkatkan kekuatan penambangan mereka dengan mengundang orang lain untuk bergabung.


### 9. **Roadmap dan Pengembangan**

   - **Tahap Pengembangan**: Pi Network telah melalui beberapa tahap, termasuk fase penambangan, pengujian jaringan, dan rencana untuk peluncuran mainnet.

   - **Fokus pada Kegunaan**: Tim pengembang berencana untuk menciptakan aplikasi yang memanfaatkan Pi Coin, seperti platform e-commerce dan layanan pembayaran.


### 10. **Kritik dan Kontroversi**

   - **Skeptisisme**: Beberapa pihak skeptis terhadap model bisnis Pi Network, terutama karena belum adanya nilai pasar yang ditentukan.

   - **Perbandingan dengan Proyek Lain**: Pi Coin sering dibandingkan dengan proyek cryptocurrency lainnya yang lebih mapan, dan ada pertanyaan mengenai keberlanjutan jangka panjangnya.


### 11. **Mekanisme Penghargaan**

   - **Keterlibatan Pengguna**: Pengguna yang aktif dan terlibat dalam komunitas dapat mendapatkan lebih banyak koin, menciptakan insentif untuk partisipasi.

   - **Pembangunan Jaringan**: Pengguna juga dapat menambah kekuatan penambangan mereka dengan mengundang pengguna baru ke dalam jaringan.


### 12. **Masa Depan**

   - **Potensi Pertumbuhan**: Jika Pi Coin berhasil menarik pengguna dan membangun ekosistem yang kuat, ada potensi pertumbuhan nilai yang signifikan.

   - **Pentingnya Adopsi**: Keberhasilan Pi Coin sangat tergantung pada seberapa banyak orang yang mau menggunakan dan memperdagangkan koin ini setelah peluncuran mainnet.


### 13. **Sumber Daya Tambahan**

   - **Dokumen Putih**: Untuk informasi teknis lebih lanjut, pengguna dapat membaca whitepaper resmi dari Pi Network.

   - **Forum Komunitas**: Bergabung dengan forum seperti Reddit atau grup Telegram untuk diskusi dan informasi terbaru.



Mengubah air menjadi bahan bakar kendaraan bermotor

Mengubah air menjadi bahan bakar kendaraan bermotor secara langsung tidaklah praktis dengan teknologi yang ada saat ini. Namun, ada teknologi yang bisa memanfaatkan air untuk menghasilkan hidrogen, yang kemudian bisa digunakan sebagai bahan bakar. Berikut ini adalah penjelasan sederhana tentang bagaimana hidrogen bisa dihasilkan dari air dan digunakan sebagai bahan bakar untuk kendaraan bermotor:

Langkah-Langkah Menghasilkan Hidrogen dari Air

  1. Elektrolisis Air:

    • Prinsip Kerja: Elektrolisis adalah proses memecah air (H₂O) menjadi hidrogen (H₂) dan oksigen (O₂) dengan menggunakan arus listrik.
    • Alat dan Bahan:
      • Sumber daya listrik (baterai atau power supply DC)
      • Air murni atau air dengan sedikit elektrolit (seperti garam meja atau baking soda)
      • Elektroda (bahan yang paling umum adalah platina, grafit, atau stainless steel)
      • Wadah (seperti gelas atau botol plastik bening)
      • Kabel dan penjepit buaya
    • Proses:
      1. Isi wadah dengan air dan tambahkan sedikit elektrolit.
      2. Masukkan elektroda ke dalam air dan sambungkan ke sumber daya listrik.
      3. Hidrogen akan terbentuk di elektroda negatif (katoda) dan oksigen di elektroda positif (anoda).
  2. Penyimpanan Hidrogen:

    • Hidrogen yang dihasilkan harus disimpan dalam tangki yang aman. Tangki hidrogen biasanya terbuat dari bahan yang tahan tekanan tinggi seperti komposit karbon atau baja.

Menggunakan Hidrogen sebagai Bahan Bakar

  1. Fuel Cell:

    • Hidrogen dapat digunakan dalam sel bahan bakar (fuel cell) untuk menghasilkan listrik yang kemudian menggerakkan motor listrik kendaraan.
    • Prinsip Kerja:
      • Sel bahan bakar menggabungkan hidrogen dengan oksigen dari udara untuk menghasilkan listrik, air, dan panas.
      • Reaksi di anoda: 2H24H++4e2H_2 \rightarrow 4H^+ + 4e^-
      • Reaksi di katoda: O2+4H++4e2H2OO_2 + 4H^+ + 4e^- \rightarrow 2H_2O
      • Total reaksi: 2H2+O22H2O2H_2 + O_2 \rightarrow 2H_2O
  2. Mesin Pembakaran Internal:

    • Hidrogen juga dapat digunakan langsung dalam mesin pembakaran internal yang telah dimodifikasi untuk membakar hidrogen.
    • Prinsip Kerja:
      • Mesin pembakaran internal menggunakan hidrogen sebagai bahan bakar, mirip dengan cara kerja mesin bensin.
      • Pembakaran hidrogen menghasilkan air sebagai produk sampingan utama.

Proses Membuat Hidrogen dengan Cara Sederhana

Berikut adalah panduan sederhana untuk menghasilkan hidrogen melalui elektrolisis:

Alat dan Bahan yang Dibutuhkan:

  • Baterai 12V atau power supply DC
  • Dua elektroda (grafit atau stainless steel)
  • Wadah bening (gelas atau botol plastik)
  • Air dengan sedikit garam atau baking soda sebagai elektrolit
  • Kabel dengan penjepit buaya

Langkah-langkah:

  1. Siapkan Wadah dan Larutan Elektrolit:

    • Isi wadah dengan air dan tambahkan sedikit garam atau baking soda untuk meningkatkan konduktivitas listrik.
  2. Pasang Elektroda:

    • Masukkan elektroda ke dalam wadah berisi air, pastikan elektroda tidak saling bersentuhan.
  3. Hubungkan Sumber Daya Listrik:

    • Sambungkan elektroda ke baterai atau power supply menggunakan kabel dan penjepit buaya.
  4. Mulai Proses Elektrolisis:

    • Nyalakan sumber daya listrik. Anda akan melihat gelembung gas mulai terbentuk di sekitar elektroda. Hidrogen akan terbentuk di elektroda negatif (katoda) dan oksigen di elektroda positif (anoda).
  5. Kumpulkan Hidrogen:

    • Gunakan alat pengumpul gas atau wadah terbalik berisi air untuk menangkap gas hidrogen yang dihasilkan. Pastikan untuk menangani gas hidrogen dengan hati-hati karena mudah terbakar.

Keselamatan dan Tips

  • Keselamatan Listrik: Selalu berhati-hati saat bekerja dengan listrik. Gunakan tegangan rendah untuk menghindari risiko sengatan listrik.
  • Keselamatan Bahan Kimia: Pastikan area kerja memiliki ventilasi yang baik untuk menghindari penumpukan gas hidrogen dan oksigen yang mudah terbakar.
  • Penyimpanan Hidrogen: Hidrogen harus disimpan dalam tangki yang aman dan dirancang untuk menahan tekanan tinggi.

Kesimpulan

Proses menghasilkan hidrogen dari air melalui elektrolisis adalah langkah pertama dalam menggunakan air sebagai sumber bahan bakar. Hidrogen yang dihasilkan dapat digunakan dalam sel bahan bakar untuk menggerakkan kendaraan listrik atau dalam mesin pembakaran internal yang dimodifikasi. Meskipun ini adalah konsep yang menarik dan ramah lingkungan, perlu diingat bahwa teknologi ini masih dalam tahap pengembangan dan memerlukan penanganan yang hati-hati dan aman.


Semoga panduan ini memberikan wawasan yang jelas tentang cara sederhana menghasilkan hidrogen dari air dan penggunaannya sebagai bahan bakar kendaraan bermotor.

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.

Program ESP32 untuk Multiplexer 64 Channel dengan FIFO dan Web Interface

Program ESP32  untuk Multiplexer 64 Channel dengan FIFO dan Web Interface + LCD: ```cpp #include <Wire.h> #include <LiquidCrystal_I...