Raspberry Pi2を使ってリモートで餌やりをする
2015/09/29
ブログからガレージの金魚にエサをやる
以前からやろうやろうと先延ばしにしてたエサやりのシステムが完成しました!
プラ船のページで完成品が見れます。
是非一度エサやりにきてください
以下にハウツーを残します
ハードウェア
材料
- ホームセンターで売られてる端材の詰め合わせ
- 100均の小さいタッパー
- ペットボトル
- トイレットペーパーの芯
- サーボモーター SG90
モーターにタッパーを取り付けて穴あけ
モーターが回ったときエサが飛び散るのでペットボトルを切ってカバーにします
配線やらソフトウェアの設定は前の記事を参考にしてください
ソフトウェア
続いてソフトウェア
無制限にボコボコとエサをやられたら水があっという間にダメになるので制限をかけます
仕様
- 最後にエサをやった時刻から3時間経過していればエサがやれる
- エサをやれる時刻は10時から20時までの間
- 毎日10時に一度自動でエサをやる
Raspberry Pi2側
まずエサをやった時刻をさくらVPSのDBに保存します
// サクラVPS側 <?php if (!array_key_exists('tbl', $_POST)) { exit; } require_once('./db_conf.php'); $pdo = getPDO(); $pdo->prepare('insert feed_log value()')->execute(); $pdo = null; ?>
ガレージのRaspberry Pi2からさくらVPSへ送信
#!/usr/bin/env ruby # -*- coding: utf-8 -*- require 'uri' require 'net/http' def http_request(method, uri, query_hash={}) query = query_hash.map{|k, v| "#{k}=#{v}"}.join('&') #ハッシュをオプションの書式に変換 query_escaped = URI.escape(query) uri_parsed = URI.parse(uri) http = Net::HTTP.new(uri_parsed.host) case method.downcase! when 'get' return http.get(uri_parsed.path + '?' + query_escaped).body when 'post' return http.post(uri_parsed.path, query_escaped).body end end #POSTで送るだけ http_request('POST', '送信先URL', {:tbl=> 'g'})
サーボブラスターを使ってエサの入ったタッパーを回転させる
#!/bin/sh echo 3=100% > /dev/servoblaster sleep 1 echo 3=20% > /dev/servoblaster #さくらVPSへログ送信 /usr/local/bin/send-feed-log
Sangoのサブスクライバに追記
#!/usr/bin/env ruby # -*- coding: utf-8 -*- require 'rubygems' require 'mqtt' MQTTHOST = "std1.mqtt.shiguredo.jp" USERNAME = "ユーザー名" PASSWORD = "パスワード" # MQTTに接続するためのクライアントを作成します client = MQTT::Client.new( MQTTHOST, :username => USERNAME, :password => PASSWORD, :keep_alive => 60 ) # 接続します client.connect do |c| # Subscribeします TOPIC = "ユーザー名/#" c.get(TOPIC) do |topic, message| # # 他省略 # #feed ←エサ用トピック追加 if topic == "ユーザー名/feed" `/usr/local/bin/feed` end end end
ブログ側
最後にエサをやった時刻と、次にエサをやれる時刻をJSONで出力する
require_once('./db_conf.php'); $pdo = getPDO(); $ret = array(); // エサやり最終時刻を取得 $sql_ret = $pdo->query("select * FROM feed_log ORDER BY id DESC LIMIT 1")->fetchAll(PDO::FETCH_ASSOC); $ret['latest'] = $sql_ret[0]['on_at']; $pdo = null; $ret['next'] = ""; // 次のエサやり時刻 if((date('Hi') + 0) > 2000 ) { $ret['next'] = date("Y-m-d", strtotime("+1 day" )) . " 13:00:00"; }else if((date('Hi') + 0) < 1000 ) { $ret['next'] = date("Y-m-d") . " 13:00:00"; }else{ $ret['next'] = date("Y-m-d H:i:s", strtotime($ret['latest'] . " +3 hour")); // 次にエサをやれる時刻が20時以降の場合は翌日の13時とする if(date("Hi", strtotime($ret['next'])) > 2000) { $ret['next'] = date("Y-m-d", strtotime("+1 day" )) . " 13:00:00"; } } header('Access-Control-Allow-Origin: *'); header('Content-type: application/json'); echo json_encode($ret, JSON_PRETTY_PRINT);
エサやりボタン押下でSangoを使ってガレージのRaspberry Pi2にキューを飛ばす
if (!array_key_exists('from', $_POST)) { exit; } require_once('./phpMQTT.php'); require_once('./db_conf.php'); $pdo = getPDO(); // エサやり時刻チェック $cnt = $pdo->query('select count(*) as cnt from feed_log where on_at > (now() - interval 3 hour)')->fetch(PDO::FETCH_ASSOC); $pdo = null; if($cnt['cnt'] === 0) { $mqtt = new phpMQTT("tcp://std1.mqtt.shiguredo.jp", 1883, md5(time())); if ($mqtt->connect(null,null,'ユーザー名', 'パスワード')) { $mqtt->publish("ユーザー名/feed","",0); $mqtt->close(); } }
これで一先ずやりたい事は実装できた感じ
やぶ蚊に刺されず屋内から金魚を眺めながらエサがやれるようになりました!
おかげで人には懐かずカメラに懐いてしまった・・・人が近づくと逃げますがカメラが動くとエサくれーしますw
関連記事
-
プラ舟のカメラ復活しました
カメラの首振りができなくなっていた プラ船のカメラが横方向に動かなくなっていたの …
-
金魚が病気の為、隔離しました
配信中の金魚水槽ですが、金魚が病気で1匹死んでしまったので隔離しました メイン水 …
-
プラ舟に外部フィルター追加
安かったのでつい・・・ ヤフオクで安い中古の外部フィルターが売っていたので衝動買 …
-
みんなのラズパイコンテストにて受賞しました
ラズパイマガジンと日経Linux、日経ソフトウエア様の みんなのラズパイコンテス …
-
穂竜水槽のフィルターを交換
穂竜が挟まる! 金魚水槽のページで配信している穂竜たちですが、非常にドン臭く よ …
-
45cm水槽を修理してみた
大昔に使ってた45cm水槽が出てきたので洗って使おうと思ったんですが水漏れしてま …
-
RaspberryPi2を使ったリモートのエサやりボタン復活しました
春がきた 春になり水温が上がってきたのでプラ舟ページのエサやりボタンを復活させま …
-
福だるま 購入しました
新入り金魚 メイン水槽をリセットしたのでヤフオクで金魚を購入しました 福だるまと …
-
プラ舟はじめました
プラ船買っちゃった 金魚にだだハマりなGW ついにプラ船買ってガレージに設置して …
-
エサやりボタンを撤去しました
寒い! 寒くなってきましね。 水温を10度を切り始めたので、プラ舟ページに配置し …
- PREV
- ピンポンパール投入しました
- NEXT
- Raspberry Pi2に2台のカメラを繋いで同時配信する
Comment
こんにちは。初めまして。ponと申します。
ラズパイを使った水槽への自動給餌機に興味があり、情報を探していたところ、こちらの記事に出会いました。
いくつかお聞きしたいことがあるのですが、よろしいでしょうか?
ご連絡お待ちしております。
答えられる範囲であればー