Ir al contenido

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.

Calificación
0 0

No hay comentarios por ahora.

para ser el primero en comentar.