Controlador temperatura Arduino - Em andamento

Homebrew Talk - Beer, Wine, Mead, & Cider Brewing Discussion Forum

Help Support Homebrew Talk - Beer, Wine, Mead, & Cider Brewing Discussion Forum:

This site may earn a commission from merchant affiliate links, including eBay, Amazon, and others.

AlexandreBr

Member
Joined
Mar 18, 2015
Messages
23
Reaction score
5
Fala galera, tudo bem?
Me chamo Alexandre e estou a meio caminho do meu curso de Engenharia de Controle e Automação. E resolvi compartilhar esse meu pequeno projetinho :)

Esse aqui é um DIY para fazer o controle de temperatura do frigobar/freezer utilizando um Arduino.

Bom, primeira coisa, é bom ter um pouco de conhecimento elétrico e eletrônico para isso, apesar de bem básico.

Materiais:
1- Arduino (eu fiz o meu com um Uno, mas acho que com qualquer um consegue).
1- Sensor temperatura DS18B20
1 - Display LCD, 16x2.
1 - Capacitor 47nF 400v
1 - Triac BTA26600B - 25A
1 - MOC3043 (ou qualquer um equivalente que possua algo chamado Zero Cross)
1 - Placa Padrão perfurada.
1 - LED.
1 - Potenciometro 10k (para o display)
2- resistores 10k
2 - Botões Push-up
5 - Resistores 330 ohms
1 - resistor de 470 ohms
1 - resistor 4K7
1 - Multimetro digital.
Tempo e paciência.

Bom, com isso tudo em mãos a gente pode começar. Tenha em mente o seguinte: esses materiais são listados pelo jeito que eu fiz. Mas, uma vez que você tenha conseguido fazer funcionar, você é livre para modificar e customizar do jeito que bem entender.

Arduino:
Bom, o código do Arduino é bastante simples.. Nós vamos usar 4 bibliotecas: EEPROM, OneWire, DallasTemperature e LiquidCrystal. A primeira e a ultima são nativas do Arduino, então não tem que se preocupar com isso.
A Dallas você encontra aqui: http://www.hacktronics.com/code/DallasTemperature.zip
E a OneWire aqui: http://www.pjrc.com/teensy/arduino_libraries/OneWire.zip
O código em si ocupa 168 linhas e possui 3 funções além da setup e loop.
Primeira coisa é as declarações de variáveis:
Code:
#define ONE_WIRE_BUS 2

#define press_on 1
#define press_out 0

OneWire oneWire(ONE_WIRE_BUS);

LiquidCrystal lcd ( 13, 12, 11, 10, 9, 8);

DallasTemperature sensors(&oneWire);
DeviceAddress sensor1;

const int set = 3;
const int ok = 4;
const int liga_bta = 5;
const int led_bta = 6;

int state = 0;
int buttonState = 0;
float temp = 0;
float temp_sens1 = 0;
int contador = 0;

Na função de setup nós incializamos e configuramos algumas coisas:
Code:
void setup() {
  sensors.begin();
  lcd.begin(16, 2);
  pinMode(set, INPUT);
  pinMode(ok, INPUT);
  pinMode(liga_bta, OUTPUT);
  pinMode(led_bta, OUTPUT);
  lcd.print("Localizando sensores DS18B20...");
  delay(500);
  lcd.clear();
  lcd.print("Foram encontrados ");
  lcd.print(sensors.getDeviceCount(), DEC);
  lcd.print(" sensores.");
  if (!sensors.getAddress(sensor1, 0))
    Serial.println("Sensores nao encontrados !");
  // Mostra o endereco do sensor encontrado no barramento
  delay(500);
  lcd.clear();
  lcd.print("Endereco sensor: ");
  lcd.setCursor(0,1);
  mostra_endereco_sensor(sensor1);
  delay(3000);
  // put your setup code here, to run once:
}
Basicamente, incializamos o display, configuramos os pinos para entradas e saidas e localizamos o sensor de temperatura (altamente necessário caso contrário não funciona).
Feito isso, vamos para as funções adicionais, começando pela do sensor
Code:
void mostra_endereco_sensor(DeviceAddress deviceAddress)
{
  for (uint8_t i = 0; i < 8; i++)
  {
    // Adiciona zeros se necessário
    if (deviceAddress[i] < 16) lcd.print("0");
    lcd.print(deviceAddress[i]);
  }
}
Essa é bem simples e não precisa muita explicação, basicamente ele só pega o endereço do sensor e imprime isso na tela.

Agora, para uma das funções mais importantes, setar a temperatura.
Code:
void set_temp() {
  float temperatura = 0;
  int butstate = 0;
  int butstate1 = 0;
  int state = 0;

  lcd.clear();
  lcd.print("Set Temperatura");
  delay(5000);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Temperatura:");
  lcd.setCursor(0, 1);
  EEPROM.get(0, temperatura);
  lcd.print(temperatura);
Em meu projeto eu usei dois botões: 1 de set e 1 de ok. O botão "OK" é utilizado tanto para chamar, quanto para sair da função de setar a temperatura. Ou seja, para essa função nós temos que usar uma máquina de estado, a fim de prender o programa na função até ser dado o comando para o contrário. Algo parecido com isso:
Code:
do {
    lcd.setCursor(0, 1);
    lcd.print(temperatura);
    butstate = digitalRead(set);    
    if (butstate == HIGH)
    {
      if (temperatura < 24)
      {
        temperatura = temperatura + 0.5;
        delay(100);
      }
      else
      {
        temperatura = 0;
      }
    }
    delay (50);
    butstate1 = digitalRead(ok);
    if (butstate1 == HIGH)
    {
      state = 1;
    }
    delay(50);
  } while (state == 0);
Por fim, temos que salvar a temperatura que queremos na memória do Arduino, para isso precisamos usar a função EEPROM. Porém, a EEPROM do Arduino tem ciclos limitados.. então para evitar que fique se escrevendo lá toda hora que acessar a função, colocamos uma linha para fazer isso apenas quando o valor for diferente:
Code:
  if (EEPROM.read(0) != temperatura) {
    EEPROM.put(0, temperatura);
  }
  return;
}
Com isso feito, iremos para a ultima função, comparar as temperaturas. Essa função é bem curta. Basicamente ela recebe o valor de temperatura que setamos, o valor lido pelo sensor e compara os dois valores.
Code:
void comp_temp(float temp_in, float temp_out) {

  if (temp_out >= (temp_in + 0.5)) //compara temperaturas com margem de 0.5 a mais.
  {
    digitalWrite(liga_bta, HIGH); //liga motor
    digitalWrite(led_bta, HIGH);
  }
  if (temp_out <= temp_in) {
    digitalWrite(liga_bta, LOW);//desliga motor
    digitalWrite(led_bta, LOW);
  }
  return;
}

Agora, por último, vamos para o código do loop. Esse código é o "corpo" do programa, vai ficar rodando e vai ser o responsável por chamar as outras funções. Para chamar a função de set temperatura eu fiz uma lógica que precisa que o botão "OK" fique apertado por +/- 5 segundos. Para isso, de novo, usamos uma máquina de estados. Note que isso tem que ir no começo do loop, para ser sempre a "prioridade" do código:
Code:
void loop() {
  // put your main code here, to run repeatedly:
  sensors.requestTemperatures(); //comando p/ pegar temperatura do sensor
  buttonState = digitalRead(ok);
  if (buttonState == HIGH)
  {
    state = 1;
    contador = 0;
  }
  else
  {
    state = 0;
  }
  if (state == 1) {
    do {
      buttonState = digitalRead (ok);
      if ( buttonState == LOW)
      {
        state = 0;
      }
      delay(50); //delay necessário para contar o tempo certo
      contador ++;
      if (contador == 90)
      {
        set_temp();
        state = 0;
        contador = 0;
      }
    } while (state == 1);
  }
Notem também que chamei a temperatura do sensor lá no começo. Tive que fazer desta forma por que, caso contrário, a temperatura ficava piscando no display o tempo inteiro.. não muito ideal. Finalizando o código do loop temos a linha que imprime na tela a temperatura e chama a comparação entre ela e a salva:
Code:
 EEPROM.get(0, temp);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Temperatura:");
  lcd.setCursor(5, 1);
  lcd.write(223);
  lcd.print("C");
  lcd.setCursor(0, 1);
  temp_sens1 = sensors.getTempC(sensor1);
  lcd.print(temp_sens1);
  delay(500);
  comp_temp(temp, temp_sens1);
  delay(3000);
}
A esse ponto, recomendo baixarem o código para o Arduino e montar o circuito, usando um LED para simular a parte do frigobar (liga_bta no código). Isso é importante para duas coisas: 1 - já ter parte do circuito pronto e sem falhas. e 2 - para entender o código e seu funcionamento, dessa forma fica mais facil procurar eventuais erros e efetuar alguma mudança. Outra coisa bem importante, monte essa parte do circuito em uma placa separada do outro, seja numa protoboard ou em uma outra placa perfurada.. Isso também é importante por que a outra parte do circuito vai ser lidada com 220V e é extremamente perigosa.
Provavelmente ficará algo assim:
eeb9eb2206334f6596d41039716bc7f8.png

Notem que o LED conectado na porta 5 do arduino será removido posteriormente e substituido pela próxima parte que falaremos a seguir.
Com essa parte feita, vamos para a outra e mais importante parte: O circuito AC 220.

O Arduino, obviamente, por si só não tem condições de acionar um freezer, ele fornece apenas 5V de saída e no máximo 30 ou 40mA por saída.. Porém, ele consegue acionar um circuito que acione o freezer. Só que como as tensões e correntes de um circuito desses são muito elevadas, isso torraria nosso pobre arduino.

Então é preciso isola-lo daquele circuito, porém ainda comunicar um com o outro. Para isso nós vamos usar o MOC 3043 (ou equivalente, com Zero Cross), que é um opto acoplador. Basicamente, é um CI que tem um LED infra vermelho que aciona um TRIAC interno que faz o outro circuito andar. Esse MOC é especifico por possuir o Zero Cross. Zero Cross é uma detecção de borda. Isso impede que o circuito acione "de soco", torna as coisas um pouco mais suaves e seguras, ameniza o impacto no motor do freezer.
O MOC tem suas características próprias, por exemplo, ele tem que ser acionado com no máximo 1.5V e 5mA. ATENÇÃO: Isso varia de modelo a modelo, pesquisem sobre seus componentes antes de fazer qualquer coisa.
Para fazer o Arduino reduzir sua tensão de saída e corrente, ligaremos 2 resistores de 330 em série (totalizando 660 ohms de resistência), no meu caso ainda liguei um Diodo na porta do arduino, apenas por precaução extra.

Esse conjunto (saida arduino - diodo - resistor) será ligado ao pino 1 do MOC, enquanto que o pino 2 será ligado ao GND (terra). Essa é a parte referente ao Arduino. Agora faremos a parte do TRIAC.

O TRIAC é um Triodo, especifico para AC (por isso o nome). O funcionamento dele é parecido com o de um Transistor: uma base (chamada de gate), um emissor (chamado de A1) e um coletor (A2). E, como um Transistor, a gente tem que alimentar ele externamente, nesse caso, com 220V. A fim de isso ficar mais claro, aqui está o simbolo dele:
133c122a02f94904891c5b5ecfca1262.png


O Pino A1 será onde será colocada a carga (freezer). Para isso, eu recomendo usar algo chamado borne que são pequenos conectorzinhos de plástico, reguláveis com uma chave, simples e eficaz. A carga é ligada em série com o TRIAC. Em paralelo à carga a gente liga o resistor de 470 e o capacitor de 47nF, isso ajuda a filtrar eventuais picos e da mais segurança ao motor e também ao circuito. Ou seja, no pino A1 ligamos um dos terminais do borne que vai para a carga e um dos terminais daquele conjunto resistor-capacitor. O outro terminal disso vai para a rede.

Já no pino A2 do TRIAC ligaremos o pino 6 do nosso MOC em série com um resistor de 330 e fecharemos o circuito da rede, apenas isso.

No pino G (gate), ligaremos o pino 4 do MOC em série com um resistor de 330 também.

