Ir para conteúdo

Fazendo um controlador arduino para máquina de café espresso


Postagens recomendadas

Concordo plenamente.

O mais importante é o controle na bomba (que pretendo fazer via utilização de PID). Tendo uma leitura  mais ou menos acurada da saída da bomba (I), em tese, é possível definir o setpoint desejado, obviamente, depois de regular os parâmetros P I D para uma resposta eficaz.

 

Claro que o grau de correspondência depende muito (e muito mesmo) do equipamento utilizado (esse sensor tem uma margem de erro um pouco maior, pelo que depreendi). Mas, se a resposta no controle da bomba for ágil, até que dá para brincar um pouco com a pressão.

Link para o comentário
Compartilhar em outros sites

Ué, é single boiler. A pressão da caldeira, na extração é a gerada pela bomba e na vaporização é a gerada pelo vapor. Basta um sensor.

 

Entendi. Situado na caldeira. Resta saber se tem um sensor que atue bem em uma faixa tão extensa de pressão.

Link para o comentário
Compartilhar em outros sites

Pensava que, em relação ao vapor, a pressão seria acumulada na caldeira (onde estão as resistências). Mas, de fato, onde tem pressão (mesmo se tiver uma válvula de via única) ela tende a exercer força para todo lado (mesmo se for para impedir de entrar, ou estou errado).

Link para o comentário
Compartilhar em outros sites

a pressao sera a mesma em todo caminho descontadas as resistencias, se considerarmos um fluxo muito rapido em condutores estreitos poderemos ter variaçao da pressao e valvula ou restritores fazem isso fora isso a pressao é a mesma.

Link para o comentário
Compartilhar em outros sites

Bem lembrado Lisca. Na mangueira, na saída da bomba, seria ruim pois haverá fluxo na extração. Daria certo só para a pressão de vapor.

 

O ideal é conectar no boiler por uma mangueira que isolaria o sensor termicamente.

Link para o comentário
Compartilhar em outros sites

Calculei aqui é irrelevante a perda de pressão devido a velocidade na mangueira. A velocidade é muito baixa. Colocar o sensor na mangueira após a bomba é um lugar viável.

 

Guilherme o café dará a pressão no sistema e essa pode ser medida em qualquer parte do circuito de água.

Link para o comentário
Compartilhar em outros sites

Na minha twin eu pus um `t` na entrada da caldeira pois tinha bom espaço e ficava na parte de cima para colocar o manometro quando fiz uns testes de pressao acho um bom lugar e evita as variaçoes da opv etc. e a agua esta fria.

Link para o comentário
Compartilhar em outros sites

Ainda nem bolei o programa, muito menos comprei o sensor de pressão. Mas já tenho o T que vou utilizar. Por ser de plástico, penso em colocá-lo na saída da bomba.

Link para o comentário
Compartilhar em outros sites

Atualizações:

Resolvi utilizar um teclado no controlador:

419-00.jpg

 

Ele é fácil de instalar (ocupa poucos pins), fácil de colocar no case do controlador (basta colar na superfície do case do controlador, fazendo um pequeno corte em linha reta para inserir o conector para dentro do case).

Além disso, vai tornar mais prática a definição dos parâmetros (acelerando e facilitando o uso).

O único problema é que esse projeto vai ficar parado por uns 40 dias até as peças chegarem.

 

Já atualizei o sketch para a nova interface.

Segue como vai ficar a tela inicial:

15246880786_f2d83f190b_c.jpg

 

 

Segue o código atualizado até agora (mais enxuto):

 

/*
   BASE DO MENU
*/
#include <MenuBackend.h>    //MenuBackend library - copyright by Alexander Brevig
#include <wire.h> // wire que precisa ser utilizado junto ao liquidCrystal I2C

#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);
// this library included with the arduino distribution
#include <Wire.h>
#include <Keypad.h> // vou usar um keypad para controlar os menus e as funções

//#include <LiquidCrystal.h>  //this library is included in the Arduino IDE

