Curso C para Arduino

🎯 Objetivo

Leer varios sensores de forma independiente y periódica, sin usar delay(), y procesar los datos por separado.
Esto es útil para estaciones meteorológicas, robots, domótica, sistemas de riego, etc.


🛠️ Ejemplo práctico:

3 sensores (analógicos y digitales) que se leen a distintos intervalos:

SensorPinTipoIntervalo
PotenciómetroA0AnalógicoCada 100 ms
LDRA1AnalógicoCada 300 ms
BotónD2DigitalTiempo real

✅ Código completo comentado

1// Pines
2const int pinPOT = A0;
3const int pinLDR = A1;
4const int pinBOTON = 2;
5
6// Variables de tiempo
7unsigned long tPot = 0;
8unsigned long tLDR = 0;
9const unsigned long intervaloPot = 100;
10const unsigned long intervaloLDR = 300;
11
12// Estado del botón
13bool estadoBotonAnterior = HIGH;
14
15void setup() {
16  Serial.begin(9600);
17  pinMode(pinBOTON, INPUT_PULLUP); // Botón entre pin y GND
18}
19
20void loop() {
21  unsigned long ahora = millis();
22
23  // Lectura periódica del potenciómetro
24  if (ahora - tPot >= intervaloPot) {
25    tPot = ahora;
26    int valorPot = analogRead(pinPOT);
27    Serial.print("Potenciómetro: ");
28    Serial.println(valorPot);
29  }
30
31  // Lectura periódica del sensor de luz (LDR)
32  if (ahora - tLDR >= intervaloLDR) {
33    tLDR = ahora;
34    int valorLDR = analogRead(pinLDR);
35    Serial.print("LDR: ");
36    Serial.println(valorLDR);
37  }
38
39  // Lectura continua del botón (sin temporizador)
40  bool estadoBoton = digitalRead(pinBOTON);
41  if (estadoBoton == LOW && estadoBotonAnterior == HIGH) {
42    Serial.println("¡Botón presionado!");
43    delay(200); // anti-rebote básico
44  }
45  estadoBotonAnterior = estadoBoton;
46}

🧠 ¿Qué estamos practicando?

  • Manejo simultáneo de sensores con millis()
  • Modularidad: cada sensor puede funcionar con su propio intervalo.
  • Lectura no bloqueante
  • Antirrebote básico en el botón

🧪 Variaciones interesantes

1. ¿Y si quiero 10 sensores?

Usa arreglos para los pines, tiempos y lecturas:

1const int sensores[] = {A0, A1, A2, A3};
2unsigned long tiempos[] = {0, 0, 0, 0};
3const unsigned long intervalos[] = {100, 200, 300, 400};
4int valores[4];

Y luego en el loop():

1for (int i = 0; i < 4; i++) {
2  if (millis() - tiempos[i] >= intervalos[i]) {
3    tiempos[i] = millis();
4    valores[i] = analogRead(sensores[i]);
5    Serial.print("Sensor ");
6    Serial.print(i);
7    Serial.print(": ");
8    Serial.println(valores[i]);
9  }
10}

🔍 Mejora opcional: funciones por tarea

Organiza el código en funciones:

1void leerPot() { /* ... */ }
2void leerLDR() { /* ... */ }
3void revisarBoton() { /* ... */ }

Y en loop() llamas a cada una. Esto mejora la modularidad y legibilidad.


🎓 Para seguir aprendiendo

  • Leer sensores digitales (DHT, HC-SR04)
  • Usar struct para agrupar pin + intervalo + último tiempo + valor
  • Combinar con pantallas, EEPROM, o envío por WiFi