Internet de las Cosas - IoT
title: Internet de las Cosas - IoT author: Luis Ferreira Gordillo publish: 28 de abril de 2025
#iot #prog #curso24_25 #ssii
Acercamiento al internet de las cosas mediante Arduino.
Preparación
Antes del taller debes revisar la siguiente documentación que utilizaremos en el taller.
NO podrá participar en el taller el alumnado que no se haya visto la documentación de forma previa.
Hardware
El hardware empleado para el taller son las placas compatibles con Arduino Uno de Keyestudio.
Firmware
Blink
Cargar programa con: Archivo - Ejemplos - 01.Basics - Blink
Depuración básica. Blink mejorado
Dado que la placa Arduino Uno no tiene soporte directo para depuración, utilizaremos la UART interna para facilitar la programación mediante envío de mensajes utilizando el monitor serie:
//------------------------
// Macros
//------------------------
#define DEBUGMSG(X) \
Serial.print("DEBUG: "); \
Serial.print(__PRETTY_FUNCTION__); \
Serial.print(' '); \
Serial.print(__FILE__); \
Serial.print(':'); \
Serial.print(__LINE__); \
Serial.print(' '); \
Serial.println(X);
//------------------------
// Constantes del sistema
//------------------------
// Pin a utiliar
// Pasos de incremento y periodo total
//------------------------
// Variables globales
//------------------------
// Tiempo up
// ¿Cada vez más tiempo en Up?
//------------------------
// Configuración del sistema
//------------------------
void setup() {
// Pin de salida
// Config puerto (hay versión ampliada)
9600);
Serial.begin(// Esperar a que esté disponible. El puerto es lento, mejor esperarlo si es algo crítico.
while (!Serial) {
// wait for serial port to connect. Needed for native USB
;
}
}
//------------------------
// Programa principal
//------------------------
// A lo main() de Java, pero dentro de un bucle infinito
void loop() {
/* En cada ciclo debe estar un tiempo apagado y otro encendido. Dichos tiempos deben sumar el periodo.
Además, en cada ciclo, el tiempo encendido deber ir incrementándose hasta llegar al periodo, y luego irá decrementando, hasta llegar al paso mínimo.
Para facilitar el desarrollo, puedes emplear la función de depuración
debugger(__PRETTY_FUNCTION__, __FILE__, __LINE__, tiempoUp) o la macro DEBUGMSG(X)
*/
}
//------------------------
// Funciones
//------------------------
// Mensajes de depuración con funciones
void debugger(String FUNCION, String FILE, int LINEA, int VALOR){
"DEBUG: ");
Serial.print(
Serial.print(FUNCION); ' ');
Serial.print(FILE);
Serial.print(':');
Serial.print(
Serial.print(LINEA); ' ');
Serial.print(
Serial.println(VALOR); }
Comunicaciones por UART
Dev2Dev
Dev2PC
Necesitamos un arduino y un conversor USB - UART.
Partiendo del programa blink mejorado, añadiremos que nuestro Arduino escuche en el puerto UART y pare en caso de recibir el comando “stop” y se reactive si recibe “start”.
Firmware del Arduino:
//------------------------
// Constantes del sistema
//------------------------
// Comandos
const String STOP = String("stop");
const String START = String("start");
// Pin a utiliar
// Pasos de incremento y periodo total
//------------------------
// Variables globales
//------------------------
//------------------------
// Configuración del sistema
//------------------------
void setup() {
// Aquí config
}
}
//------------------------
// Programa principal
//------------------------
// A lo main() de Java, pero dentro de un bucle infinito
void loop() {
// Zona blink
// Zona comunicaciones
"";
String request = // Mientras haya datos disponibles leerlos y guardarlos en variable
while(Serial.available()) {
request += Serial.readString();
}
// Zona de control
if ( request == STOP ) {
false;
habilitado = "Debemos parar");
DEBUGMSG(else if ( request == START ) {
} true;
habilitado = "Debemos reemprender");
DEBUGMSG(else if ( request.length() != 0 ){
} "Otro COMANDO:"+request+"-"+request.length());
DEBUGMSG(
} }
Programa PC:
package uart;
import com.fazecast.jSerialComm.SerialPort;
import java.util.Arrays;
import java.util.Scanner;
public class ConexionUART{
// Puerto UART de la placa
private static final String PORT = "ttyUSB0";
public static void main(String[] args) {
new ConexionUART();
ConexionUART conexionUART = start();
conexionUART.
}
private void start(){
// Capturamos los puertos UART disponibles
getCommPorts();
SerialPort[] puertos = SerialPort.System.out.println("Lista de puertos:
" + Arrays.toString(puertos) );
// Buscamos el puerto UART deseado (el ttyUSB0)
null;
SerialPort uart = for (SerialPort puerto : puertos) {
String descripcionDelPuerto = String.format("%s, %s, %s, %s", puerto.getSystemPortName(), puerto.getPortDescription(), puerto.getSystemPortName(), puerto.getManufacturer());
System.out.println(descripcionDelPuerto);
if (puerto.getSystemPortName().equals(PORT)) {
uart = puerto;
}
}
// Si existe el puerto UART deseado, y podemos abrirlo
if ( uart != null && uart.openPort() ){
String comando;
do {
// Capturamos comando y enviamos
System.out.println("Envía comando 'start/stop' para iniciar/detener:");
Scanner sc = new Scanner(System.in);
nextLine();
comando = sc.// Salir del programa
if (comando.equals("quit")) { break; }
writeBytes(comando.getBytes(), comando.length());
uart.
while ( ! comando.equals("quit") );
} closePort();
uart.
}
} }
Dependencias pom.xml:
<dependency>
<groupId>com.fazecast</groupId>
<artifactId>jSerialComm</artifactId>
<version>[2.0.0,3.0.0)</version>
</dependency>