const byte ROWS = 4; //four rows
const byte COLS = 3; //three columns
char keys[ROWS][COLS] = {
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'*','0','#'}
};
byte rowPins[ROWS] = {5, 4, 3, 2}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {8, 7, 6}; //connect to the column pinouts of the keypad

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

// DEFINIR BOTOES

int keypressed;
int none;
int buttonpushed;

// LiquidCrystal display with:
// rs on pin 7
// rw on ground
// enable on pin 6
// d4, d5, d6, d7 on pins 5, 4, 3, 2


//Menu variables
MenuBackend menu = MenuBackend(menuUsed,menuChanged);
//initialize menuitems
   MenuItem menu1Item1 = MenuItem("Item1");
      MenuItem menuItem1SubItem1 = MenuItem("Item1SubItem1");
      MenuItem menuItem1SubItem2 = MenuItem("Item1SubItem2");
   MenuItem menu1Item2 = MenuItem("Item2");
      MenuItem menuItem2SubItem1 = MenuItem("Item2SubItem1");
      MenuItem menuItem2SubItem2 = MenuItem("Item2SubItem2");
      MenuItem menuItem2SubItem3 = MenuItem("Item2SubItem3");
    MenuItem menu1Item3 = MenuItem("Item3");
      MenuItem menuItem3SubItem1 = MenuItem("Item3SubItem3");
      MenuItem menuItem3SubItem2 = MenuItem("Item3SubItem2");
      MenuItem menuItem3SubItem3 = MenuItem("Item3SubItem3");
  MenuItem menu1Item4 = MenuItem("Item4");


void setup()
{
  lcd.init();
  lcd.backlight();
  lcd.begin(16, 2);
 
  //configure menu
  menu.getRoot().add(menu1Item1);
  menu1Item1.addRight(menu1Item2).addRight(menu1Item3).addRight(menu1Item4);
  menu1Item1.add(menuItem1SubItem1).addRight(menuItem1SubItem2);
  menu1Item2.add(menuItem2SubItem1).addRight(menuItem2SubItem2).addRight(menuItem2SubItem3);
  menu1Item3.add(menuItem3SubItem1).addRight(menuItem3SubItem2).addRight(menuItem3SubItem3);
  menu.toRoot();
  lcd.setCursor(0,0);  
 

}  // setup()...


void loop()
{

  readButtons();  //I splitted button reading and navigation in two procedures because
  navigateMenus();  //in some situations I want to use the button for other purpose (eg. to change some settings)
                  
} //loop()...


void menuChanged(MenuChangeEvent changed){
 
  MenuItem newMenuItem=changed.to; //get the destination menu
 
  lcd.setCursor(0,1); //set the start position for lcd printing to the second row
  lcd.clear();
  if(newMenuItem.getName()==menu.getRoot()){
      lcd.print("      MENU");
      lcd.setCursor (0,1);
      lcd.print ("#-ESC,   *-ENTER");
      lcd.setCursor (0,1);
  }else if(newMenuItem.getName()=="Item1"){
      lcd.print("PREPARAR");
  }else if(newMenuItem.getName()=="Item1SubItem1"){
      lcd.print("CURTO");
  }else if(newMenuItem.getName()=="Item1SubItem2"){
      lcd.print("LONGO");
  }else if(newMenuItem.getName()=="Item2"){
      lcd.print("CONFIGURAR");
  }else if(newMenuItem.getName()=="Item2SubItem1"){
      lcd.print("TEMPO CURTO");
  }else if(newMenuItem.getName()=="Item2SubItem2"){
      lcd.print("TEMPO LONGO");
  }else if(newMenuItem.getName()=="Item2SubItem3"){
      lcd.print("TEMPO PREINFUSAO   ");
  }else if(newMenuItem.getName()=="Item3"){
      lcd.print("DEFINIR PID");
  }else if(newMenuItem.getName()=="Item3SubItem1"){
      lcd.print("DEFINIR P");
}else if(newMenuItem.getName()=="Item3SubItem2"){
      lcd.print("DEFINIR I");  
}else if(newMenuItem.getName()=="Item3SubItem3"){
      lcd.print("DEFINIR D");
}else if(newMenuItem.getName()=="Item4"){
      lcd.print("DEFINIR TEMPERATURA");
}
}

