Arduino no Aquario :)

11 06 2012

Como o fim de semana esteve chuvoso deu tempo de fazer algo que andava a adiar à já algum tempo. Automatizar o meu aquario! Peguei numa board arduino e mãos à obra ;) desenvolvi até agora as seguintes funções:

– Controlo de iluminação com ativação e variação com base na luz ambiente

– Alimentação automática dos peixes

– alimentação dos peixes quando o sensor detecta a presença da mão

– Controlo da unidade de filtragem

– Controlo do volume de ar introduzido no aquario

Fica o código para quem quiser utilizar, quando tiver mais tempo quero desenvolver uma monitorização da qualidade da agua e muda automática da mesma…

#include “Timer.h” #include <Servo.h> Servo myservo;

Timer t;

const int pingPin = 7; //const int ActionPin = 13;   // set the pin 13 as action for something

int PinState = LOW;              // PinState store the state of pin int ledEvent; int photocellPin = 0;     // the cell and 10K pulldown are connected to a0 int photocellReading;  //stores the the analog reading from the cell long Tinterval = 1000; //relay 1 int R1State = LOW;              // R1State stores the relay1 state long R1Tinterval = 5400000; // define o intervalo de tempo do relay 1, 5400000=1,5h

//relay 2  int R2State = LOW;              // R2State stores the relay2 state  long R2intervalOn = 900000;         // interval to activate relay 1 (900000milliseconds = 15min)  long R2intervalOff = 5400000;         // interval that relay 1 stays off(5400000milliseconds)=1h30min)  long previousMillisR2 = 0;        // will store last time relay 2 was updated  long previousMillisR2off = 0;   void setup() {

//pinMode(ActionPin, OUTPUT);   pinMode(1, OUTPUT); //pin 1 a ser usado pela ldr   pinMode(13, OUTPUT); //pin 13 usado pela bomba ar   pinMode(10, OUTPUT); //pin 10 usado pelo relay 1   pinMode(11, OUTPUT); //pin 11 usado pelo relay 2     // controla a bomba de ar   int ledEvent = t.oscillate(13, 120000, HIGH);   // alterna o pin 13 On/off  por periodos de 120s – ligado a bomba de ar   //t.oscillate(13, 10 * 1000, HIGH,5); //pin 13 on for 10s period repeat 5times      // controla o alimentador de comida   int ServoEvent = t.every(16200000, doSomething); // despoleta a funcao “doSomething” a cada 6h – ligado ao servo      // controla o relay 1   int Relay1Event = t.every(R1Tinterval, doSomething2); // liga o relay 1       // controla o relay 2   int Relay2Event = t.every(Tinterval, doSomething3); //  //   int afterEvent = t.after(10000, doAfter);   }

void loop() {    t.update(); // chama as funçoes t, com timer    //reads from photo cell   photocellReading = analogRead(photocellPin);     // actions for photo cell values   if (photocellReading < 100) { // Serial.println(” – Dark”); liga o pin     digitalWrite(1, HIGH);   } else if (photocellReading > 101) {     digitalWrite(1, LOW); // Serial.println(” – Bright”); desliga o pin   }  //acao para o relay2    unsigned long currentMillis = millis();       if(currentMillis – previousMillisR2 > R2intervalOn) {      // save the last time you activated relay 1     previousMillisR2 = currentMillis;                        // if relay 2 is off turn it on      if (R2State == LOW)        R2State = HIGH;      else       if(currentMillis – previousMillisR2off > R2intervalOff) {       // save the last time you activated relay 1          previousMillisR2off = currentMillis;          previousMillisR2 = currentMillis;          // if relay 1 is on turn it off          if (R2State == HIGH)              R2State = LOW;                                                              }     // set the relay 1 with the R1State of the variable:      digitalWrite(11, R2State);                                                                     }         // establish variables for duration of the ping,   // and the distance result in inches and centimeters:   long duration, inches, cm;

// The PING))) is triggered by a HIGH pulse of 2 or more microseconds.   // Give a short LOW pulse beforehand to ensure a clean HIGH pulse:   pinMode(pingPin, OUTPUT);   digitalWrite(pingPin, LOW);   delayMicroseconds(2);   digitalWrite(pingPin, HIGH);   delayMicroseconds(5);   digitalWrite(pingPin, LOW);

// The pin 8 is used to read the signal from the PING))): a HIGH   // pulse whose duration is the time (in microseconds) from the sending   // of the ping to the reception of its echo off of an object.   pinMode(8, INPUT);   duration = pulseIn(8, HIGH);

// convert the time into a distance   inches = microsecondsToInches(duration);   cm = microsecondsToCentimeters(duration);     delay(100);

if (cm <= 10) {      // turn servo on        myservo.attach(9);        myservo.write(180);        delay(1000); //after 1s turn it off        myservo.detach();      } }

long microsecondsToInches(long microseconds) {   // According to Parallax’s datasheet for the PING))), there are   // 73.746 microseconds per inch (i.e. sound travels at 1130 feet per   // second).  This gives the distance travelled by the ping, outbound   // and return, so we divide by 2 to get the distance of the obstacle.   // See: http://www.parallax.com/dl/docs/prod/acc/28015-PING-v1.3.pdf   return microseconds / 74 / 2; }

long microsecondsToCentimeters(long microseconds) {   // The speed of sound is 340 m/s or 29 microseconds per centimeter.   // The ping travels out and back, so to find the distance of the   // object we take half of the distance travelled.   return microseconds / 29 / 2; }

void doSomething() {     // turn servo on        myservo.attach(9);        myservo.write(180);        delay(1000); //after 1s turn it off        myservo.detach(); }

void doSomething2() { // if relay 1 is off turn it on      if (R1State == LOW)        R1State = HIGH;       else        if (R1State == HIGH) // if its on tur it off              R1State = LOW;    // set the relay 1 with the R1State of the variable:        digitalWrite(10, R1State);            }

void doSomething3() {

}

void doAfter() { //  t.stop(ledEvent); //  t.oscillate(13, 500, HIGH, 5); }


Ações

Information

Deixe uma Resposta

Preencha os seus detalhes abaixo ou clique num ícone para iniciar sessão:

Logótipo da WordPress.com

Está a comentar usando a sua conta WordPress.com Terminar Sessão / Alterar )

Imagem do Twitter

Está a comentar usando a sua conta Twitter Terminar Sessão / Alterar )

Facebook photo

Está a comentar usando a sua conta Facebook Terminar Sessão / Alterar )

Google+ photo

Está a comentar usando a sua conta Google+ Terminar Sessão / Alterar )

Connecting to %s




%d bloggers like this: