Olá amigos, sou novo no Lab e preciso de uma ajuda com um projeto que estou montando. Segue o esboço do código abaixo.

O sistema funcionará de forma que os servos controlarão os registros de água fria e quente. O registros que utilizarei serão de abertura em 180 graus, assim como os servos.

 

Bom, gostaria de saber se estou indo pelo caminho correto, pois simulei o código no Proteus e inicialmente não obtive o resultado desejado.
Durante a simulação os servos responderam de maneira que o incremento/decremento da sua posição era muito acima do desejado, 9. No Proteus esse incremento passa de 15, 20, ele fica bem instável. (testado e funcionando!)

 

......ATUALIZADO 12/09/2013

Preciso de críticas! Agradeço a ajuda de todos!

#include <Servo.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 10

OneWire oneWire(ONE_WIRE_BUS);

DallasTemperature sensors(&oneWire);

DeviceAddress tempBoiler = {0x28, 0x78, 0x1E, 0x22, 0x05, 0x00, 0x00, 0xBB};
DeviceAddress tempExit = {0x28, 0x04, 0xFB, 0x22, 0x05, 0x00, 0x00, 0x56};


Servo cWater;
Servo hWater;

float tempCBoiler = 0; //temperatura do reservatório
float tempCExit = 0; //temperatura do cano de saida

int sButton = HIGH;
int pButton = HIGH;
int mButton = HIGH;


int sTemp; //tempo definido para desligar banho
int dTime = 15; //"duration time" tempo de banho
float fWater = 100; //fluxo da água(pressão) 100% 120% 140% 160%
int iMenu = 0;
int sWarning =0;
int pcWater; //posição servo frio
int phWater; //posição servo quente
float dTemp = 40.0; //temperatura desesada para uso
String sMenu[] = {"Ligar", "Configurações", "Sair", "Temperatura", "Duração","Vazão","Data e","Aviso","Retornar"};
String sSubMenu[] = {"Misturador?", "", "", "Padrão","do Banho","da Água","Hora","Sonoro",""};


void setup()
{
Serial.begin(9600);
pinMode(2, INPUT);
pinMode(4, INPUT);
pinMode(7, INPUT);
cWater.attach(3);
hWater.attach(5);
sensors.begin();
sensors.setResolution(tempBoiler, 10);
sensors.setResolution(tempExit, 10);
}


void loop()
{
sButton = !digitalRead(2);
if(sButton == HIGH)//inicia rotina
{
Serial.println(sButton);
Serial.print("Aguarde");//lcd
for(int i = 0; i < 10; i++)
{
Serial.print(".");
delay(300);
}
iMenu = 0;
Serial.println("Pronto!");
while(iMenu >= 0)
{
Serial.print(sMenu[iMenu]);//lcd
Serial.println(sSubMenu[iMenu]);//lcd
while(sButton == HIGH && pButton == HIGH && mButton == HIGH)
{
sButton = digitalRead(2);
pButton = digitalRead(4);
mButton = digitalRead(7);
}
delay(300);

if(pButton == LOW)//botão PLUS
{
iMenu++;
if(iMenu == 3)iMenu = 0;
pButton = HIGH;
} else {
if(mButton == LOW)//botão MINUS
{
iMenu--;
if(iMenu == -1)iMenu = 2;
mButton = HIGH;
} else {
if(sButton == LOW)//botão START
sButton = HIGH;
{
switch(iMenu)
{

case 0:
/*

#######################
# INICIA MISTURADOR #
#######################

*/
setPosition();
while(sButton == HIGH)
{
getTemperatures();
waterTap(tempCExit, tempCBoiler);

sButton = digitalRead(2);
pButton = digitalRead(4);
mButton = digitalRead(7);
setTemperature();

}
sButton = HIGH;
Serial.println("Desligado!");
delay(300);
break;


case 1://abre subMENU
iMenu = 3;
while(iMenu >= 3)
{
Serial.print(sMenu[iMenu]);//lcd
Serial.println(sSubMenu[iMenu]);//lcd
while(sButton == HIGH && pButton == HIGH && mButton == HIGH)
{
sButton = digitalRead(2);
pButton = digitalRead(4);
mButton = digitalRead(7);
}
delay(300);

if(pButton == LOW)//botão PLUS
{
iMenu++;
if(iMenu == 9)iMenu = 3;
pButton = HIGH;
} else {
if(mButton == LOW)//botão MINUS
{
iMenu--;
if(iMenu == 2)iMenu = 8;
mButton = HIGH;
} else {
if(sButton == LOW)//botão START
{
sButton = HIGH;
delay(300);
switch(iMenu)
{
case 3://temperatura da água
Serial.println("Temperatura");//LCD
Serial.println(dTemp);//LCD
while(sButton == HIGH)
{
sButton = digitalRead(2);
pButton = digitalRead(4);
mButton = digitalRead(7);
setTemperature();
}
if(sButton == LOW)
{
sButton = HIGH;//condição de saída
delay(300);
}
break;

case 4://tempo de banho
Serial.println("Duração");//LCD
Serial.print(dTime);//LCD
Serial.println("min");
while(sButton == HIGH)
{
sButton = digitalRead(2);
pButton = digitalRead(4);
mButton = digitalRead(7);
if(pButton == LOW)
{
dTime += 1;
Serial.print(dTime);//LCD
Serial.println("min");
delay(300);
}
if(mButton == LOW)
{
dTime -= 1;
Serial.print(dTime);//LCD
Serial.println("min");
delay(300);
}
}
if(sButton == LOW)
{
sButton = HIGH;//condição de saída
delay(300);
}
break;

case 5://vazão da água (100,120,140,160%)
Serial.println("Vazão da água");//LCD
Serial.println(fWater);//LCD
while(sButton == HIGH)
{
sButton = digitalRead(2);
pButton = digitalRead(4);
mButton = digitalRead(7);
if(pButton == LOW)
{
fWater += 20;
if(fWater > 160)
{
Serial.println("Máximo!");
fWater = 160;
}
Serial.println(fWater);//LCD
delay(300);
}
if(mButton == LOW)
{
fWater -= 20;
if(fWater <100)
{
Serial.println("Mínimo!");
fWater = 100;
}
Serial.println(fWater);//LCD
delay(300);
}
}
if(sButton == LOW)
{
sButton = HIGH;//condição de saída
delay(300);
}
break;

case 6://data e hora
break;

case 7://Aviso sonoro (sim/não)
Serial.println("Aviso");//LCD
if(sWarning == 0) Serial.println("OFF");
else Serial.println("ON");
while(sButton == HIGH)
{
sButton = digitalRead(2);
pButton = digitalRead(4);
mButton = digitalRead(7);
if(pButton == LOW)
{
sWarning =0;
Serial.println("OFF");//LCD
delay(300);
}
if(mButton == LOW)
{
sWarning = 1;
Serial.println("ON");//LCD
delay(300);
}
}
if(sButton == LOW)
{
sButton = HIGH;//condição de saída
delay(300);
}
break;

case 8://retornar;
iMenu = 1;
break;
}
}
}
}
}
break;




case 2://finaliza rotina
iMenu = -1;
break;
}
}

}
}


}

Serial.println("Sistema desligado!");
delay(2000);
}
}

