collapse

* Links de Robótica

* Posts Recentes

URGENTE - display de 7 segmentos com backpack por helderjsd
[Hoje às 12:30]


Preços e fabricantes de pcb por Sérgio_Sena
[Ontem às 10:20]


Palavras Cruzadas por Njay
[Ontem às 02:24]


Isaac Asimov - I, Robot por senso
[18 de Setembro de 2017, 03:41]


Apresentação por TigPT
[17 de Setembro de 2017, 07:31]


ic SL440 da Plessey? por senso
[16 de Setembro de 2017, 13:11]


Compra Colectiva RS-Amidata por brunus
[15 de Setembro de 2017, 22:31]


Ideias para construir um quadrúpede simples por zordlyon
[15 de Setembro de 2017, 10:18]


Preparar bancada de testes por jm_araujo
[14 de Setembro de 2017, 10:24]


Mitos: mudança da ilumação tradicional p/ iluminação a LEDs? por LVirtual
[14 de Setembro de 2017, 07:46]

Autor Tópico: Controlador para caldeira a pellets  (Lida 5624 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline tgferreira

  • Mini Robot
  • *
  • Mensagens: 148
Controlador para caldeira a pellets
« em: 06 de Dezembro de 2012, 23:53 »
Boas pessoal,
Criei este tópico um pouco no seguimento do tópico já existente e relativo a uma salamandra. Como sabem, esse projecto ficou em stand-by por motivos financeiros. No entanto, no domingo estava a ler um pouco sobre o tópico "pellets" e apercebi-me que é possível converter uma caldeira a gasóleo para caldeira a pellets. No entanto o preço destes "kits" ronda os 2000€. Ora, por este preço, nem pensar. Decidi então por mãos à obra e fazer eu mesmo.

Todo o processo de conversão é relativamente simples. Sublinho que quero que isto me fique ao mais baixo custo possível. E aqui cheguei a alguns problemas relacionados com electrónica. Passo a explicar:

A caldeira actualmente é controlada por duas "secções". A principal, que regula temperaturas, pressões, etc; e a secundária que apenas tem 4 cabos: positivo, negatico, terra e um cabo para dar um sinal de erro. Até aqui tudo bem.

A secção "secundária" recebe energia e depois decide o que há-de fazer com ela: liga e desliga a ventoínha de combustão, bombas de combustível, verifica sensores luminosos, etc. É esta: http://www.calor.ro/documents/products/33237/G_OR.pdf
Ora, isto era espectacular não fossem apenas dois pequenos problemas:
1- O tempo de ignição do gasóleo é muito menor do que o dos pellets.
2- Eu poderei querer usar um motor DC e este equipamento trabalha com motores AC apenas.

Então, chegando ao que pretendo: tenho que fazer uma nova "central" que:
-Trabalhe com motores AC e DC
-Monitorize o sensor de luminosidade (para verificação se há chama ou não)
-Que me permita ter um tempo de ignição na casa dos 3 minutos.

Se isto fosse feito com um arduino, era fácil e já estava feito. Mas assim sendo, é mais complicado.
Alguém faz ideia de que materiais irei necessitar? Estou a pensar em algumas relés, mas para controlar o tempo de ignição não faço ideia nenhuma. Ah, também não sei como é que posso fazer algo que saiba que, caso não arranque então tem que acender uma luz e desligar o resto ou que tem que fazer uma nova tentativa.

Aguardo respostas (o frio é grande :P)
Cumprimentos e obrigado!

Offline tgferreira

  • Mini Robot
  • *
  • Mensagens: 148
Re: Controlador para caldeira a pellets
« Responder #1 em: 23 de Dezembro de 2012, 22:44 »
Boas pessoal,

Entretanto e após o último tópico já fiz alguma investigação, já construí toda a parte mecânica e já estou na fase final: programação. Mas tenho que admitir uma coisa: estou confuso como tudo porque me parece que o programa é enorme e tem muitas funções dentro de funções. Vou-vos dar um ligeiro lámiré do que pretendo e do que tenho que controlar:

Tenho duas relés ligadas: uma para o igniter e outra para um motor. Estas relés são controladas através de um pino digital do arduino.
Além disto tenho alguns LEDS, um botão e um LDR.

O que eu pretendo que o arduino faça é:
(defini as funções por valores porque assim é mais fácil de explicar e ajuda-vos a entender o que pretendo)

Resumidamente, recebe corrente e a primeira função a ser executada é a Função 1.

O que são as funções:

FUNÇÃO 1:
-Função que dura três minutos; liga a relé do motor por 5 segundos, liga a relé do igniter durante o resto dos três minutos e no fim dos três minutos verifica os valores do LDR. Caso o valor lido seja y, vai para a função 3, caso seja x vai para a função 2.

FUNÇÃO 2:
Liga a relé do motor e verifica os valores do LDR de minuto a minuto. Caso os valores do LDR atinjam um valor y, vai para a função 1 , caso atinjam um valor x, continua na função 2

FUNÇÃO 3:
-Função que dura 4 minutos. Liga a relé do motor por 2 segundos e liga a relé do igniter durante os 4 minutos. Ao fim dos 4 minutos verifica o valor do LDR. Caso o valor lido seja y, vai para a função 4. Caso o valor lido seja x, vai para a função 2;

FUNÇÃO 4:
-Função dura "para sempre". Acende um LED. Caso seja premido um botão nesta função, vai para a função 3.

Como podem ver, tem alguns "truques": A função 1 é sempre a primeira a ser executada e só é executada uma vez (até o arduino ficar sem corrente), a função 4 só pode ser acedida vindo da função 3, etc.

Por acaso, agora parece-me mais simples o código de ser escrito. Mas tenho uma dúvida sobre a qual já pesquisei e não estou a entender mesmo assim: como é que faço para que o arduino contabilize tempo? Isto é, como é que faço para que ele execute funções de x em x tempo ou aguarde x tempo? Isto sem recorrer ao delay, como é lógico.
Já vi algumas coisas na net, mas não compreendi as explicações. Podem-me dar um exemplo prático, por favor?

Aguardo respostas!
Obrigado,
Tiago Ferreira.

Offline rglove

  • Mini Robot
  • *
  • Mensagens: 526
Re: Controlador para caldeira a pellets
« Responder #2 em: 23 de Dezembro de 2012, 22:57 »
Boas,
Não li tudo com atenção porque agora não tenho tempo, mas para o que queres há um exemplo... O blink without delay.
Usas a função millis(). Fica algo parecido com isto:
Código: [Seleccione]
unsigned long millis1 = 1000; // Se a colocares a 0 ele corre logo no início do loop a função

void setup() {
}

void loop() {
  if (millis()>=millis1) {
    // Aqui escreves o código que queres que execute de x em x tempo
    millis1 = millis() + 1000; // 1000 -> tempo em ms de 'delay'
  }
}

Não testei, fiz agora à pressa, mas acho que está bem.

Cumps.

Offline rglove

  • Mini Robot
  • *
  • Mensagens: 526
Re: Controlador para caldeira a pellets
« Responder #3 em: 23 de Dezembro de 2012, 23:00 »
Outra forma é configurares interrupções de x em x tempo, porque esse delay pode não ser preciso.

Offline migvalsan

  • Mini Robot
  • *
  • Mensagens: 39
Re: Controlador para caldeira a pellets
« Responder #4 em: 23 de Dezembro de 2012, 23:02 »
Boas pessoal,

Entretanto e após o último tópico já fiz alguma investigação, já construí toda a parte mecânica e já estou na fase final: programação. Mas tenho que admitir uma coisa: estou confuso como tudo porque me parece que o programa é enorme e tem muitas funções dentro de funções. Vou-vos dar um ligeiro lámiré do que pretendo e do que tenho que controlar:

Tenho duas relés ligadas: uma para o igniter e outra para um motor. Estas relés são controladas através de um pino digital do arduino.
Além disto tenho alguns LEDS, um botão e um LDR.

O que eu pretendo que o arduino faça é:
(defini as funções por valores porque assim é mais fácil de explicar e ajuda-vos a entender o que pretendo)

Resumidamente, recebe corrente e a primeira função a ser executada é a Função 1.

O que são as funções:

FUNÇÃO 1:
-Função que dura três minutos; liga a relé do motor por 5 segundos, liga a relé do igniter durante o resto dos três minutos e no fim dos três minutos verifica os valores do LDR. Caso o valor lido seja y, vai para a função 3, caso seja x vai para a função 2.

FUNÇÃO 2:
Liga a relé do motor e verifica os valores do LDR de minuto a minuto. Caso os valores do LDR atinjam um valor y, vai para a função 1 , caso atinjam um valor x, continua na função 2

FUNÇÃO 3:
-Função que dura 4 minutos. Liga a relé do motor por 2 segundos e liga a relé do igniter durante os 4 minutos. Ao fim dos 4 minutos verifica o valor do LDR. Caso o valor lido seja y, vai para a função 4. Caso o valor lido seja x, vai para a função 2;

FUNÇÃO 4:
-Função dura "para sempre". Acende um LED. Caso seja premido um botão nesta função, vai para a função 3.

Como podem ver, tem alguns "truques": A função 1 é sempre a primeira a ser executada e só é executada uma vez (até o arduino ficar sem corrente), a função 4 só pode ser acedida vindo da função 3, etc.

Por acaso, agora parece-me mais simples o código de ser escrito. Mas tenho uma dúvida sobre a qual já pesquisei e não estou a entender mesmo assim: como é que faço para que o arduino contabilize tempo? Isto é, como é que faço para que ele execute funções de x em x tempo ou aguarde x tempo? Isto sem recorrer ao delay, como é lógico.
Já vi algumas coisas na net, mas não compreendi as explicações. Podem-me dar um exemplo prático, por favor?

Aguardo respostas!
Obrigado,
Tiago Ferreira.
para isso podes utilizar um RTC (real time clock).
utiliza o ds1307. se pesquisares aqui no forum achas muita informação sobre ele e montes de codigo para te guiares.

cumps

Miguel

Offline tgferreira

  • Mini Robot
  • *
  • Mensagens: 148
Re: Controlador para caldeira a pellets
« Responder #5 em: 24 de Dezembro de 2012, 11:52 »
Boas pessoal!
Entretanto apercebi-me de uma coisa: se tiver delay, até não faz mal porque faço com que as coisas funcionem na mesma. Portanto, já fiz o código, falta-me testar na prática.
Aqui está:

Código: [Seleccione]
int igniter =8;
int ledverde = 13;
int ledvermelho = 12;
int berbequim = 7;
int ldr = 0;
int reset = 6;
int vldr = analogRead(0);






void setup(){
  pinMode(igniter, OUTPUT);
  pinMode(ledverde, OUTPUT);
  pinMode(ledvermelho, OUTPUT);
  pinMode(ldr, INPUT);
  pinMode(reset, INPUT);
 
   
  Serial.begin(9600);
}



void loop() {
  void start()
 
 
}


void start() {
  digitalWrite(igniter, HIGH); // Ligo o igniter
  digitalWrite(berbequim, HIGH); // Ligo o berbequim para caírem pellets
  delay(5000); // Tempo para a queda de pellets, com o berbequim ligado
  digitalWrite(berbequim, LOW); // Os pellets já cairam em quantidade suficiente, desligo berbequim
  delay(180000); // Aguardo 3 minutos, com o igniter ligado para que comece a chama.
 
  if(vldr <= 50) {
    principal(); // Caso o valor do LDR for menor ou igual a 50 (chama), vamos para a função principal
  }
 
  else  {
    restart(); // Caso não haja chama, vamos tentar outra vez
  }
 
}


void principal(){
  digitalWrite(berbequim, HIGH); // Função principal de funcionamento normal. Ligo o berbequim
  delay(1000); // Espero um segundo com o berbequim ligado, para caírem os pellets
  digitalWrite(berbequim, LOW);
  delay(59000); //Aguardo 59 segundos
 
  if(vldr <= 50) {
    principal();
  }
 
  else {
   restart();
  }
 
}


void restart() {
  digitalWrite(igniter, HIGH);
  digitalWrite(berbequim, HIGH); // Ligo berbequim
  delay(500);
  digitalWrite(berbequim, LOW);
  delay(180000); //Aguardo três minutos
  if(vldr <= 50) {
    principal();
  }
 
  else {
    over();
  }
 
}

void over() {
  digitalWrite(ledvermelho, HIGH);
 
}



Até ver, sem erros. Se virem alguma coisa, digam!
Cumprimentos,
Tiago.

Offline rglove

  • Mini Robot
  • *
  • Mensagens: 526
Re: Controlador para caldeira a pellets
« Responder #6 em: 24 de Dezembro de 2012, 13:36 »
Boas,
Vi assim por alto. Tens pelo menos um erro. Tu declaras vldr no início, mas durante o programa não o actualizas, pelo que nas funções todas a variável vldr vai ter o valor que tinha no início.
Antes de leres a variável tens de a actualizar.

Acho também que podias poupar linhas de código e simplificar um bocado porque tens 2 funções iguaizinhas (excepto o tempo para descarga dos pellets).

Podias criar uma variável para guardar o nr de tentativas, por exemplo.
Simplificavas o código, mas de qualquer forma não está confuso assim.

O igniter é suposto estar ligado o tempo todo?
Da forma como o código está feito o igniter liga no início e continua ligado o tempo todo.

De que forma estás a ligar os relés? Atenção que não deves ligar directamente ao arduino porque cada pino consegue fornecer no máximo 40mA de corrente.
Eu tenho aqui um relé de 5V, fui medir a resistência da bobine e é de 34Ohms. Ou seja, o relé que eu aqui tenho puxa 100 e tal mA, mais do que o que o pino digital do atmega consegue fornecer.
Penso que isto pode queimar a porta do micro. É melhor usares um transístor para poderes alimentar o relé de forma segura. E convém usares díodos de proteção no relé.

Cumps.

Cumps

Offline tgferreira

  • Mini Robot
  • *
  • Mensagens: 148
Re: Controlador para caldeira a pellets
« Responder #7 em: 24 de Dezembro de 2012, 14:09 »
Boas,
Obrigado pelas correcções. Não, o igniter é só para estar ligado um bocado no início e depois desliga. Quanto à ligação das relés, estou a usar transistor e este circuito: http://www.glacialwanderer.com/_blog/blog2008/04_April/hb_relay5.jpg

Tenho é agora um problema dos diabos: o arduino demora algum tempo a ligar, e durante o "startup" as relés estão activadas. Isto é: os motores estão ligados. Isso é um grande problema porque me esvazia instantaneamente o depósito dos pellets (o motor é muito rápido). Fora isso, estou a conseguir controlar mais ou menos. Isto é um problema porque:

A minha caldeira tem sensores de temperatura. Define-se que a água tem que estar a (por exemplo) 80ºC e ela liga a parte de aquecimento até chegar perto disso. Depois desliga e vai ligando quando necessário. Ora, eu estava a pensar em ligar todo o sistema a essa parte que a caldeira liga. Resumidamente, o arduino ligava e controlava as coisas quando a caldeira pedia para tal. Mas, como o arduino tem o startup time, isso inviabiliza-me toda esta solução.
O ideal seria manter o arduino sempre ligado, mas fico com dúvidas como programar isto porque ele só tinha que executar as funções quando a caldeira ligasse essa tal parte (que trabalha a 220v). Estou mesmo sem ideias para esta parte. Alguém conhece alguma alternativa?

EDIT: Há alguma maneira de eu fazer o que disse acima (detectar 220V) com um transformador de 5v? Isto é, ter o arduino ligado normalmente a um transformador 5v, e com o segundo transformador ligado a uma ficha, quando detecta electricidade fazer algo no arduino. É possível?
« Última modificação: 24 de Dezembro de 2012, 14:15 por tgferreira »

Offline rglove

  • Mini Robot
  • *
  • Mensagens: 526
Re: Controlador para caldeira a pellets
« Responder #8 em: 24 de Dezembro de 2012, 14:28 »
Sim, é possível.
Se só queres o arduino a funcionar quando passam os tais 220V AC até podes usar esse mesmo transformador para alimentar o arduino.

Vê isto:
http://electronics.stackexchange.com/questions/30017/which-configuration-is-better-for-pulling-down-an-npn-transistors-base

Experimenta colocar essa resistência para puxar a base para o GND quando o microcontrolador está a iniciar.

EDIT: Da forma que está o código o igniter vai estar sempre ligado.

Offline tgferreira

  • Mini Robot
  • *
  • Mensagens: 148
Re: Controlador para caldeira a pellets
« Responder #9 em: 24 de Dezembro de 2012, 14:45 »
Sim, é possível.
Se só queres o arduino a funcionar quando passam os tais 220V AC até podes usar esse mesmo transformador para alimentar o arduino.

Vê isto:
http://electronics.stackexchange.com/questions/30017/which-configuration-is-better-for-pulling-down-an-npn-transistors-base

Experimenta colocar essa resistência para puxar a base para o GND quando o microcontrolador está a iniciar.

EDIT: Da forma que está o código o igniter vai estar sempre ligado.

rglove, o que quero é que o arduino já esteja ligado. Vou tentar fazer o seguinte: ligar o arduino com o respectivo transformador e mante-lo sempre ligado. Depois, com um segundo transformador de 5V, ligado aos 220V da caldeira. Os outputs deste transformador, ligo-os ao arduino.
Quando a caldeira liga, o segundo transformador liga também, avisando assim o arduino de que há corrente de 220V na caldeira.

A minha dúvida agora é na ligação dos outputs do segundo transformador ao arduino. Julgo que vou ligar o gnd ao gnd, o positivo do transformador com uma resistência de 1k e ligado a uma porta digital. Depois faço um digitalRead nessa porta, para ver se há corrente ou não. Julgo que assim deve dar.

Quanto ao igniter, eu já resolvo isso. E obrigado pelo link que mandaste, assim que tiver isto a dar minimamente, vou ler!
Obrigado!

EDIT: Sim, já testei como disse e funciona. Agora vou ter que escrever o código, mas com uma ligeira alteração: o arduino só entra na função "start" quando detecta corrente 220V. Depois, a caldeira vai desligar quando atinge a temperatura necessária. Tenho que pôr algo em todas as funções para, caso o arduino deixe de detectar os 220V, passa para a função de "espera", outra vez. Vou alterar o código e já cá o ponho.
« Última modificação: 24 de Dezembro de 2012, 14:58 por tgferreira »

Offline rglove

  • Mini Robot
  • *
  • Mensagens: 526
Re: Controlador para caldeira a pellets
« Responder #10 em: 24 de Dezembro de 2012, 15:30 »
Atenção, não sei se podes ligar o output do transformador à porta do arduino. O microcontrolador só lê tensões positivas e o output que vem do transformador é AC, logo tens de usar um díodo para retirar a parte negativa do output e só depois é que podes ligar ao microcontrolador. Há ainda outro problema: O output é AC, ou seja, ao usares a função digitalRead() vais obter tanto 0 como 1 dependendo da fase da onda AC.
Sugiro que faças uma ponte rectificadora com 4 díodos, que coloques um condensador em paralelo e depois sim, podes ligar o output à porta digital do microcontrolador e irás obter 1 quando estiver ligado o transformador e 0 quando estiver desligado.

Mais uma coisa, não sei de que forma estás a alimentar o microcontrolador/arduino, mas se estiveres a usar 2 fontes diferentes os grounds do arduino e do transformador têm que estar unidos.

Offline tgferreira

  • Mini Robot
  • *
  • Mensagens: 148
Re: Controlador para caldeira a pellets
« Responder #11 em: 27 de Dezembro de 2012, 13:50 »
Atenção, não sei se podes ligar o output do transformador à porta do arduino. O microcontrolador só lê tensões positivas e o output que vem do transformador é AC, logo tens de usar um díodo para retirar a parte negativa do output e só depois é que podes ligar ao microcontrolador. Há ainda outro problema: O output é AC, ou seja, ao usares a função digitalRead() vais obter tanto 0 como 1 dependendo da fase da onda AC.
Sugiro que faças uma ponte rectificadora com 4 díodos, que coloques um condensador em paralelo e depois sim, podes ligar o output à porta digital do microcontrolador e irás obter 1 quando estiver ligado o transformador e 0 quando estiver desligado.

Mais uma coisa, não sei de que forma estás a alimentar o microcontrolador/arduino, mas se estiveres a usar 2 fontes diferentes os grounds do arduino e do transformador têm que estar unidos.

Boas,
Esqueci-me de mencionar: o output do transformador é DC, 5V. Já fiz testes e o Arduino faz bem as leituras. E sim, tenho os GNDs todos ligados, fiz um lembrete disso logo no início porque me costumo esquecer! Ainda assim, obrigado :)

