Boa noite

Com a ajuda do fórum consegui montar meu projeto em partes, testar cada parte dele em módulos individuais, ao mesmo tempo fui montando o circuito testando por partes agora estou com conceito testado e pronto, o projeto de alimentador de aquário como já postei em outros tópicos consta:

1 RTC

2 Potenciometros

1 LM35

1 push button

A proposta é programar quantas vezes alimentarei os meus peixes com um potenciômetro, o outro potenciômetro definirá a quantidade de ração que será dada aos peixes durante cada alimentação.

O RTC auxiliará nos horários em que ocorrerá as alimentações e o botão é para testar se a quantidade de ração está correta. O LM35 ira variar quantidade de ração de acordo com a temperatura ambiente, visto que os peixes se alimentam menos em dias frios.

segue abaixo o código (já lembrando que sou leigo em programação):

//código relógio rtc alimentador
#include <Wire.h>
#include "RTClib.h"

RTC_DS1307 rtc;

int valorSensor;            // porta analogica input de frequencia de alimentação potenciometro 1
int valorModificado;     // converte a leitura do potenciometro 1
int valorSensor2;         // porta analogica input dose de por frequencia diaria potenciometro 2
int valorModificado2;   // converte a leitura do potenciometro 1
int motPin2= 12;           // porta em output alimentador
int motState2 = LOW;  // estado do alimentador desligado
int botao = 9;                // porta em input (para o push button)

int val = 0;                      // variável para ler o status do pino
int valorLido;                 // leitura temperatura
int pinoSensor = A0;   // porta analogica input do LM35
float temperatura;
int doseracao;             // define quantidade de ração, ou seja, delay de tempor de acionamento do motor


void setup() {

Serial.begin(9600);
#ifdef AVR
Wire.begin();
#else
Wire1.begin();           // Shield I2C pins connect to alt I2C bus on Arduino Due
#endif
rtc.begin();
pinMode(motPin2, OUTPUT);  // declare motor como output
pinMode(botao, INPUT);           // declare pushbutton como input

}

void loop() {

potenciometro1();                    // programa frequencia diaria de arraçoamento
potenciometro2();                   // programa a quantidade de ração por arraçoamento
hora ();                                  // imprime a hora
botaoTeste ();                         // botão teste
}

void hora (){                             // imprime a hora na serial
DateTime now = rtc.now();
Serial.print(' ');
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
Serial.print(':');
Serial.print(now.second(), DEC);
Serial.println();

Serial.println();
delay(2000);
}

void potenciometro1(){           // programa a hora que irá acionar o potenciometro 1 A3 numero de vezes em que ocorrerá a alimentação


// Le valor do pino analógico
valorSensor = analogRead(A3);                                       // leitura do potenciometro 1

valorModificado = map(valorSensor, 0, 1023, 1, 12);   // converte leitura para 12 partes conforme visivel no potenciometro

Serial.print("posicao= ");
Serial.print(valorModificado);
delay(2000);


if (valorModificado <= 4){                                          // se o valor lido for menor que 4 alimentador 1

alimentador1();
Serial.println(" alimentador1");
}

if (valorModificado > 4 && valorModificado <= 8){    //se o valor lido estiver entre 4 e 8 alimentador 2
alimentador2();
Serial.println(" alimentador2");
}

if (valorModificado > 8){                       // se o valor lido for maior que 8 alimentador3
alimentador3();
Serial.println(" alimentador3");
}
}
void potenciometro2(){                        // programa a hora que irá acionar o potenciometro 1 A1 dose ração

valorSensor2 = analogRead(A1);      // leitura do potenciometro 2

valorModificado2 = map(valorSensor2, 0, 1023, 50, 2000);      // programa a dose de ração por arraçoamento com delay entre 50 e 2000

}

void LM35 (){      //faz a leitura da temperatura e define a dose de ração em função da temperatura

valorLido = analogRead(pinoSensor);                  // leitura da temperatura
double temperatura = (valorLido * 0.48857);        // converte a leitura do LM35 em graus Celcius

Serial.print("Temp; ");
Serial.print(temperatura);
Serial.print(" delay; ");
Serial.println(valorModificado2);
delay(2000);


if (temperatura <=15){                                          // se a temperatura for menor que 15 não alimenta
doseracao = 0;
}
if (temperatura >= 15 && temperatura <=17){  // se a temperatura for entre 15 e 17 1/3 da ração
doseracao = valorModificado2/3;//
}
if (temperatura >= 17 && temperatura <=21){   // se a temperatura for entre 17 e 21 1/2 da ração
doseracao = valorModificado2/2;
}
if (temperatura >= 21 && temperatura <=33){   // se a temperatura estiver entre 21 a 33 ração normal
doseracao = valorModificado2;
}
if (temperatura >= 33){                               // se a temperatura estiver acima de de 33 não alimenta
doseracao = 0;
}
}


void alimentador1 (){                              // quando chamado alimenta 2 vezes ao dia
DateTime now = rtc.now();
digitalWrite(motPin2, motState2);
if (((now.hour() == 6) || (now.hour() == 18)) && (now.minute() == 30) && (now.second()<=2)) {

  // alimenta as 6 e as 18 horas

digitalWrite(motPin2, HIGH);
delay (doseracao);                                   // seria o tempo necessário para a dose correta de ração
Serial.println("ligou mot1");
digitalWrite(motPin2, LOW);
delay(2000);                                               // Aguarda 2 segundos para encerrar o if
}
}

void alimentador2 (){                                  // quando chamado alimenta 3 vezes ao dia
DateTime now = rtc.now();
digitalWrite(motPin2, motState2);
if ((((now.hour() == 6) || (now.hour() == 12) || (now.hour() == 18)) && (now.minute() == 29) && (now.second()<=2))){ // hora da ação

digitalWrite(motPin2, HIGH);
delay (doseracao);                                      // seria o tempo necessário para a dose correta de ração
Serial.println("ligou mot1");
digitalWrite(motPin2, LOW);
delay(2000); // Aguarda 2 segundos para encerrar o if
}
}

void alimentador3 (){                                  // quando chamado alimenta 4 vezes ao dia
DateTime now = rtc.now();
digitalWrite(motPin2, motState2);
if ((((now.hour() == 6) || (now.hour() == 9) || (now.hour() == 12) || (now.hour() == 15) || (now.hour() == 18)) && (now.minute() == 29) && (now.second()<=2))){ // hora da ação

digitalWrite(motPin2, HIGH);
delay (doseracao);                                       // seria o tempo necessário para a dose correta de ração
Serial.println("ligou mot1");
digitalWrite(motPin2, LOW);
delay(2000);                                                   // Aguarda 2 segundos para encerrar o if
}
}

void botaoTeste (){                                // quando apertado o botão testa a dose de ração prevista
val = digitalRead(botao);                    // ler a entrada de valor

if (val == HIGH) {                                    // verificar se a entrada é alta

digitalWrite(motPin2, LOW);              // alimentador OFF

} else {

digitalWrite(motPin2, HIGH);            // alimentador ON para teste
delay (valorModificado2);                   // delay do valor definido para dose de ração por frequencia
Serial.println("ligou teste");

}
}

Porem possuo dois problemas ainda, um é que estou achando o código extenso, pois o projeto é simples  imagino que deve haver forma melhor de escrever ele, principalmente as funções "alimentador 1 2 e 3".

O outro desafio que estou tendo com o uso do botão de teste, ele só funciona algumas vezes quando pressionado, imagino que seja devido aos delays existentes no código que estão atrapalhando, mas não sei qual a melhor forma de substitui-los.

Exibições: 241

Responder esta

Respostas a este tópico

Melhorando a pergunta, eu precisaria fundir as funções alimentador 1, 2 e 3, dentro da função potenciometro 1.

Após algumas alterações ficou deste jeito, seria está a melhor forma?

void potenciometro1(){ // programa a hora que irá acionar o potenciometro 1 A3 numero de vezes em que ocorrerá a alimentação


DateTime now = rtc.now();
valorSensor = analogRead(A3); // leitura do potenciometro 1
valorModificado = map(valorSensor, 0, 1023, 1, 12); // converte leitura para 12 partes conforme visivel no potenciometro
Serial.print("posicao= ");
Serial.print(valorModificado);
delay(2000);
{
if ((valorModificado <= 4) && (((now.hour() == 6) || (now.hour() == 18)) && (now.minute() == 30) && (now.second()<=2))){ // se o valor lido for menor que 4 alimentador 1
// alimenta duas vezes ao dia
digitalWrite(motPin2, HIGH);
delay (doseracao);
Serial.println(" alimentador1");
}

if ((valorModificado > 4 && valorModificado <= 8) && ((((now.hour() == 6) || (now.hour() == 12) || (now.hour() == 18)) && (now.minute() == 29) && (now.second()<=2)))){{
//se o valor lido estiver entre 4 e 8 alimentador 2
digitalWrite(motPin2, HIGH);
delay (doseracao);
Serial.println(" alimentador2");
}

if ((valorModificado > 8) && ((((now.hour() == 6) || (now.hour() == 9) || (now.hour() == 12) || (now.hour() == 15) || (now.hour() == 18)) && (now.minute() == 29) && (now.second()<=2)))){{ // se o valor lido for maior que 8 alimentador3
/// alimenta quatro vezes ao dia
digitalWrite(motPin2, HIGH);
delay (doseracao);
Serial.println(" alimentador3");
}
else
digitalWrite(motPin2, LOW);
delay(2000);
}
}
}
digitalWrite(motPin2, motState2);
}

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço