#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // Lebar layar OLED (SSD1306)
#define SCREEN_HEIGHT 64 // Tinggi layar OLED (SSD1306)
#define OLED_RESET -1 // Reset pin tidak digunakan dalam kode ini
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
const int analogPin = A0; // Pin input analog
const int chargePin = 7; // Pin output untuk pengisian kapasitor
const int dischargePin = 8; // Pin output untuk pengosongan kapasitor
const int resistorValue = 10000; // Nilai resistor dalam ohm (10k ohm)
void setup() {
// Inisialisasi komunikasi I2C untuk OLED
Wire.begin();
Wire.setClock(400000); // Tingkatkan kecepatan I2C jika diperlukan
// Inisialisasi OLED dengan alamat I2C
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Alamat I2C untuk OLED adalah 0x3C
Serial.println(F("SSD1306 allocation failed"));
for(;;);
}
// Tunggu OLED siap
delay(2000);
// Clear display
display.clearDisplay();
// Tampilkan pesan sambutan
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("Capacitor Meter");
display.display();
pinMode(chargePin, OUTPUT);
pinMode(dischargePin, OUTPUT);
digitalWrite(chargePin, LOW);
digitalWrite(dischargePin, LOW);
Serial.begin(9600);
}
void loop() {
display.clearDisplay();
display.setCursor(0, 0);
display.println("Measuring...");
float capacitance = measureCapacitor();
display.setCursor(0, 1);
display.println("Capacitance:");
display.setCursor(0, 2);
display.print(capacitance, 2);
display.println(" uF");
display.display();
delay(2000); // Tunggu 2 detik sebelum pengukuran berikutnya
}
float measureCapacitor() {
// Discharge kapasitor
pinMode(dischargePin, OUTPUT);
digitalWrite(dischargePin, LOW);
delay(100);
pinMode(dischargePin, INPUT);
// Mulai pengisian kapasitor
unsigned long startTime = millis();
pinMode(chargePin, OUTPUT);
digitalWrite(chargePin, HIGH);
// Tunggu sampai tegangan mencapai 63.2% dari tegangan penuh (sekitar 3.16V untuk 5V)
while (analogRead(analogPin) < (5.0 / 1023.0) * 632) {
// Tunggu sampai kapasitor terisi
}
unsigned long endTime = millis();
unsigned long elapsedTime = endTime - startTime;
// Matikan pengisian kapasitor
digitalWrite(chargePin, LOW);
// Hitung kapasitas
float capacitance = (float)elapsedTime / resistorValue * 1000; // dalam mikrofarad (uF)
return capacitance;
}
/*
Arduino Pin 7 (chargePin) ----|---- 10kΩ Resistor ----|----|----(+) Capacitor
| | |
| | |
GND A0 GND
| | |
| | |
Arduino Pin 8 (dischargePin) ---|---------------------|----|
*/