Mas agora estou aqui com um problema estranho: liguei tudo como tinha programado e não acontece nada. Como tal, e para tentar perceber onde é que o arduino está a "bloquear", mudei o programa, fazendo com que o arduino acenda um LED de cada vez que passa numa das funções. Aqui está o programa "final":

Código: [Seleccione]
int igniter =8;
int berbequim = 7;
int ldr = 0;
int reset = 6;
int vldr = analogRead(0);
int dcorrente = digitalRead(3);
int ledstandby = 13;
int ledprincipal = 12;
int ledstart = 11;
int ledrestart = 10;
int ledover = 9;


void setup(){
  pinMode(igniter, OUTPUT);
  pinMode(ldr, INPUT);
  pinMode(reset, INPUT);
  pinMode(dcorrente, INPUT);
  pinMode(berbequim, OUTPUT);
  pinMode(ledstandby, OUTPUT);
  pinMode(ledprincipal, OUTPUT);
  pinMode(ledstart, OUTPUT);
  pinMode(ledover, OUTPUT);
  pinMode(ledrestart, OUTPUT);
 
  Serial.begin(9600);
}



void loop() {
  standby();
 
}


void standby() {
  digitalWrite(ledstandby, HIGH);
  delay(3000);
  digitalRead(3);
  if(digitalRead(3) == 1) { // Caso seja detectada corrente 220V
    start();
  }
 
  else {
    loop();
  }
 
}



