Raspberry Pi – Leds y pulsadores

En esta ocasión empezaremos a jugar con las entradas del GPIO poniendo tres pulsadores que usaremos para hacer diferentes acciones.

Este seria el esquema

Crearemos un nuevo proyecto C# para net Core 3.1 y pegaremos este codigo

En el se puede ver como llamamos a las funciones que actuaran con los eventos de paso de nivel alto a nivel bajo ( PinEventTypes.Rising ) y las de paso de nivel bajo a nivel alto (PinEventTypes.Falling ) , vamos cuando se pulsa y se suelta el pulsador ….

using System;
using System.Device.Gpio;
using System.Threading;

namespace Test_Pulsadores
{
    class RPi
    {
        static void Main(string[] args)
        {
            //Codigo Raspberry pi 
            //Definicion de I/O
            int Led_Rojo = 26;
            int Led_Verde = 6;
            int Led_Amarillo = 5;

            int pulsador_1 = 17;
            int pulsador_2 = 27;
            int pulsador_3 = 22;

            GpioController controller = new GpioController();

            //Modo de trabajo I/O
            controller.OpenPin(Led_Verde, PinMode.Output);
            controller.OpenPin(Led_Amarillo, PinMode.Output);
            controller.OpenPin(Led_Rojo, PinMode.Output);

            controller.OpenPin(pulsador_1, PinMode.InputPullUp);
            controller.OpenPin(pulsador_2, PinMode.InputPullUp);
            controller.OpenPin(pulsador_3, PinMode.InputPullUp);

            controller.RegisterCallbackForPinValueChangedEvent(pulsador_1, PinEventTypes.Rising, evento_pulsar_pulsador_1);
            controller.RegisterCallbackForPinValueChangedEvent(pulsador_1, PinEventTypes.Falling, evento_soltar_pulsador_1);
            controller.RegisterCallbackForPinValueChangedEvent(pulsador_2, PinEventTypes.Rising, evento_pulsar_pulsador_2);
            controller.RegisterCallbackForPinValueChangedEvent(pulsador_2, PinEventTypes.Falling, evento_soltar_pulsador_2);
            controller.RegisterCallbackForPinValueChangedEvent(pulsador_3, PinEventTypes.Rising, evento_pulsar_pulsador_3);
            controller.RegisterCallbackForPinValueChangedEvent(pulsador_3, PinEventTypes.Falling, evento_soltar_pulsador_3);


            while (true)
            {
                for (int nContador = 0; nContador < 3; nContador++)
                {
                    Thread.Sleep(250);
                    controller.Write(Led_Verde, PinValue.Low);
                    controller.Write(Led_Amarillo, PinValue.Low);
                    controller.Write(Led_Rojo, PinValue.Low);

                    switch (nContador)
                    {
                        case 0:
                            controller.Write(Led_Verde, PinValue.High);
                            break;
                        case 1:
                            controller.Write(Led_Amarillo, PinValue.High);
                            break;
                        case 2:
                            controller.Write(Led_Rojo, PinValue.High);
                            break;
                    }
                    Thread.Sleep(250);
                    Console.Write(".");
                }
            }


            void evento_pulsar_pulsador_1(object sender, PinValueChangedEventArgs args)
            {
                Console.WriteLine(DateTime.Now + " " + args.PinNumber + " pulsado ...");
                controller.Write(Led_Rojo, PinValue.High);
                Thread.Sleep(500);
                controller.Write(Led_Rojo, PinValue.Low);

            }

            void evento_soltar_pulsador_1(object sender, PinValueChangedEventArgs args)
            {
                Console.WriteLine(DateTime.Now + " " + args.PinNumber + " soltado ....");
            }

            void evento_pulsar_pulsador_2(object sender, PinValueChangedEventArgs args)
            {
                Console.WriteLine(DateTime.Now + " " + args.PinNumber + " pulsado ...");
                controller.Write(Led_Amarillo, PinValue.High);
                Thread.Sleep(500);
                controller.Write(Led_Amarillo, PinValue.Low);
            }

            void evento_soltar_pulsador_2(object sender, PinValueChangedEventArgs args)
            {
                Console.WriteLine(DateTime.Now + " " + args.PinNumber + " soltado ....");
            }

            void evento_pulsar_pulsador_3(object sender, PinValueChangedEventArgs args)
            {
                Console.WriteLine(DateTime.Now + " " + args.PinNumber + " pulsado ...");
                controller.Write(Led_Verde, PinValue.High);
                Thread.Sleep(500);
                controller.Write(Led_Verde, PinValue.Low);
            }

            void evento_soltar_pulsador_3(object sender, PinValueChangedEventArgs args)
            {
                Console.WriteLine(DateTime.Now + " " + args.PinNumber + " soltado ....");
            }

        }
    }
}

Y veremos en la consola cuando pulsamos y soltamos cada uno de los pulsadores , así como cuando pulsamos nos encenderá el led correspondiente durante medio segundo

El publica con pscp esta bien , pero no es lo mas optimo , después de buscar encontré Dot Net SSH Deployer , que podéis encontrar aquí .

Puede ser que necesitéis instalar el SDK de net core 3.1

https://dotnet.microsoft.com/en-us/download/dotnet/thank-you/sdk-3.1.417-windows-x64-installer

y el SDK de NET 6.0

https://dotnet.microsoft.com/en-us/download/dotnet/thank-you/sdk-6.0.201-windows-x64-installer

En la raiz del proyecto ejecutar

dotnet tool install --global dotnet-ssh

Y para configurar seguir los pasos que nos va preguntando

dotnet-ssh configure MyRaspberryPi --auth-type UserSecrets --auth usuario:contraseña

Ahora cuando le demos a ejecutar subirá directamente y de forma diferencial todos los ficheros modificados , la primera carga es un poco lenta ya que tiene que subir todas las dependencias del proyecto.

Luego solo actualiza los cambios con lo que es muy rápido en hacer el deploy

Ejecutaremos nuestra aplicación con :

dotnet /home/antonio/net/test_pulsadores/Test\ Pulsadores.dll

Y este seria el resultado ejecutándose

Con esto y un bizcocho …………..