HOWTO · Arduino
Espera de entrada de Arduino
Se puede configurar el Arduino para que espere la entrada usando la función Serial.available() y la función digitalRead().
En esta página
Elige la fuente de entrada que corresponda a la señal: usa la entrada serie para recibir bytes enviados desde una computadora u otro dispositivo, digitalRead() para leer un pin con dos estados, como el de un botón, y analogRead() para comparar la lectura de un sensor con un umbral. Los sketches de Arduino que aparecen a continuación usan la API estándar de Arduino. Los programas de prueba portables en C++ usan sustitutos deterministas del hardware de la placa para que puedas compilar y seguir la lógica de manejo de entradas sin una placa Arduino; no prueban el comportamiento eléctrico.
Elige la fuente de entrada: serie, digital o analógica
Usa la entrada serie cuando un dispositivo host envíe caracteres o comandos por USB o una conexión UART. Usa un pin digital cuando la señal tenga dos estados. Usa una entrada analógica cuando el sensor produzca un voltaje variable que debas muestrear y comparar. Elige el pin de entrada y la configuración eléctrica adecuados para tu placa y sensor; los ejemplos usan el pin 2 para un botón y A0 para un sensor analógico.
Espera datos serie con Serial.available()
Serial.available() indica cuántos bytes esperan en el búfer de recepción. Comprueba este valor antes de llamar a Serial.read() para que el sketch no intente leer cuando no haya ningún byte disponible. Este ejemplo consume y repite un byte cada vez, lo cual sirve para un comando sencillo de un carácter. No ensambla una línea completa; para comandos basados en líneas, recopila los bytes hasta recibir un salto de línea y gestiona explícitamente el terminador.
Ejecuta este programa de prueba portable para ver el patrón de manejo de bytes. En un sketch de Arduino, conserva setup() y loop() y usa el objeto Serial de la placa en lugar del pequeño sustituto que se muestra aquí.
#include <iostream>
class SerialPort {
public:
void begin(int) {}
int available() const { return next_ < 1; }
int read() { ++next_; return 65; }
void print(const char* text) { std::cout << text; }
void println(int value) { std::cout << value << '\n'; }
private:
int next_ = 0;
};
SerialPort Serial;
void setup() {
Serial.begin(9600);
}
void loop() {
if (Serial.available() > 0) {
int incomingByte = Serial.read();
Serial.print("Received byte: ");
Serial.println(incomingByte);
}
}
int main() {
setup();
loop();
}
Received byte: 65
Configura el monitor serie o el dispositivo emisor con la misma velocidad en baudios. Como Serial.read() devuelve un valor entero que representa un byte, el ejemplo imprime un informe numérico del byte con etiqueta: la etiqueta «Received byte:» seguida del valor numérico del byte; conviértelo a char si quieres imprimir el carácter correspondiente.
Espera una entrada digital con digitalRead()
La entrada digital se lee desde su pin, no desde el puerto serie. Si conectas un botón entre el pin 2 y tierra, configura INPUT_PULLUP: cuando el botón no está presionado, la lectura es HIGH; cuando está presionado, es LOW. El bucle de abajo espera primero a que se presione y luego a que se suelte el botón. Mientras espera cualquiera de esos cambios, esta espera por sondeo pausa las demás tareas de loop().
Este programa de prueba portable proporciona una secuencia de estados del pin a la misma lógica de espera. En el sketch de Arduino, sustituye las funciones de prueba por las API de la placa pinMode() y digitalRead().
#include <iostream>
const int INPUT_PULLUP = 2;
const int HIGH = 1;
const int LOW = 0;
const int buttonPin = 2;
int pinStates[] = {HIGH, LOW, LOW, HIGH};
int stateIndex = 0;
void pinMode(int, int) {}
int digitalRead(int) { return pinStates[stateIndex++]; }
class SerialPort {
public:
void begin(int) {}
void println(const char* text) { std::cout << text << '\n'; }
};
SerialPort Serial;
void setup() {
pinMode(buttonPin, INPUT_PULLUP);
Serial.begin(9600);
}
void loop() {
while (digitalRead(buttonPin) == HIGH) {
}
Serial.println("Button pressed");
while (digitalRead(buttonPin) == LOW) {
}
}
int main() {
setup();
loop();
}
Button pressed
La resistencia pull-up interna mantiene la entrada en un nivel definido cuando el botón está abierto. Si, en cambio, tu circuito conecta el botón a una alimentación positiva y usa una resistencia pull-down externa, utiliza INPUT y comprueba si la lectura es HIGH cuando se presiona. Ajusta la polaridad del código al circuito para evitar una entrada flotante o una respuesta invertida.
Espera a que se alcance un umbral analógico con analogRead()
analogRead() muestrea el voltaje de un pin analógico y devuelve una lectura numérica. Compara esa lectura con un umbral elegido para tu sensor y placa. Este sketch informa cuando una lectura muestreada supera el umbral, incluso en la primera iteración si ya se cumple esa condición. Después de informarlo, espera hasta que una lectura posterior sea igual o inferior al umbral para poder informar de nuevo.
Este programa de prueba portable proporciona dos lecturas: una por encima del umbral y la siguiente igual o inferior a este. En la placa, el núcleo de Arduino proporciona A0 y analogRead(); los pines disponibles y el rango de lectura dependen de la placa.
#include <iostream>
const int A0 = 0;
const int sensorPin = A0;
const int threshold = 500;
int readings[] = {600, 450};
int readingIndex = 0;
int analogRead(int) { return readings[readingIndex++]; }
class SerialPort {
public:
void begin(int) {}
void println(const char* text) { std::cout << text << '\n'; }
};
SerialPort Serial;
void setup() {
Serial.begin(9600);
}
void loop() {
int sensorValue = analogRead(sensorPin);
if (sensorValue > threshold) {
Serial.println("Threshold exceeded");
while (analogRead(sensorPin) > threshold) {
}
}
}
int main() {
setup();
loop();
}
Threshold exceeded
El rango numérico y el voltaje que representa analogRead() dependen de la placa. Consulta su documentación y calibra threshold según las lecturas del sensor. Esto consiste en muestrear y comparar repetidamente; no es una espera de bytes serie.
Evita bloquear el resto del sketch
Un bucle while ajustado comprueba la entrada una y otra vez, pero impide que se ejecute el resto de loop() hasta que cambie la condición. Esto resulta útil si el sketch debe detenerse en ese punto, pero retrasa otras tareas, como actualizar una pantalla o comprobar otra entrada. Si el sketch debe seguir trabajando, comprueba la entrada una vez en cada iteración y guarda su estado en lugar de esperar dentro de un bucle. Por ejemplo, usa if (Serial.available() > 0) para procesar los bytes disponibles y continuar con el resto de loop().
Si el sketch parece no responder, comprueba que el pin elegido coincida con el cableado, que la entrada digital tenga un nivel definido, que el dispositivo emisor serie use la velocidad en baudios configurada y que el umbral analógico corresponda al rango de lectura de la placa. Una espera bloqueante tampoco terminará hasta que cambie el estado que se está comprobando.