void start() {
  digitalWrite(ledstart, HIGH);
  digitalWrite(igniter, LOW); // Ligo o igniter
  digitalWrite(berbequim, LOW); // Ligo o berbequim para caírem pellets
  delay(50); // Tempo para a queda de pellets, com o berbequim ligado
  digitalWrite(berbequim, HIGH); // Os pellets já cairam em quantidade suficiente, desligo berbequim
  delay(360000); // Aguardo 3 minutos, com o igniter ligado para que comece a chama.
  digitalWrite(igniter, HIGH); // Desligo o igniter
  analogRead(vldr);
  digitalRead(dcorrente);
 
  if(vldr >= 1 && digitalRead(dcorrente) == 1) {
    principal(); // Caso o valor do LDR for menor ou igual a 50 (chama), vamos para a função principal
  }
 
  if(vldr == 0 && digitalRead(dcorrente) == 1)  {
    restart(); // Caso não haja chama, vamos tentar outra vez
  }
 
  else {
    standby();
  }
 
 
 
}


void principal(){
  digitalWrite(ledprincipal, HIGH);
  digitalWrite(berbequim, LOW); // Função principal de funcionamento normal. Ligo o berbequim
  delay(50); //
  digitalWrite(berbequim, HIGH);
  delay(30000); //Aguardo 30 segundos
  digitalWrite(berbequim, LOW);
  delay(50);
  digitalWrite(berbequim, HIGH);
  delay(30000);
  digitalRead(dcorrente);
  analogRead(vldr);
 
  if(vldr >= 1 && digitalRead(dcorrente) ==1) {
    principal();
  }
 
  if(vldr == 0 && digitalRead(dcorrente ==1)) {
      restart();
  }
 
  else {
    standby();
  }
 
}


