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________________________________

}

 

Exibições: 2343

Responder esta

Respostas a este tópico

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

Qual o esquema de ligação

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço