#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <math.h>
// Define the OLED display dimensions
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
// Create an instance of the OLED display
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1); // -1 for no reset pin
// Definición de botones
const int buttonNext = 3; // Botón para avanzar en la selección de color
const int buttonSelect = 4; // Botón para seleccionar el color
const int buttonReset = 5; // Botón para resetear
// Colores de las bandas de resistencias
const char* colors[] = {"Negro", "Marron", "Rojo", "Naranja", "Amarillo", "Verde", "Azul", "Violeta", "Gris", "Blanco"};
const char* toleranceColors[] = {"Dorado", "Plateado"};
int selectedColors[4] = {-1, -1, -1, -1}; // Arreglo para guardar los colores seleccionados
int currentColorIndex = 0; // Índice del color actual
int currentBand = 0; // Banda actual
bool started = false; // Estado inicial
void setup() {
// Initialize the display
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Default I2C address for the OLED
Serial.println(F("SSD1306 allocation failed"));
for(;;); // No continuar si la pantalla no se inicializa
}
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
pinMode(buttonNext, INPUT_PULLUP);
pinMode(buttonSelect, INPUT_PULLUP);
pinMode(buttonReset, INPUT_PULLUP);
display.setCursor(0, 0);
display.print("CALCULADORA DE");
display.setCursor(0, 10);
display.print("RESISTENCIA");
display.display();
delay(2000); // Mostrar mensaje por 2 segundos
display.clearDisplay();
display.setCursor(0, 0);
display.print("SELECCIONE UN");
display.setCursor(0, 10);
display.print("COLOR:");
display.display();
}
void loop() {
// Iniciar la selección al presionar cualquier botón
if (!started && (digitalRead(buttonNext) == LOW || digitalRead(buttonSelect) == LOW || digitalRead(buttonReset) == LOW)) {
started = true;
currentBand = 0; // Reiniciar la banda actual
currentColorIndex = 0; // Reiniciar el índice de color
display.clearDisplay(); // Borrar el mensaje inicial
displayCurrentColor();
delay(200); // Debounce
}
// Verificar el botón de selección de color
if (started && digitalRead(buttonNext) == LOW) {
if (currentBand < 3) {
currentColorIndex = (currentColorIndex + 1) % 10; // Avanza al siguiente color (colores normales)
} else {
currentColorIndex = (currentColorIndex + 1) % 2; // Solo oro y plata
}
displayCurrentColor();
delay(200); // Debounce
}
// Verificar el botón de selección
if (started && digitalRead(buttonSelect) == LOW) {
if (currentBand < 3) {
selectedColors[currentBand] = currentColorIndex; // Guarda el color seleccionado
} else {
selectedColors[currentBand] = currentColorIndex + 10; // Guarda el color de tolerancia
}
displaySelectedColors();
currentBand++;
if (currentBand < 4) {
currentColorIndex = 0; // Reiniciar el índice de color
displayCurrentColor();
} else {
calculateResistance();
}
delay(200); // Debounce
}
// Verificar el botón de reset
if (digitalRead(buttonReset) == LOW) {
resetSelection(); // Reiniciar inmediatamente
}
}
void displayCurrentColor() {
display.setCursor(0, 10);
display.print(" "); // Limpiar la línea de texto actual
display.setCursor(0, 10);
if (currentBand < 3) {
display.print(colors[currentColorIndex]);
} else {
display.print(toleranceColors[currentColorIndex]);
}
display.display();
}
void displaySelectedColors() {
display.setCursor(0, 0);
display.print(" "); // Limpiar la línea de selección de colores
display.setCursor(0, 0);
for (int i = 0; i <= currentBand; i++) {
if (selectedColors[i] != -1) {
if (i < 3) {
display.print(colors[selectedColors[i]][0]); // Muestra la primera letra
} else {
display.print(toleranceColors[selectedColors[i] - 10][0]); // Muestra la primera letra de oro/plata
}
display.print(" "); // Espacio entre letras
}
}
display.display();
}
void calculateResistance() {
long resistance = 0;
if (selectedColors[0] != -1 && selectedColors[1] != -1 && selectedColors[2] != -1) {
resistance = (selectedColors[0] * 10 + selectedColors[1]) * pow(10, selectedColors[2]);
display.clearDisplay();
display.setCursor(0, 0);
display.print("RESISTENCIA:");
display.setCursor(0, 10);
if (resistance >= 1000000) {
display.print(resistance / 1000000.0);
display.print(" MOhm");
} else if (resistance >= 1000) {
display.print(resistance / 1000.0);
display.print(" KOhm");
} else {
display.print(resistance);
display.print(" Ohm");
}
display.display();
delay(5000); // Mostrar valor por 5 segundos
resetSelection(); // Reiniciar selección después de mostrar
}
}
void resetSelection() {
for (int i = 0; i < 4; i++) {
selectedColors[i] = -1;
}
currentBand = 0;
currentColorIndex = 0;
started = false; // Reiniciar el estado
display.clearDisplay();
display.setCursor(0, 0);
display.print("SELECCIONE UN");
display.setCursor(0, 10);
display.print("COLOR:");
display.display();
}