void restart() {
  digitalWrite(ledrestart, HIGH);
  digitalWrite(igniter, LOW);
  digitalWrite(berbequim, LOW); // Ligo berbequim
  delay(25);
  digitalWrite(berbequim, HIGH);
  delay(360000); //Aguardo três minutos
  digitalWrite(igniter, HIGH);
  analogRead(vldr);
  digitalRead(dcorrente);
 
 
  if(vldr >= 1 && digitalRead(dcorrente) == 1) {
    principal();
  }
 
  if(vldr == 0 && digitalRead(dcorrente) == 1) {
    over();
  }
 
  else {
    standby();
  }
 
 
}

void over() {
  digitalRead(dcorrente);
  if(digitalRead(dcorrente) == 1) {
    digitalWrite(ledover, HIGH);
   
   
  }
 
  else {
    standby();
  }
 
}



Mas ainda assim, está estranho porque... o arduino nem sequer sai da função standby(). Já verifiquei o código e faço uma leitura da porta digital do dcorrente de cada vez que passo na função, etc. Alguém faz alguma ideia do que pode ser?

Cumprimentos e obrigado!

EDIT:

Fiz uns pequenos testes com este código:

Código: [Seleccione]
int berbequim = 13;
int dcorrente = 3;


void setup() {
  Serial.begin(9600);
  pinMode(berbequim, OUTPUT);
  pinMode(dcorrente, INPUT);
 
}




