raspberry_pi_iot 0.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/doc/Actuator.html +145 -0
- data/doc/BH1750.html +535 -0
- data/doc/BME280.html +276 -0
- data/doc/BMP280.html +276 -0
- data/doc/BMxSensor.html +559 -0
- data/doc/BinaryActuator.html +177 -0
- data/doc/BinaryEffector.html +246 -0
- data/doc/BinaryReceptor.html +387 -0
- data/doc/BinarySensor.html +168 -0
- data/doc/Bus.html +126 -0
- data/doc/Button.html +986 -0
- data/doc/DHT11.html +287 -0
- data/doc/DHT22.html +287 -0
- data/doc/DHTxxSensor.html +361 -0
- data/doc/DS18B20.html +339 -0
- data/doc/DigitalActuator.html +164 -0
- data/doc/DigitalEffector.html +636 -0
- data/doc/DigitalReceptor.html +242 -0
- data/doc/DigitalSensor.html +162 -0
- data/doc/Effector.html +257 -0
- data/doc/HCSR501.html +172 -0
- data/doc/HumitureSensor.html +453 -0
- data/doc/IoT.html +116 -0
- data/doc/LED.html +784 -0
- data/doc/MAX44009.html +830 -0
- data/doc/RaspberryPi.html +309 -0
- data/doc/Receptor.html +257 -0
- data/doc/Sensor.html +145 -0
- data/doc/TemperatureSensor.html +644 -0
- data/doc/_index.html +379 -0
- data/doc/class_list.html +51 -0
- data/doc/file_list.html +51 -0
- data/doc/frames.html +17 -0
- data/doc/index.html +379 -0
- data/doc/method_list.html +715 -0
- data/doc/top-level-namespace.html +112 -0
- data/lib/bh1750.rb +43 -0
- data/lib/binary_effector.rb +16 -0
- data/lib/binary_receptor.rb +23 -0
- data/lib/bmx_sensor.rb +86 -0
- data/lib/bus.rb +26 -0
- data/lib/button.rb +70 -0
- data/lib/dht_sensor.rb +36 -0
- data/lib/digital_effector.rb +56 -0
- data/lib/digital_receptor.rb +20 -0
- data/lib/ds18b20.rb +24 -0
- data/lib/effector.rb +32 -0
- data/lib/hcsr501.rb +7 -0
- data/lib/humiture_sensor.rb +26 -0
- data/lib/iot.rb +4 -0
- data/lib/led.rb +58 -0
- data/lib/led_pwm.rb +6 -0
- data/lib/led_rgb.rb +100 -0
- data/lib/max44009.rb +77 -0
- data/lib/raspberry_pi.rb +41 -0
- data/lib/raspberry_pi_iot.rb +3 -0
- data/lib/receptor.rb +33 -0
- data/lib/temperature_sensor.rb +49 -0
- data/lib/thermal_sensor.rb +22 -0
- metadata +203 -0
@@ -0,0 +1,112 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<meta charset="utf-8">
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
6
|
+
<title>
|
7
|
+
Top Level Namespace
|
8
|
+
|
9
|
+
— Documentation by YARD 0.9.16
|
10
|
+
|
11
|
+
</title>
|
12
|
+
|
13
|
+
<link rel="stylesheet" href="css/style.css" type="text/css" charset="utf-8" />
|
14
|
+
|
15
|
+
<link rel="stylesheet" href="css/common.css" type="text/css" charset="utf-8" />
|
16
|
+
|
17
|
+
<script type="text/javascript" charset="utf-8">
|
18
|
+
pathId = "";
|
19
|
+
relpath = '';
|
20
|
+
</script>
|
21
|
+
|
22
|
+
|
23
|
+
<script type="text/javascript" charset="utf-8" src="js/jquery.js"></script>
|
24
|
+
|
25
|
+
<script type="text/javascript" charset="utf-8" src="js/app.js"></script>
|
26
|
+
|
27
|
+
|
28
|
+
</head>
|
29
|
+
<body>
|
30
|
+
<div class="nav_wrap">
|
31
|
+
<iframe id="nav" src="class_list.html?1"></iframe>
|
32
|
+
<div id="resizer"></div>
|
33
|
+
</div>
|
34
|
+
|
35
|
+
<div id="main" tabindex="-1">
|
36
|
+
<div id="header">
|
37
|
+
<div id="menu">
|
38
|
+
|
39
|
+
<a href="_index.html">Index</a> »
|
40
|
+
|
41
|
+
|
42
|
+
<span class="title">Top Level Namespace</span>
|
43
|
+
|
44
|
+
</div>
|
45
|
+
|
46
|
+
<div id="search">
|
47
|
+
|
48
|
+
<a class="full_list_link" id="class_list_link"
|
49
|
+
href="class_list.html">
|
50
|
+
|
51
|
+
<svg width="24" height="24">
|
52
|
+
<rect x="0" y="4" width="24" height="4" rx="1" ry="1"></rect>
|
53
|
+
<rect x="0" y="12" width="24" height="4" rx="1" ry="1"></rect>
|
54
|
+
<rect x="0" y="20" width="24" height="4" rx="1" ry="1"></rect>
|
55
|
+
</svg>
|
56
|
+
</a>
|
57
|
+
|
58
|
+
</div>
|
59
|
+
<div class="clear"></div>
|
60
|
+
</div>
|
61
|
+
|
62
|
+
<div id="content"><h1>Top Level Namespace
|
63
|
+
|
64
|
+
|
65
|
+
|
66
|
+
</h1>
|
67
|
+
<div class="box_info">
|
68
|
+
|
69
|
+
|
70
|
+
|
71
|
+
|
72
|
+
|
73
|
+
|
74
|
+
|
75
|
+
|
76
|
+
|
77
|
+
|
78
|
+
|
79
|
+
</div>
|
80
|
+
|
81
|
+
<h2>Defined Under Namespace</h2>
|
82
|
+
<p class="children">
|
83
|
+
|
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>
|
86
|
+
|
87
|
+
|
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
|
+
|
92
|
+
</p>
|
93
|
+
|
94
|
+
|
95
|
+
|
96
|
+
|
97
|
+
|
98
|
+
|
99
|
+
|
100
|
+
|
101
|
+
|
102
|
+
</div>
|
103
|
+
|
104
|
+
<div id="footer">
|
105
|
+
Generated on Tue Dec 11 17:46:24 2018 by
|
106
|
+
<a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
|
107
|
+
0.9.16 (ruby-2.3.3).
|
108
|
+
</div>
|
109
|
+
|
110
|
+
</div>
|
111
|
+
</body>
|
112
|
+
</html>
|
data/lib/bh1750.rb
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'bus'
|
2
|
+
|
3
|
+
# BH1750 - ambient light sensor
|
4
|
+
class BH1750
|
5
|
+
DEVICE = 0x23 # I2C sensor address
|
6
|
+
POWER_DOWN = 0x00 # off state
|
7
|
+
POWER_ON = 0x01 # on state
|
8
|
+
RESET = 0x07 # reset state: POWER_DOWN = 0x00
|
9
|
+
|
10
|
+
CONTINUOUS_LOW_RES_MODE = 0x13 # Measure with resolution 4.0 lx and timing ~16 ms
|
11
|
+
CONTINUOUS_HIGH_RES_MODE_1 = 0x10 # Measure with resolution 1.0 lx and timing ~120 ms
|
12
|
+
CONTINUOUS_HIGH_RES_MODE_2 = 0x11 # Measure with resolution 0.5 lx and timing ~120 ms
|
13
|
+
ONE_TIME_LOW_RES_MODE = 0x23 # Measure with resolution 4.0 lx, POWER DOWN after measuring
|
14
|
+
ONE_TIME_HIGH_RES_MODE_1 = 0x20 # Measure with resolution 1.0 lx, POWER DOWN after measuring
|
15
|
+
ONE_TIME_HIGH_RES_MODE_2 = 0x21 # Measure with resolution 0.5 lx, POWER DOWN after measuring
|
16
|
+
|
17
|
+
def initialize(i2c_bus='/dev/i2c-1')
|
18
|
+
@sensor_name = 'BH1750'
|
19
|
+
@i2c_bus = i2c_bus
|
20
|
+
@device = I2CDevice.new(address: DEVICE, driver: I2CDevice::Driver::I2CDev.new(@i2c_bus))
|
21
|
+
@resolution = ONE_TIME_HIGH_RES_MODE_1
|
22
|
+
@length = 2
|
23
|
+
@value = read_sensor
|
24
|
+
end
|
25
|
+
|
26
|
+
# Read raw data from sensor and convert it to numeric
|
27
|
+
def read_sensor
|
28
|
+
data = @device.i2cget(@resolution, @length)
|
29
|
+
@value = to_f(data)
|
30
|
+
end
|
31
|
+
|
32
|
+
# Return value in Lux
|
33
|
+
def lux
|
34
|
+
read_sensor
|
35
|
+
@value
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
# Convert 2 bytes of sensor data to a float number
|
40
|
+
def to_f(data)
|
41
|
+
return ((data[1].ord + (256 * data[0].ord)) / 1.2)
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'digital_effector'
|
2
|
+
|
3
|
+
# BinaryEffector - effector with binary logic
|
4
|
+
class BinaryEffector < DigitalEffector
|
5
|
+
@pin = nil # pin
|
6
|
+
|
7
|
+
def initialize(pin=25, state=:low)
|
8
|
+
super({:pin => pin}, :low)
|
9
|
+
@pin = pin
|
10
|
+
end
|
11
|
+
|
12
|
+
end
|
13
|
+
|
14
|
+
# BinaryActuator - synomym for BinaryEffector
|
15
|
+
class BinaryActuator < BinaryEffector
|
16
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'receptor'
|
2
|
+
|
3
|
+
# BinaryReceptor - receptor/actuator with binary logic
|
4
|
+
class BinaryReceptor < Receptor
|
5
|
+
@pin = nil # pin
|
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
|
+
|
21
|
+
# BinarySensor - a synonym for BinaryReceptor
|
22
|
+
class BinarySensor < BinaryReceptor
|
23
|
+
end
|
data/lib/bmx_sensor.rb
ADDED
@@ -0,0 +1,86 @@
|
|
1
|
+
gem 'i2c'
|
2
|
+
require 'i2c'
|
3
|
+
gem 'i2c-bme280'
|
4
|
+
require 'i2c/bme280'
|
5
|
+
require 'humiture_sensor'
|
6
|
+
|
7
|
+
|
8
|
+
# BMP/BME humidity, temperature & atmospheric pressure sensor family
|
9
|
+
class BMxSensor < HumitureSensor
|
10
|
+
|
11
|
+
def initialize(sensor_name, bus=1)
|
12
|
+
@sensor_name = sensor_name
|
13
|
+
@sensor = I2C::Driver::BME280.new(device: bus)
|
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
|
+
# standard atmospheric pressure @ sea level = 1.01325 bar = 1013.25 mbar = 101.325 kPa
|
26
|
+
def hPa
|
27
|
+
@pressure
|
28
|
+
end
|
29
|
+
|
30
|
+
def pressure(mode=:hPa)
|
31
|
+
case mode
|
32
|
+
when :hPa # 1 hPa = 100 Pa = 1 mbar = 1 hPa = 0.750062 mmHg [@ 0°C]
|
33
|
+
hPa
|
34
|
+
when :kPa # 1 kPa = 1000 Pa = 10 hPa
|
35
|
+
hPa / 10.0
|
36
|
+
when :Pa # 1 Pa = 0.01 hPa = 0.001 kPa
|
37
|
+
hPa * 100.0
|
38
|
+
when :mmHg # 1 mmHg = 1.3332236842105263 hPa = 133.322387415 Pa = 1.000000142466321... Torr
|
39
|
+
hPa / (1013.25 / 760) # 760 mmHg = 101.3250144354 kPa
|
40
|
+
when :atm # 1 atm = 101325 Pa = 101.325 kPa
|
41
|
+
hPa / 1013.25
|
42
|
+
when :bar # 1 bar ≡ 100000 Pa = 1000 hPa = 0.987 atm = 750.06 mmHg = 750.06 Torr
|
43
|
+
hPa / 1000.0
|
44
|
+
when :mbar # 1 mbar = 0.001 bar
|
45
|
+
bar * 1000.0
|
46
|
+
when :Torr # 1 Torr = 1/760 atm = 101325/760 Pa = 0.999999857533699... mmHg
|
47
|
+
(hPa / 1013.25) / 760
|
48
|
+
else
|
49
|
+
hPa
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def to_s
|
54
|
+
sprintf "%5.2f°C, %5.2f %%, %5.2f mmHg", @temperature, @humidity, pressure(:mmHg)
|
55
|
+
end
|
56
|
+
|
57
|
+
# OLD implementation with 'i2c-devices.gem'
|
58
|
+
#require 'bus'
|
59
|
+
#require 'i2c/device/bme280'
|
60
|
+
|
61
|
+
# BMP/BME humidity, temperature & atmospheric pressure sensor family
|
62
|
+
# def initialize(sensor_name)
|
63
|
+
# @sensor_name = sensor_name
|
64
|
+
# @sensor = I2CDevice::Bme280.new
|
65
|
+
# @temperature, @humidity, @pressure = read_data
|
66
|
+
# end
|
67
|
+
# def read_data
|
68
|
+
# data = @sensor.calc_sensor_data
|
69
|
+
# @temperature = data[:temp]
|
70
|
+
# @pressure = data[:pressure]
|
71
|
+
# @humidity = data[:hum]
|
72
|
+
# [@temperature, @humidity, @pressure]
|
73
|
+
# end
|
74
|
+
end
|
75
|
+
|
76
|
+
class BMP280 < BMxSensor
|
77
|
+
def initialize
|
78
|
+
super('BMP280')
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
class BME280 < BMxSensor
|
83
|
+
def initialize
|
84
|
+
super('BME280')
|
85
|
+
end
|
86
|
+
end
|
data/lib/bus.rb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
|
2
|
+
#$LOAD_PATH << '~/lib/ruby-i2c-devices/lib'
|
3
|
+
gem 'i2c-devices'
|
4
|
+
require 'i2c'
|
5
|
+
require 'i2c/driver/i2c-dev'
|
6
|
+
|
7
|
+
# Bus - interfaces for physical devices
|
8
|
+
module Bus
|
9
|
+
# 1-wire interface to devices
|
10
|
+
class OneWire
|
11
|
+
@@one_wire_bus = '/sys/bus/w1/devices'
|
12
|
+
@sensor_file = nil
|
13
|
+
end
|
14
|
+
|
15
|
+
# I2C interface to devices
|
16
|
+
class I2C
|
17
|
+
@@i2c_bus = '/dev/i2c-1'
|
18
|
+
def self.set_bus(bus=1)
|
19
|
+
@@i2c_bus = "/dev/i2c-#{bus}"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
# SPI interface to devices
|
24
|
+
class SPI
|
25
|
+
end
|
26
|
+
end
|
data/lib/button.rb
ADDED
@@ -0,0 +1,70 @@
|
|
1
|
+
require 'binary_receptor'
|
2
|
+
|
3
|
+
# Button - simple push button
|
4
|
+
class Button < BinaryReceptor
|
5
|
+
attr_writer :measure_pause
|
6
|
+
|
7
|
+
def initialize(pin)
|
8
|
+
receptor_name = 'BUTTON'
|
9
|
+
super(pin)
|
10
|
+
@measure_pause = 0.01
|
11
|
+
@long_click = 1.0
|
12
|
+
@short_interval = 0.2
|
13
|
+
@intervals = []
|
14
|
+
end
|
15
|
+
|
16
|
+
# Is button pressed?
|
17
|
+
def pressed?
|
18
|
+
low?
|
19
|
+
end
|
20
|
+
|
21
|
+
# Is button not pressed?
|
22
|
+
def not_pressed?
|
23
|
+
high?
|
24
|
+
end
|
25
|
+
|
26
|
+
# Wait for the 1st pressing of button
|
27
|
+
def wait_for_press
|
28
|
+
wait_for_presses(1)
|
29
|
+
end
|
30
|
+
|
31
|
+
# Wait for several sequential presses
|
32
|
+
def wait_for_presses(attempts=2)
|
33
|
+
@intervals = []
|
34
|
+
attempts.times do
|
35
|
+
interval = []
|
36
|
+
timer = Time.now
|
37
|
+
while not_pressed? do
|
38
|
+
sleep @measure_pause
|
39
|
+
end
|
40
|
+
interval << Time.now-timer
|
41
|
+
timer = Time.now
|
42
|
+
while pressed? do
|
43
|
+
sleep @measure_pause
|
44
|
+
end
|
45
|
+
interval << Time.now-timer
|
46
|
+
@intervals << interval
|
47
|
+
end
|
48
|
+
@intervals
|
49
|
+
end
|
50
|
+
|
51
|
+
# Was the button pressed once?
|
52
|
+
def single_press?(intervals=@intervals)
|
53
|
+
intervals.size == 1
|
54
|
+
end
|
55
|
+
|
56
|
+
# Was the button pressed twice?
|
57
|
+
def double_press?(intervals=@intervals)
|
58
|
+
intervals.size == 2 && intervals[1][0] <= @short_interval
|
59
|
+
end
|
60
|
+
|
61
|
+
# Was the button pressed 3 times?
|
62
|
+
def triple_press?(intervals=@intervals)
|
63
|
+
intervals.size == 3
|
64
|
+
end
|
65
|
+
|
66
|
+
# Was the button pressed for more than @long_click?
|
67
|
+
def long_press?(intervals=@intervals)
|
68
|
+
intervals.size == 1 && intervals[0][1] >= @long_click
|
69
|
+
end
|
70
|
+
end
|
data/lib/dht_sensor.rb
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'humiture_sensor'
|
2
|
+
require 'dht-sensor-ffi'
|
3
|
+
|
4
|
+
# DHT11/22 humidity & temperature sensor family
|
5
|
+
class DHTxxSensor < HumitureSensor
|
6
|
+
|
7
|
+
def initialize(pin, sensor_model)
|
8
|
+
@pin = pin
|
9
|
+
@sensor_name = 'DHT'+sensor_model.to_s
|
10
|
+
@sensor_model = sensor_model.to_i
|
11
|
+
@temperature, @humidity = read_data
|
12
|
+
end
|
13
|
+
|
14
|
+
# Read values by 'DhtSensor.read' from 'dht-sensor-ffi'
|
15
|
+
def read_data
|
16
|
+
sensor_data = DhtSensor.read(@pin, @sensor_model)
|
17
|
+
@temperature = sensor_data.temp
|
18
|
+
@humidity = sensor_data.humidity
|
19
|
+
[@temperature, @humidity]
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
# DHT11 - junior model, lower presicion
|
25
|
+
class DHT11 < DHTxxSensor
|
26
|
+
def initialize(pin)
|
27
|
+
super(pin, 11)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
# DHT11 - senior model, higher presicion
|
32
|
+
class DHT22 < DHTxxSensor
|
33
|
+
def initialize(pin)
|
34
|
+
super(pin, 22)
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'effector'
|
2
|
+
|
3
|
+
RPi::GPIO.set_warnings(false)
|
4
|
+
RPi::GPIO.set_numbering :bcm
|
5
|
+
|
6
|
+
# DigitalEffector - effector/actuator with digitized control
|
7
|
+
class DigitalEffector < Effector
|
8
|
+
@pin = nil
|
9
|
+
@pins = {} # GPIO pins
|
10
|
+
|
11
|
+
def initialize(pins, state=:low)
|
12
|
+
@states = {}
|
13
|
+
@pins = pins
|
14
|
+
@pins.each_value do |pin|
|
15
|
+
RPi::GPIO.setup pin, :as => :output, :initialize => state
|
16
|
+
@states[pin] = (state == :high)
|
17
|
+
end
|
18
|
+
@pin = pins.values[0]
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.on(pin=@pin)
|
22
|
+
RPi::GPIO.set_high pin
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.off(pin=@pin)
|
26
|
+
RPi::GPIO.set_low pin
|
27
|
+
end
|
28
|
+
|
29
|
+
def on(pin=@pin)
|
30
|
+
BinaryEffector.on @pin
|
31
|
+
@states[pin] = true
|
32
|
+
end
|
33
|
+
|
34
|
+
def off(pin=@pin)
|
35
|
+
BinaryEffector.off @pin
|
36
|
+
@states[pin] = false
|
37
|
+
end
|
38
|
+
|
39
|
+
def on?(pin=@pin)
|
40
|
+
state = nil
|
41
|
+
if pin.class.name == 'Fixnum' # by number
|
42
|
+
state = @states[pin]
|
43
|
+
elsif @pins[pin] # by name
|
44
|
+
state = @states[@pins[pin]]
|
45
|
+
end
|
46
|
+
state
|
47
|
+
end
|
48
|
+
|
49
|
+
def off?(pin=@pin)
|
50
|
+
not on(pin)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
# DigitalActuator - synonym for DigitalEffector
|
55
|
+
class DigitalActuator < DigitalEffector
|
56
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'receptor'
|
2
|
+
|
3
|
+
# DigitalReceptor - receptor with digitized values
|
4
|
+
class DigitalReceptor < Receptor
|
5
|
+
@@one_wire_bus = '/sys/bus/w1/devices'
|
6
|
+
@sensor_file = nil
|
7
|
+
|
8
|
+
def self.one_wire_file(prefix='28*', device='w1_slave')
|
9
|
+
files = Dir[@@one_wire_bus+'/'+prefix]
|
10
|
+
if files.size > 0 then
|
11
|
+
@sensor_file = files[0]+'/'+device
|
12
|
+
end
|
13
|
+
@sensor_file
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
|
18
|
+
# DigitalSensor - a synonym for DigitalReceptor
|
19
|
+
class DigitalSensor < DigitalReceptor
|
20
|
+
end
|
data/lib/ds18b20.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'temperature_sensor'
|
2
|
+
|
3
|
+
# DS18B20 - high precision temperature sensor with 1-wire interface
|
4
|
+
class DS18B20 < TemperatureSensor
|
5
|
+
|
6
|
+
def initialize(device='w1_slave')
|
7
|
+
self.name = 'DS18B20'
|
8
|
+
@sensor_file = DigitalReceptor.one_wire_file('28*', device)
|
9
|
+
if @sensor_file
|
10
|
+
@temperature = read_data
|
11
|
+
else
|
12
|
+
raise "#{@sensor_name} - Sensor NOT FOUND!"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def read_data
|
17
|
+
File.open(@sensor_file, 'r') do |f|
|
18
|
+
value = f.read
|
19
|
+
@temperature = value.scan(/t=(\d+)/).flatten[0].to_i/1000.0
|
20
|
+
end
|
21
|
+
@temperature
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
data/lib/effector.rb
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
# https://github.com/ClockVapor/rpi_gpio
|
2
|
+
require 'rpi_gpio'
|
3
|
+
|
4
|
+
RPi::GPIO.set_warnings(false)
|
5
|
+
RPi::GPIO.set_numbering :bcm
|
6
|
+
|
7
|
+
# Effector - a controlled physical device that performs some (useful) action
|
8
|
+
class Effector
|
9
|
+
@model = 'N/A'
|
10
|
+
@name = 'N/A'
|
11
|
+
|
12
|
+
def name
|
13
|
+
@name
|
14
|
+
end
|
15
|
+
|
16
|
+
def model_name
|
17
|
+
@model
|
18
|
+
end
|
19
|
+
|
20
|
+
protected
|
21
|
+
def name=(name)
|
22
|
+
@name = name
|
23
|
+
end
|
24
|
+
|
25
|
+
def model_name=(name)
|
26
|
+
@model_name = name
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
# Actuator - a synonym for Effector
|
31
|
+
class Actuator < Effector
|
32
|
+
end
|
data/lib/hcsr501.rb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'temperature_sensor'
|
2
|
+
|
3
|
+
# HumitureSensor - combined humidity & temperature sensor
|
4
|
+
class HumitureSensor < TemperatureSensor
|
5
|
+
@humidity = 0.0
|
6
|
+
@temperature = 0.0
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
@humidity, @temperature = read_data
|
10
|
+
end
|
11
|
+
|
12
|
+
def read_data
|
13
|
+
[@humidity, @temperature]
|
14
|
+
end
|
15
|
+
|
16
|
+
# Humidity in per cents
|
17
|
+
def humidity
|
18
|
+
@humidity
|
19
|
+
end
|
20
|
+
|
21
|
+
# Temperature & humidity as a string
|
22
|
+
def to_s
|
23
|
+
sprintf "%5.2f°, %5.2f %%", @temperature, @humidity
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
data/lib/iot.rb
ADDED
data/lib/led.rb
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
require 'binary_effector'
|
2
|
+
|
3
|
+
# LED - Light Emitting Diode
|
4
|
+
class LED < BinaryEffector
|
5
|
+
def initialize(pin)
|
6
|
+
super(pin)
|
7
|
+
self.name = 'LED'
|
8
|
+
end
|
9
|
+
|
10
|
+
def on(pin=@pin)
|
11
|
+
super(pin)
|
12
|
+
end
|
13
|
+
|
14
|
+
def off(pin=@pin)
|
15
|
+
super(pin)
|
16
|
+
end
|
17
|
+
|
18
|
+
# Repeat 'repeat' times: light the LED for 'switched_on' secs, then pause for 'switched_off' secs
|
19
|
+
def blink(repeat=3, switched_on=0.25, switched_off=0.5)
|
20
|
+
repeat.times do |n|
|
21
|
+
on
|
22
|
+
sleep switched_on
|
23
|
+
off
|
24
|
+
sleep switched_off
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def on_for(seconds=1)
|
29
|
+
on
|
30
|
+
sleep seconds
|
31
|
+
off
|
32
|
+
end
|
33
|
+
|
34
|
+
def off_for(seconds=1)
|
35
|
+
off
|
36
|
+
sleep seconds
|
37
|
+
on
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
# Experimental methods with names in Russian
|
42
|
+
class LED
|
43
|
+
def LED.создать(pin = 25)
|
44
|
+
LED.new(pin)
|
45
|
+
end
|
46
|
+
|
47
|
+
def включить
|
48
|
+
on
|
49
|
+
end
|
50
|
+
|
51
|
+
def выключить
|
52
|
+
off
|
53
|
+
end
|
54
|
+
|
55
|
+
def мигать(repeat=3, switched_on=0.25, switched_off=0.5)
|
56
|
+
blink(repeat, switched_on, switched_off)
|
57
|
+
end
|
58
|
+
end
|