raspberry_pi_iot 0.0.6
Sign up to get free protection for your applications and to get access to all the features.
- 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
|