Aqui está o esquema elétrico desenhado, para ficar um pouco mais claro:
b2270e5ed0f545048df5ecfeaaf0913e.png

Algumas dicas:
- Uma coisa interessante é usar uma régua (de tomadas), para ligar ao borne e ligar o freezer nessa régua, dessa forma não tem que destruir a flecha do seu freezer.
- Não se preocupe com espaçamento do circuito, é de extrema importância soldar os componentes bem e evitar curto circuitos, por motivos óbvios. Utilize bem de seus recursos, como o multímetro para detectar curtos e etc.
-Lembre-se de ter paciência, o circuito é de alta tensão. Tem que ficar sempre o mais bem feito possível.
- Antes de ligar qualquer coisa, tome todas precauções devidas, como se isolar, verificar se esta tudo OK sem curto.. essas coisas. Ultima coisa que queremos é tomar um choque desses, não é?
- De novo, procure entender o circuito e seu funcionamento, tornará as coisas mais fáceis.

Aqui um link de um pequeno vídeo demonstrando o meu circuito final, ligado ao freezer em funcionamento. Como pretendo evoluir este circuito mais adiante ele ainda está meio bagunçado (Pelo menos a parte do Arduino), pretendo melhorar isso com o tempo (próximo passo é permitir trabalhar com isso via Wireless por exemplo):
https://youtu.be/YqcXJrGKAa8

Por enquanto, acho que é isso gurizada. É um projetinho meio básico, mas a vantagem deste tipo de sensor é que ele é a prova d'água e um projeto assim nos da liberdade de fazer o que bem entendermos, imaginação é o limite. No total, sem contar o arduino, eu acredito que gastei em torno de 70 reais, mas comprei algumas coisas pela internet, então o custo aumenta um pouco.

Fico à disposição de vocês para dúvidas, sugestões e afins. Se preferirem, este é o meu Facebook, podem me contatar por lá: https://www.facebook.com/aleeebrito

Espero que tenham gostado.

Cheers!:mug:
 
Se você realmente pretende tocar esse projeto e receber colaboradores, sugiro colocar o código no github.

Eu estou trabalhando em um algoritmo de previsão para o Saci (veja o link da assinatura) mas ainda não tenho nada pra mostrar publicamente e eu to com pouco tempo pra isso.

Sent from my Moto G using Tapatalk
 
Se você realmente pretende tocar esse projeto e receber colaboradores, sugiro colocar o código no github.

Eu estou trabalhando em um algoritmo de previsão para o Saci (veja o link da assinatura) mas ainda não tenho nada pra mostrar publicamente e eu to com pouco tempo pra isso.

Sent from my Moto G using Tapatalk

A principio e apenas quis compartilhar, até por que eu já tenho bem a ideia do que fazer e como, apenas não tive tempo ainda. E eu sei que tem bastante gente por ai que curte fazer algumas coisas por conta (como eu) e não sabe por onde começar.
 
Segue o meu projeto:

https://github.com/leandrocosta/brew-controller-chromeapp
https://github.com/leandrocosta/brew-controller-arduinoapp
https://chrome.google.com/webstore/...gohpalbfdiaddkhkla?utm_source=chrome-ntp-icon

Dá pra controlar 3 DS18B20 e 2 SSRs (não precisa de SSR pro BK).
A interface é Web, e utilizo um notebook conectado ao Arduino pela porta USB.
O único problema que ainda tenho é que, às vezes, quando a bomba liga ou desliga, o Arduino reinicia. Parece ser interferência, mas como não sou engenheiro não sei como resolver.
Na foto abaixo o Arduino está fora da caixa, mas pretendo fixá-lo por dentro e parafusar a caixa na parede.
 

Attachments

  • 2015-11-04 19.59.54.jpg
    2015-11-04 19.59.54.jpg
    161.9 KB · Views: 151
Segue o meu projeto:

https://github.com/leandrocosta/brew-controller-chromeapp
https://github.com/leandrocosta/brew-controller-arduinoapp
https://chrome.google.com/webstore/...gohpalbfdiaddkhkla?utm_source=chrome-ntp-icon

