Boa tarde a todos,
Eu estou fazendo um tcc que te que ser entregue segunda e preciso de uma ajuda com a programação. O projeto consiste em o usuário escolher a temperatura através de dois botoes e visualizar a mesma em um display (display estará escrito temperatura deseja e temperatura real), apos isso o usuário ira para baixo do chuveiro e um sensor infravermelho irá o identificar e abrir o fluxo de água através de uma válvula com solenoide. No bumbo do chuveiro que onde fica a água tem um sensor lm35 informando a temperatura real da água, com isso o arduino ira armazenar a temperatura deseja e a real e calcular essa diferença através do pid do próprio arduino, apos isso ele enviara tensão ao um rele de estado solido que amplificara o sinal para ir ate a resistência do chuveiro.
Problemas: o lcd funciona no começo mas depois de pouco tempo aparece códigos nele.
o arduino esta tirando e colocando corrente muito rápido não dando tempo de aquecer a agua
por favor poderiam ajudar , segue abaixo a programação pra darem uma olhada , obrigado
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3,2);
int pino_sensor= 9;
int caso = 0;
const int LM35 = 0;
int ADClido = 0;
int rele = 6;
const int Botao1 = 7;
const int Botao2 = 8;
int EstadoBotao1 = 0;
int EstadoBotao2 = 0;
int estado_sensor = 0;
float temp = 0;
float ValorTemp = 0; // Leitura da temperatura do sistema
float errotemp = 0; // Erros (temp)
float errotemp2 = 0;
float mediaerro = 0;
float errotemp_integral = 0;
float dertemp = 0;
float kpt = 50; // Constantes do controlador (pesquisar funçao transferencia)
float kit = 0.2;
int pwm = 0; // Controladores (Saídas)
int pinopwm = 10;
int saidatemp = 0;
int Signal = 0;
int conta = 0;
float t = 1;
void setup(){
Serial.begin(9600);
analogReference(INTERNAL);
pinMode(pino_sensor, INPUT);
pinMode (rele, OUTPUT);
pinMode (LM35, INPUT);
pinMode (Botao1, INPUT);
pinMode (Botao2, INPUT);
lcd.begin(16, 2);
pinMode(pinopwm, OUTPUT);
temp = 20;
}
//*************** Rotina botao1 *****************
void loop(){
EstadoBotao1 = digitalRead(Botao1);
if (EstadoBotao1 == HIGH){
delay(250);
if (EstadoBotao1 == HIGH){
if(temp>=50){
temp=50;
}else temp++;
lcd.setCursor(12,0);
lcd.print(temp);
}
}
//*************** Rotina botao2 *****************
EstadoBotao2 = digitalRead(Botao2);
if (EstadoBotao2 == HIGH){
delay(250);
if (EstadoBotao2 == HIGH){
if(temp<=20){
temp=20;
} else temp--;
lcd.setCursor(12,0);
lcd.print(temp);
}
}
//****** rotina do lm35************************
{
ADClido= analogRead(LM35);
ValorTemp= ADClido * 0.1075268817204301;
delay(10000);
}
// **********sensor Presenca e valvula**********
estado_sensor = digitalRead(pino_sensor);
if (estado_sensor == 1){
// valvula desligada;
digitalWrite(rele, LOW);
delay(100);
}
else {
// valvula liga ;
digitalWrite(rele,HIGH);
}
// Controlador:________COONTROLE DA TEMPERATURA_________________________
errotemp = temp - ValorTemp; // Erro temp
mediaerro = (errotemp + errotemp2);
errotemp_integral = errotemp_integral + mediaerro*t; // Acumulação do erro, parte integral
saidatemp = kpt * mediaerro + kit * errotemp_integral;
pwm = map(saidatemp, -50, 50, 0, 255); // Controlador da temperatura
if (pwm > 255){
pwm = 255;
}
if (pwm < 0){
pwm = 0;
}
analogWrite(pinopwm, pwm);
//_______________________________________________________________
errotemp2 = errotemp; // Guarda os erros anteriores para o
// cálculo da média
//LCD ______________________________________
// 0123456789012345
// T: 30,5 30,5 C
// ________________
lcd.setCursor(0,0);
lcd.print("T desejada:");
lcd.setCursor(15,0);
lcd.print("C");
lcd.setCursor(0,1);
lcd.print("Temp real:");
lcd.setCursor(12,1);
lcd.print(ValorTemp);
lcd.setCursor(15,1);
lcd.print("C");
// FIM DO LCD________________________________
}
Tags:
Não tenho como testar aqui, mas observo alguns detalhes:
- Vc precisa identar o programa. O editor tem uma função pra isso. Eh super dificil achar onde cada colchete fecha com o programa assim.
- 99,999999% do tempo seu programa fica parado na linha de delay(10000). Acho que não está certo isso...
- Vc fala de media de erro, mas soma 2 valores, nao teria que dividir por 2 pra fazer a media ?
Acho que seria interessante mostrar no display ou no terminal os valores intermediarios de PWM, temperatura lida, etc, assim vc consegue acompanhar o que acontece.
Enfim, ou não entendi ou tem erro nas suas contas e acredito que os calculos deveriam ser refeitos por ex a cada 0,1s ou coisa assim.
-eduardo como abre essa função de editor?
-modifiquei o delay pra 100
- estou verificando os calculos e sabado irei fazer um teste e retorno com os resultados .
muito obrigado pela ajuda Eduardo
Tools / Auto Format
https://www.arduino.cc/en/Guide/Environment
O ideal é fazer na mão, pelo menos eu prefiro, mas o automatico é melhor que nada.
fiz os teste e agua continua nao aquecendo, e o display mostra a temperatura real que é leitura do lm35 oscilando de 100 a 90 ° o que nao esta correto, alem que apos alguns segundos o display fica cheio de codigo , poderiam me ajudar nao sei mais oque fazer
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por