Instalar Servicio GPIO
Creación del Servicio
En este artículo aprenderás a instalar y configurar un servicio en Raspberry Pi que escucha los pulsadores conectados a los pines GPIO y envía eventos en tiempo real a la aplicación de turnos.
1. Requisitos
- Una Raspberry Pi (modelos 3/4/5 funcionan bien).
- Sistema operativo Raspberry Pi OS (Bookworm o similar).
- Python 3 instalado (viene por defecto).
- Acceso SSH o terminal.
- Pulsadores físicos conectados a los pines GPIO.
Ejemplo:
- Pulsador en GPIO17 → genera un “nuevo turno”.
- Pulsador en GPIO27 → pasa al “siguiente turno”.
- Pulsador en GPIO22 → retrocede al “anterior turno”.
2. Preparar directorio de trabajo
Creamos una carpeta dentro del proyecto turnero:
cd /var/www/html/turnero sudo mkdir -p tools cd tools
3. Script Python para leer pulsadores
Guarda este archivo como gpio_test.py:
#!/usr/bin/env python3 import RPi.GPIO as GPIO import time, argparse, requests, json def report(url, payload): try: r = requests.post(url, json=payload, timeout=2) print("Reported:", r.status_code, r.text) except Exception as e: print("Error reporting:", e) def monitor(pins, mode, url, debounce): GPIO.setmode(GPIO.BCM if mode=="bcm" else GPIO.BOARD) for pin in pins: GPIO.setup(pin, GPIO.IN, pull_up_down=GPIO.PUD_UP) last_state = {p:GPIO.input(p) for p in pins} while True: for p in pins: val = GPIO.input(p) if val != last_state[p]: last_state[p] = val evt = {"pin":p, "value":f"event:{val}", "ts":int(time.time())} print("Change detected:", evt) if url: report(url, evt) time.sleep(debounce/1000.0) if __name__ == "__main__": ap = argparse.ArgumentParser() ap.add_argument("action", choices=["monitor"]) ap.add_argument("--pin", nargs="+", type=int, required=True) ap.add_argument("--mode", default="bcm", choices=["bcm","board"]) ap.add_argument("--report-url", required=True) ap.add_argument("--debounce", type=int, default=200) args = ap.parse_args() if args.action=="monitor": monitor(args.pin, args.mode, args.report_url, args.debounce)
Hazlo ejecutable:
sudo chmod +x gpio_test.py
4. Script PHP receptor de eventos
En la carpeta tools/, crea gpio_report.php:
<?php header('Content-Type: application/json; charset=utf-8'); $raw = file_get_contents("php://input"); $data = json_decode($raw, true); if (!$data) { echo json_encode(['ok'=>false,'error'=>'Invalid JSON']); exit; } $event = [ 'pin' => $data['pin'] ?? null, 'value' => $data['value'] ?? null, 'queue' => (int)($data['queue_id'] ?? 1), 'ts' => time(), 'ts_iso'=> date('c') ]; file_put_contents(__DIR__.'/gpio_events.json', json_encode($event, JSON_UNESCAPED_SLASHES).PHP_EOL, FILE_APPEND); echo json_encode(['ok'=>true,'event'=>$event]);
Esto guarda cada evento en gpio_events.json y responde con JSON.
5. Servicio systemd para ejecutar el monitor
Creamos gpio_monitor.service:
[Unit] Description=Turnero GPIO Monitor After=network.target [Service] Type=simple ExecStart=/usr/bin/python3 /var/www/html/turnero/tools/gpio_test.py monitor \ --pin 17 27 22 \ --mode bcm \ --report-url http://127.0.0.1/turnero/tools/gpio_report.php \ --debounce 200 Restart=always User=root WorkingDirectory=/var/www/html/turnero/tools [Install] WantedBy=multi-user.target
Copiar al sistema:
sudo cp gpio_monitor.service /etc/systemd/system/ sudo systemctl daemon-reload sudo systemctl enable --now gpio_monitor.service
6. Verificar el servicio
Revisar estado:
systemctl status gpio_monitor.service --no-pager
Ver logs en vivo:
journalctl -u gpio_monitor.service -f
Al presionar los pulsadores deberías ver eventos tipo:
Change detected: {'pin': 17, 'value': 'event:0', 'ts': 1695992137} Reported: 200 {"ok":true,"event":{"pin":17,"value":"event:0","queue":1,"ts":...}}
7. Integración con la App
Los eventos que recibe gpio_report.php se redirigen a los endpoints de tu aplicación de turnos, por ejemplo:
- pin 17 → /api/botones/nuevo.php
- pin 27 → /api/botones/siguiente.php
- pin 22 → /api/botones/anterior.php
Esto se ajusta en gpio_dispatch.php (router PHP) para que cada pulsación actúe igual que si lo hubieras hecho desde la interfaz web.
✅ Con esto, tu Raspberry Pi ya escucha pulsadores físicos y los traduce en acciones de turnos en tiempo real en la pantalla.
No hay comentarios por ahora.