Ruby
Rails
Arduino
通信

ArduinoとRails(Ruby)を繋げて入室管理を作ってみた

概要

研究室でハッカソンみたいなことしよう!(深夜1:00)みたいなノリがあって、作ってみました。
作ったのは入室管理システムです。
arduinoをrailsでシリアル通信する記事少なかったので,
こんな風に書きますよーっての紹介(参考までに)

使用したgem

https://github.com/hparra/ruby-serialport

内容

そんなに細かく書かないです。

Model
・ Student /学生
・ LabStatus /研究室の状況
など

require 'active_record'
namespace :arduino_data do
  desc 'Get arduino status 1 or 0'
  task :receiver => :environment do
    SerialPort.open('/dev/cu.usbmodem1421', 9600, 8, 1, 0) do |sp|
      sp.read_timeout = 10000000
      begin
        arduino_data = sp.readline.slice(0)
        time_now = Time.now

        config = YAML.load_file('./config/database.yml')

        ActiveRecord::Base.establish_connection(config["development"])

        #研究室に人がいる場合
        if arduino_data == '1' && !LabStatus.where(exit_time: nil).present?
          lab_record = LabStatus.new
          lab_record.light_entry = arduino_data
          lab_record.entry_time = time_now
          lab_record.save
        #研究室に人がいない場合
        elsif arduino_data == '0' && LabStatus.where(exit_time: nil).present?
          puts "get 0"
          lab_record = LabStatus.where(exit_time: nil).last
          lab_record.light_entry = arduino_data
          lab_record.exit_time = time_now
          lab_record.update(light_entry: arduino_data, exit_time: time_now)

          #are_you_now status of all students change false 
          Student.all.each do |student|
            student.total_time += student.exit_time.strftime("%H").to_i - student.entry_time.strftime("%H").to_i
            student.save
          end
          Student.all.update_all(entry_time: nil, exit_time: nil, are_you_now: 0)
        #ardinoからの値が取得されない場合やその他の挙動
        else
          puts 'not mutch'
        end

        if @line.present?
          break
        end
      rescue EOFError
        break
      end
    end
  end
end

自分の作ったapplicationから一部を切り抜いてきました。
https://github.com/ryotamorohashi/furulab

まとめ

Socket通信やらSerial通信やら興味あるので、知見を深めていきたいなーって思います。

dormvicfirthさん、khskさん編集リクエストありがとうございます。
ささっと書いたので誤字多いですが、悪しからず。