// APENAS PARA VER O QUE FOI PRESSIONADO E QUAL O MENU USADO
void menuUsed(MenuUseEvent used){
  lcd.setCursor(0,0);  
  lcd.print("FOI USADO       ");
  lcd.setCursor(0,1);
  lcd.print(used.item.getName());
  delay(3000);  //delay to allow message reading
  lcd.init();
    menu.toRoot();  //back to Main
}


void  readButtons(){  //read buttons status
  char key = keypad.getKey();
   keypressed = (key);
   
 
                  

                  
                  
}

void navigateMenus() {
  MenuItem currentMenu=menu.getCurrent();
 
  switch (keypressed){
    case '*':
      if(!(currentMenu.moveDown())){  //if the current menu has a child and has been pressed enter then menu navigate to item below
        menu.use();
      }else{  //otherwise, if menu has no child and has been pressed enter the current menu is used
        menu.moveDown();
       }
      break;
    case '#':
      menu.moveLeft();  //volta para o menu anterior
      break;
   
  }
 
  }

Link para o comentário
Compartilhar em outros sites

A partir de agora, para não tumultuar o tópico, vou salvar os updates do sketch na pasta do google drive

 

https://drive.google.com/folderview?id=0ByeNNDDkmoEEaDZ6UkhHdVQ0REk&usp=sharing

 

Já estou trabalhando as funções, no momento, definindo parâmetros da extração de um espresso curto.

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

Rapaz (ou moça rss), a ansiedade mata. Não aguentei esperar. Acabei comprando esse keypad no mercadolivre (paguei algo como 4x mais, considerando o frete que, no DX, é gratuito).

 

É que estou de vento em popa na programação e não vejo a hora de testar a funcionalidade dos menus.

 

:wacko:    :P   :ph34r:

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Acho que estou quase no fim da programação.

 

falta apenas definir códigos para mostrar um contador na hora da extração.

vou fazer como um void à parte (fica mais fácil programar assim, bem como entender depois, se der alguma zebra na execução).

 

Está lá na pasta do google drive : https://drive.google.com/folderview?id=0ByeNNDDkmoEEaDZ6UkhHdVQ0REk&usp=sharing

 

Ainda tenho que testar.

 

Ficou bem tranquilo de replicar.

Se, quando eu testar, o programa funcionar como eu planejei (rss) ..... rsss.

Link para o comentário
Compartilhar em outros sites

Valeu.

A versão preliminar estava errada. Faltavam linhas que permitissem navegação para cima e para baixo entre os menus.

Atualizei, bem como redesenhei o que será mostrado no LCD.

Quando ligada a máquina, vai mostrar o seguinte:

 

15103909858_2358df4344_c.jpg

 

 

 

Por sua vez, a tela principal (quando nenhuma função estiver sendo selecionada, bem como durante a execução de extrações) vai mostrar o seguinte:

 

 

15103767610_08e7036760_c.jpg

 

 

A ordem da tela é a seguinte:

Tempo transcorrido a partir do momento que a máquina foi ligada (para que o usuário tenha uma noção se o conjunto já alcançou estabilidade)

D - que é a duração da extração (só varia quando uma extração de espresso estiver em curso, seja um curto ou um longo)

T - temperatura medida pelo sensor (na caldeira ou dentro da caldeira, a depender da instalação física na máquina de café espresso)

P - pressão medida na tubulação da máquina.

  • Curtir 7
Link para o comentário
Compartilhar em outros sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Visitante
Responder

×   Você colou conteúdo com formatação.   Remover formatação

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Processando...
×
×
  • Criar Novo...