LusoRobótica - Robótica em Português
Electrónica => Electrónica Geral => Tópico iniciado por: Bony em 28 de Fevereiro de 2012, 22:06
-
Viva :)
Ando aqui a pensar em fazer um termometro digital para o aquario. e queria um sensor que desse para meter na agua, nao sei qual é que dá para meter na agua e dps que aparece o visor nos display de 7 segmentos... ja andei a pesquisar mas ainda nao encontrei nada em concreto... pode me mostrar alguns esquemas ou exemplos na mesma situacao, e que sensor de temperatura utilizo ? falaram-me no LM335, mas acho que nao o posso meter dentro de agua. por isso a que preciso da vossa ajuda...
cumps
-
Ou compras um sensor isolado, por exemplo a sparkfun tem ds18b20's enfiados num tubo de plástico com epoxy que são á prova de água, ou fazes tu um, com um lm335 ou um ds18b20 ou outro qualquer sensor de temperatura, compras cabo de 3 condutores isolado, enfias o sensor com os fios soldados num pedaço de heat-shrink e enches com silicone e deixas uma ponta do package do sensor de fora para que tenhas uma melhor leitura da temperatura de água.
-
e o esquema de montagem é igual aos outros todos ?
-
O que é que entendes por esquema de montagem e quais outros todos, cada sensor tem a sua datasheet.
Os ds18b20 funcionam com um protocolo 1-wire, se usas Arduino é só ir buscar a biblioteca, se usas avr tambem é só ir buscar uma biblioteca e está a andar, tenho aqui um ao meu lado a funcionar á semanas sem problema nenhum, para pic ou arm tenho a certeza que tambem encontras bibliotecas 1-wire, bascom já tem uma incorporada assim como picaxe.
-
Pois... entao deixa-me pesquisar mais a fundo que logo digo algo brevemente.
obrigado, pelas dicas ;)
-
Podes ver aqui:
http://engenhocas4you.wordpress.com/2011/12/04/arduino-aula-5-sensor-temperatura-ds18b20-lcd/ (http://engenhocas4you.wordpress.com/2011/12/04/arduino-aula-5-sensor-temperatura-ds18b20-lcd/)
cumps
-
Também podes usar um díodo qualquer. Precisas de o calibrar, mas se tiveres outro termómetro é fácil. Basta um circuito assim
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg140.imageshack.us%2Fimg140%2F5292%2Ftemperaturesensorschema.png&hash=8c212c193abf0349d694fc5f11bca88420d5a219)
A tensão em OUT baixa cerca de 2.3mV por cada ºC de aumento de temperatura. Acho que isto já foi discutido aqui no fórum, é uma questão de procurares.
-
Podes ver aqui:
http://engenhocas4you.wordpress.com/2011/12/04/arduino-aula-5-sensor-temperatura-ds18b20-lcd/ (http://engenhocas4you.wordpress.com/2011/12/04/arduino-aula-5-sensor-temperatura-ds18b20-lcd/)
cumps
onde compras.te o sensor ? é preciso ?
-
Também podes usar um díodo qualquer. Precisas de o calibrar, mas se tiveres outro termómetro é fácil. Basta um circuito assim
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg140.imageshack.us%2Fimg140%2F5292%2Ftemperaturesensorschema.png&hash=8c212c193abf0349d694fc5f11bca88420d5a219)
A tensão em OUT baixa cerca de 2.3mV por cada ºC de aumento de temperatura. Acho que isto já foi discutido aqui no fórum, é uma questão de procurares.
isso cheira-me a pouca precisao...
-
Podes ver aqui:
http://engenhocas4you.wordpress.com/2011/12/04/arduino-aula-5-sensor-temperatura-ds18b20-lcd/ (http://engenhocas4you.wordpress.com/2011/12/04/arduino-aula-5-sensor-temperatura-ds18b20-lcd/)
cumps
onde compras.te o sensor ?
queres mm o ds1820?... eu vou ter em stock qdo fizer encomenda à mouser, mas de momento eu arranjo só o lm35
-
Podes ver aqui:
http://engenhocas4you.wordpress.com/2011/12/04/arduino-aula-5-sensor-temperatura-ds18b20-lcd/ (http://engenhocas4you.wordpress.com/2011/12/04/arduino-aula-5-sensor-temperatura-ds18b20-lcd/)
cumps
onde compras.te o sensor ?
queres mm o ds1820?... eu vou ter em stock qdo fizer encomenda à mouser, mas de momento eu arranjo só o lm35
quanto ira custar ? quando vais fazer a encomenda ?
-
Pede samples na Maxim, procuras por ds18b20 e pedes samples do package TO-92.
-
Se tiverem interessados também tenho para venda.
Cumps
-
(...)
isso cheira-me a pouca precisao...
Aí está um exercício interessante. Qual é a precisão de
- um ds1820?
- um LM35?
- um díodo calibrado à mão com um termómetro de medir temperatura do corpo?
Se calhar ainda ficamos espantados com a resposta...
-
Boas.
Ando aqui de volta deste projecto em que falta um promenor para finalizar e nao consigo por nada ver onde está o erro.... vou deixar aqui um excerto do codigo na parte onde penso que esteja o erro:
// Led Verde
if (sensors.getTempCByIndex(0)>=26 & sensors.getTempCByIndex(0)<=28.5) // se a temperatura é maior ou igual que 26 e menor que 28.5 graus vais acender o led verde
{
digitalWrite(ledverde, HIGH);
}
else // caso contrario vai estar o led verde apagado
{
digitalWrite(ledverde, LOW);
}
// Led Amarelo
if (sensors.getTempCByIndex(0)>=25.0 & sensors.getTempCByIndex(0)<=25.9) // se a temperatura é maior ou igual que 25.0 graus e menos ou igual que 25.9 graus vai acender o led amarelo
{
digitalWrite(ledamarelo, HIGH);
}
else // caso contrario o led amarelo vai estar apagado.
{
digitalWrite(ledamarelo, LOW);
}
// Led Vermelho
if (sensors.getTempCByIndex(0)<=24 & sensors.getTempCByIndex(0)>=29) // se a temperatura é menor ou igual que 24 graus ou maior ou igual que 29 vai piscar o led vermelho
{
digitalWrite(ledvermelho, HIGH);
delay(1000);
digitalWrite(ledvermelho, LOW);
delay(1000);
}
vejam la se descobrem algum erro para o LED vermelho nao acender nem piscar nada :| os LED´s amarelo e verde funcionam na boa, o vermelho nao dá sinal de vida nao sei pk :| ja o testei com o codigo do exemplo do arduino do "blink" e ele funciona :S ja nao sei mais que inventar ...
-
Tira o & e mete &&. O & é o and bit-a-bit. O && é o and lógico.
-
Recomendava o LM335 ou LM35, é barato, já o usei e é de fácil leitura pré-calibrado a 10mV por cada ºC.
-
Tira o & e mete &&. O & é o and bit-a-bit. O && é o and lógico.
ja meti, continua igual :|
-
Recomendava o LM335 ou LM35, é barato, já o usei e é de fácil leitura pré-calibrado a 10mV por cada ºC.
estou a usar o DS18B20, isto requer algum tipo de calibração ou ja vem calibrado ?
-
Recomendava o LM335 ou LM35, é barato, já o usei e é de fácil leitura pré-calibrado a 10mV por cada ºC.
estou a usar o DS18B20, isto requer algum tipo de calibração ou ja vem calibrado ?
Costumo utilizar e nunca calibrei nenhum, mas já queimei cerca de 3...
-
Recomendava o LM335 ou LM35, é barato, já o usei e é de fácil leitura pré-calibrado a 10mV por cada ºC.
estou a usar o DS18B20, isto requer algum tipo de calibração ou ja vem calibrado ?
Já está calibrado de fábrica.
para saber como ligar, é seguir o datasheet.
-
Recomendava o LM335 ou LM35, é barato, já o usei e é de fácil leitura pré-calibrado a 10mV por cada ºC.
estou a usar o DS18B20, isto requer algum tipo de calibração ou ja vem calibrado ?
Costumo utilizar e nunca calibrei nenhum, mas já queimei cerca de 3...
E porque é que queimara, chegaste a saber ?
-
Se a aplicação vai ser para um aquário, não é necessário ter grande precisão e recorrer a um sensor digital de 9 a 12bits como o DS18B20.
Muitos dos micros têm entrada analógica e recorrendo a um atmega8 terias a precisão de 11bits (1023 em decimal), no que poderia ser realizada uma escala de 0 a 102.3ºC por exemplo e ainda controlar 4 displays de 7 segmentos em simultâneo.
máxima temperatura:
LM35 = 150ºC
DS18B20 = 125ºC
ps: o sensor não deve ser testado com isqueiro obviamente ;)
-
Este pessoal gosta de gastar dinheiro em sensores em vez de usar um díodo. tss tss tsss....
Mete uns Serial println para veres o valor que lês do sensor, para tentar perceber porque é que não entra no if.
-
Se a aplicação vai ser para um aquário, não é necessário ter grande precisão e recorrer a um sensor digital de 9 a 12bits como o DS18B20.
Muitos dos micros têm entrada analógica e recorrendo a um atmega8 terias a precisão de 11bits (1023 em decimal), no que poderia ser realizada uma escala de 0 a 102.3ºC por exemplo e ainda controlar 4 displays de 7 segmentos em simultâneo.
máxima temperatura:
LM35 = 150ºC
DS18B20 = 125ºC
ps: o sensor não deve ser testado com isqueiro obviamente ;)
São 10 bits e não 11 Dropes, 11bits teria um valor máximo de 2047.
-
Tens razão, era só para ver se o pessoal estava atento ;)
-
Tens razão, era só para ver se o pessoal estava atento ;)
mais bit menos bit!.. ;D
-
Recomendava o LM335 ou LM35, é barato, já o usei e é de fácil leitura pré-calibrado a 10mV por cada ºC.
estou a usar o DS18B20, isto requer algum tipo de calibração ou ja vem calibrado ?
Então afinal estás a usar qual sensor?
-
E porque é que queimara, chegaste a saber ?
Sim soube de todos, por ordem: curto circuito, não reparar q estava ligado directo a 12v, exceder (em muito) os 125º.
Basicamente foram todos acidentes.
-
e ninguem em ajuda :(
deixo aqui o codigo tudo ( vejam la se descobrem porque raio ao led nao quer acender):
#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(12,11,5,4,3,2);
#define ledverde 6
#define ledamarelo 7
#define ledvermelho 9
#define ONE_WIRE_BUS 10 // sensor de temperatura ligao ao pin 10
// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);
void setup(void)
{
// start serial port
Serial.begin(9600);
lcd.begin(20,4);
sensors.begin(); // IC Default 9 bit. If you have troubles consider upping it 12. Ups the delay giving the IC more time to process the temperature measurement
pinMode(ledverde, OUTPUT);
digitalWrite(ledverde, LOW);
pinMode(ledamarelo, OUTPUT);
digitalWrite(ledamarelo, LOW);
pinMode(ledvermelho, OUTPUT);
digitalWrite(ledvermelho, LOW);
}
void loop(void)
{
lcd.setCursor(0,0);
lcd.print("Temperatura Aquario");
sensors.requestTemperatures(); // Send the command to get temperatures
lcd.setCursor(6,1);
lcd.print(sensors.getTempCByIndex(0));// Why "byIndex"? You can have more than one IC on the same bus. 0 refers to the first IC on the wire
lcd.print( " C " );
sensors.requestTemperatures();
// Led Verde
if (sensors.getTempCByIndex(0)>=26 && sensors.getTempCByIndex(0)<=28.5) // se a temperatura é maior ou igual que 26 e menor que 28.5 graus vais acender o led verde
{
digitalWrite(ledverde, HIGH);
}
else // caso contrario vai estar o led verde apagado
{
digitalWrite(ledverde, LOW);
}
// Led Amarelo
if (sensors.getTempCByIndex(0)>=25.0 && sensors.getTempCByIndex(0)<=25.9) // se a temperatura é maior ou igual que 25.0 graus e menos ou igual que 25.9 graus vai acender o led amarelo
{
digitalWrite(ledamarelo, HIGH);
}
else // caso contrario o led amarelo vai estar apagado.
{
digitalWrite(ledamarelo, LOW);
}
// Led Vermelho
if (sensors.getTempCByIndex(0)<=24 && sensors.getTempCByIndex(0)>=29) // se a temperatura é menor ou igual que 24 graus ou maior ou igual que 29 vai piscar o led vermelho
{
digitalWrite(ledvermelho, HIGH);
delay(1000);
digitalWrite(ledvermelho, LOW);
delay(1000);
}
lcd.setCursor(0,2);
lcd.print("Temperatura Ambiente");
sensors.requestTemperatures(); // Send the command to get temperatures
lcd.setCursor(6,3);
lcd.print(sensors.getTempCByIndex(1));// Why "byIndex"? You can have more than one IC on the same bus. 0 refers to the first IC on the wire
lcd.print( " C " );
sensors.requestTemperatures();
}
-
Olá, o led vermelho não acende porque estás a utilizar AND quando devias utilizar OR aqui:
if (sensors.getTempCByIndex(0)<=24 && sensors.getTempCByIndex(0)>=29) // se a temperatura é menor ou igual que 24 graus ou maior ou igual que 29 vai piscar o led vermelho
{
digitalWrite(ledvermelho, HIGH);
delay(1000);
digitalWrite(ledvermelho, LOW);
delay(1000);}
Penso que bastará substituir "&&" por "or", mas espera por mais respostas.
Edit: Também dá para usar "||" em vez de "or".
-
Tambem acho que é isso. substitui && por || e ficas com o problema resolvido.
p.s. rglove foste mais rapido fizeste-me apagar o texto hehehe
-
Desculpa lá Marvin xD
-
e ninguem em ajuda :(
Isso é mentira; estás a ser injusto e pedinchas. Já te deram algumas ajudas e eu já te disse para imprimires para a porta série os valores do sensor, coisa que pareces ter ignorado. Por mim agora desenrasca-te, termino definitivamente a participação neste tópico.
-
Agora que resolvi um problema aparece outro :|
Ja consegui meter o led a piscar e afinal os || nao funcionam tive mesmo que escrever "or" assim ja funciona :)
Agora o led pisca, mas nao pisca com a rapidez que eu queria, está para ai a piscar de 3 em 3 segundos ja alterei e meti montes de valores no delay e nada continua sempre a piscar igual :|
Alguma sugestao?
é o ledvermelho.
// Led Verde
if (sensors.getTempCByIndex(0)>=26 && sensors.getTempCByIndex(0)<=28.5) // se a temperatura é maior ou igual que 26 e menor que 28.5 graus vais acender o led verde
{
digitalWrite(ledverde, HIGH);
}
else // caso contrario vai estar o led verde apagado
{
digitalWrite(ledverde, LOW);
}
// Led Amarelo
if (sensors.getTempCByIndex(0)>=25.00 && sensors.getTempCByIndex(0)<=25.99) // se a temperatura é maior ou igual que 25.0 graus e menos ou igual que 25.9 graus vai acender o led amarelo
{
digitalWrite(ledamarelo, HIGH);
}
else // caso contrario o led amarelo vai estar apagado.
{
digitalWrite(ledamarelo, LOW);
}
// Led Vermelho
if (sensors.getTempCByIndex(0)<=24 or sensors.getTempCByIndex(0)>=29) // se a temperatura é menor ou igual que 24 graus ou maior ou igual que 29 vai piscar o led vermelho
{
digitalWrite(ledvermelho, HIGH);
delay(1000);
digitalWrite(ledvermelho, LOW);
delay(1000);
}
else
{
digitalWrite(ledvermelho, LOW);
}
-
Cada conversão demora 750mS na resolução máxima, e como em vez de fazeres uma leitura para uma variavel e usar essa variavel nos if's estás a fazer leituras consecutivas para cada comparação dentro do if é normal que isso aconteça.
-
nao percebi :S
cada conversao ?
podes me dar um exemplo ?
-
Eu faço isso. Espera um pouco.
-
Oky :)
-
Cada vez que isto aparece no código:
sensors.getTempCByIndex(0)
São 750milisegundos que o arduino está á espera de resposta por parte do sensor de temperatura.
-
humm... entao mas a meu ver fico na mesma, tenho que fazer na mesma 3 variaveis para cada if, todos os If tem escalas de temperaturas diferentes.
-
Aqui tens:
#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(12,11,5,4,3,2);
#define ledverde 6
#define ledamarelo 7
#define ledvermelho 9
#define ONE_WIRE_BUS 10 // sensor de temperatura ligao ao pin 10
boolean vermelhoLigado = false;
boolean ultimoBlink = 0;
// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);
void setup()
{
// start serial port
Serial.begin(9600);
lcd.begin(20,4);
sensors.begin(); // IC Default 9 bit. If you have troubles consider upping it 12. Ups the delay giving the IC more time to process the temperature measurement
pinMode(ledverde, OUTPUT);
digitalWrite(ledverde, LOW);
pinMode(ledamarelo, OUTPUT);
digitalWrite(ledamarelo, LOW);
pinMode(ledvermelho, OUTPUT);
digitalWrite(ledvermelho, LOW);
}
void loop()
{
sensors.requestTemperatures(); // Send the command to get temperatures
int temperatura = sensors.getTempCByIndex(0);
lcd.setCursor(0,0);
lcd.print("Temperatura Aquario");
lcd.setCursor(6,1);
lcd.print(temperatura);// Why "byIndex"? You can have more than one IC on the same bus. 0 refers to the first IC on the wire
lcd.print( " C " );
int perigo = 0;
if (temperatura >= 26 && temperatura <= 28.5) perigo=0;
else if (temperatura >= 25 && temperatura <= 26) perigo=1;
else perigo=2;
switch (perigo)
{
case 0: //Led verde
digitalWrite(ledverde, HIGH);
digitalWrite(ledamarelo, LOW);
digitalWrite(ledvermelho, LOW);
break;
case 1: //Led amarelo
digitalWrite(ledamarelo, HIGH);
digitalWrite(ledverde, LOW);
digitalWrite(ledvermelho, LOW);
break;
case 2: //Led vermelho
digitalWrite(ledverde, LOW);
digitalWrite(ledvermelho, LOW);
if (ultimoBlink+1000 >= millis())
{
ultimoBlink = millis();
if (vermelhoLigado) {digitalWrite(ledvermelho, LOW); vermelhoLigado = false;}
else {digitalWrite(ledvermelho, HIGH); vermelhoLigado = true;}
}
break;
}
lcd.setCursor(0,2);
lcd.print("Temperatura Ambiente");
lcd.setCursor(6,3);
lcd.print(temperatura);//
lcd.print( " C " );
}
-
humm... entao mas a meu ver fico na mesma, tenho que fazer na mesma 3 variaveis para cada if, todos os If tem escalas de temperaturas diferentes.
Não, fazes só uma leitura por loop em vez de meia duzia delas.
-
Pedrock, Obrigadissimo.
Mas no teu codigo surge um problema, é que no display só mostra a temperatura a 2 bits e antigamente mostrava a 4 bits :)
-
Tinha posto a temperatura como valor inteiro.
Vê assim:
#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(12,11,5,4,3,2);
#define ledverde 6
#define ledamarelo 7
#define ledvermelho 9
#define ONE_WIRE_BUS 10 // sensor de temperatura ligao ao pin 10
boolean vermelhoLigado = false;
boolean ultimoBlink = 0;
// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);
void setup()
{
Serial.begin(9600); // start serial port
lcd.begin(20,4);
sensors.begin(); // IC Default 9 bit. If you have troubles consider upping it 12. Ups the delay giving the IC more time to process the temperature measurement
pinMode(ledverde, OUTPUT);
pinMode(ledamarelo, OUTPUT);
pinMode(ledvermelho, OUTPUT);
}
void loop()
{
sensors.requestTemperatures(); // Send the command to get temperatures
float temperatura = sensors.getTempCByIndex(0);
lcd.setCursor(0,0);
lcd.print("Temperatura Aquario");
lcd.setCursor(6,1);
lcd.print(temperatura);// Why "byIndex"? You can have more than one IC on the same bus. 0 refers to the first IC on the wire
lcd.print( " C " );
int perigo = 0;
if (temperatura >= 26 && temperatura <= 28.5) perigo=0;
else if (temperatura >= 25 && temperatura <= 26) perigo=1;
else perigo=2;
switch (perigo)
{
case 0: //Led verde
digitalWrite(ledverde, HIGH);
digitalWrite(ledamarelo, LOW);
digitalWrite(ledvermelho, LOW);
break;
case 1: //Led amarelo
digitalWrite(ledamarelo, HIGH);
digitalWrite(ledverde, LOW);
digitalWrite(ledvermelho, LOW);
break;
case 2: //Led vermelho
digitalWrite(ledverde, LOW);
digitalWrite(ledvermelho, LOW);
if (ultimoBlink+1000 >= millis())
{
ultimoBlink = millis();
if (vermelhoLigado) {digitalWrite(ledvermelho, LOW); vermelhoLigado = false;}
else {digitalWrite(ledvermelho, HIGH); vermelhoLigado = true;}
}
break;
}
lcd.setCursor(0,2);
lcd.print("Temperatura Ambiente");
lcd.setCursor(6,3);
lcd.print(temperatura);//
lcd.print( " C " );
}
-
Exacto dahh era trocar o int pelo float :| que pergunta a minha xD
Entretanto o Led vermelho agora quando ligo o circuito liga.se pk a temperatura esta abaixo dos 24 mas dps apaga-se nao se liga mais :|
-
Não sei se reparaste, mas com as alterações que fiz, acende abaixo dos 25. Antes se tivesse a, por exemplo, 24.5, não acendia nenhum.
Já corrigi o problema do vermelho, era um erro estúpido, pus um bolean em vez de unsigned long LOL
E não tinha percebido que havia dois sensores, por isso a temperatura ambiente era a do aquário. Corrigi isso também:
#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(12,11,5,4,3,2);
#define ledverde 6
#define ledamarelo 7
#define ledvermelho 9
#define ONE_WIRE_BUS 10 // sensor de temperatura ligao ao pin 10
boolean vermelhoLigado = false;
unsigned long ultimoBlink = 0;
// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);
void setup()
{
Serial.begin(9600); // start serial port
lcd.begin(20,4);
sensors.begin(); // IC Default 9 bit. If you have troubles consider upping it 12. Ups the delay giving the IC more time to process the temperature measurement
pinMode(ledverde, OUTPUT);
pinMode(ledamarelo, OUTPUT);
pinMode(ledvermelho, OUTPUT);
}
void loop()
{
sensors.requestTemperatures(); // Send the command to get temperatures
float temperatura = sensors.getTempCByIndex(0);
lcd.setCursor(0,0);
lcd.print("Temperatura Aquario");
lcd.setCursor(6,1);
lcd.print(temperatura);// Why "byIndex"? You can have more than one IC on the same bus. 0 refers to the first IC on the wire
lcd.print( " C " );
int perigo = 0;
if (temperatura >= 26 && temperatura <= 28.5) perigo=0;
else if (temperatura >= 25 && temperatura <= 26) perigo=1;
else perigo=2;
switch (perigo)
{
case 0: //Led verde
digitalWrite(ledverde, HIGH);
digitalWrite(ledamarelo, LOW);
digitalWrite(ledvermelho, LOW);
break;
case 1: //Led amarelo
digitalWrite(ledamarelo, HIGH);
digitalWrite(ledverde, LOW);
digitalWrite(ledvermelho, LOW);
break;
case 2: //Led vermelho
digitalWrite(ledverde, LOW);
digitalWrite(ledvermelho, LOW);
if (ultimoBlink+1000 >= millis())
{
ultimoBlink = millis();
if (vermelhoLigado) {digitalWrite(ledvermelho, LOW); vermelhoLigado = false;}
else {digitalWrite(ledvermelho, HIGH); vermelhoLigado = true;}
}
break;
}
lcd.setCursor(0,2);
lcd.print("Temperatura Ambiente");
lcd.setCursor(6,3);
lcd.print(sensors.getTempCByIndex(1));//
lcd.print( " C " );
}
-
Agora sim :D Finalmente tudo funciona como eu quero, bem deu luta...
Considero este projecto terminado.
Obrigadissimo mais uma vez :D
Já meto aqui umas fotos e uns videos e uma pequena descrisao do projecto para depois ficar tb como consulta quando alguem tiver uma duvida.
-
Agora sim :D Finalmente tudo funciona como eu quero, bem deu luta...
Considero este projecto terminado.
Obrigadissimo mais uma vez :D
Já meto aqui umas fotos e uns videos e uma pequena descrisao do projecto para depois ficar tb como consulta quando alguem tiver uma duvida.
;D
Um video era fixe. Como é que fizeste para tornar o sensor à prova de água?
-
Primeiramente comecei por isolar com fita isolado cada pin do sensor isto dps de ja estar soldado ao fio depois com Manga Termo-Retráctil revesti o sensor e como mesmo assim nao estava mto convencido ainda meti cola quente :)
-
Primeiramente comecei por isolar com fita isolado cada pin do sensor isto dps de ja estar soldado ao fio depois com Manga Termo-Retráctil revesti o sensor e como mesmo assim nao estava mto convencido ainda meti cola quente :)
Ah ok. Se tivesse um aquário fazia uma coisa assim... 8)
-
Só tem um contra... assim sai prai umas 20 x mais caro do que comprares um já feito proprio para o aquario. Só o sensor custa quase tanto com um termometro para o aqua.
Neste caso comprei 2, mais o display mais as tretas todas para fazer o arduino. Mas prefiro assim sempre se aprende umas coisas :)
-
Podes por o arduino a ligar um "aquecedor" caso a temperatura esteja baixa ou alguma espécie de "arrefecedor" caso esteja demasiado quente.
-
fica a ideia para um futuro projecto :P mas neste caso ja tenho 2 termoestatos para aquecer a agua !
-
Fixe agora era fazeres um sensor de ph... coisa que eu tambem queria para a minha horta hidroponica.
-
eu vendo cabos ja com os sensores de tempª isolados numa capsula de metal e com isolamento para mergulhar em agua.
-
Fixe agora era fazeres um sensor de ph... coisa que eu tambem queria para a minha horta hidroponica.
loOl do que te fostes lembrar...
Por acaso esse projecto está em cima da mesa :)
até ja andei a investigar sobre isso :P
brevemente
-
eu vendo cabos ja com os sensores de tempª isolados numa capsula de metal e com isolamento para mergulhar em agua.
Ola Hugo, sim eu na altura que iniciei o projecto ainda cheguei a falar cntg sobre isso, mas tu nao tinhas em stock na altura... salvo erro... foi assim uma coisa !
-
eu vendo cabos ja com os sensores de tempª isolados numa capsula de metal e com isolamento para mergulhar em agua.
Ola Hugo, sim eu na altura que iniciei o projecto ainda cheguei a falar cntg sobre isso, mas tu nao tinhas em stock na altura... salvo erro... foi assim uma coisa !
ya lembra e até tava convencido que te tinha enviado um cabo a ti.. se n foi a ti k vendi um cabo foi a outro moço kk...
-
Descubri porque é que não funcionava bem.
Testa assim:
#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(12,11,5,4,3,2);
#define ledverde 6
#define ledamarelo 7
#define ledvermelho 9
#define ONE_WIRE_BUS 10 // sensor de temperatura ligao ao pin 10
boolean vermelhoLigado = false;
unsigned long ultimoBlink = 0;
// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);
void setup()
{
Serial.begin(9600); // start serial port
lcd.begin(20,4);
sensors.begin(); // IC Default 9 bit. If you have troubles consider upping it 12. Ups the delay giving the IC more time to process the temperature measurement
pinMode(ledverde, OUTPUT);
pinMode(ledamarelo, OUTPUT);
pinMode(ledvermelho, OUTPUT);
}
void loop()
{
sensors.requestTemperatures(); // Send the command to get temperatures
float temperatura = sensors.getTempCByIndex(0);
lcd.setCursor(0,0);
lcd.print("Temperatura Aquario");
lcd.setCursor(6,1);
lcd.print(temperatura);// Why "byIndex"? You can have more than one IC on the same bus. 0 refers to the first IC on the wire
lcd.print( " C " );
int perigo = 0;
if (temperatura >= 26 && temperatura <= 28.5) perigo=0;
else if (temperatura >= 25 && temperatura <= 26) perigo=1;
else perigo=2;
switch (perigo)
{
case 0: //Led verde
digitalWrite(ledverde, HIGH);
digitalWrite(ledamarelo, LOW);
digitalWrite(ledvermelho, LOW);
break;
case 1: //Led amarelo
digitalWrite(ledamarelo, HIGH);
digitalWrite(ledverde, LOW);
digitalWrite(ledvermelho, LOW);
break;
case 2: //Led vermelho
digitalWrite(ledverde, LOW);
digitalWrite(ledvermelho, LOW);
if (millis()-ultimoBlink>= 1000)
{
ultimoBlink = millis();
if (vermelhoLigado) {digitalWrite(ledvermelho, LOW); vermelhoLigado = false;}
else {digitalWrite(ledvermelho, HIGH); vermelhoLigado = true;}
}
break;
}
lcd.setCursor(0,2);
lcd.print("Temperatura Ambiente");
lcd.setCursor(6,3);
lcd.print(sensors.getTempCByIndex(1));//
lcd.print( " C " );
}
EDIT:
Agora é que está certo.
-
Está quase. agora ja passa para o vermelho a piscar o problema é que o led amarelo continua em simultaneo acesso :|
-
Já descobri :D
-
Pois, tinha um erro simples...
Deixo aqui a versão corrigida para referência futura:
#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(12,11,5,4,3,2);
#define ledverde 6
#define ledamarelo 7
#define ledvermelho 9
#define ONE_WIRE_BUS 10 // sensor de temperatura ligao ao pin 10
boolean vermelhoLigado = false;
unsigned long ultimoBlink = 0;
// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);
void setup()
{
Serial.begin(9600); // start serial port
lcd.begin(20,4);
sensors.begin(); // IC Default 9 bit. If you have troubles consider upping it 12. Ups the delay giving the IC more time to process the temperature measurement
pinMode(ledverde, OUTPUT);
pinMode(ledamarelo, OUTPUT);
pinMode(ledvermelho, OUTPUT);
}
void loop()
{
sensors.requestTemperatures(); // Send the command to get temperatures
float temperatura = sensors.getTempCByIndex(0);
lcd.setCursor(0,0);
lcd.print("Temperatura Aquario");
lcd.setCursor(6,1);
lcd.print(temperatura);// Why "byIndex"? You can have more than one IC on the same bus. 0 refers to the first IC on the wire
lcd.print( " C " );
int perigo = 0;
if (temperatura >= 26 && temperatura <= 28.5) perigo=0;
else if (temperatura >= 25 && temperatura <= 26) perigo=1;
else perigo=2;
switch (perigo)
{
case 0: //Led verde
digitalWrite(ledverde, HIGH);
digitalWrite(ledamarelo, LOW);
digitalWrite(ledvermelho, LOW);
break;
case 1: //Led amarelo
digitalWrite(ledamarelo, HIGH);
digitalWrite(ledverde, LOW);
digitalWrite(ledvermelho, LOW);
break;
case 2: //Led vermelho
digitalWrite(ledverde, LOW);
digitalWrite(ledamarelo, LOW);
if (millis()-ultimoBlink>= 1000)
{
ultimoBlink = millis();
if (vermelhoLigado) {digitalWrite(ledvermelho, LOW); vermelhoLigado = false;}
else {digitalWrite(ledvermelho, HIGH); vermelhoLigado = true;}
}
break;
}
lcd.setCursor(0,2);
lcd.print("Temperatura Ambiente");
lcd.setCursor(6,3);
lcd.print(sensors.getTempCByIndex(1));//
lcd.print( " C " );
}
-
Este projecto comecou meramente por fazer um sensor de temperatura para o aquario com display´s de 7 segmentos, fui pesquisando a coisa mesmo a fundo até que acabou nisto! Nao era para ficar assim como mostro nas fotos abaixo, mas na altura a CNC onde ia mandar fazer isto pifou e acabou por ficar assim, primeiramente até era para ficar numa caixinha e só se via os led´s e o display mais nada, ficou mais feio é verdade mas o objectivo está lá :)
Material:
1 x Arduino
1 x LCD Display 16x4 (salvo erro)
2 x Sensor DS18b20
1 x Led Verde
1 x Led Amarelo
1 x Led Vermelho
1 x Potenciometro
2 x Resistências de 4K7
2 x Butoes ( se quiseres)
No display ira dizer a temperatura da agua do aquario e a temperatura ambiente da divisao, neste caso da sala, aproveitei ja que ia fazer um para aquario adicionei mais outro sensor e para me dizer a temperatura da sala.
O sensor como podem ver no video foi isolado para poder ser aprova de agua, apesar de já os haver feitos isolados nao me foi possivel na altura comprar um, entao decidi eu mesmo fazer um e isolado, para isso eu fiz o seguinte:
- 1º - do sensor saem 3 fios e como é obvio nao se podem tocar para tal meti fita isoladora em cada um.
- 2º - Seguidamente meti Plástico Termo-Retractil como ele custou a entrar, isto é entrou forcado iria juntar os fios do sensor dai ter feito o passo 1.
- 3º - Mesmo assim achei por bem revestir o sensor com cola quente, e fim do processo.
Seguidamente foi ligar o respectivo arduino potenciometro ao LCD, e para isto segui este esquema:
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fi296.photobucket.com%2Falbums%2Fmm184%2FCrazyBony%2FSensor%2520de%2520Temperatura%2FesquemadeligacaoLCD.png&hash=f8c3fc063bcecbe549aa9d42368d3cef21f77c88)
De seguinte foi ligar os sensores ao arduino e segui este esquema:
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fi296.photobucket.com%2Falbums%2Fmm184%2FCrazyBony%2FSensor%2520de%2520Temperatura%2Fesquemadeligacaosensor.jpg&hash=742d74a7e5ee9f63e2380f169462df69daf8d147)
Sao 2 sensores mas ambos vao ligar á mesma entrada do arduino, cada sensor tem um "numero proprio associado" (e foi aqui a que as coisas se comecaram a complicar a nivel de programação), o arduino consegue destingui-los aos dois por esse numero mesmo ligados há mesma entrada.
#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(12,11,5,4,3,2);
#define ledverde 6 // Led verde ligado ao pin 6
#define ledamarelo 7 // Led Amarelo ligado ao pin 7
#define ledvermelho 9 // Led Vermelho ligado ao pin 9
#define ONE_WIRE_BUS 10 // sensor de temperatura ligao ao pin 10
boolean vermelhoLigado = false;
unsigned long ultimoBlink = 0;
// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);
void setup()
{
Serial.begin(9600); // start serial port
lcd.begin(20,4);
sensors.begin(); // IC Default 9 bit. If you have troubles consider upping it 12. Ups the delay giving the IC more time to process the temperature measurement
pinMode(ledverde, OUTPUT);
pinMode(ledamarelo, OUTPUT);
pinMode(ledvermelho, OUTPUT);
}
void loop()
{
sensors.requestTemperatures(); // Send the command to get temperatures
float temperatura = sensors.getTempCByIndex(0);
lcd.setCursor(0,0);
lcd.print("Temperatura Aquario");
lcd.setCursor(6,1);
lcd.print(temperatura);// Why "byIndex"? You can have more than one IC on the same bus. 0 refers to the first IC on the wire
lcd.print( " C " );
int perigo = 0;
if (temperatura >= 26 && temperatura <= 28) perigo=0;
else if (temperatura >= 25 && temperatura <= 26) perigo=1;
else perigo=2;
switch (perigo)
{
case 0: //Led verde
digitalWrite(ledverde, HIGH);
digitalWrite(ledamarelo, LOW);
digitalWrite(ledvermelho, LOW);
break;
case 1: //Led amarelo
digitalWrite(ledamarelo, HIGH);
digitalWrite(ledverde, LOW);
digitalWrite(ledvermelho, LOW);
break;
case 2: //Led vermelho
digitalWrite(ledverde, LOW);
digitalWrite(ledamarelo, LOW);
if (millis()-ultimoBlink>= 500)
{
ultimoBlink = millis();
if (vermelhoLigado) {digitalWrite(ledvermelho, LOW); vermelhoLigado = false;}
else {digitalWrite(ledvermelho, HIGH); vermelhoLigado = true;}
}
break;
}
lcd.setCursor(0,2);
lcd.print("Temperatura Ambiente");
lcd.setCursor(6,3);
lcd.print(sensors.getTempCByIndex(1));//
lcd.print( " C " );
}
Situação para este aquario:
Quando a temperatura esta boa ira acender o led verde ( entre 26ºC a 28ºC)
Quando a temperatura comeca a ficar perigosa para os peixes e nao só, acende o led amarelo ( entre 25ºC a 26ºC)
Todos os outros valores ira ficar o led vermelho a piscar ( temperaturas <=24 e temperaturas >28ºC)
acho que nao me esqueci de nada.
Deixo aqui tambem um link muito util do user engenhocas4you:
http://engenhocas4you.wordpress.com/2011/12/04/arduino-aula-5-sensor-temperatura-ds18b20-lcd/ (http://engenhocas4you.wordpress.com/2011/12/04/arduino-aula-5-sensor-temperatura-ds18b20-lcd/)
Entretanto segue um video e fotos do bixo:
Frente
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fi296.photobucket.com%2Falbums%2Fmm184%2FCrazyBony%2FSensor%2520de%2520Temperatura%2FIMAG0096.jpg&hash=082f2ff4fb70ba874edcd6edeab7ce3bdd0de121)
traz
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fi296.photobucket.com%2Falbums%2Fmm184%2FCrazyBony%2FSensor%2520de%2520Temperatura%2FIMAG0098.jpg&hash=6a792f9e29dcc87e6cb257125f8db49563daae92)
O video:
Home made Sensor temperature for aquarium (http://www.youtube.com/watch?v=qNPTQvuKeW0#)
E pronto é isto !!
-
Ficou fixe! parabéns! 8)
-
Obrigadissimo Hugo :)
-
Obrigadissimo Hugo :)
ja agora, mostra la o teu aquario! k "tubaroes" tens em casa?! 8)
-
Este projecto comecou meramente por fazer um sensor de temperatura para o aquario com display´s de 7 segmentos, fui pesquisando a coisa mesmo a fundo até que acabou nisto! Nao era para ficar assim como mostro nas fotos abaixo, mas na altura a CNC onde ia mandar fazer isto pifou e acabou por ficar assim, primeiramente até era para ficar numa caixinha e só se via os led´s e o display mais nada, ficou mais feio é verdade mas o objectivo está lá :)
Desafio-te a fazer o mesmo projecto, sem usar Arduino!
Uma verdadeira aventura de aprendizagem e extremamente útil para o teu desenvolvimento.
-
Quando dizes sem Arduino queres dizer sem microcontrolador ou apenas sem Arduino?
-
Quando dizes sem Arduino queres dizer sem microcontrolador ou apenas sem Arduino?
Sem usar o Arduino.
Com microcontrolador puro e duro.
-
Quando dizes sem Arduino queres dizer sem microcontrolador ou apenas sem Arduino?
Sem usar o Arduino.
Com microcontrolador puro e duro.
Pode-se usar um atmega ou até um attiny se ele não quiser usar o LCD, e programar com o mesmo código do arduino. O arduino até pode ser usado como ISP para programar o microcontrolador. Tem a vantagem de não ter que ter o arduino sempre lá metido e consome menos energia.
Por exemple o ATTiny85 pode ser alimentado entre 1.8 - 5.5V, por isso não precisa regulador.
Consome apenas 300 ?A a 1 MHz, 1.8V. Não diz no datasheet quanto a 8Mhz ou 16Mhz (com cristal externo), mas não deve ser muito. O arduino consome entre 40mA - 50mA sem sensores ou actuadores. Faz muita diferença
Existe um tutorial sobre isso aqui:
http://hlt.media.mit.edu/?p=1695 (http://hlt.media.mit.edu/?p=1695)
-
Gostei :)
Parabéns pelo projecto, bons "detalhes" e funcionalidade.
-
Quando dizes sem Arduino queres dizer sem microcontrolador ou apenas sem Arduino?
Sem usar o Arduino.
Com microcontrolador puro e duro.
Pode-se usar um atmega ou até um attiny se ele não quiser usar o LCD, e programar com o mesmo código do arduino. O arduino até pode ser usado como ISP para programar o microcontrolador. Tem a vantagem de não ter que ter o arduino sempre lá metido e consome menos energia.
Por exemple o ATTiny85 pode ser alimentado entre 1.8 - 5.5V, por isso não precisa regulador.
Consome apenas 300 ?A a 1 MHz, 1.8V. Não diz no datasheet quanto a 8Mhz ou 16Mhz (com cristal externo), mas não deve ser muito. O arduino consome entre 40mA - 50mA sem sensores ou actuadores. Faz muita diferença
Existe um tutorial sobre isso aqui:
http://hlt.media.mit.edu/?p=1695 (http://hlt.media.mit.edu/?p=1695)
Esquece o Arduino. Faz de conta que ele não existe. Não uses nada que seja ligado ao Arduino.
Agarra num micro limpo e no datasheet.
Vais descobrir um mundo novo.
-
Esquece o Arduino. Faz de conta que ele não existe. Não uses nada que seja ligado ao Arduino.
Agarra num micro limpo e no datasheet.
Vais descobrir um mundo novo.
LOL existirá vida além do arduino ? ::)
-
Esquece o Arduino. Faz de conta que ele não existe. Não uses nada que seja ligado ao Arduino.
Agarra num micro limpo e no datasheet.
Vais descobrir um mundo novo.
LOL existirá vida além do arduino ? ::)
medo... muito medo.... ;D LOL
-
coitado do rapaz, levou uma porrada de tempo e ainda vcs kerem ver o gaijo a bater com a cabeça nas paredes pra atacar o mm projecto sem o arduino?! vcs sao sadomasoquistas! :P
Está bem fixe! isso pra ficar "molto bono", merecia ter uma pcb à maneira! ::)
-
Try: http://lusorobotica.com/index.php?topic=2838.0 (http://lusorobotica.com/index.php?topic=2838.0)