Edited at

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さん編集リクエストありがとうございます。

ささっと書いたので誤字多いですが、悪しからず。