summaryrefslogtreecommitdiff
path: root/read.rb
diff options
context:
space:
mode:
authorJulian Blake Kongslie2024-07-25 13:28:55 -0700
committerJulian Blake Kongslie2024-07-25 13:28:55 -0700
commit5c49f7c2e46d6fced0763094ec05bba41298cbed (patch)
tree951d9fd4744eec31557274e3af659aab01185436 /read.rb
downloadrivulet-5c49f7c2e46d6fced0763094ec05bba41298cbed.tar.xz
Initial working version.HEADmain
Diffstat (limited to 'read.rb')
-rwxr-xr-xread.rb56
1 files changed, 56 insertions, 0 deletions
diff --git a/read.rb b/read.rb
new file mode 100755
index 0000000..5f8182e
--- /dev/null
+++ b/read.rb
@@ -0,0 +1,56 @@
1#!/usr/bin/ruby -w
2
3require "enumerable/statistics"
4require "serialport"
5
6SENSOR_BITS = 12
7SENSOR_MAX = (1 << SENSOR_BITS) - 1
8
9$stdout.sync = true
10def log(msg)
11 $stdout.write("#{Time.now.strftime("%H:%M:%S")} #{msg}\n")
12 $stdout.flush
13end
14
15sensors = []
16
17SerialPort.open("/dev/ttyACM1", 115200, 8, 1, SerialPort::NONE) do | port |
18
19 log("Allowing sensors to settle...")
20
21 sleep(3)
22 begin
23 port.read_nonblock(16 << 20)
24 rescue IO::WaitReadable
25 end
26 port.readline
27
28 log("Reading soil moisture sensors...")
29
30 10.times do
31 raw = port.readline
32 raise "Cannot parse sensor results #{raw.inspect}" unless raw =~ /\[([^\]]+)\]/
33
34 sensors << $1.split(/\s+/).filter { | x | not x.empty? }.map { | x | x.to_i }
35
36 log("Raw sensor results: \t#{sensors[-1].join("\t")}")
37 end
38
39end
40
41avgsensors = []
42stdsensors = []
43
44sensors.transpose.each do | sensor |
45 avgsensors << sensor.mean.round
46 stdsensors << sensor.stdev.round
47end
48
49log("Avg sensor results: \t#{avgsensors.join("\t")} \t(per sensor)")
50log("SDv sensor results: \t#{stdsensors.join("\t")} \t(per sensor)")
51
52avg = sensors.flatten.mean.round
53std = sensors.flatten.stdev.round
54
55log("Avg sensor results: \t#{avg} \t(#{(100.0 * avg.to_f / SENSOR_MAX.to_f).round}%) \t(overall)")
56log("SDv sensor results: \t#{std} \t(overall)")