raspberry_pi_iot 0.0.8 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (109) hide show
  1. checksums.yaml +5 -5
  2. data/doc/IoT.html +8 -6
  3. data/doc/{Bus.html → RaspberryPiIoT.html} +21 -26
  4. data/doc/_index.html +84 -77
  5. data/doc/class_list.html +1 -1
  6. data/doc/file.LICENSE.html +92 -0
  7. data/doc/file.README.html +63 -29
  8. data/doc/file_list.html +5 -0
  9. data/doc/frames.html +1 -1
  10. data/doc/index.html +63 -29
  11. data/doc/method_list.html +170 -202
  12. data/doc/top-level-namespace.html +4 -6
  13. data/lib/bus.rb +0 -2
  14. data/lib/iot.rb +4 -2
  15. data/lib/iot/actuator.rb +7 -0
  16. data/lib/iot/bh1750.rb +54 -0
  17. data/lib/iot/binary_actuator.rb +7 -0
  18. data/lib/iot/binary_effector.rb +11 -0
  19. data/lib/iot/binary_receptor.rb +20 -0
  20. data/lib/iot/binary_sensor.rb +7 -0
  21. data/lib/iot/bmx_sensor.rb +73 -0
  22. data/lib/iot/button.rb +100 -0
  23. data/lib/iot/dht_sensor.rb +41 -0
  24. data/lib/iot/digital_actuator.rb +7 -0
  25. data/lib/iot/digital_effector.rb +67 -0
  26. data/lib/iot/digital_receptor.rb +17 -0
  27. data/lib/iot/digital_sensor.rb +7 -0
  28. data/lib/iot/ds18b20.rb +25 -0
  29. data/lib/iot/effector.rb +32 -0
  30. data/lib/iot/hcsr501.rb +8 -0
  31. data/lib/iot/humiture_sensor.rb +27 -0
  32. data/lib/iot/led.rb +64 -0
  33. data/lib/iot/led_pwm.rb +8 -0
  34. data/lib/iot/led_rgb.rb +86 -0
  35. data/lib/iot/max44009.rb +84 -0
  36. data/lib/iot/receptor.rb +38 -0
  37. data/lib/iot/sensor.rb +8 -0
  38. data/lib/iot/temperature_sensor.rb +51 -0
  39. data/lib/raspberry_pi.rb +46 -1
  40. data/lib/raspberry_pi_iot.rb +9 -3
  41. data/lib/raspberry_pi_iot/version.rb +3 -0
  42. data/lib/thermal_sensor.rb +2 -3
  43. data/test/test.sh +17 -0
  44. data/test/test.txt +173 -0
  45. data/test/test_Raspberry_Pi_IoT.rb +10 -0
  46. data/test/test_bh1750.rb +9 -4
  47. data/test/{standalone_test_bmp280.rb → test_bme280.rb} +24 -19
  48. data/test/test_bmp280.rb +52 -0
  49. data/test/test_button.rb +25 -14
  50. data/test/test_dht11.rb +3 -3
  51. data/test/test_dht22.rb +35 -0
  52. data/test/test_ds18b20.rb +4 -3
  53. data/test/test_helper.rb +6 -0
  54. data/test/test_info.rb +24 -3
  55. data/test/test_ky008.rb +41 -0
  56. data/test/test_led.rb +9 -9
  57. data/test/test_led_rgb.rb +28 -5
  58. data/test/test_max44009_gy49.rb +4 -4
  59. data/test/test_thermal.rb +27 -0
  60. metadata +103 -59
  61. data/doc/Actuator.html +0 -145
  62. data/doc/BH1750.html +0 -541
  63. data/doc/BME280.html +0 -276
  64. data/doc/BMP280.html +0 -276
  65. data/doc/BMxSensor.html +0 -557
  66. data/doc/BinaryActuator.html +0 -177
  67. data/doc/BinaryEffector.html +0 -246
  68. data/doc/BinaryReceptor.html +0 -387
  69. data/doc/BinarySensor.html +0 -168
  70. data/doc/Button.html +0 -986
  71. data/doc/DHT11.html +0 -287
  72. data/doc/DHT22.html +0 -287
  73. data/doc/DHTxxSensor.html +0 -361
  74. data/doc/DS18B20.html +0 -339
  75. data/doc/DigitalActuator.html +0 -164
  76. data/doc/DigitalEffector.html +0 -636
  77. data/doc/DigitalReceptor.html +0 -242
  78. data/doc/DigitalSensor.html +0 -162
  79. data/doc/Effector.html +0 -257
  80. data/doc/HCSR501.html +0 -172
  81. data/doc/HumitureSensor.html +0 -453
  82. data/doc/LED.html +0 -784
  83. data/doc/MAX44009.html +0 -830
  84. data/doc/RaspberryPi.html +0 -317
  85. data/doc/Receptor.html +0 -257
  86. data/doc/Sensor.html +0 -145
  87. data/doc/TemperatureSensor.html +0 -644
  88. data/lib/bh1750.rb +0 -46
  89. data/lib/binary_actuator.rb +0 -5
  90. data/lib/binary_effector.rb +0 -12
  91. data/lib/binary_receptor.rb +0 -19
  92. data/lib/binary_sensor.rb +0 -5
  93. data/lib/bmx_sensor.rb +0 -85
  94. data/lib/button.rb +0 -70
  95. data/lib/dht_sensor.rb +0 -36
  96. data/lib/digital_actuator.rb +0 -5
  97. data/lib/digital_effector.rb +0 -69
  98. data/lib/digital_receptor.rb +0 -16
  99. data/lib/digital_sensor.rb +0 -5
  100. data/lib/ds18b20.rb +0 -24
  101. data/lib/effector.rb +0 -32
  102. data/lib/hcsr501.rb +0 -7
  103. data/lib/humiture_sensor.rb +0 -26
  104. data/lib/led.rb +0 -58
  105. data/lib/led_pwm.rb +0 -6
  106. data/lib/led_rgb.rb +0 -101
  107. data/lib/max44009.rb +0 -77
  108. data/lib/receptor.rb +0 -33
  109. data/lib/temperature_sensor.rb +0 -49
@@ -6,7 +6,7 @@
6
6
  <title>
7
7
  Top Level Namespace
8
8
 
9
- &mdash; Documentation by YARD 0.9.16
9
+ &mdash; Documentation by YARD 0.9.20
10
10
 
11
11
  </title>
12
12
 
@@ -82,12 +82,10 @@
82
82
  <p class="children">
83
83
 
84
84
 
85
- <strong class="modules">Modules:</strong> <span class='object_link'><a href="Bus.html" title="Bus (module)">Bus</a></span>, <span class='object_link'><a href="IoT.html" title="IoT (module)">IoT</a></span>, <span class='object_link'><a href="RaspberryPi.html" title="RaspberryPi (module)">RaspberryPi</a></span>
85
+ <strong class="modules">Modules:</strong> <span class='object_link'><a href="IoT.html" title="IoT (module)">IoT</a></span>, <span class='object_link'><a href="RaspberryPiIoT.html" title="RaspberryPiIoT (module)">RaspberryPiIoT</a></span>
86
86
 
87
87
 
88
88
 
89
- <strong class="classes">Classes:</strong> <span class='object_link'><a href="Actuator.html" title="Actuator (class)">Actuator</a></span>, <span class='object_link'><a href="BH1750.html" title="BH1750 (class)">BH1750</a></span>, <span class='object_link'><a href="BME280.html" title="BME280 (class)">BME280</a></span>, <span class='object_link'><a href="BMP280.html" title="BMP280 (class)">BMP280</a></span>, <span class='object_link'><a href="BMxSensor.html" title="BMxSensor (class)">BMxSensor</a></span>, <span class='object_link'><a href="BinaryActuator.html" title="BinaryActuator (class)">BinaryActuator</a></span>, <span class='object_link'><a href="BinaryEffector.html" title="BinaryEffector (class)">BinaryEffector</a></span>, <span class='object_link'><a href="BinaryReceptor.html" title="BinaryReceptor (class)">BinaryReceptor</a></span>, <span class='object_link'><a href="BinarySensor.html" title="BinarySensor (class)">BinarySensor</a></span>, <span class='object_link'><a href="Button.html" title="Button (class)">Button</a></span>, <span class='object_link'><a href="DHT11.html" title="DHT11 (class)">DHT11</a></span>, <span class='object_link'><a href="DHT22.html" title="DHT22 (class)">DHT22</a></span>, <span class='object_link'><a href="DHTxxSensor.html" title="DHTxxSensor (class)">DHTxxSensor</a></span>, <span class='object_link'><a href="DS18B20.html" title="DS18B20 (class)">DS18B20</a></span>, <span class='object_link'><a href="DigitalActuator.html" title="DigitalActuator (class)">DigitalActuator</a></span>, <span class='object_link'><a href="DigitalEffector.html" title="DigitalEffector (class)">DigitalEffector</a></span>, <span class='object_link'><a href="DigitalReceptor.html" title="DigitalReceptor (class)">DigitalReceptor</a></span>, <span class='object_link'><a href="DigitalSensor.html" title="DigitalSensor (class)">DigitalSensor</a></span>, <span class='object_link'><a href="Effector.html" title="Effector (class)">Effector</a></span>, <span class='object_link'><a href="HCSR501.html" title="HCSR501 (class)">HCSR501</a></span>, <span class='object_link'><a href="HumitureSensor.html" title="HumitureSensor (class)">HumitureSensor</a></span>, <span class='object_link'><a href="LED.html" title="LED (class)">LED</a></span>, <span class='object_link'><a href="MAX44009.html" title="MAX44009 (class)">MAX44009</a></span>, <span class='object_link'><a href="Receptor.html" title="Receptor (class)">Receptor</a></span>, <span class='object_link'><a href="Sensor.html" title="Sensor (class)">Sensor</a></span>, <span class='object_link'><a href="TemperatureSensor.html" title="TemperatureSensor (class)">TemperatureSensor</a></span>
90
-
91
89
 
