코코아팹은 누구나 창의적 아이디어를 현실로 만들어 낼 수 있도록
만들고, 공유하고, 배울 수 있는 터전이
되고자 합니다.
아이디와 비밀번호를 잊으셨나요?아이디 / 비밀번호 찾기
코코아팹 회원이 아니신가요? 회원가입
2014-07-28 07:06:17
여러분이 집 밖에 있거나 몸이 안 좋을 때에도 털북숭이 친구의 물 그릇을 자동으로
채워주는 알리미를 소개합니다. 두 개의 자작센서를 마이크로 컨트롤러와 연결해서
애완동물이 마시는 물 그릇의 높이를 측정해 물이 없으면 펌프를 자동으로 작동시켜
물통에서 물을 채우고, 만약 물통의 물이 모두 떨어지면 트윗을 보냅니다.
제가 만든 시스템의 중심은 아두이노 마이크로 컨트롤러로, 두 개의 센서를 읽고 물의
흐름을 제어하는 역할을 합니다. 센서는 트랜지스터에 전선 몇 개만 연결하면 간단하게
만들 수 있습니다. 물통은 어떤 크기라도 상관없지만 저는 10리터 짜리 물통을
사용했습니다. 적당히 오래 쓸 수도 있으면서 너무 무겁지는 않으니까요. 이 물통의
바닥에 설치한 수족관펌프에서 나오는 물로 물 그릇을 채우게 됩니다.
트위터 기능은 아두이노 이더넷실드(와이파이실드가 좋은 분은 와이파이 실드를 써도
됩니다)로만들었습니다. 물통이 비었거나 센서가 고장이나서 코드로 설정한 시간이
지났음에도 불구하고 물 그릇이 채워지지 않는 다면 자동으로 물통의 마개를 닫고 오류가
발생했다고 트윗을 하므로, 여러분은 금방집으로 달려와 애완동물의 물통을 채워 줄 수
있답니다.
/************************************************
* Author: Eloy Salinas
* Project: Pet Water Warden
* Company: Make Magazine // RadioShack
* Date: 8/8/13
* Version: 1.0
* http://makezine.com/projects/petwaterwarden/
*************************************************/
//Twitter capabilities thanks to http://arduino-tweet.appspot.com/
//Ethernet Shield Version
#include <SPI.h>
#include <Ethernet.h>//Included with Arduino V1.0 and higher
#include <Twitter.h>//Lib from Arduino Tweet
//Twitter info
// Your Token to Tweet (get it from http://arduino-tweet.appspot.com/)
Twitter twitter("Your-Token-Here");
// Message to post to twitter in case of a fail
charmsg[] ="Pet Water Warden Error: Please check my water!";
//Network information (Only edit if not using default mode).
//Default mode is Auto DHCP, your router will assign an ip address.
//Only fill in ip, gateway, and subnet if not using auto DHCP
byte mac[] = {
0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // this can be made up
byteip[] = {
0, 0, 0, 0 }; // a free IP address on your network
byte gateway[] = {
0, 0, 0, 0 }; // the gateway address of your network
byte subnet[] = {
0, 0, 0, 0 }; // the subnet mask of your network
//Set output pin 8 to control switchtail/pump
constint pump =8;
//Failsafe off
longtimerA=0;
intwardenFailed=0; // Flag incase something goes wrong
voidsetup() {
// initialize serial communication at 9600 bits per second:
Serial.begin(9600);
//Set pump output pin
pinMode(pump, OUTPUT);
//Start with pump off
digitalWrite(pump, LOW);
//If not using auto DHCP use Ethernet.begin(mac, ip, gateway, subnet);
Ethernet.begin(mac); //begins the Ethernet connection and uses automatic DHCP
Serial.begin(9600); // starts serial communications so we can debug easier
delay(1000); // a 1 second delay to let everything settle down!
// attempt a DHCP connection:
Serial.println("Attempting to get an IP address using DHCP:");
if (!Ethernet.begin(mac)) {
// if DHCP fails, start with a hard-coded address:
Serial.println("failed to get an IP address using DHCP, trying manually");
Ethernet.begin(mac, ip);
}
Serial.print("My address:");
Serial.println(Ethernet.localIP());
//Test Twitter
Serial.println("Pet Water Warden testing twitter connection...");
if (twitter.post("Pet Water Warden is up and running!!")) { // Twitter that we are up and running
int status =twitter.wait(&Serial); // wait for a response from twitter
if (status ==200) { // if Twitter responds 200
Serial.println(", Tweet is OK!"); // print success
Serial.println(); // print a blank line, used for debugging
}
else {
Serial.print("Tweet failed : code ");
Serial.println(status); // print error code
Serial.println(); // print a blank line, used for debugging
}
}
else {
Serial.println("Connection to Twitter failed.");
}
}
voidloop(){
//Read the input on A0-A1
//High and Low Sensors
intsensorLow=analogRead(A1);
intsensorHigh=analogRead(A0);
//Convert to a voltage
floatvoltageLow=sensorLow* (5.0/1023.0);
floatvoltageHigh=sensorHigh* (5.0/1023.0);
//Sensor States
intlowState=0;
inthighState=0;
//Are the sensors on or off?
//Write states, voltage comparison values may need to be adjusted depending on your transistor
//and if you are using extneral or the MakerShields LEDs
if (voltageLow>=3.3){lowState=0;}
elseif (voltageLow<3.3){lowState=1;}
if (voltageHigh>=3.3){highState=0;}
elseif (voltageHigh<3.3){highState=1;}
//Turn on the pump?
if(highState==1&&lowState==1&&wardenFailed==0){
digitalWrite(pump, LOW);
timerA=0;
}elseif(highState==0&&digitalRead(pump) == LOW &&wardenFailed==0){
//FailSafe Timers
timerA=0;
digitalWrite(pump, HIGH);
timerA=millis();
Serial.print("Starting timer: ");
Serial.println(timerA);
}
//My pet bowl fills in about 45 sec, adjust to the size
// of your pet bowl
if( (millis() -timerA) >=45000&&timerA!=0){
digitalWrite(pump, LOW);
Serial.println(timerA);
Serial.println(millis());
timerA=0;
//Either no water left or the pump didn't turn off, bad sensor?
tweetFail();
wardenFailed=1; // the Pet Warden Warden has run into trouble and failed
Serial.print("Something went wrong! The wardenFailed status is: ");
Serial.println(wardenFailed);
exit(0);// exit the program until error is fixed
Serial.println("Either no water left or the pump didn't turn off, bad sensor?");
}
//Debug Prints
Serial.print("Low Sensor: ");
Serial.println(lowState);
Serial.print("High Sensor: ");
Serial.println(highState);
Serial.println(voltageLow);
Serial.println(voltageHigh);
//Check Sensors every 10 sec
delay(10000);
}
voidtweetFail(){
if (twitter.post(msg)) { // Twitter that we are up and running
int status =twitter.wait(&Serial); // wait for a response from twitter
if (status ==200) { // if Twitter responds 200
Serial.println(", Tweet is OK!"); // print success
Serial.println(); // print a blank line, used for debugging
}
else {
Serial.print("Tweet failed : code ");
Serial.println(status); // print error code
Serial.println(); // print a blank line, used for debugging
//If Tweet fails try again
tweetFail();
}
}
else {
Serial.println("Connection to Twitter failed.");
}
}
kocoafab