From 5c49f7c2e46d6fced0763094ec05bba41298cbed Mon Sep 17 00:00:00 2001 From: Julian Blake Kongslie Date: Thu, 25 Jul 2024 13:28:55 -0700 Subject: Initial working version. --- read.rb | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100755 read.rb (limited to 'read.rb') diff --git a/read.rb b/read.rb new file mode 100755 index 0000000..5f8182e --- /dev/null +++ b/read.rb @@ -0,0 +1,56 @@ +#!/usr/bin/ruby -w + +require "enumerable/statistics" +require "serialport" + +SENSOR_BITS = 12 +SENSOR_MAX = (1 << SENSOR_BITS) - 1 + +$stdout.sync = true +def log(msg) + $stdout.write("#{Time.now.strftime("%H:%M:%S")} #{msg}\n") + $stdout.flush +end + +sensors = [] + +SerialPort.open("/dev/ttyACM1", 115200, 8, 1, SerialPort::NONE) do | port | + + log("Allowing sensors to settle...") + + sleep(3) + begin + port.read_nonblock(16 << 20) + rescue IO::WaitReadable + end + port.readline + + log("Reading soil moisture sensors...") + + 10.times do + raw = port.readline + raise "Cannot parse sensor results #{raw.inspect}" unless raw =~ /\[([^\]]+)\]/ + + sensors << $1.split(/\s+/).filter { | x | not x.empty? }.map { | x | x.to_i } + + log("Raw sensor results: \t#{sensors[-1].join("\t")}") + end + +end + +avgsensors = [] +stdsensors = [] + +sensors.transpose.each do | sensor | + avgsensors << sensor.mean.round + stdsensors << sensor.stdev.round +end + +log("Avg sensor results: \t#{avgsensors.join("\t")} \t(per sensor)") +log("SDv sensor results: \t#{stdsensors.join("\t")} \t(per sensor)") + +avg = sensors.flatten.mean.round +std = sensors.flatten.stdev.round + +log("Avg sensor results: \t#{avg} \t(#{(100.0 * avg.to_f / SENSOR_MAX.to_f).round}%) \t(overall)") +log("SDv sensor results: \t#{std} \t(overall)") -- cgit v1.2.3