void loop() {
    digitalRead(dcorrente);
    Serial.println(dcorrente);
   
   
  if(dcorrente == 1){
    digitalWrite(berbequim, HIGH);
    delay(2500);
    loop();
  }

  if(dcorrente == 0){
  digitalWrite(berbequim, LOW);
  delay(2500);
  loop();
   
}

}

E apercebi-me de que o problema é com a leitura do estado da corrente: se está a um ou a zero. Com alguns tweaks que tinha nesse código ficava "preso" o valor até eu fazer reset. Isto é:

Tinha o transformador desligado da corrente, e o arduino estava-me a fazer print de 0's na consola serial. Tudo bem. Mas quando ligava, mesmo passado algum tempo, mantinha-se sempre a 0. Só quando eu fazia reset ao arduino é que este passava a fazer print de 1's na consola. Passava-se o mesmo quando desligava. Com o código como está acima, está a imprimir 3's. Estranho. Agora é que não estou mesmo a ver o que se passa. Está tudo bem ligado e o transformador está bom (testei com multímetro). Estou-me a esquecer de algo?
« Última modificação: 27 de Dezembro de 2012, 14:04 por tgferreira »

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.389
  • Helpdesk do sitio
Re: Controlador para caldeira a pellets
« Responder #12 em: 27 de Dezembro de 2012, 14:58 »
Estás a fazer chamadas recursivas ao loop, isso vai correr muito mal, porque nunca retornas dessas chamadas e acabas por acabar com a ram, e dá stack overflow, é que não tem qualquer sentido essa chamada do loop.

E tambem não estou a perceber essa do transformador de corrente, a medir DC!!! e ligado a um pino digital, vai ai uma pequena confusão..
Avr fanboy

Offline tgferreira

  • Mini Robot
  • *
  • Mensagens: 148
Re: Controlador para caldeira a pellets
« Responder #13 em: 27 de Dezembro de 2012, 15:14 »
Estás a fazer chamadas recursivas ao loop, isso vai correr muito mal, porque nunca retornas dessas chamadas e acabas por acabar com a ram, e dá stack overflow, é que não tem qualquer sentido essa chamada do loop.

E tambem não estou a perceber essa do transformador de corrente, a medir DC!!! e ligado a um pino digital, vai ai uma pequena confusão..

Boas Senso,
Vou tentar explicar o melhor possível.
Então: resumidamente, o arduino vai estar sempre ligado, numa função standby. A questão do standby e do transformador DC ligado ao pino digital e ao GND é para detectar corrente. Isto é: em alturas aleatórias, a caldeira vai ligar. Eu quero que, quando ela ligue o arduino detecte isso e entre numa função chamada "start".
Por outras palavras: o arduino está sempre ligado e com o seu próprio transformador. Mas, para detectar se a caldeira ligou ou não, uso um segundo transformador que só se liga quando esta se liga também. Os outputs deste último transformador estão ligados aos GND do arduino e à porta digital 3. O arduino faz leituras de x em x tempo nessa porta e caso detecte "1" (transformador ligado), quero que entre na função "start".
O problema é que fiz outra vez a montagem toda e, por algum motivo, o arduino está a detectar corrente mesmo quando não há. O código com que estou a trabalhar agora é este:

