Galera, estou com um programa de controle de temperatura com PID, triac , lm35 , esta quase completo só falta dois botões up e dn para colocar a temperatura  fixa que o usuário quiser manualmente, a temperatura fica entre 24 e 38 graus. Os modelos que peguei não dão certo e não sei o que fazer, além tem algum programa para me ajudar ?

Exibições: 405

Responder esta

Respostas a este tópico

Oi S_A, boa tarde.

Voce pode postar o seu code para vermos onde está o problema?

Se for postar, post em arquivo anexo para não perder a formatação.

Rui

Sim vou enviar 

Oi S_A, voce pode anexar aqui, ou postar no www.pastebin.com e postar o link aqui.

Rui

Estou postando aqui tbm ... o erro esta la embaixo ''ROTINA PRESSUP E ROTINA PRESSDN'' esta na cor preta e o que esta em parenteses e o erro que aparece quando compilo o programa no arduino.  agradeço muito se voce conseguir ver pra mim o que fiz de errado

#include <PID_v1.h>
#include <LiquidCrystal.h> // Inclui a biblioteca para utilizar o LCD.
LiquidCrystal lcd (12, 11, 5, 4, 3, 2);
#include <stdlib.h>
float Temperatura; // Variável que recebe o valor convertido para temperatura.
#define loadR 4
volatile int power = 5000;
#define LoadR 4
const int Up = 2; // Pino do switch de Up
const int Dn = 3; // Pino do switch de Dn

// Constantes do PID
#define kp 50
#define ki 10
#define kd 0

// Variáveis do PID: a nomenclatura é a mesma descrita no post III
double SetPoint, PresentValue, ManipulatedValue;
// O último parâmetro indica se o controle é inversa ou
// diretamente proporcional, ou seja, se a uma alteração do PV
// deve corresponder uma alteração de mesmo sinal (DIRECT) ou
// de sinal trocado (REVERSE).


void zero_crosss_int()
{
// Cálculo do ângulo de disparo: 60Hz-> 8.33ms (1/2 ciclo)
// (8333us - 8.33us) / 256 = 32 (aprox)
int powertime = (32*(256-power));
// Mantém o circuito desligado por powertime microssegundos
delayMicroseconds(powertime);
// Envia sinal ao TRIAC para que ele passe a conduzir
digitalWrite(loadR, HIGH);
// Espera alguns microssegundos para que o TRIAC perceba o pulso
delayMicroseconds(8.33);
// Desliga o pulso
digitalWrite(loadR, LOW);
}

//Mensagem exibida na serial
String mensagem = " ";
//variavel para guardar o valor de conversao
float temperatura;
//variavel para guardar o valor de conversao em string
char buf[50];
//variavel que recebe o valor do pino de frequencia
int freq = 0;

void setup(){
//inicia serial
Serial.begin(9600);
lcd.begin(16, 2); // Diz para o Arduino que o display é 16x2.
lcd.print("Temperatura: "); // Manda o texto para a tela do display
{
Serial.begin(9600);
pinMode(loadR, OUTPUT);
// Inicializa interrupção. O número zero indica a porta 2 do Arduino,
// zero_crosss_int é a função que será chamada toda vez que o pino 2
// "subir" (RISING) de valor de 0 para 1.
attachInterrupt(0, zero_crosss_int, RISING);
}


}

void loop(){

//le a frequencia do sensor no pino 0 analogico
freq = analogRead(0);
//calculo para conversao em graus celcius
temperatura = (5.0 * freq * 100.0)/1024.0;
//conversao em string para imprimir na serial
mensagem = dtostrf(temperatura,3,2,buf);
//imprime na serial
Serial.println(mensagem);
//pausa entre os ciclos
delay(1000);

//*************** Rotina PressUp *****************
void PressUp() // Rotina chamada pela interrupcao do botão de aumento
long debouncing_time = 15; // Debouncing Time in Milliseconds (expected initializer before 'long')
volatile unsigned long last_micros; // Variavel para deboucing
{
if((long)(micros() - last_micros) >= debouncing_time * 1000) // Tempo de debouncing
{
TempProg = TempProg + 0.1; // Incrementa temperatura em 0,01 oC
lcd.setCursor(11, 1); // Seleciona posição 0 da linha 0
lcd.print(TempProg); // Imprime variavel
last_micros = micros(); // Tempo de debouncing
}
}
//*************** Rotina PressDn *****************
void PressDn() // Rotina chamada pela interrupcao do botão de reducao
long debouncing_time = 15; // Debouncing Time in Milliseconds  ( expected initializer before 'long'  )
volatile unsigned long last_micros; // Variavel para deboucing
{
if((long)(micros() - last_micros) >= debouncing_time * 1000) // Tempo de debouncing
{
TempProg = TempProg - 0.1; // Decrementa temperatura em 0,01 oC
lcd.setCursor(11, 1); // Seleciona posição 0 da linha 0
lcd.print(TempProg); // Imprime variavel
last_micros = micros(); // Tempo de debouncing
}
}

//senao se a temperatura for maior que 24 mas menor que 38, acende verde maximo
if (temperatura >24 && temperatura < 38){
analogWrite(9,255);
analogWrite(10,0);
lcd.setCursor(0, 1); // Move o cursor do display para a segunda linha.
lcd.print(Temperatura); // Exibe o valor de temperatura no display.
lcd.print(" C"); // Escreve “C” para dizer que a escala é Celsius.
}


//senao se for menor que 24, vermelho maximo

else if (temperatura < 24) {
analogWrite(9,0);
analogWrite(10,255);
lcd.setCursor(0, 1); // Move o cursor do display para a segunda linha.
lcd.print(Temperatura); // Exibe o valor de temperatura no display.
lcd.print(" C"); // Escreve “C” para dizer que a escala é Celsius.
}

//senao, certamente e maior que 38 e deve acender vermelho no maximo


else if (temperatura >38) {
analogWrite(9,0);
analogWrite(10,255);
lcd.setCursor(0, 1); // Move o cursor do display para a segunda linha.
lcd.print(Temperatura); // Exibe o valor de temperatura no display.
lcd.print(" C"); // Escreve “C” para dizer que a escala é Celsius.
}
}

Anexos

PS: o programa foi postado duas vezes 

Oi S_A, boa noite.

encontrei esta definição no site do arduino:

 long speedOfLight = 186000L;   // see the Integer Constants page for explanation of the 'L' 
teste com :

long debouncing_time = 15L;

Teste e depois da um retorno pra gente.

Rui

Nao deu certo, continua o mesmo erro, acredito que o ''LONG'' esta errado e nao consigo descobrir

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço