🐋
Apuntes Sistemas
  • ⚓Presentación
  • 📊Sistemas y Servidores
    • Personalizar el prompt de Windows
    • Utilidad de manejo de apps para Windows
    • PRACTICA: Arranque dual Windows y Ubuntu
    • 🚧SysLinuxOS: el SO para ASIX
    • Comandos Linux
      • PRACTICA - Ejercicio de práctica comandos
      • 🚧Instalación de paquetes
      • Apuntes Linux: blue/red team
      • Ejemplos de bash
      • Listado de comandos de Linux
    • Comandos Windows
      • 🚧Apuntes Powershell
      • Bucles FOR con batch
      • Scripts de práctica de Windows
    • Prácticas con Windows 10
    • Configuración de netplan
    • Terminal shell
      • SSH
      • 🚧Ghostty
      • 🚧Warp: la terminal inteligente
      • tmux: paneles de terminal
      • Tabby: Mejorar terminal
      • Conexión SSH en red NAT con VirtualBox
      • TheFuck!: Corrección de comandos
      • Wave: Mejorar terminal Linux
      • 🚧Registros de sesiones
    • Instalación manual de Wordpress en CDMON
    • 🏗️Proxmox
    • 🚧TrueNAS
    • Docker
      • Instalación de Docker
      • Dockerfiles
      • Volúmenes de docker
      • Deployment web con Docker con ejemplos
        • 🚧PRACTICA: Node.js con docker
      • Docker Compose
        • Ejemplo 1: Implantación de Wordpress
        • Ejemplo 2: Implementación de servidor con Nginx, Flask y mySQL
        • Ejemplo 3: Implantación de onlyoffice
        • 🚧Ejemplo 4: Passbolt
        • 🚧PRACTICA: Creando una web de emulación de juegos con docker-compose
      • Monitorización con Grafana en Docker
      • Pi-hole con docker
      • Actividad clase: Deployment app
      • Proyectos self-hosted de docker
    • 🚧Ansible
      • Configuración de laboratorio de ansible
    • 🚧Monitorización de servicios y redes
      • Servicios y cronjobs
      • 1Panel
      • 🚧WatchYourLAN
      • 🚧Uptime-kuma
      • 🚧Netdata
      • 🚧Prometheus + Grafana + Loki
    • LDAP
      • 🚧Gestión gráfica de LDAP
      • Carpetas compartidas NFS
      • PRACTICA: Infraestructura LDAP
  • 🗃️Servicios
    • 🚧Servidor hosting público
    • DHCP
      • DHCP con Ubuntu
      • 🦖DHCP & DNS script
      • DHCP con Alpine
        • Alpine - configuración de red
    • DNS
      • 😡Comprobación DNS
      • Script para enumeración DNS
      • DNS con ubuntu server
      • 🏗️DNSmasq
      • 🚧Securizar servidor DNS
    • Web
      • IIS con Windows server
      • Apache
        • Instalación de LAMP en Ubuntu
          • Prueba de servidor LAMP
          • 🚧Configuración de seguridad de Ubuntu
          • Creación de un VirtualHost en LAMP
          • Creación de varios VirtualHosts en LAMP
          • 🚧Instalación por script de LAMP
        • Aplicaciones con LAMP
          • Instalación de WP en entorno LAMP
          • 🚧Instalación de MantisBT en LAMP
            • 👷Guía de MantisBT
          • 🚧Instalación de QDPM con LAMP
      • Nginx
        • Virtualhosts
        • Instalando Wordpress en nginx
      • 👷MEAN stack
      • 👷‍♂️Caddy
      • 🚧Plesk
      • 🚧Ajenti -Web interface
    • 🏗️Proxy
      • Nginx como proxy inverso y balanceador
      • 🚧Zoraxy
    • Mailing
      • 🚧Servidor Mail con cloudfare
      • 🚧Reenvío de correos de root
      • 🚧Roundcube como MUA
      • Comprobación ESMTP
      • 🚧Seguridad en mailing
      • 🚧Mailhog
    • 🏗️File transfer
      • 🚧FTP
      • Git
    • Sistemas de comunicación instantánea
      • Comunicación mediante CLI
      • Ejabberd - XMPP
        • 🚧Ejabberd con docker
      • 🚧Openfire - XMPP
      • 🚧Comunicaciones servidor-móvil
    • 🏗️Multimedia services
      • Stremio
      • Ver anime por CLI
      • Jellyfin
      • 🚧HLS sobre Apache
      • 🚧Servicio autohospedado de videoconferencia
      • 🚧Morphos: Conversor docs
      • 🚧Reproductores de música en CLI
      • 🚧Icecast - música en streaming
      • 🚧RTMP-HLS server
      • 🚧Guacamole
  • 🖱️Hardware
    • 🚧Identificando conectores
    • Curso de electrónica analógica
    • Alcanzar los 3200MHz con la RAM
    • Calculadora de cuellos de botella
    • 🚧PXE: Bootear sistemas en red
    • 🚧PRÁCTICA - Clonación de disco con Clonezilla
    • Logitech iFixit
  • 🕸️Redes
    • Apuntes IPv4 Alina
    • ¿Cómo diferenciar tantos elementos de red?
    • 🚧IPv6
    • PRÁCTICA - Subneteo con IPcalc en Linux
    • PRÁCTICA - Comandos de red en Windows
    • 🚧PRÁCTICA - Comandos de red en Linux
    • Herramientas de red
      • 🚧TCPDump: analizado de paquetes en red
      • PRÁCTICA - Netsh
      • 🚧PRÁCTICA - mtr.ping.pe
      • 🚧Netcat
    • Wireshark
    • VPN y escritorio remoto
      • Comunicación punto a punto con ngrok
      • 🚧VPN
    • Escaneo de red
      • PRÁCTICA - Mapeado de red con Draw.io
      • 🚧PRÁCTICA - Nmap/Zenmap
    • Redes inalámbricas
      • Wi-fi
        • 🚧PRÁCTICA - Configuración de router
        • 🚧PRÁCTICA - Como hacer un Wifi Heatmap
        • 🚧Seguridad de redes inalámbricas
        • PRÁCTICA - Crackear la contraseña del Wifi con WPA/WPA2
    • PRÁCTICA - Usar SSH en Cisco packet tracer
  • 🛑Ciberseguridad
    • 🚧Securizando un servidor Linux
      • Protégete de ataques de fuerza bruta con Fail2ban
      • Firewall
        • UFW (uncomplicated firewall)
          • GUFW - Interfaz gráfica de ufw
        • 🚧IPTables
        • 🚧PFsense
          • 🚧DMZ con PFsense
      • 🚧Passbolt: gestor de contraseñas autohospedado
      • 🚧Hashes y encriptación
      • 🚧Certificados SSL/TLS
      • Copias de seguridad
    • 🚧Alerta de escaneo de puertos
    • 🚧Google dorks
    • 🚧Enumeración DNS
    • Comandos destructivos de linux
    • Webs enseñanza cyber
    • Wireless Pentesting CheatSheet Github
    • The password game!
    • Personal Security Checklist
  • 🔌Arduino
    • Termómetro e higrómetros digitales y online con Arduino
    • Construyendo un coche multipropósito
      • Multi
      • Montaje del auto
    • Arduino con Sigfox para IoT
    • 10 proyectos de Arduino
  • 📚Recursos y libros
    • Media library: libros varios
    • Herramientas básicas de sysadmin
  • 🌍Sostenibilidad y digitalización
    • Portfolio curso digitalización MOOC
    • 🚧Explotación de recursos por IA
    • 🚧Nuevas tecnologias y comunicaciones
    • 🚧Enlaces sobre Inteligencia artificial
Con tecnología de GitBook
En esta página
  • Materiales
  • Esquema
  • 1r - Termohigrómetro con botón de desconexión
  • Código y explicación
  • 2o - Enviar los datos por CSV a Windows
  • 3o - Interfaz web local
  • 4o - Configurar el arduino por acceso público
  1. Arduino

Termómetro e higrómetros digitales y online con Arduino

AnteriorWebs enseñanza cyberSiguienteConstruyendo un coche multipropósito

Última actualización hace 10 meses

Podemos probar de crear un Arduino que envíe información a través de una interfaz web y que, a su vez, guarde información dentro de un servidor Linux.

El Github es el siguiente:

Materiales

  • Placa Arduino con todo

  • 4x cables mín.

  • Termo-higrómetro (DHT)

  • LED

  • Botón switch (single pole double throw, SPDT)

  • 1x resistencia 220 Ohm

  • 1x resistencia 10 kOhm

Esquema

1r - Termohigrómetro con botón de desconexión

Primeramente empezaremos por diseñar la parte del circuito necesaria para toda la práctica, oseaser el sensor de temperatura y humedad junto con un botón switch con estados encendido/apagado por defecto y un LED que nos indicará ese estado para mayor comodidad.

Para la práctica deberemos tener en cuenta algunas cosas importantes de los componentes:

  • El LED tiene dos pines, el largo que deberá ir conectado a la resistencia y en serie con el puerto y el corto que deberá ir al GND.

  • El botón switch (SPDT) tiene tres pines da igual la orientación o el orden pero:

    • Los pines de los lados serán los dos estados (en nuestro caso encendido/3'3V y apagado/GND)

    • El pin central deberá ir conectado al puerto del Arduino y se conectará a uno u otro circuitos.

  • El termohigrometro (DHT):

    • El pin SDA es un pin de datos, que se utiliza para comunicarse con otros dispositivos. Este debe conectarse por resistencia al VCC que, a su vez, irá conectado al circuito de 3'3.

    • El pin NC (Not Connected Pin) es un tipo de pin que se encuentra en varios paquetes de circuitos integrados. Este pin no debe conectarse a ninguna de las conexiones del circuito.

Código y explicación

Básicamente lo que hace el cogido es:

  1. Inicializar variables en el setup.

  2. En la función loop:

    1. Revisar el valor del botón switch (que siempre será 1 si tiene electricidad o 0 si no tiene).

    2. Si es positivo, enciende el LED e inicia la función de lectura del sensor que es la llamada "leerTempHum" y muestra un mensaje de información.

    3. Iguala el valor del switch al lastSwitchValue, una variable de control.

    4. Si se apaga el botón, apagará el LED y revisará que la variable de control no sea la misma que el valor del switch (0 en este caso).

2o - Enviar los datos por CSV a Windows

A continuación lo que intentaremos es visualizar los datos a través de terminal (no solo por el monitor en serie del Arduino IDE) y, a partir de estos datos, exportarlo a un archivo de texto.

Ten cuidado, los puertos COM en Windows solo permiten una aplicación con la conexión por lo que deberás cerrar una aplicación u otra según te convenga.

En mi caso usaré el siguiente script con el terminal de Powershell en modo administrador (Ctrl+X > Ejecutar Powershell como administrador) :

Código del script
# Configura el puerto serie
$port = new-Object System.IO.Ports.SerialPort COM3,115200,None,8,one
$port.open()

# Abre el archivo para escribir
$filePath = "C:\Users\david\Documents\Arduino\Proyectos\output.csv"
$streamWriter = [System.IO.StreamWriter]::new($filePath, $true)
#Crea la primera linea
$streamWriter.WriteLine("Fecha,Temperatura,Humedad")

try {
    while ($true) {
        # Lee los datos del puerto serie
	$line = $port.ReadLine()
				
	# Muestra los datos en la consola (opcional)
        Write-Host $line  
        
        # Escribe los datos en el archivo
	$currentDateTime = Get-Date -format "yyyy-mm-dd-HH:mm:ss"
	echo $currentDateTime
	#Escribe la fecha actual más la temperatura y humedad separadas por comas
	$csvformat = $currentDateTime + "," + $line
			#$streamWriter.WriteLine($currentDateTime)
			#$streamWriter.WriteLine($line)
	$streamWriter.WriteLine($csvformat) 
        $streamWriter.Flush()
    }
}
catch {
    Write-Host "Se ha producido un error: $_"
}

finally {
    # Cierra el archivo y el puerto serie
    $streamWriter.Close()
    $port.Close()
}

Para ejecutarlo recuerda guardarlo como leerScript.ps1 o .bat. A través del terminal, accede a la carpeta donde se encuentra o pon la ruta absoluta al archivo:

.\leerScript.ps1
#o bien: 
C:\Users\user\Documents\Arduino\leerScript.ps1

Si te da algún error de permisos, puede ser por que tu sistema no permita la ejecución de scripts, prueba con la siguiente opción:

Set-ExecutionPolicy RemoteSigned

En otro orden de cosas, ¡recuerda también modificar la ruta del script en el código!

El script lee los datos de la conexión, los muestra por consola y los va añadiendo al archivo CSV separado por comas para luego intentar usar esos datos en la interfaz web.

Pulsa Ctrl+C para dejar de escribir el archivo.

Deberia tratar de automatizar este proceso!

3o - Interfaz web local

A partir de un tutorial que vi, me pareció interesante ver como poder crear un servidor web con Arduino, encontré un código muy práctico para el tema y decidí probarlo sobre mi placa y con mis parámetros para ver si funcionaba.

Con este tutorial y código no solo se puede crear la web con HTML+CSS sino que también te permite embeber JavaScript e incluso modificar el estado de módulos (como LEDs) por web.

A priori no he modificado nada, solamente he cambiado los parámetros y quitado el tema de los LEDs.

Solamente ten en cuenta de añadir el archivo data.h con el SSID y la contraseña del Wifi y poner el Monitor serie en 115200 bauds. Al iniciar el monitor debería darte la IP para conectarte al servidor siempre y cuando estés dentro de la misma red.

Dentro del archivo de data.h he añadido el siguiente código de html/css/js:

Código de la página
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Gráfico de Líneas de Temperatura y Humedad</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            text-align: center;
            margin: 20px;
        }

        #csvFileInput {
            margin-bottom: 20px;
        }

        canvas {
            max-width: 100%;
            height: auto;
        }
    </style>