92
90
  </p>
93
91
 
@@ -102,9 +100,9 @@
102
100
  </div>
103
101
 
104
102
  <div id="footer">
105
- Generated on Tue Dec 18 16:03:38 2018 by
103
+ Generated on Wed Jun 10 16:52:49 2020 by
106
104
  <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
107
- 0.9.16 (ruby-2.3.3).
105
+ 0.9.20 (ruby-2.5.5).
108
106
  </div>
109
107
 
110
108
  </div>
data/lib/bus.rb CHANGED
@@ -1,5 +1,3 @@
1
-
2
- #$LOAD_PATH << '~/lib/ruby-i2c-devices/lib'
3
1
  gem 'i2c-devices'
4
2
  require 'i2c'
5
3
  require 'i2c/driver/i2c-dev'
data/lib/iot.rb CHANGED
@@ -1,9 +1,11 @@
1
+ require_relative 'iot/receptor'
2
+ require_relative 'iot/effector'
3
+
1
4
  # IoT - Internet of Things classes and modules
2
5
  module IoT
3
-
4
6
  # Logging events and actions
5
7
  class Log
6
- @file_name = nil
8
+ attr_accessor :file_name
7
9
 
8
10
  def initialize(file_name='/tmp/iot.log')
9
11
  @file_name = file_name
