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

*

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 を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

  関連記事

Raspberry Pi2でPlanexのGW-450Dが動かなくなった

Raspberry Pi2上で何も考えずソフト類をアップグレードしたらカーネルの …

エサやりボタンを撤去しました

寒い! 寒くなってきましね。 水温を10度を切り始めたので、プラ舟ページに配置し …

福だるま 購入しました

新入り金魚 メイン水槽をリセットしたのでヤフオクで金魚を購入しました 福だるまと …

ウチの金魚たち

ウチに置いてある水槽の紹介 仕事場水槽 金魚水槽のページで配信している60cm水 …

Raspberry Pi2で外部から水槽のLEDを点灯する その2

前回でひとまずさくらVPS上のPHPから自宅水槽のLED照明をONにできるように …

Raspberry Pi ZEROをソーラーパネルで動かす

ソーラーパネルでラズパイ! 以前からソーラーパネルを使って電源の要らないRasp …

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

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

穂竜はじめました

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

Raspberry Pi2で室温、水温を計測してグラフ表示する

Raspberry Pi2に水温計と温度計を取り付け、10分ごとに室温と水温を計 …

プラ舟に外部フィルター追加

安かったのでつい・・・ ヤフオクで安い中古の外部フィルターが売っていたので衝動買 …