</head>
<body>
    <h1>Gráfico de Líneas de Temperatura y Humedad</h1>
    <input type="file" id="csvFileInput" accept=".csv">
    <canvas id="lineChart"></canvas>

    <script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
    <script>
        document.getElementById('csvFileInput').addEventListener('change', handleFileSelect);

        function handleFileSelect(event) {
            const file = event.target.files[0];
            if (file && file.type === 'text/csv') {
                const reader = new FileReader();
                reader.onload = function(e) {
                    const csvData = e.target.result;
                    const parsedData = parseCSV(csvData);
                    createLineChart(parsedData);
                };
                reader.readAsText(file);
            } else {
                alert('Por favor, selecciona un archivo CSV.');
            }
        }

        function parseCSV(data) {
            const lines = data.split('\n');
            const labels = [];
            const temperatureData = [];
            const humidityData = [];

            lines.forEach((line, index) => {
                if (index === 0) return; // Omitir la primera línea si contiene encabezados
                const [label, temperature, humidity] = line.split(',');
                if (label && temperature && humidity) {
                    labels.push(label);
                    temperatureData.push(parseFloat(temperature));
                    humidityData.push(parseFloat(humidity));
                }
            });

            return { labels, temperatureData, humidityData };
        }

        function createLineChart(data) {
            const ctx = document.getElementById('lineChart').getContext('2d');
            new Chart(ctx, {
                type: 'line',
                data: {
                    labels: data.labels,
                    datasets: [
                        {
                            label: 'Temperatura',
                            data: data.temperatureData,
                            borderColor: 'rgba(255, 99, 132, 1)',
                            backgroundColor: 'rgba(255, 99, 132, 0.2)',
                            fill: false
                        },
                        {
                            label: 'Humedad',
                            data: data.humidityData,
                            borderColor: 'rgba(54, 162, 235, 1)',
                            backgroundColor: 'rgba(54, 162, 235, 0.2)',
                            fill: false
                        }
                    ]
                },
                options: {
                    responsive: true,
                    scales: {
                        x: {
                            title: {
                                display: true,
                                text: 'Fecha'
                            }
                        },
                        y: {
                            title: {
                                display: true,
                                text: 'Valor'
                            }
                        }
                    }
                }
            });
        }
    </script>