void waterTap (float eTemp, float bTemp) //manipulação dos registros/servos
{
if(dTemp > bTemp)
{
Serial.print("Temp.Max = ");
Serial.println(bTemp);
cWater.write(0);
hWater.write(180);
}
else
{
if(eTemp < dTemp)
{
if(pcWater > 0 && phWater <180)
{
pcWater -= 9;
phWater += 9;
cWater.write(pcWater);
hWater.write(phWater);
}
}
if(eTemp > dTemp)
{
if(pcWater < 180 && phWater > 0)
{
pcWater -= 9;
phWater += 9;
cWater.write(pcWater);
hWater.write(phWater);
}
}
}
}

void setPosition() //define posição inicial dos servos
{
pcWater = (180/2)*(fWater/100);
phWater = (180/2)*(fWater/100);
cWater.write(pcWater);
hWater.write(phWater);
}

void getTemperatures() //lê temperatura dos sensores
{
sensors.requestTemperatures();
tempCBoiler = sensors.getTempC(tempBoiler);
tempCExit = sensors.getTempC(tempExit);
}

void setTemperature() //define temperatura de saída da água
{
if(pButton == LOW)
{
dTemp += 1.0;
Serial.println(dTemp);//LCD
delay(300);
}
if(mButton == LOW)
{
dTemp -= 1.0;
Serial.println(dTemp);//LCD
delay(300);
}
}

 

Exibições: 2147

Responder esta

Respostas a este tópico

Olha, parece sim que o seu programa faz aquilo a que se propõe. Só que ele vai ficar atuando nas torneiras o tempo todo, ou seja, ele não vai atuar convergindo a mistura de água quente e fria para uma proporção em que mantenham a temperatura constante.

Para fazer esse controle dessa maneira simplificada eu não atuaria nas duas torneiras: abriria a torneira quente toda e controlaria somente a fria. Isso me asseguraria a vazão máxima possível para não baixar dos quarenta graus.

Agora, chique mesmo era fazer com PID: http://automatobr.blogspot.com.br/2013/05/controle-de-potencia-em-c...

Obrigado pela dica Mauro! 

Até tinha pensado na possibilidade da torneira quente ficar aberta o tempo todo, garantindo máxima pressão, mas aí eu analise e levei também em consideração a questão da economia de água. Se mantiver os dois registros setados em 50% e a partir daí ir abrindo um registro e proporcionalmente fechando o outro, terei sempre uma proporção de 100% de vasão da bitola de 60mm, o que parece ter uma pressão satisfatória aqui em casa.

Outro fator que levei em consideração foi o desejo de gastar somente a água fria. Esse sistema ficará instalado na tubulação que precede o registro do banheiro, que distribui água para a torneira do lavatório, para o chuveiro e para a patente. É que ainda não está implementado no código acima, mas o misturador funcionará somente quando for solicitado. Caso contrário a água sairá somente fria, preservando a água quente para quando for necessário. 

