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.
Tags:
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);
}
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por