mirror of
				https://github.com/node-red/node-red.git
				synced 2025-03-01 10:36:34 +00:00 
			
		
		
		
	Add debounce to Pi GPIO node
This commit is contained in:
		| @@ -41,16 +41,18 @@ | ||||
|     </div> | ||||
|     <div class="form-row"> | ||||
|         <label for="node-input-intype"><i class="fa fa-level-up"></i> <span data-i18n="rpi-gpio.label.resistor"></span></label> | ||||
|         <select type="text" id="node-input-intype" style="width: 150px;"> | ||||
|         <select type="text" id="node-input-intype" style="width:100px;"> | ||||
|         <option value="tri" data-i18n="rpi-gpio.resistor.none"></option> | ||||
|         <option value="up" data-i18n="rpi-gpio.resistor.pullup"></option> | ||||
|         <option value="down" data-i18n="rpi-gpio.resistor.pulldown"></option> | ||||
|         </select> | ||||
|              <span data-i18n="rpi-gpio.label.debounce"></span> | ||||
|         <input type="text" id="node-input-debounce" style="width:47px; text-align:right"/> mS | ||||
|     </div> | ||||
|     <div class="form-row"> | ||||
|         <label> </label> | ||||
|         <input type="checkbox" id="node-input-read" style="display: inline-block; width: auto; vertical-align: top;"> | ||||
|         <label for="node-input-read" style="width: 70%;"><span data-i18n="rpi-gpio.label.readinitial"></span></label> | ||||
|         <label for="node-input-read" style="width:70%;"><span data-i18n="rpi-gpio.label.readinitial"></span></label> | ||||
|     </div> | ||||
|     <br/> | ||||
|     <div class="form-row"> | ||||
| @@ -65,7 +67,7 @@ | ||||
|     <p>Raspberry Pi input node. Generates a <b>msg.payload</b> with either a 0 or 1 depending on the state of the input pin. Requires the gpio command to work.</p> | ||||
|     <p>You may also enable the input pullup resistor or the pulldown resistor.</p> | ||||
|     <p>The <b>msg.topic</b> is set to <i>pi/{the pin number}</i></p> | ||||
|     <p>Requires the RPi.GPIO python library version 0.5.8 (or better) in order to work.</p> | ||||
|     <p>Requires the RPi.GPIO python library version 0.5.10 (or better) in order to work.</p> | ||||
|     <p><b>Note:</b> we are using the actual physical pin numbers on connector P1 as they are easier to locate.</p> | ||||
|     </script> | ||||
|  | ||||
| @@ -77,8 +79,9 @@ | ||||
|         color:"#c6dbef", | ||||
|         defaults: { | ||||
|             name: { value:"" }, | ||||
|             pin: { value:"",required:true,validate:RED.validators.number() }, | ||||
|             intype: { value: "in" }, | ||||
|             pin: { value:"tri",required:true,validate:RED.validators.number() }, | ||||
|             intype: { value:"in" }, | ||||
|             debounce: { value:"25" }, | ||||
|             read: { value:false } | ||||
|         }, | ||||
|         inputs:0, | ||||
| @@ -104,7 +107,7 @@ | ||||
|             var alreadyset = this._("rpi-gpio.alreadyset"); | ||||
|             $.getJSON('rpi-gpio/'+this.id,function(data) { | ||||
|                 $('#pitype').text(data.type); | ||||
|                 if ((data.type === "Model B+") || (data.type === "Model A+")) { | ||||
|                 if ((data.type !== "Model B") && (data.type !== "Model A")) { | ||||
|                     $('#node-input-pin').append($("<option></option>").attr("value",27).text("27 - SDA0 - BCM0")); | ||||
|                     $('#node-input-pin').append($("<option></option>").attr("value",28).text("28 - SCL0 - BCM1")); | ||||
|                     $('#node-input-pin').append($("<option></option>").attr("value",29).text("29 - GPIO21 - BCM5")); | ||||
| @@ -206,7 +209,7 @@ | ||||
|     <p>When using PWM mode - expects an input value of a number 0 - 100. It can be floating point.</p> | ||||
|     <p>PWM mode can be used to drive a servo using input values between 10 and 20 only. | ||||
|     The GPIO2 pin is best for this as it uses hardware to do the PWM.</p> | ||||
|     <p>Requires the RPi.GPIO python library version 0.5.8 (or better) in order to work.</p> | ||||
|     <p>Requires the RPi.GPIO python library version 0.5.10 (or better) in order to work.</p> | ||||
|     <p><b>Note:</b> we are using the actual physical pin numbers on connector P1 as they are easier to locate.</p> | ||||
| </script> | ||||
|  | ||||
| @@ -249,7 +252,7 @@ | ||||
|             if (!$("#node-input-out").val()) { $("#node-input-out").val("out"); } | ||||
|             $.getJSON('rpi-gpio/'+this.id,function(data) { | ||||
|                 $('#pitype').text(data.type); | ||||
|                 if ((data.type === "Model B+") || (data.type === "Model A+")) { | ||||
|                 if ((data.type !== "Model B") && (data.type !== "Model A")) { | ||||
|                     $('#node-input-pin').append($("<option></option>").attr("value",27).text("27 - SDA0 - BCM0")); | ||||
|                     $('#node-input-pin').append($("<option></option>").attr("value",28).text("28 - SCL0 - BCM1")); | ||||
|                     $('#node-input-pin').append($("<option></option>").attr("value",29).text("29 - GPIO21 - BCM5")); | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /** | ||||
|  * Copyright 2013,2015 IBM Corp. | ||||
|  * Copyright 2013,2016 IBM Corp. | ||||
|  * | ||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|  * you may not use this file except in compliance with the License. | ||||
| @@ -18,9 +18,9 @@ module.exports = function(RED) { | ||||
|     "use strict"; | ||||
|     var exec = require('child_process').exec; | ||||
|     var spawn = require('child_process').spawn; | ||||
|     var fs =  require('fs'); | ||||
|     var fs = require('fs'); | ||||
|  | ||||
|     var gpioCommand = __dirname+'/nrgpio.py'; | ||||
|     var gpioCommand = __dirname+'/nrgpio'; | ||||
|  | ||||
|     try { | ||||
|         fs.statSync("/dev/ttyAMA0"); // unlikely if not on a Pi | ||||
| @@ -53,6 +53,7 @@ module.exports = function(RED) { | ||||
|         this.pin = n.pin; | ||||
|         this.intype = n.intype; | ||||
|         this.read = n.read || false; | ||||
|         this.debounce = Number(n.debounce || 25); | ||||
|         if (this.read) { this.buttonState = -2; } | ||||
|         var node = this; | ||||
|         if (!pinsInUse.hasOwnProperty(this.pin)) { | ||||
| @@ -65,11 +66,7 @@ module.exports = function(RED) { | ||||
|         } | ||||
|  | ||||
|         if (node.pin !== undefined) { | ||||
|             if (node.intype === "tri") { | ||||
|                 node.child = spawn(gpioCommand, ["in",node.pin]); | ||||
|             } else { | ||||
|                 node.child = spawn(gpioCommand, ["in",node.pin,node.intype]); | ||||
|             } | ||||
|             node.child = spawn(gpioCommand, ["in",node.pin,node.intype,node.debounce]); | ||||
|             node.running = true; | ||||
|             node.status({fill:"green",shape:"dot",text:"common.status.ok"}); | ||||
|  | ||||
| @@ -164,7 +161,7 @@ module.exports = function(RED) { | ||||
|         if (node.pin !== undefined) { | ||||
|             if (node.set && (node.out === "out")) { | ||||
|                 node.child = spawn(gpioCommand, [node.out,node.pin,node.level]); | ||||
|                 } else { | ||||
|             } else { | ||||
|                 node.child = spawn(gpioCommand, [node.out,node.pin]); | ||||
|             } | ||||
|             node.running = true; | ||||
| @@ -216,16 +213,18 @@ module.exports = function(RED) { | ||||
|     } | ||||
|  | ||||
|     var pitype = { type:"" }; | ||||
|     exec(gpioCommand+" rev 0", function(err,stdout,stderr) { | ||||
|     exec(gpioCommand+" info", function(err,stdout,stderr) { | ||||
|         if (err) { | ||||
|             RED.log.info(RED._("rpi-gpio.errors.version")); | ||||
|         } | ||||
|         else { | ||||
|             if (stdout.trim() == "0") { pitype = { type:"Compute" }; } | ||||
|             else if (stdout.trim() == "1") { pitype = { type:"A/B v1" }; } | ||||
|             else if (stdout.trim() == "2") { pitype = { type:"A/B v2" }; } | ||||
|             else if (stdout.trim() == "3") { pitype = { type:"Model B+" }; } | ||||
|             else { RED.log.info(RED._("rpi-gpio.errors.sawpitype"),stdout.trim()); } | ||||
|             try { | ||||
|                 var info = JSON.parse( stdout.trim().replace(/\'/g,"\"") ); | ||||
|                 pitype.type = info["TYPE"]; | ||||
|             } | ||||
|             catch(e) { | ||||
|                 RED.log.info(RED._("rpi-gpio.errors.sawpitype"),stdout.trim()); | ||||
|             } | ||||
|         } | ||||
|     }); | ||||
|     RED.nodes.registerType("rpi-gpio out",GPIOOutNode); | ||||
| @@ -235,7 +234,7 @@ module.exports = function(RED) { | ||||
|         this.butt = n.butt || 7; | ||||
|         var node = this; | ||||
|  | ||||
|         node.child = spawn(gpioCommand, ["mouse",node.butt]); | ||||
|         node.child = spawn(gpioCommand+".py", ["mouse",node.butt]); | ||||
|         node.status({fill:"green",shape:"dot",text:"common.status.ok"}); | ||||
|  | ||||
|         node.child.stdout.on('data', function (data) { | ||||
| @@ -281,7 +280,7 @@ module.exports = function(RED) { | ||||
|         RED.nodes.createNode(this,n); | ||||
|         var node = this; | ||||
|  | ||||
|         node.child = spawn(gpioCommand, ["kbd","0"]); | ||||
|         node.child = spawn(gpioCommand+".py", ["kbd","0"]); | ||||
|         node.status({fill:"green",shape:"dot",text:"common.status.ok"}); | ||||
|  | ||||
|         node.child.stdout.on('data', function (data) { | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| #!/usr/bin/python | ||||
| # | ||||
| # Copyright 2014 IBM Corp. | ||||
| # Copyright 2014,2016 IBM Corp. | ||||
| # | ||||
| # Licensed under the Apache License, Version 2.0 (the "License"); | ||||
| # you may not use this file except in compliance with the License. | ||||
| @@ -19,8 +19,9 @@ import struct | ||||
| import sys | ||||
| import os | ||||
| import subprocess | ||||
| from time import sleep | ||||
|  | ||||
| bounce = 20     # bounce time in mS to apply | ||||
| bouce = 20; | ||||
|  | ||||
| if sys.version_info >= (3,0): | ||||
|     print("Sorry - currently only configured to work with python 2.x") | ||||
| @@ -95,18 +96,18 @@ if len(sys.argv) > 2: | ||||
|  | ||||
|     elif cmd == "in": | ||||
|         #print "Initialised pin "+str(pin)+" to IN" | ||||
|         bounce = int(sys.argv[4]) | ||||
|         def handle_callback(chan): | ||||
|             sleep(bounce/1000) | ||||
|             print GPIO.input(chan) | ||||
|  | ||||
|         if len(sys.argv) == 4: | ||||
|             if sys.argv[3].lower() == "up": | ||||
|                 GPIO.setup(pin,GPIO.IN,GPIO.PUD_UP) | ||||
|             elif sys.argv[3].lower() == "down": | ||||
|                 GPIO.setup(pin,GPIO.IN,GPIO.PUD_DOWN) | ||||
|             else: | ||||
|                 GPIO.setup(pin,GPIO.IN) | ||||
|         if sys.argv[3].lower() == "up": | ||||
|             GPIO.setup(pin,GPIO.IN,GPIO.PUD_UP) | ||||
|         elif sys.argv[3].lower() == "down": | ||||
|             GPIO.setup(pin,GPIO.IN,GPIO.PUD_DOWN) | ||||
|         else: | ||||
|             GPIO.setup(pin,GPIO.IN) | ||||
|  | ||||
|         print GPIO.input(pin) | ||||
|         GPIO.add_event_detect(pin, GPIO.BOTH, callback=handle_callback, bouncetime=bounce) | ||||
|  | ||||
| @@ -169,12 +170,6 @@ if len(sys.argv) > 2: | ||||
|             except: | ||||
|                 data = 0 | ||||
|  | ||||
|     elif cmd == "rev": | ||||
|         print GPIO.RPI_REVISION | ||||
|  | ||||
|     elif cmd == "ver": | ||||
|         print GPIO.VERSION | ||||
|  | ||||
|     elif cmd == "mouse":  # catch mice button events | ||||
|         file = open( "/dev/input/mice", "rb" ) | ||||
|         oldbutt = 0 | ||||
| @@ -225,9 +220,11 @@ elif len(sys.argv) > 1: | ||||
|         print GPIO.RPI_REVISION | ||||
|     elif cmd == "ver": | ||||
|         print GPIO.VERSION | ||||
|     elif cmd == "info": | ||||
|         print GPIO.RPI_INFO | ||||
|     else: | ||||
|         print "Bad parameters - in|out|pwm|buzz|byte|borg|mouse|kbd|ver {pin} {value|up|down}" | ||||
|         print "  only ver (gpio version) and rev (board revision) accept no pin parameter." | ||||
|         print "Bad parameters - in|out|pwm|buzz|byte|borg|mouse|kbd|ver|info {pin} {value|up|down}" | ||||
|         print "  only ver (gpio version) and info (board information) accept no pin parameter." | ||||
|  | ||||
| else: | ||||
|     print "Bad parameters - in|out|pwm|buzz|byte|borg|mouse|kbd|ver {pin} {value|up|down}" | ||||
|     print "Bad parameters - in|out|pwm|buzz|byte|borg|mouse|kbd|ver|info {pin} {value|up|down}" | ||||
|   | ||||
| @@ -569,6 +569,7 @@ | ||||
|             "readinitial": "Read initial state of pin on deploy/restart?", | ||||
|             "type": "Type", | ||||
|             "initpin": "Initialise pin state?", | ||||
|             "debounce": "Debounce", | ||||
|             "button": "Button", | ||||
|             "pimouse": "Pi Mouse", | ||||
|             "pikeyboard": "Pi Keyboard", | ||||
|   | ||||
		Reference in New Issue
	
	Block a user