</body>
</html>

El código de la pagina no carga, presupongo que es por la cantidad de información, probare con el código de la guía oficial. Sino puede ser la libreria de JS

4o - Configurar el arduino por acceso público

Para esta práctica, me he basado en las siguientes guías:

El código lo puedes encontrar aquí:

Ya que el propio monitor serial de Arduino IDE no nos permite exportar los datos, deberemos hacerlo a través de otro terminal, como es el propio Powershell de Windows, , Putty o como podríamos hacer con interfaces Linux.

La fecha la saca con el comando Get-Date y formateado como tu prefieras, la explicación y ejemplos los he sacado de . He decidido hacerlo así ya que Arduino solo permite sacar la fecha y hora actuales con un módulo específico y es más fácil de esta forma.

El código lo tienes en el Github:

Para el gráfico dinámico he usado la librería de , open-source y fácil de usar incluso para mi.

https://github.com/aviladotgibert/arduino_TempHumOnline/tree/main/Termohigrometro_button
Tabby
aquí
https://github.com/alswnet/NocheProgramacion/tree/master/series/arduino_esp/007_Web_Server_Facil
Chart.js
https://nocheprogramacion.com/series/arduino_esp/007_web_server_facil.html
https://www.youtube.com/watch?v=46BLISvOsrM&ab_channel=ChepeCarlos
🔌
Page cover image
GitHub - aviladotgibert/arduino_TempHumOnline: Codigos del proyecto de Arduino de sensor de temperatura y humedad online con backup de datos en LinuxGitHub
Crea un servidor Web con ESP32 y ESP8266 FácilNocheProgramacion // ChepeCarlos
Logo
Logo
En el diagrama no se reflejan bien los pines usados
Fotografía del circuito real
LED circuit
SPDT button
Pines
conexiones
Resultado por terminal
CSV abierto con Libreoffice