diff options
Diffstat (limited to 'read.rb')
| -rwxr-xr-x | read.rb | 56 |
1 files changed, 56 insertions, 0 deletions
| @@ -0,0 +1,56 @@ | |||
| 1 | #!/usr/bin/ruby -w | ||
| 2 | |||
| 3 | require "enumerable/statistics" | ||
| 4 | require "serialport" | ||
| 5 | |||
| 6 | SENSOR_BITS = 12 | ||
| 7 | SENSOR_MAX = (1 << SENSOR_BITS) - 1 | ||
| 8 | |||
| 9 | $stdout.sync = true | ||
| 10 | def log(msg) | ||
| 11 | $stdout.write("#{Time.now.strftime("%H:%M:%S")} #{msg}\n") | ||
| 12 | $stdout.flush | ||
| 13 | end | ||
| 14 | |||
| 15 | sensors = [] | ||
| 16 | |||
| 17 | SerialPort.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 | |||
| 39 | end | ||
| 40 | |||
| 41 | avgsensors = [] | ||
| 42 | stdsensors = [] | ||
| 43 | |||
| 44 | sensors.transpose.each do | sensor | | ||
| 45 | avgsensors << sensor.mean.round | ||
| 46 | stdsensors << sensor.stdev.round | ||
| 47 | end | ||
| 48 | |||
| 49 | log("Avg sensor results: \t#{avgsensors.join("\t")} \t(per sensor)") | ||
| 50 | log("SDv sensor results: \t#{stdsensors.join("\t")} \t(per sensor)") | ||
| 51 | |||
| 52 | avg = sensors.flatten.mean.round | ||
| 53 | std = sensors.flatten.stdev.round | ||
| 54 | |||
| 55 | log("Avg sensor results: \t#{avg} \t(#{(100.0 * avg.to_f / SENSOR_MAX.to_f).round}%) \t(overall)") | ||
| 56 | log("SDv sensor results: \t#{std} \t(overall)") | ||
