#define Println(a) Serial.println(a);
#define Print(a) Serial.print(a);
const int numElementos = 11; // Número de elementos en el arreglo
String frecuency = "12345678.12";
// Definir los pines de los canales A y B del encoder
const int pinA = 2;
const int pinB = 3;
const int pinButton = 4; // Pin para el botón (si existe)
int estadoAAnterior = LOW; // Estado anterior del canal A
int contador = 0; // Contador del encoder, declarado globalmente
String contadorString = "000"; // String para almacenar el valor del contador
int indicesACambiar[3] = {0, 1, 2};
void cambiarElementos(String& arreglo, int* indices, String& nuevosValores, int numCambios=3) {
for (int i = 0; i < numCambios; i++) {
int indice = indices[i];
if (indice >= 0 && indice < numElementos) {
arreglo[indice] = nuevosValores[i];
} else {
Print("Índice fuera de rango: ");
Println(indice);
}
}
}
void setup() {
Serial.begin(9600);
pinMode(pinA, INPUT);
pinMode(pinB, INPUT);
pinMode(pinButton, INPUT_PULLUP); // Botón con resistencia pull-up interna
// Mostrar el valor inicial del contador
actualizarDisplay(contador);
// ---------------------
// Mostrar el arreglo antes de cambiar elementos
// Println("Arreglo antes del cambio:");
// Println(frecuency);
// Indices de los elementos a cambiar y sus nuevos valores
; // Indices de los elementos a cambiar
// String nuevosValores = "111"; // Nuevos valores para esos elementos
// // Cambiar los valores de los elementos especificados
// cambiarElementos(frecuency, indicesACambiar, nuevosValores);
// // Mostrar el arreglo después de cambiar los elementos
// Println("Arreglo después del cambio:");
// Println(frecuency);
// float realFrecuency = convertToFloat(frecuency);
// realFrecuency++;
// Println(realFrecuency);
}
void loop() {
contador = manejarEncoder(contador);
contadorString = convertToString(contador);
cambiarElementos(frecuency, indicesACambiar, contadorString);
// Resetear el contador si se pulsa el botón
if (digitalRead(pinButton) == LOW) {
contador = 0;
actualizarDisplay(contador);
delay(500); // Antirrebote para el botón
}
}
float convertToFloat(String str) {
return str.toFloat();
}
String convertToString(int num) {
if (num >= 0 && num <= 9) {
return "00" + String(num);
} else if (num >= 10 && num <= 99) {
return "0" + String(num);
} else {
return String(num);
}
}
int manejarEncoder(int contador) {
int estadoA = digitalRead(pinA);
// Detectar cambio de estado en el canal A
if (estadoA != estadoAAnterior && estadoA == HIGH) {
if (digitalRead(pinB) != estadoA) {
// El canal B está en estado alto -> incremento del contador
contador++;
} else {
// El canal B está en estado bajo -> decremento del contador
contador--;
}
// Limitar el contador a valores entre 0 y 999
if (contador > 999) {
contador = 0;
} else if (contador < 0) {
contador = 999;
}
// Actualizar el display con el nuevo valor del contador
actualizarDisplay(contador);
Println(frecuency);
}
// Actualizar el estado anterior del canal A
estadoAAnterior = estadoA;
return contador;
}
void actualizarDisplay(int valor) {
// Función para actualizar el display (puede ser una pantalla LCD, un display de 7 segmentos, etc.)
// En este ejemplo, simplemente imprimimos el valor por el puerto serial
Serial.print("Contador: ");
Serial.println(valor);
}