@@ -0,0 +1,7 @@
1
+ require_relative 'effector'
2
+
3
+ module IoT
4
+ # Actuator - a synonym for Effector
5
+ class Actuator < IoT::Effector
6
+ end
7
+ end
@@ -0,0 +1,54 @@
1
+ require 'bus'
2
+ require_relative 'digital_receptor'
3
+
4
+ module IoT
5
+ # BH1750 - ambient light sensor
6
+ class BH1750 < IoT::DigitalReceptor
7
+ DEVICE = 0x23 # I2C sensor address
8
+ POWER_DOWN = 0x00 # off state
9
+ POWER_ON = 0x01 # on state
10
+ RESET = 0x07 # reset state: POWER_DOWN = 0x00
11
+
12
+ CONTINUOUS_LOW_RES_MODE = 0x13 # Measure with resolution 4.0 lx and timing ~16 ms
13
+ CONTINUOUS_HIGH_RES_MODE_1 = 0x10 # Measure with resolution 1.0 lx and timing ~120 ms
14
+ CONTINUOUS_HIGH_RES_MODE_2 = 0x11 # Measure with resolution 0.5 lx and timing ~120 ms
15
+ ONE_TIME_LOW_RES_MODE = 0x23 # Measure with resolution 4.0 lx, POWER DOWN after measuring
16
+ ONE_TIME_HIGH_RES_MODE_1 = 0x20 # Measure with resolution 1.0 lx, POWER DOWN after measuring
17
+ ONE_TIME_HIGH_RES_MODE_2 = 0x21 # Measure with resolution 0.5 lx, POWER DOWN after measuring
18
+
19
+ def initialize(device_address=DEVICE, bus_number=1)
20
+ @sensor_name = 'BH1750'
21
+ Bus::I2C.bus_number = bus_number
22
+ @device_address = device_address
23
+
24
+ @i2c_bus = Bus::I2C.bus
25
+ @device = I2CDevice.new(address: DEVICE, driver: I2CDevice::Driver::I2CDev.new(@i2c_bus))
26
+ @resolution = ONE_TIME_HIGH_RES_MODE_1
27
+ @length = 2
28
+ @value = read
29
+ end
30
+
31
+ # Read raw data from sensor and convert it to numeric
32
+ def read
33
+ data = @device.i2cget(@resolution, @length)
34
+ @value = to_f(data)
35
+ end
36
+
37
+ # Return value in Lux
38
+ def lux
39
+ read
40
+ @value
41
+ end
42
+
43
+
44
+ def name
45
+ @sensor_name
46
+ end
47
+
48
+ private
49
+ # Convert 2 bytes of sensor data to a float number
50
+ def to_f(data)
51
+ return ((data[1].ord + (256 * data[0].ord)) / 1.2)
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,7 @@
1
+ require_relative 'binary_effector'
2
+
3
+ module IoT
4
+ # BinaryActuator - a synomym for BinaryEffector
5
+ class BinaryActuator < IoT::BinaryEffector
6
+ end
7
+ end
@@ -0,0 +1,11 @@
1
+ require_relative 'digital_effector'
2
+
3
+ module IoT
4
+ # BinaryEffector - effector with binary logic
5
+ class BinaryEffector < IoT::DigitalEffector
6
+ def initialize(pin=25, state=:low)
7
+ super({:pin => pin}, :low)
8
+ @pin = pin
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,20 @@
1
+ require_relative 'receptor'
2
+
3
+ module IoT
4
+ # BinaryReceptor - receptor/actuator with binary logic
5
+ class BinaryReceptor < IoT::Receptor
6
+
7
+ def initialize(pin=21, pull=:up)
8
+ @pin = pin
9
+ RPi::GPIO.setup pin, :as => :input, :pull => pull
10
+ end
11
+
12
+ def high?
13
+ RPi::GPIO.high? @pin
14
+ end
15
+
16
+ def low?
17
+ RPi::GPIO.low? @pin
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,7 @@
1
+ require_relative 'binary_receptor'
2
+
3
+ module IoT
4
+ # BinarySensor - a synonym for BinaryReceptor
5
+ class BinarySensor < IoT::BinaryReceptor
6
+ end
7
+ end
@@ -0,0 +1,73 @@
1
+ require 'i2c/backends/i2c-dev.rb'
2
+ require 'i2c/bme280'
3
+ require_relative 'humiture_sensor'
4
+
5
+ module IoT
6
+ # Bosch BMP/BME humidity, temperature & atmospheric pressure sensor family
7
+ class BMxSensor < IoT::HumitureSensor
8
+
9
+ def initialize(sensor_name='BMx280', bus=1)
10
+ @sensor_name = sensor_name
11
+
12
+ device = I2C::Dev.create("/dev/i2c-#{bus}")
13
+ @sensor = I2C::Driver::BME280.new(device: device)
14
+ @temperature, @humidity, @pressure = read_data
15
+ end
16
+
17
+ def read_data
18
+ data = @sensor.all
19
+ @temperature = data[:t]
20
+ @pressure = data[:p]
21
+ @humidity = data[:h]
22
+ [@temperature, @humidity, @pressure]
23
+ end
24
+
25
+ def name
26
+ @sensor_name
27
+ end
28
+
29
+ # standard atmospheric pressure @ sea level = 1.01325 bar = 1013.25 mbar = 101.325 kPa
30
+ def hPa
31
+ @pressure
32
+ end
33
+
34
+ def pressure(mode=:hPa)
35
+ case mode
36
+ when :hPa # 1 hPa = 100 Pa = 1 mbar = 1 hPa = 0.750062 mmHg [@ 0°C]
37
+ hPa
38
+ when :kPa # 1 kPa = 1000 Pa = 10 hPa
39
+ hPa / 10.0
40
+ when :Pa # 1 Pa = 0.01 hPa = 0.001 kPa
41
+ hPa * 100.0
42
+ when :mmHg # 1 mmHg = 1.3332236842105263 hPa = 133.322387415 Pa = 1.000000142466321... Torr
43
+ hPa / (1013.25 / 760) # 760 mmHg = 101.3250144354 kPa
44
+ when :atm # 1 atm = 101325 Pa = 101.325 kPa
45
+ hPa / 1013.25
46
+ when :bar # 1 bar ≡ 100000 Pa = 1000 hPa = 0.987 atm = 750.06 mmHg = 750.06 Torr
47
+ hPa / 1000.0
48
+ when :mbar # 1 mbar = 0.001 bar
49
+ bar * 1000.0
50
+ when :Torr # 1 Torr = 1/760 atm = 101325/760 Pa = 0.999999857533699... mmHg
51
+ (hPa / 1013.25) / 760
52
+ else
53
+ hPa
54
+ end
55
+ end
56
+
57
+ def to_s
58
+ sprintf "%5.2f°C, %5.2f %%, %5.2f mmHg", @temperature, @humidity, pressure(:mmHg)
59
+ end
60
+ end
61
+
62
+ class BMP280 < IoT::BMxSensor # combined atmospheric pressure & temperature sensor
63
+ def initialize
64
+ super('BMP280')
65
+ end
66
+ end
67
+
68
+ class BME280 < IoT::BMxSensor # combined atmospheric pressure, temperature & humidity sensor
69
+ def initialize
70
+ super('BME280')
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,100 @@
1
+ require_relative 'binary_receptor'
2
+
3
+ module IoT
4
+ # Button - simple tactile / push button
5
+ class Button < IoT::BinaryReceptor
6
+ attr_writer :measure_pause
7
+
8
+ def initialize(pin)
9
+ @receptor_name = 'BUTTON'
10
+ super(pin)
11
+ @measure_pause = 0.01
12
+ @long_click = 1.0
13
+ @short_interval = 0.2
14
+ @timeout = 30
15
+ @intervals = []
16
+ # samples: wait time press time wait time press time
17
+ # double press: [[1.486804292, 0.090814152], [0.131284967, 0.13125429]]
18
+ # long press: [[0.910878286, 1.109352219]]
19
+ end
20
+
21
+ def name
22
+ @receptor_name
23
+ end
24
+
25
+ # Is button being pressed?
26
+ def pressed?
27
+ low?
28
+ end
29
+
30
+ # Is button not being pressed?
31
+ def not_pressed?
32
+ high?
33
+ end
34
+
35
+ def was_pressed?
36
+ @intervals.size > 0
37
+ end
38
+
39
+ def was_not_pressed?
40
+ !was_pressed?
41
+ end
42
+
43
+ # Wait for the 1st pressing of button
44
+ def wait_for_press
45
+ wait_for_presses(1)
46
+ end
47
+
48
+ # Wait for several sequential presses
49
+ def wait_for_presses(attempts=2, timeout=@timeout)
50
+ @intervals = []
51
+ attempts.times do
52
+ interval = []
53
+ timer = Time.now
54
+ while not_pressed? && (Time.now-timer) < timeout do
55
+ sleep @measure_pause
56
+ end
57
+ interval << Time.now-timer
58
+ timer = Time.now
59
+ while pressed? do
60
+ sleep @measure_pause
61
+ end
62
+ interval << Time.now-timer
63
+ @intervals << interval
64
+ end
65
+ @intervals
66
+ end
67
+
68
+ # Was the button pressed once?
69
+ def single_press?(intervals=@intervals)
70
+ intervals.size == 1
71
+ end
72
+
73
+ # Was the button pressed twice?
74
+ def double_press?(intervals=@intervals)
75
+ intervals.size == 2 && intervals[1][0] <= @short_interval
76
+ end
77
+
78
+ # Was the button pressed 3 times?
79
+ def triple_press?(intervals=@intervals)
80
+ intervals.size == 3
81
+ end
82
+
83
+ # Was the button pressed for more than @long_click?
84
+ def long_press?(intervals=@intervals)
85
+ intervals.size == 1 && intervals[0][1] >= @long_click
86
+ end
87
+
88
+ def set_timeout(timeout)
89
+ @timeout = timeout
90
+ end
91
+
92
+ def timeout?
93
+ min_wait_time = 60.0*60.0*60.00
94
+ @intervals.each do |interval|
95
+ min_wait_time = [min_wait_time, interval[0]].min
96
+ end
97
+ min_wait_time > @timeout
98
+ end
99
+ end
100
+ end
@@ -0,0 +1,41 @@
1
+ require_relative 'humiture_sensor'
2
+ require 'dht-sensor-ffi'
3
+
4
+ module IoT
5
+ # DHT11/22 humidity & temperature sensor family
6
+ class DHTxxSensor < IoT::HumitureSensor
7
+
8
+ def initialize(pin, sensor_model)
9
+ @pin = pin
10
+ @sensor_name = 'DHT'+sensor_model.to_s
11
+ @sensor_model = sensor_model.to_i
12
+ @temperature, @humidity = read_data
13
+ end
14
+
15
+ def name
16
+ @sensor_name
17
+ end
18
+
19
+ # Read values by 'DhtSensor.read' from 'dht-sensor-ffi'
20
+ def read_data
21
+ sensor_data = DhtSensor.read(@pin, @sensor_model)
22
+ @temperature = sensor_data.temp
23
+ @humidity = sensor_data.humidity
24
+ [@temperature, @humidity]
25
+ end
26
+ end
27
+
28
+ # DHT11 - junior model, lower presicion
29
+ class DHT11 < DHTxxSensor
30
+ def initialize(pin)
31
+ super(pin, 11)
32
+ end
33
+ end
34
+
35
+ # DHT22 - senior model, higher presicion
36
+ class DHT22 < DHTxxSensor
37
+ def initialize(pin)
38
+ super(pin, 22)
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,7 @@
1
+ require_relative 'digital_effector'
2
+
3
+ module IoT
4
+ # DigitalActuator - a synonym for DigitalEffector
5
+ class DigitalActuator < IoT::DigitalEffector
6
+ end
7
+ end
@@ -0,0 +1,67 @@
1
+ require_relative 'effector'
2
+
3
+ RPi::GPIO.set_warnings(false)
4
+ RPi::GPIO.set_numbering :bcm
5
+
6
+ module IoT
7
+ # DigitalEffector - effector/actuator with digitized control
8
+ class DigitalEffector < IoT::Effector
9
+ def initialize(pins={}, state=:low)
10
+ @pin = nil
11
+ @states = {} # ON / Off states for pin numbers
12
+ @pins = pins # DigitalEffector.new {red: 17, green: 28, blue: 22}
13
+ @pins.each_value do |pin|
14
+ RPi::GPIO.setup pin, :as => :output, :initialize => state
15
+ @states[pin] = (state == :high)
16
+ end
17
+ @pin = pins.values[0] # default pin
18
+ end
19
+
20
+ def self.on(pin=@pin)
21
+ RPi::GPIO.set_high pin
22
+ end
23
+
24
+ def self.off(pin=@pin)
25
+ RPi::GPIO.set_low pin
26
+ end
27
+
28
+ def on(pin=@pin)
29
+ DigitalEffector.on pin
30
+ @states[pin_number(pin)] = true
31
+ end
32
+
33
+ def off(pin=@pin)
34
+ DigitalEffector.off pin
35
+ @states[pin_number(pin)] = false
36
+ end
37
+
38
+ def on?(pin=@pin)
39
+ @states[pin_number(pin)]
40
+ end
41
+
42
+ def off?(pin=@pin)
43
+ !on?(pin)
44
+ end
45
+
46
+ private
47
+ def pin_number(pin)
48
+ if (pin.class.name == 'Integer') || (pin.class.name == 'Fixnum') # by number
49
+ pin
50
+ elsif @pins[pin] # by name as Symbol
51
+ @pins[pin]
52
+ end
53
+ end
54
+
55
+ def high?(pin=@pin)
56
+ RPi::GPIO.high? pin
57
+ end
58
+
59
+ def low?(pin=@pin)
60
+ RPi::GPIO.low? pin
61
+ end
62
+
63
+ def state
64
+ [@pins, @states]
65
+ end
66
+ end
67
+ end