Git Product home page Git Product logo

pi-gpio-server's Introduction

After following the installation and configuration steps below, your Raspberry Pi will serve a single page demonstration app at: http://your_raspberry_pi_hostname:5000/.

  • Each pin defined as output will show up in the controls section with a button to toggle its state.
  • Each pin with an input event displays a message in the events section each time it is triggered.

GPIO server page


Installation & Setup


Step 1: Clone this repository

git clone https://github.com/projectweekend/Pi-GPIO-Server.git

Step 2: Run install script

From the project directory Pi-GPIO-Server/, run the following command:

./install.sh

Step 3: Reboot

sudo reboot

Getting Started


Pin Configuration

A config file config/pins.yml is used to define the initial setup for pins that will be accessible to the API. If a pin is not defined here it will not have a URL route in the API. For full documentation about available GPIO input pin configurations see the documentation.

18:
  name: Whatever you want
  mode: OUT
  initial: HIGH
23:
  name: Whatever you want
  mode: OUT
  initial: LOW
  resistor: PUD_DOWN
24:
  name: Whatever you want
  mode: IN
  event: RISING
  bounce: 200
  • Add a numbered element for each pin to enabled
  • name - This is an optional text label you can use to identify your pins. If present, this value will be displayed on the included GPIO server page.
  • mode - This controls whether the pin will be used for input or output. Accepted values are: IN, OUT. (Required)
  • initial - This controls the starting value of the pin. Accepted values are: LOW, HIGH. (Optional - defaults to LOW)
  • resistor - This controls the software defined pull up/pull down resistor available in the Broadcom SOC. Accepted values are: PUD_UP, PUD_DOWN. (Optional - defaults to none)
  • event - This can only be used in combination with a pin set to input mode (mode: IN). If defined, the pin will use a socket.io connection and push data to the client when an event is detected. Accepted values are: RISING, FALLING, BOTH.
  • bounce - This can be used when an event is defined to prevent multiple callbacks being fired accidentally. The value is the number of milliseconds to wait before detecting another event.
Note:

An example configuration file is included in this project. It defines:

  • Pin 18 as an output pin
  • Pin 23 as an input pin registered with a RISING event.

Using this configuration, all you need to do is wire a 1K resistor and LED to pin 18, and an button to pin 23 to start using the demonstration app immediately.

Raspberry Pi Bread Board

Important:

After making any change to config/pins.yml, you will need to restart the GPIO server to see those changes take affect. You can do this without rebooting:

sudo service gpio-server restart

JSON API


List enabled GPIO pins

GET: /api/v1/pin

Response

[
    {
        "initial": null,
        "value": 0,
        "resistor": null,
        "name": "Whatever",
        "num": 18,
        "mode": "OUT",
        "event": null,
        "bounce": 0
    },
    {
        "initial": null,
        "value": 0,
        "resistor": null,
        "name": "Whatever",
        "num": 23,
        "mode": "IN",
        "event": "RISING",
        "bounce": 200
    },
    ...
]

Read a single pin

GET: /api/v1/pin/:num

Response

{
    "initial": null,
    "value": 0,
    "resistor": null,
    "name": "Whatever",
    "num": 18,
    "mode": "OUT",
    "event": null,
    "bounce": 0
}

Write to a single pin

PATCH: /api/v1/pin/:pin

Body

{
    "value": 0
}

Response

{
    "initial": null,
    "value": 0,
    "resistor": null,
    "name": "Whatever",
    "num": 18,
    "mode": "OUT",
    "event": null,
    "bounce": 0
}

Socket.io


List enabled GPIO pins

Name: pin:list

Example Client JavaScript

var socket = io.connect( 'http://your_raspberry_pi.local' );

// listen and receive data in the callback
socket.on( 'pin:list', function ( data ) {
  // do something with data
  console.log( data );
} );

// emit 'pin:list' to trigger a response with data
socket.emit( 'pin:list' );

Read a single pin

Name: pin:read

Example Client JavaScript

var socket = io.connect( 'http://your_raspberry_pi.local' );

// listen and receive data in the callback
socket.on( 'pin:read', function ( data ) {
  // do something with data
  console.log( data );
} );

// emit 'pin:read' to trigger a response with data
socket.emit( 'pin:read', { num: 1 } );

Write to a single pin

Name: pin:write

Example Client JavaScript

var socket = io.connect( 'http://your_raspberry_pi.local' );

// listen and receive data in the callback
socket.on( 'pin:write', function ( data ) {
  // do something with data
  console.log( data );
} );

// emit 'pin:write' to update a pin and trigger a response
socket.emit( 'pin:write', { num: 1, value: 0 } );

Events


Each pin event defined in pins.yml will push inormation to the client via socket.io. Data is sent on a named socket: pin:event.

Example Socket.io Payload
{
  "num": 23,
  "name": "Whatever",
  "event": "RISING"
}
Example Client JavaScript
var socket = io.connect( 'http://your_raspberry_pi.local' );

// listen and receive data in the callback
socket.on( 'pin:event', function ( data ) {
  // do something with data
  console.log( data );
} );

Upstart


This project uses Upstart to automatically start the GPIO web server when the Raspberry Pi boots. If you make changes to the server code in this project on your Raspberry Pi, you will need to restart the GPIO server in order for those changes to take affect. This also includes changes made to the pins.yml config file. If you want to do this without rebooting, you can use the following command:

sudo service gpio-server restart

If for any reason you wish to stop the GPIO server from running you can use:

sudo service gpio-server stop

If you want to start the GPIO server again, use:

sudo service gpio-server start

TODO


  • Add support for I2C
  • Add support for SPI

pi-gpio-server's People

Contributors

ermaker avatar agdude avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.