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.
- checksums.yaml +5 -5
- data/doc/IoT.html +8 -6
- data/doc/{Bus.html → RaspberryPiIoT.html} +21 -26
- data/doc/_index.html +84 -77
- data/doc/class_list.html +1 -1
- data/doc/file.LICENSE.html +92 -0
- data/doc/file.README.html +63 -29
- data/doc/file_list.html +5 -0
- data/doc/frames.html +1 -1
- data/doc/index.html +63 -29
- data/doc/method_list.html +170 -202
- data/doc/top-level-namespace.html +4 -6
- data/lib/bus.rb +0 -2
- data/lib/iot.rb +4 -2
- data/lib/iot/actuator.rb +7 -0
- data/lib/iot/bh1750.rb +54 -0
- data/lib/iot/binary_actuator.rb +7 -0
- data/lib/iot/binary_effector.rb +11 -0
- data/lib/iot/binary_receptor.rb +20 -0
- data/lib/iot/binary_sensor.rb +7 -0
- data/lib/iot/bmx_sensor.rb +73 -0
- data/lib/iot/button.rb +100 -0
- data/lib/iot/dht_sensor.rb +41 -0
- data/lib/iot/digital_actuator.rb +7 -0
- data/lib/iot/digital_effector.rb +67 -0
- data/lib/iot/digital_receptor.rb +17 -0
- data/lib/iot/digital_sensor.rb +7 -0
- data/lib/iot/ds18b20.rb +25 -0
- data/lib/iot/effector.rb +32 -0
- data/lib/iot/hcsr501.rb +8 -0
- data/lib/iot/humiture_sensor.rb +27 -0
- data/lib/iot/led.rb +64 -0
- data/lib/iot/led_pwm.rb +8 -0
- data/lib/iot/led_rgb.rb +86 -0
- data/lib/iot/max44009.rb +84 -0
- data/lib/iot/receptor.rb +38 -0
- data/lib/iot/sensor.rb +8 -0
- data/lib/iot/temperature_sensor.rb +51 -0
- data/lib/raspberry_pi.rb +46 -1
- data/lib/raspberry_pi_iot.rb +9 -3
- data/lib/raspberry_pi_iot/version.rb +3 -0
- data/lib/thermal_sensor.rb +2 -3
- data/test/test.sh +17 -0
- data/test/test.txt +173 -0
- data/test/test_Raspberry_Pi_IoT.rb +10 -0
- data/test/test_bh1750.rb +9 -4
- data/test/{standalone_test_bmp280.rb → test_bme280.rb} +24 -19
- data/test/test_bmp280.rb +52 -0
- data/test/test_button.rb +25 -14
- data/test/test_dht11.rb +3 -3
- data/test/test_dht22.rb +35 -0
- data/test/test_ds18b20.rb +4 -3
- data/test/test_helper.rb +6 -0
- data/test/test_info.rb +24 -3
- data/test/test_ky008.rb +41 -0
- data/test/test_led.rb +9 -9
- data/test/test_led_rgb.rb +28 -5
- data/test/test_max44009_gy49.rb +4 -4
- data/test/test_thermal.rb +27 -0
- metadata +103 -59
- data/doc/Actuator.html +0 -145
- data/doc/BH1750.html +0 -541
- data/doc/BME280.html +0 -276
- data/doc/BMP280.html +0 -276
- data/doc/BMxSensor.html +0 -557
- data/doc/BinaryActuator.html +0 -177
- data/doc/BinaryEffector.html +0 -246
- data/doc/BinaryReceptor.html +0 -387
- data/doc/BinarySensor.html +0 -168
- data/doc/Button.html +0 -986
- data/doc/DHT11.html +0 -287
- data/doc/DHT22.html +0 -287
- data/doc/DHTxxSensor.html +0 -361
- data/doc/DS18B20.html +0 -339
- data/doc/DigitalActuator.html +0 -164
- data/doc/DigitalEffector.html +0 -636
- data/doc/DigitalReceptor.html +0 -242
- data/doc/DigitalSensor.html +0 -162
- data/doc/Effector.html +0 -257
- data/doc/HCSR501.html +0 -172
- data/doc/HumitureSensor.html +0 -453
- data/doc/LED.html +0 -784
- data/doc/MAX44009.html +0 -830
- data/doc/RaspberryPi.html +0 -317
- data/doc/Receptor.html +0 -257
- data/doc/Sensor.html +0 -145
- data/doc/TemperatureSensor.html +0 -644
- data/lib/bh1750.rb +0 -46
- data/lib/binary_actuator.rb +0 -5
- data/lib/binary_effector.rb +0 -12
- data/lib/binary_receptor.rb +0 -19
- data/lib/binary_sensor.rb +0 -5
- data/lib/bmx_sensor.rb +0 -85
- data/lib/button.rb +0 -70
- data/lib/dht_sensor.rb +0 -36
- data/lib/digital_actuator.rb +0 -5
- data/lib/digital_effector.rb +0 -69
- data/lib/digital_receptor.rb +0 -16
- data/lib/digital_sensor.rb +0 -5
- data/lib/ds18b20.rb +0 -24
- data/lib/effector.rb +0 -32
- data/lib/hcsr501.rb +0 -7
- data/lib/humiture_sensor.rb +0 -26
- data/lib/led.rb +0 -58
- data/lib/led_pwm.rb +0 -6
- data/lib/led_rgb.rb +0 -101
- data/lib/max44009.rb +0 -77
- data/lib/receptor.rb +0 -33
- data/lib/temperature_sensor.rb +0 -49
data/lib/bh1750.rb
DELETED
@@ -1,46 +0,0 @@
|
|
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(device_address=DEVICE, bus_number=1)
|
18
|
-
@sensor_name = 'BH1750'
|
19
|
-
Bus::I2C.bus_number = bus_number
|
20
|
-
@device_address = device_address
|
21
|
-
|
22
|
-
@i2c_bus = Bus::I2C.bus
|
23
|
-
@device = I2CDevice.new(address: DEVICE, driver: I2CDevice::Driver::I2CDev.new(@i2c_bus))
|
24
|
-
@resolution = ONE_TIME_HIGH_RES_MODE_1
|
25
|
-
@length = 2
|
26
|
-
@value = read_sensor
|
27
|
-
end
|
28
|
-
|
29
|
-
# Read raw data from sensor and convert it to numeric
|
30
|
-
def read_sensor
|
31
|
-
data = @device.i2cget(@resolution, @length)
|
32
|
-
@value = to_f(data)
|
33
|
-
end
|
34
|
-
|
35
|
-
# Return value in Lux
|
36
|
-
def lux
|
37
|
-
read_sensor
|
38
|
-
@value
|
39
|
-
end
|
40
|
-
|
41
|
-
private
|
42
|
-
# Convert 2 bytes of sensor data to a float number
|
43
|
-
def to_f(data)
|
44
|
-
return ((data[1].ord + (256 * data[0].ord)) / 1.2)
|
45
|
-
end
|
46
|
-
end
|
data/lib/binary_actuator.rb
DELETED
data/lib/binary_effector.rb
DELETED
data/lib/binary_receptor.rb
DELETED
@@ -1,19 +0,0 @@
|
|
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
|
data/lib/binary_sensor.rb
DELETED
data/lib/bmx_sensor.rb
DELETED
@@ -1,85 +0,0 @@
|
|
1
|
-
gem 'i2c'
|
2
|
-
require 'i2c'
|
3
|
-
gem 'i2c-bme280'
|
4
|
-
require 'i2c/bme280'
|
5
|
-
require 'humiture_sensor'
|
6
|
-
|
7
|
-
# BMP/BME humidity, temperature & atmospheric pressure sensor family
|
8
|
-
class BMxSensor < HumitureSensor
|
9
|
-
|
10
|
-
def initialize(sensor_name, bus=1)
|
11
|
-
@sensor_name = sensor_name
|
12
|
-
@sensor = I2C::Driver::BME280.new(device: bus)
|
13
|
-
@temperature, @humidity, @pressure = read_data
|
14
|
-
end
|
15
|
-
|
16
|
-
def read_data
|
17
|
-
data = @sensor.all
|
18
|
-
@temperature = data[:t]
|
19
|
-
@pressure = data[:p]
|
20
|
-
@humidity = data[:h]
|
21
|
-
[@temperature, @humidity, @pressure]
|
22
|
-
end
|
23
|
-
|
24
|
-
# standard atmospheric pressure @ sea level = 1.01325 bar = 1013.25 mbar = 101.325 kPa
|
25
|
-
def hPa
|
26
|
-
@pressure
|
27
|
-
end
|
28
|
-
|
29
|
-
def pressure(mode=:hPa)
|
30
|
-
case mode
|
31
|
-
when :hPa # 1 hPa = 100 Pa = 1 mbar = 1 hPa = 0.750062 mmHg [@ 0°C]
|
32
|
-
hPa
|
33
|
-
when :kPa # 1 kPa = 1000 Pa = 10 hPa
|
34
|
-
hPa / 10.0
|
35
|
-
when :Pa # 1 Pa = 0.01 hPa = 0.001 kPa
|
36
|
-
hPa * 100.0
|
37
|
-
when :mmHg # 1 mmHg = 1.3332236842105263 hPa = 133.322387415 Pa = 1.000000142466321... Torr
|
38
|
-
hPa / (1013.25 / 760) # 760 mmHg = 101.3250144354 kPa
|
39
|
-
when :atm # 1 atm = 101325 Pa = 101.325 kPa
|
40
|
-
hPa / 1013.25
|
41
|
-
when :bar # 1 bar ≡ 100000 Pa = 1000 hPa = 0.987 atm = 750.06 mmHg = 750.06 Torr
|
42
|
-
hPa / 1000.0
|
43
|
-
when :mbar # 1 mbar = 0.001 bar
|
44
|
-
bar * 1000.0
|
45
|
-
when :Torr # 1 Torr = 1/760 atm = 101325/760 Pa = 0.999999857533699... mmHg
|
46
|
-
(hPa / 1013.25) / 760
|
47
|
-
else
|
48
|
-
hPa
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
def to_s
|
53
|
-
sprintf "%5.2f°C, %5.2f %%, %5.2f mmHg", @temperature, @humidity, pressure(:mmHg)
|
54
|
-
end
|
55
|
-
|
56
|
-
# OLD implementation with 'i2c-devices.gem'
|
57
|
-
#require 'bus'
|
58
|
-
#require 'i2c/device/bme280'
|
59
|
-
|
60
|
-
# BMP/BME humidity, temperature & atmospheric pressure sensor family
|
61
|
-
# def initialize(sensor_name)
|
62
|
-
# @sensor_name = sensor_name
|
63
|
-
# @sensor = I2CDevice::Bme280.new
|
64
|
-
# @temperature, @humidity, @pressure = read_data
|
65
|
-
# end
|
66
|
-
# def read_data
|
67
|
-
# data = @sensor.calc_sensor_data
|
68
|
-
# @temperature = data[:temp]
|
69
|
-
# @pressure = data[:pressure]
|
70
|
-
# @humidity = data[:hum]
|
71
|
-
# [@temperature, @humidity, @pressure]
|
72
|
-
# end
|
73
|
-
end
|
74
|
-
|
75
|
-
class BMP280 < BMxSensor
|
76
|
-
def initialize
|
77
|
-
super('BMP280')
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
|
-
class BME280 < BMxSensor
|
82
|
-
def initialize
|
83
|
-
super('BME280')
|
84
|
-
end
|
85
|
-
end
|
data/lib/button.rb
DELETED
@@ -1,70 +0,0 @@
|
|
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
DELETED
@@ -1,36 +0,0 @@
|
|
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
|
data/lib/digital_actuator.rb
DELETED
data/lib/digital_effector.rb
DELETED
@@ -1,69 +0,0 @@
|
|
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
|
-
!on?(pin)
|
51
|
-
end
|
52
|
-
|
53
|
-
private
|
54
|
-
def pin_number(pin)
|
55
|
-
if pin.class.name == 'Fixnum' # by number
|
56
|
-
pin
|
57
|
-
elsif @pins[pin] # by name
|
58
|
-
@pins[pin]
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
def high?(pin=@pin)
|
63
|
-
RPi::GPIO.high? pin
|
64
|
-
end
|
65
|
-
|
66
|
-
def low?(pin=@pin)
|
67
|
-
RPi::GPIO.low? pin
|
68
|
-
end
|
69
|
-
end
|
data/lib/digital_receptor.rb
DELETED
@@ -1,16 +0,0 @@
|
|
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
|
data/lib/digital_sensor.rb
DELETED
data/lib/ds18b20.rb
DELETED
@@ -1,24 +0,0 @@
|
|
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 "#{self.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
DELETED
@@ -1,32 +0,0 @@
|
|
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
|