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

*

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, 金魚 , , , ,

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

Comment

  1. pon より:

    こんにちは。初めまして。ponと申します。
    ラズパイを使った水槽への自動給餌機に興味があり、情報を探していたところ、こちらの記事に出会いました。
    いくつかお聞きしたいことがあるのですが、よろしいでしょうか?
    ご連絡お待ちしております。

Message

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

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

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

  関連記事

45cm水槽を修理してみた

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

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

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

RaspberryPi2を使ったリモートのエサやりボタン復活しました

春がきた 春になり水温が上がってきたのでプラ舟ページのエサやりボタンを復活させま …

福だるま購入しました

福だるま?玉サバ? ちょっと前、寝室に60cm水槽に立ち上げた水槽へ福だるまを4 …

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

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

Raspberry Pi ZEROでGW-450D2(無線LANドングル)を使う

ZERO買っちゃった Pimoroniで入荷しているのを見たのでRaspberr …

プラ舟に水中カメラ設置

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

Raspberry Pi2でリモコンを使って水槽の照明をつける

リモコン操作で照明をつける Web上からRaspberry Pi2で水槽の照明を …

穂竜はじめました

先日新しく45cm水槽を立ち上げてまして穂竜という金魚を飼いはじめました。 高頭 …

Raspberry Pi2でプラ船のカメラを動かす

カメラの首振り プラ舟内に設置しているカメラにサーボを取り付けて遠隔からカメラの …