Dá pra controlar 3 DS18B20 e 2 SSRs (não precisa de SSR pro BK).
A interface é Web, e utilizo um notebook conectado ao Arduino pela porta USB.
O único problema que ainda tenho é que, às vezes, quando a bomba liga ou desliga, o Arduino reinicia. Parece ser interferência, mas como não sou engenheiro não sei como resolver.
Na foto abaixo o Arduino está fora da caixa, mas pretendo fixá-lo por dentro e parafusar a caixa na parede.

tens algum relê no circuito?

se sim, tens que colocar um diodo 1N4148 na bobina do relê.

se não, deves ter algum ruido no ckt.
 
Segue o meu projeto:

https://github.com/leandrocosta/brew-controller-chromeapp
https://github.com/leandrocosta/brew-controller-arduinoapp
https://chrome.google.com/webstore/...gohpalbfdiaddkhkla?utm_source=chrome-ntp-icon

Dá pra controlar 3 DS18B20 e 2 SSRs (não precisa de SSR pro BK).
A interface é Web, e utilizo um notebook conectado ao Arduino pela porta USB.
O único problema que ainda tenho é que, às vezes, quando a bomba liga ou desliga, o Arduino reinicia. Parece ser interferência, mas como não sou engenheiro não sei como resolver.
Na foto abaixo o Arduino está fora da caixa, mas pretendo fixá-lo por dentro e parafusar a caixa na parede.
Como está alimentando o Arduino?

Se for o computador experimente usar alimentação externa e teste se resolveu.

Enviado do meu GT-I9300 através de Tapatalk
 
Estou usando o circuito com diodo 1N-4007 e transistor BC337, se não me engano são estes os componentes utilizados no ArdBir.
Se eu trocar o diodo pelo 1N-4148 vai fazer diferença?

tens algum relê no circuito?

se sim, tens que colocar um diodo 1N4148 na bobina do relê.

se não, deves ter algum ruido no ckt.
 
@cristianot, vou providenciar uma fonte pra fazer o teste com alimentação externa, mas qual seria a explicação para isso?
Achei que a corrente da porta USB do notebook seria suficiente para o circuito, de acordo com as especificações do SSR e do DB18S20.

Como está alimentando o Arduino?

Se for o computador experimente usar alimentação externa e teste se resolveu.

Enviado do meu GT-I9300 através de Tapatalk
 
@cristianot, vou providenciar uma fonte pra fazer o teste com alimentação externa, mas qual seria a explicação para isso?
Achei que a corrente da porta USB do notebook seria suficiente para o circuito, de acordo com as especificações do SSR e do DB18S20.
É uma possibilidade. Logo diga como correu.

Enviado do meu GT-I9300 através de Tapatalk
 
Segue o meu projeto:

https://github.com/leandrocosta/brew-controller-chromeapp
https://github.com/leandrocosta/brew-controller-arduinoapp
https://chrome.google.com/webstore/...gohpalbfdiaddkhkla?utm_source=chrome-ntp-icon

Dá pra controlar 3 DS18B20 e 2 SSRs (não precisa de SSR pro BK).
A interface é Web, e utilizo um notebook conectado ao Arduino pela porta USB.
O único problema que ainda tenho é que, às vezes, quando a bomba liga ou desliga, o Arduino reinicia. Parece ser interferência, mas como não sou engenheiro não sei como resolver.
Na foto abaixo o Arduino está fora da caixa, mas pretendo fixá-lo por dentro e parafusar a caixa na parede.

Esse seu é para qual finalidade?
Por enquanto eu pretendo me reter apenas no controle de temperatura para fermentação (até por questões de espaço). Mas tenho algumas ideias para automatizar algumas outras partes do processo.
 
Controlar um sistema RIMS.

Esse seu é para qual finalidade?
Por enquanto eu pretendo me reter apenas no controle de temperatura para fermentação (até por questões de espaço). Mas tenho algumas ideias para automatizar algumas outras partes do processo.
 
@leandrocosta, você já testou com a fonte externa?

Enviado do meu GT-I9300 através de Tapatalk
 
Back
Top