大阪近郊で活動するフリーランスエンジニアのブログです 技術情報とか趣味など

*

Raspberry Pi2を使ってリモートで餌やりをする

      2015/09/29

ブログからガレージの金魚にエサをやる

以前からやろうやろうと先延ばしにしてたエサやりのシステムが完成しました!
プラ船のページで完成品が見れます。
是非一度エサやりにきてください

以下にハウツーを残します

ハードウェア

まずはエサやり機を自作します
P_20150928_151827

材料

  • ホームセンターで売られてる端材の詰め合わせ
  • 100均の小さいタッパー
  • ペットボトル
  • トイレットペーパーの芯
  • サーボモーター SG90

P_20150928_151817
モーターにタッパーを取り付けて穴あけ
モーターが回ったときエサが飛び散るのでペットボトルを切ってカバーにします

P_20150928_151934_HDR
後はフタの隙間にエサが流れるように設置

配線やらソフトウェアの設定は前の記事を参考にしてください

ソフトウェア

続いてソフトウェア
無制限にボコボコとエサをやられたら水があっという間にダメになるので制限をかけます

仕様

  • 最後にエサをやった時刻から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

 - php, Raspberry Pi, ruby, 金魚 , , , ,

  • このエントリーをはてなブックマークに追加
  • にほんブログ村 観賞魚ブログ 金魚へ

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

  関連記事

RaspberryPi2で動画配信しながら写真も撮りたい

金魚デカくなった? 金魚にエサやってると4月の初頭から飼い始めた琉金が1周り大き …

45cm水槽を修理してみた

大昔に使ってた45cm水槽が出てきたので洗って使おうと思ったんですが水漏れしてま …

100均のタッパーで投げ込み式ろ過器を自作する

ジャンボタライにろ過器を追加したい ベランダ水槽のジャンボタライなのですが、60 …

金魚が病気の為、隔離しました

配信中の金魚水槽ですが、金魚が病気で1匹死んでしまったので隔離しました メイン水 …

プラ舟に水中ライトを設置

ライトが暗い! 配信中のプラ船ページですが、以前からライトが暗いので水中ライトを …

Raspberry Pi2に2台のカメラを繋いで同時配信する

水槽増えたんだけどまたパイ買うの? 先日新しく45cm水槽を買いまして買ったなら …

プラ舟に水中カメラ設置

水中カメラを設置したい プラ舟ページで配信しているカメラですが、 鳥やネコ避けの …

プラ船 復活しました

先日ネコに襲撃され破られた金網ですが、1枚ものの塩ビ板でフタをすることにしました …

プラ舟のカメラ復活しました

カメラの首振りができなくなっていた プラ船のカメラが横方向に動かなくなっていたの …

Sangoのメッセージ数について聞いてみた

メッセージ数が足りない! 金魚水槽のページやトップページからライトを点灯するのに …