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:
| Sensor | Pin | Tipo | Intervalo |
|---|---|---|---|
| Potenciómetro | A0 | Analógico | Cada 100 ms |
| LDR | A1 | Analógico | Cada 300 ms |
| Botón | D2 | Digital | Tiempo 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
structpara agrupar pin + intervalo + último tiempo + valor - Combinar con pantallas, EEPROM, o envío por WiFi