#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
#define SCREEN_ADDRESS 0x3C
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
const int basePin = 32; // Conectar la base del transistor al pin GPIO 32
const int collectorPin = 33; // Conectar el colector del transistor al pin GPIO 33
const int emitterPin = 34; // Conectar el emisor del transistor al pin GPIO 34
const int capacitorPin = 35; // Conectar el capacitor al pin GPIO 35
void setup() {
Serial.begin(9600);
if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;);
}
display.display();
delay(2000);
display.clearDisplay();
pinMode(basePin, OUTPUT);
pinMode(collectorPin, INPUT);
pinMode(emitterPin, INPUT);
pinMode(capacitorPin, OUTPUT);
}
void loop() {
displayMenu();
delay(2000);
}
void displayMenu() {
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0,0);
display.println("1. Medir Transistor");
display.println("2. Medir Capacitor");
display.display();
// Esperar a que el usuario seleccione una opción
while(true) {
if(Serial.available() > 0) {
char option = Serial.read();
if(option == '1') {
measureTransistor();
break;
} else if(option == '2') {
measureCapacitor();
break;
}
}
}
}
void measureTransistor() {
// Establecer el pin de la base a LOW para descartar cualquier carga previa
digitalWrite(basePin, LOW);
delay(10);
// Establecer el pin de la base a HIGH y medir la corriente de colector y emisor
digitalWrite(basePin, HIGH);
delay(100); // Esperar a que el transistor se cargue completamente
float collectorCurrent = analogRead(collectorPin) * (5.0 / 4095.0);
float emitterCurrent = analogRead(emitterPin) * (5.0 / 4095.0);
// Calcular hFE (ganancia del transistor)
float hFE = collectorCurrent / emitterCurrent;
// Detectar la polaridad del transistor
String polarity;
if (hFE < 1) {
polarity = "NPN";
} else {
polarity = "PNP";
}
// Mostrar resultados en la pantalla OLED
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0,0);
display.println("Medir Transistor");
display.setTextSize(2);
display.setCursor(0,10);
display.print("Tipo: ");
display.println(polarity);
display.print("hFE: ");
display.println(hFE);
display.display();
}
void measureCapacitor() {
// Descarga el capacitor
digitalWrite(capacitorPin, LOW);
delay(10);
// Carga el capacitor
pinMode(capacitorPin, INPUT);
unsigned long startTime = millis();
while(digitalRead(capacitorPin) == LOW) {
if(millis() - startTime > 5000) {
// Si el capacitor no se carga después de 5 segundos, muestra un mensaje de error y sale de la función
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0,0);
display.println("Error: El capacitor no se carga");
display.display();
return;
}
}
// Medir el tiempo de carga del capacitor
unsigned long capacitanceTime = millis() - startTime;
// Calcular el valor del capacitor en microfaradios (uF)
// El tiempo de carga es proporcional a la capacitancia del capacitor
// Puedes calibrar esta ecuación según la constante de tiempo de tu circuito
float capacitanceUF = capacitanceTime / 1000.0; // Por ejemplo, si la constante de tiempo es 1ms/uF
// Mostrar resultados en la pantalla OLED
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0,0);
display.println("Medir Capacitor");
display.setTextSize(2);
display.setCursor(0,10);
display.print("Capacidad: ");
display.print(capacitanceUF);
display.println(" uF");
display.display();
}