Código: [Seleccione]
int igniter =8;
int berbequim = 7;
int ldr = 0;
int reset = 6;
int vldr = analogRead(0);
int dcorrente = digitalRead(3);
int ledstandby = 13;
int ledprincipal = 12;
int ledstart = 11;
int ledrestart = 10;
int ledover = 9;
int ecorrente = 1;

void setup(){
  pinMode(igniter, OUTPUT);
  pinMode(ldr, INPUT);
  pinMode(reset, INPUT);
  pinMode(dcorrente, INPUT);
  pinMode(berbequim, OUTPUT);
  pinMode(ledstandby, OUTPUT);
  pinMode(ledprincipal, OUTPUT);
  pinMode(ledstart, OUTPUT);
  pinMode(ledover, OUTPUT);
  pinMode(ledrestart, OUTPUT);
 
  Serial.begin(9600);
}



void loop() {
  standby();
 
}


void standby() {
  digitalWrite(ledstandby, HIGH);
  delay(3000);
  ecorrente = digitalRead(3);
  if(ecorrente == 1) { // Caso seja detectada corrente 220V
    start();
  }
 
  else {
    loop();
  }
 
}



void start() {
  digitalWrite(ledstart, HIGH);
  digitalWrite(igniter, LOW); // Ligo o igniter
  digitalWrite(berbequim, LOW); // Ligo o berbequim para caírem pellets
  delay(50); // Tempo para a queda de pellets, com o berbequim ligado
  digitalWrite(berbequim, HIGH); // Os pellets já cairam em quantidade suficiente, desligo berbequim
  delay(360000); // Aguardo 3 minutos, com o igniter ligado para que comece a chama.
  digitalWrite(igniter, HIGH); // Desligo o igniter
  analogRead(vldr);
  ecorrente = digitalRead(3);
 
  if(vldr >= 1 && ecorrente == 1) {
    principal(); // Caso o valor do LDR for menor ou igual a 50 (chama), vamos para a função principal
  }
 
  if(vldr == 0 && ecorrente == 1)  {
    restart(); // Caso não haja chama, vamos tentar outra vez
  }
 
  else {
    standby();
  }
 
 
 
}


void principal(){
  digitalWrite(ledprincipal, HIGH);
  digitalWrite(berbequim, LOW); // Função principal de funcionamento normal. Ligo o berbequim
  delay(50); //
  digitalWrite(berbequim, HIGH);
  delay(30); //Aguardo 30 segundos
  digitalWrite(berbequim, LOW);
  delay(50);
  digitalWrite(berbequim, HIGH);
  delay(30);
  ecorrente = digitalRead(3);
  analogRead(vldr);
 
  if(vldr >= 1 && ecorrente ==1) {
    principal();
  }
 
  if(vldr == 0 && ecorrente ==1 ) {
      restart();
  }
 
  else {
    standby();
  }
 
}


void restart() {
  digitalWrite(ledrestart, HIGH);
  digitalWrite(igniter, LOW);
  digitalWrite(berbequim, LOW); // Ligo berbequim
  delay(25);
  digitalWrite(berbequim, HIGH);
  delay(3000); //Aguardo três minutos
  digitalWrite(igniter, HIGH);
  ecorrente = digitalRead(3);
 
 
  if(vldr >= 1 && ecorrente == 1) {
    principal();
  }
 
  if(vldr == 0 && ecorrente == 1) {
    over();
  }
 
  else {
    standby();
  }
 
 
}

void over() {
  ecorrente = digitalRead(3);
  if(ecorrente == 1) {
    digitalWrite(ledover, HIGH);
   
   
  }
 
  else {
    standby();
  }
 
}



Quanto ao que referiste, de fazer várias chamadas ao loop: como posso evitar isso?
Obrigado!

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.389
  • Helpdesk do sitio
Re: Controlador para caldeira a pellets
« Responder #14 em: 27 de Dezembro de 2012, 15:19 »
Nas funçoes fazes simplesmente return, ou se está no fim da função não metes nada, porque ele retorna á função que chamou a função em que estás, se foi o loop, retorna ao loop, mas isso tens ai uma confusão de saltos entre funções, isso devia ser implementado com uma máquina de estados, com switch/case's e tudo no main(loop), sem delays nem coisas do género.

É tipico isso acontecer, o transformador desligado fica a flutuar, logo tens de lhe meter uma resistência de pull-down.
Mas se isso controla a caldeira, para que é que precisas de saber que ela está ligada, supostamente quem a liga não é o código/arduino?
Parece-me algo desnecessário..
Avr fanboy