A minha maior dúvida é referente aos servos... Eles irão funcionar incrementando apenas 9º como eu desejo, ou ficarão "loucos" como no Proteus? Será que o desempenho no Proteus está correto?

Obrigado novamente pela ajuda!

 

Olha, eu acho que vai funcionar sim. Se não funcionar, adapta-se melhor o código. Não esquente com o Proteus, mas sim com o seu circuito... haha... (infame, essa!)

kkkk

Vou pedir os servos e realizar os testes!

 
Obrigado grande Mauro, sucesso para ti!

Olá, gostaria de saber qual servo que está usando, ele faz a função "pra frente e pra traz", e gostaria de saber os registro, parte expremental, estou com um pronto mas está louco quero mexer na parte prática..

valeu

burst, desculpe a demora! Então, minha intensão é utilizar 2x SG-5010, mas como não fiz o teste com os registros, não tenho certeza se serão suficiente. Nos registros eu estou batendo a cabeça... A princípio eu achei que seria fácil encontrar um registro de pressão com fechamento em 180º, mas para minha surpresa está sendo doloroso... Recentemente achei um da TIGRE para fazer os testes.. na verdade eu descobri ele, ainda não comprei. Minha intenção é colocar um registro da DECA com uma espécie de adaptador que o fecha em 1/2 volta(dê uma procurada por Conversor 1/2 Volta para Registro Pressao). Estou reformulando totalmente meu projeto. Assim que eu der uma adiantada, te dou um toque! Se você já tiver realizado algum teste, agradeceria seu comentário! 

Carlos, pois é eu estou com serio problema com esse misturador que tenho. Acesse o Youtube e digita "misturador eletronico", vai ter um cara que fez, meu pai comprou direto dele, e o sistema não funciona, ele já patentiou mas não da certo.

PROBLEMA: O sistema de vedação é de tecnil interno com eixo prolongado de um motor DC de 12vcc, ele fez dentro da caixinha da STECK, com CI todos raspado, a tubulação é de LATÃO forjado, porém o tecnil dentro dessa tubulação não veda totalmente.

Tem um potenciometro que vc regula onde estiver, mas somente ele, o sensor é na saída dos dois tipos de água quente, já troquei o sensor pois fica mt próximo as tubulação fria e quente,  o motor fica com esse bug. intende água quente e fria ele fica girando, NÃO ESTABILIZANDO A ÁGUA DESEJADA PELO POTENCIOMETRO. "já foi me trocado 2 e não resolve"

SOLUÇÃO, coloquei o arduino com um sensor NTC  e um driver, inicialmente funcionou mas ficou inviavél.

ABRAÇO.

Então burst, o motor fica girando, alternando entre água quente e fria intermitentemente e não atinge a temperatura correta? Eu sinceramente já havia assistido o vídeo desse produto, mas não gostei muito do aspecto dele, embora parecesse bem funcional. Optei por comprar 2 registros, assim como no vídeo de um outro projeto. Esse misturador que você comprou tem apenas um motor? Ele está funcionando com ponte H? Mande umas fotos, se possível! Abraços!

ve o video do misturado que não estabiliza na temperatura ideal.

http://www.youtube.com/watch?v=D67jxN54niQ

ele não é preciso, e fica oscilando enquanto estiver energizado. Estou sem fotos desse feito pelo Cara, ele patentiou um produto que não é tão preciso.

estou desenvolvendo um para controlar somente 1 registo de agua quente, talvez funcione por uns tempo, o INTUITO NÃO É FAZER PRA VENDA !

Então, era esse mesmo vídeo que eu tinha visto... se você for ver, sorte nossa que ele patenteou isso, assim impede que alguém cometa o mesmo erro! kkkk   Uma forma que eu vejo de aproveitar o projeto dele é resolver o problema do vazamento com uma vedação de borracha(se for possível), tirar fora o CI(já que está raspado) e colocar o arduino para realizar o gerenciamento do motor(provavelmente como você já fez), que pode ser ligador por uma ponte H. Recomendaria um 18B20 para fazer a leitura da temperatura... Será que não seria o suficiente? Quando eu estava pensando no meu projeto, cogitei a possibilidade de gerenciar apenas o registro da água quente, mas quando pensei melhor, vi que nos dias frios isso poderia ser um problema. Por isso, desde o início eu venho com a ideia de dois registros controlados separadamente. Abraços! 

Eu adorei esse projeto. Comprei um chuveiro que incrementa a temperatura de grau em grau exatamente para ser um apoio elétrico na falta de água quente.

Vou acompanhar. Não deixe de postar umas fotos ou um video. Ajuda e esclarecer muito.

Sidney, onde posso achar esse chuveiro? Estou precisando de um backup para meu futuro aquecedor solar! =] Tinha pensado em usar o meu próprio chuveiro (ligado no máximo) por um dimmer 220v para realizar um possível complemento, mas essa solução já pronta pode ser uma alternativa! Estou melhorando meu projeto... agora irei interagir por meio de um lcd com 3 botões, onde será possível ligar ou desligar o misturador, definir tempo de funcionamento, temperatura padrão, pressão da água, entre outros! Assim que conseguir, posto essas alterações! Abraços!  

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço