LusoRobótica - Robótica em Português
Sistemas específicos => Arduino / AVR => Tópico iniciado por: almamater em 07 de Junho de 2010, 15:41
-
Post actualizado! - 29-10-2010 - Projecto concluído ;D
O mesmo está disponível na página que criei: https://sites.google.com/site/grcbyte/electronica/fancontroller (https://sites.google.com/site/grcbyte/electronica/fancontroller) e neste caso trata-se da versão 2.0 :)
Objectivo:
- Controlar automaticamente todas as ventoinhas da caixa do PC consoante a temperatura recebida de um sensor
- Visualizar em tempo real a temperatura do sensor nos displays de 7 segmentos
- Ajustar a velocidade das ventoinhas consoante a temperatura (através de Software no PC)
- Informações diversas no LCD 16x2
- Isto tudo com um Arduino a comandar as operações :)
Vídeo 'Preview':
Fan Controller II (http://www.youtube.com/watch?v=zXD28a0Ue24&feature=player_embedded#)
Inicialmente fiz uma placa e que, após imenso trabalho, não funcionou como esperado e como podem confirmar nos posts abaixo, o sensor de temperatura usado (LM35/60) não indicava um valor certo e o circuito para controlar as Fans não era muito bom:
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg87.imageshack.us%2Fimg87%2F578%2Fimg6932.th.png&hash=a5cc52123137a03fc8dd5c4ff26e0bfacb08fbed) (http://img87.imageshack.us/i/img6932.png/) (https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg80.imageshack.us%2Fimg80%2F1931%2Fimg6935.th.png&hash=222973696db2d7af976e9cd78b9e88697e9cd699) (http://img80.imageshack.us/i/img6935.png/)
Alterei assim o sensor de temperatura para o DS18b20 (muito mais estável) e no circuito das Fans usei dois TIP122.
Ideias iniciais para a caixa:
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg17.imageshack.us%2Fimg17%2F7340%2Fframe2d.th.png&hash=ccf4d3741d586d071f6ebb5963fb749ec062b1fa) (http://img17.imageshack.us/i/frame2d.png/)
A primeira versão do software que desenvolvi em Visual Basic:
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg27.imageshack.us%2Fimg27%2F5327%2Ffancontroller.th.png&hash=3e5f640e07f64a68da4ef09a2e04f3e88015c604) (http://img27.imageshack.us/i/fancontroller.png/)
Após várias tentativas e ideias para a caixa, comecei a fazê-la em acrílico e ficou algo assim:
(parte traseira para se ligarem as ventoinhas):
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg513.imageshack.us%2Fimg513%2F8089%2Fimg7707.th.png&hash=6a0990e46d83e0f7d5b6cd6a276d0d6de7c81b4b) (http://img513.imageshack.us/i/img7707.png/) (https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg294.imageshack.us%2Fimg294%2F2450%2Fimg7708.th.png&hash=fa316292b39d29a041721f4d7adde042d1f7bf74) (http://img294.imageshack.us/i/img7708.png/)
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg44.imageshack.us%2Fimg44%2F1359%2Fimg7711.th.png&hash=23c6d6e9011a2c8ce9c9549a6e6ddc7014dace03) (http://img44.imageshack.us/i/img7711.png/) (https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg401.imageshack.us%2Fimg401%2F4881%2Fimg7712.th.png&hash=f3af8bda16adf6e646b43055d6acc442cd29affc) (http://img401.imageshack.us/i/img7712.png/)
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg89.imageshack.us%2Fimg89%2F1125%2Fimg7713.th.png&hash=b808928ffeede0622630b599b334378603b62d86) (http://img89.imageshack.us/i/img7713.png/) (https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg529.imageshack.us%2Fimg529%2F7162%2Fimg7714.th.png&hash=4ffb4b44edd4aba6ae9e4eeb2477e41f69710a5a) (http://img529.imageshack.us/i/img7714.png/)
Passo seguinte,colocar isto tudo na caixa de acrílico:
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg42.imageshack.us%2Fimg42%2F2212%2Fimg7715.th.png&hash=cc1c7c7a0401e3b773302485f6b754e2dd59839c) (http://img42.imageshack.us/i/img7715.png/)
Após ter alterado a aplicação que desenvolvi, adicionando novas funções, o resultado geral de todo o sistema é este:
Hardware:
- Ao iniciar faz um diagnóstico aos componentes (fans, displays de segmentos, etc.).
- No 1º arranque aguarda 5 segundos ("Boot Waiting") se quisermos estabelecer ligação ao Software no PC, caso contrário prossegue com o aranque.
- 2 botões, para iniciar o modo de configuração onde podemos Desligar/Ligar os vários compoenentes [Fans, Displays, Lcd, Bezouro]. 1 Botão escolhe o Modo o outro altera o Estado
Software:
- Estabelece e testa a ligação com o Arduino.
- Podemos obter os valores PWM guardados na memória do Arduino (11 valores que estão associados a 11 diferenças de temperaturas de <10 até >60), isto para os 2 grupos de Fans (cada um com 4 ou 8 fans).
- Podemos obter a temperatura actual do sensor.
- Podemos Ligar /Desligar o aviso sonoro (bezouro) e configurar uma temperatura máx. para a qual ele apita caso seja atingida.
- Podemos também definir o intervalo em segundos (que depois converte para milisegundos) para que seja lida a temperatura do sensor (pelo Arduino).
Aspecto da aplicação:
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg203.imageshack.us%2Fimg203%2F8638%2F001jl.th.png&hash=7aecb8f929f6f828ea32610d66fc40ea7aa12358) (http://img203.imageshack.us/i/001jl.png/)
Teste final ainda na placa de ensaio:
Fan Controller - Arduino (http://www.youtube.com/watch?v=KzCwqUPEYBw&feature=player_embedded#)
Imagens da placa "agregadora" dos componentes para interligar tudo com o Arduino, etc.:
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg264.imageshack.us%2Fimg264%2F581%2Fimg8308.th.png&hash=94338eed6173c496d758fada17f1b77700f9f4b1) (http://img264.imageshack.us/i/img8308.png/) (https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg263.imageshack.us%2Fimg263%2F4450%2Fimg8309.th.png&hash=7b8e3d99c6743e01e7e6bee48dd21a60b2d5f895) (http://img263.imageshack.us/i/img8309.png/) (https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg94.imageshack.us%2Fimg94%2F1751%2Fimg8310.th.png&hash=e675ff4b55acb1ec9a21c517ef8375907f4b465a) (http://img94.imageshack.us/i/img8310.png/)
Caixa de acrílico preparada:
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg820.imageshack.us%2Fimg820%2F1997%2Fimg8312.th.png&hash=ab73b4fddf7853030819348452d5a146a5e96393) (http://img820.imageshack.us/i/img8312.png/) (https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg839.imageshack.us%2Fimg839%2F130%2Fimg8313.th.png&hash=3dd7a83f8a9fb116a03109d385eec353e4afb501) (http://img839.imageshack.us/i/img8313.png/)
Aspecto final:
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg832.imageshack.us%2Fimg832%2F6984%2Fimg8314.th.png&hash=f6c32a0b7b8013fc462272af6aac5f03fa9a3bf8) (http://img832.imageshack.us/i/img8314.png/) (https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg408.imageshack.us%2Fimg408%2F3541%2Fimg8315.th.png&hash=cdac7bd68927f4ab62aaf8e8b1d047c17d890406) (http://img408.imageshack.us/i/img8315.png/) (https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg526.imageshack.us%2Fimg526%2F2789%2Fimg8316.th.png&hash=cb6921d848db827b26e69336c0526d53c62222be) (http://img526.imageshack.us/i/img8316.png/) (https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg401.imageshack.us%2Fimg401%2F6712%2Fimg8317.th.png&hash=443e6c42adabeb77ae14500f62c327f5ac32829a) (http://img401.imageshack.us/i/img8317.png/)
Demonstração Final:
Fan Controller - Arduino (http://www.youtube.com/watch?v=kJ9JyoF3bBk&feature=player_embedded#)
(disponível em 720 HD)
FanController in a PC Case (http://www.youtube.com/watch?v=gon4R5OdoNc&feature=player_embedded#)
-
Eu comecei a fazer um projecto idêntico a uns tempos (deve andar por aí o tópico :P ) mas por falta de tempo tive de o meter em standby :(
Tenho uma dúvida no teu projecto. Porque utilizas displays de 7 segmentos e não metes a informação a aparecer toda no display alfanumérico?
-
Acho que ja vi este rapaz noutro forum :P
Pessoal do modding é que é ;D
Grande projecto :P
-
:) Bom.. estou na parte da programação :o
Juntei o código do LM35, que mostra o valor nos Segmentos, com o do LCD que mostra a info recebida do Lcd Smartie.. o resultado é +/-...
Qdo não tenho o LCD Smartie ligado parece tudo normal, mas se estou a receber info do LcdSmartie os displays de segmentos parece que actualizam ao mesmo tempo que o LCD e os números ficam a tremer..
Vídeo: http://www.youtube.com/watch?v=qvEQ0I-JNJE# (http://www.youtube.com/watch?v=qvEQ0I-JNJE#)
Isto acontece pq tenho de meter tudo no Loop, inicialmente tinha um delay(50) no código do LM35 mas substituí por:
if(currentMillis - previousMillis > interval) {
previousMillis = currentMillis;
}
Que permite executar ambos os códigos (do LCD e do LM35/Displays Segmentos) ao mesmo tempo sem parar, mas acontece este pequeno promenor
-
Acho que ja vi este rapaz noutro forum :P
Pessoal do modding é que é ;D
Grande projecto :P
Pessoal do modding partilha dos mesmos gostos...electronica/robotica/informatica :P
@almamater, que microcontrolador estás a usar?
-
Pelo pedacinho de código que ele mostrou, um atmega168 ou 328 aka arduino.
-
Pelo pedacinho de código que ele mostrou, um atmega168 ou 328 aka arduino.
referia-me mesmo ao IC...pois se for um mega168 não sei se vai conseguir processar tudo ao mesmo tempo :P
-
Só se for por falta de espaço de código, e mesmo assim não sei, se o lcd está a receber dados do pc e o resto é pwm e adc e pouco mais..
-
Só se for por falta de espaço de código, e mesmo assim não sei, se o lcd está a receber dados do pc e o resto é pwm e adc e pouco mais..
Yep.. é um ATMEGA168.. portanto é probelma certo? :-[
-
Pode não ser problema...Mas também pode começar a ficar um pouco lento com tantas tarefas ao mesmo tempo. Mas não posso dizer nada, pois nunca levei um mega aos limites...o único IC que me aconteceu isso foi um Picaxe :P por isso vai fazendo, se notares problemas, aí sim será grave :D
-
Pode não ser problema...Mas também pode começar a ficar um pouco lento com tantas tarefas ao mesmo tempo. Mas não posso dizer nada, pois nunca levei um mega aos limites...o único IC que me aconteceu isso foi um Picaxe :P por isso vai fazendo, se notares problemas, aí sim será grave :D
Pois mas devem ser de facto muitos processos, tenho que meter a opção de ter a monitorização da temperatura ou a apresentação da info do LcdSmartie.. :( >:(
-
Mas o picaxe se não me engano corre a 0,5Mhz, e o atmeaa corre a 16Mhz, se o código for bem feito corre isso tudo na boa e ainda sobra tempo, o pwm é gerado com timers e não consome cpu, escrever no lcd ou assim é esporádico, assim como ler a adc.
-
Mas o picaxe se não me engano corre a 0,5Mhz, e o atmeaa corre a 16Mhz, se o código for bem feito corre isso tudo na boa e ainda sobra tempo, o pwm é gerado com timers e não consome cpu, escrever no lcd ou assim é esporádico, assim como ler a adc.
sim...por isso eu disse que tem de ser um código bem feito :P
-
O código bem feito? Eu acho que não consigo dar a volta a isto, pois estou a usar o código deste projecto:
LCD smartie on Arduino (http://www.nuelectronics.com/estore/index.php?main_page=project_lcdsmartie), mais propriamente este: http://www.nuelectronics.com/download/projects/lcd_smartie_v1.pde (http://www.nuelectronics.com/download/projects/lcd_smartie_v1.pde)
com este: http://ricardo-dias.com/node/77 (http://ricardo-dias.com/node/77)
e tudo junto não dá, se meto um delay qualquer na parte do código da temperatura a informação vinda do LcdSmartie já chega com muito atraso ao LCD, ou se meter tudo a correr ao mesmo tempo acontece aquilo que mostrei no vídeo.. os digitos nos displays de segmentos ficam "nervosos".
-
Mas esse código que estás a usar, gera saídas para o display de 7 segmentos.
Tu estás a usá-los?
-
Mas esse código que estás a usar, gera saídas para o display de 7 segmentos.
Tu estás a usá-los?
Sim gera, queria usar os displays de 7 segmentos e o LCD ao mesmo tempo! Seria esse o objectivo
-
Então posso perguntar para que é que queres pôr um delay no código?
-
Então posso perguntar para que é que queres pôr um delay no código?
Bom, se reparares o código do Ricardo tem um delay:
#
// Obtemos 8 samples da temperatura
for(i = 0; i<=7; i++){
samples[i] = ( 5.0 * analogRead(sensorPin) * 100.0) / 1024.0;
tempc = tempc + samples[i];
--> delay(50);
}
Dessa forma não funciona bem, pq o LCD recebe a info com bastante atraso..
Alterei essa parte por (interval=50):
if(currentMillis - previousMillis > interval) {
previousMillis = currentMillis;
}
Desta forma os digitos dos Segmentos ficam assim meios estranhos nas passagens qdo o LCD está a receber info da porta serial.. mas secalhar tem mesmo de ser assim.. (http://www.youtube.com/watch?v=qvEQ0I-JNJE# (http://www.youtube.com/watch?v=qvEQ0I-JNJE#)) (a partir do minuto 1:21 nota-se)
Possivelmente vou ter de usar apenas o LCD c/ o LcdSmartie à parte! Com 1 arduino só para isso
-
Então posso perguntar para que é que queres pôr um delay no código?
Bom, se reparares o código do Ricardo tem um delay:
#
// Obtemos 8 samples da temperatura
for(i = 0; i<=7; i++){
samples[i] = ( 5.0 * analogRead(sensorPin) * 100.0) / 1024.0;
tempc = tempc + samples[i];
--> delay(50);
}
Dessa forma não funciona bem, pq o LCD recebe a info com bastante atraso..
Alterei essa parte por (interval=50):
if(currentMillis - previousMillis > interval) {
previousMillis = currentMillis;
}
Desta forma os digitos dos Segmentos ficam assim meios estranhos nas passagens qdo o LCD está a receber info da porta serial.. mas secalhar tem mesmo de ser assim.. (http://www.youtube.com/watch?v=qvEQ0I-JNJE# (http://www.youtube.com/watch?v=qvEQ0I-JNJE#)) (a partir do minuto 1:21 nota-se)
Possivelmente vou ter de usar apenas o LCD c/ o LcdSmartie à parte! Com 1 arduino só para isso
Lol, caso ainda não tenhas reparado, eu sou o Ricardo... :P
Tu não precisas de outro Arduino coisa nenhuma...
Ao retirares o delay, ficas com o sensor demasiado reactivo. E como sabes, tudo o que é analógico tem ruído.
O que está a acontecer é que estás com oscilações na leitura, pois estás a fazê-la demasiado rápida.
A leitura pode ser feita como tu tens... Mas a passagem para os display's de 7 Seg não.
Só temos de garantir que só passas um valor novo para os display's de X em X tempo.
Não querendo desviar-te da ideia, proponho-te a seguinte solução... A substituição não chega, temos de fazer uns "tweaks" ao código.
Adicionamos estas variáveis:
int nLeituras = 0;
int maxLeituras = 8;
int interval = 50;
E agora no loop metes assim:
if(currentMillis - previousMillis > interval) {
previousMillis = currentMillis;
nleituras++;
samples[i] = ( 5.0 * analogRead(sensorPin) * 100.0) / 1024.0;
// Se atingimos o maximo de leituras que queremos
if(nLeituras == maxLeituras){
nleituras = 0; // recomecamos no proximo ciclo
// vamos calcular a media
for(i = 0; i<=7; i++) tempc = tempc + samples[i];
tempc = tempc/8.0; // Calcula-se a média
// para mostrar nos displays de 7 segmentos...
// Calcula-se o dígito da esquerda e da direita
int num1 = 0;
do{
num1++;
tempc = tempc - 10;
}while(tempc >= 10);
dataEsq = esq[num1];
dataDir = dir[tempc];
// Enquanto estivermos a transmitir, o pino "latch" tem de estar a LOW
digitalWrite(latchPin, 0);
// Enviar os bytes
shiftOut(dataPin, clockPin, dataDir);
shiftOut(dataPin, clockPin, dataEsq);
// Voltamos a por o pino "latch" do CI a HIGH para lhe indicar que já acabámos
// de transmitir os dados
digitalWrite(latchPin, 1);
}
}
Esta parte serve só para a parte dos displays de 7 segmentos, não bloqueia o que puseres depois disto.
Podes voltar a usar a variável "tempc" para calculares o necessário a enviar para o LCD Smartie. (Essa parte não vi muito bem, tens de ser tu a juntar as peças) ;)
-
Lol, caso ainda não tenhas reparado, eu sou o Ricardo... :P
;D ;D Muito bom!! Nem tinha reparado/associado :o
Tu não precisas de outro Arduino coisa nenhuma...
Ao retirares o delay, ficas com o sensor demasiado reactivo. E como sabes, tudo o que é analógico tem ruído.
O que está a acontecer é que estás com oscilações na leitura, pois estás a fazê-la demasiado rápida.
A leitura pode ser feita como tu tens... Mas a passagem para os display's de 7 Seg não.
Só temos de garantir que só passas um valor novo para os display's de X em X tempo.
Não querendo desviar-te da ideia, proponho-te a seguinte solução... A substituição não chega, temos de fazer uns "tweaks" ao código.
Adicionamos estas variáveis:
int nLeituras = 0;
int maxLeituras = 8;
int interval = 50;
E agora no loop metes assim:
if(currentMillis - previousMillis > interval) {
previousMillis = currentMillis;
nleituras++;
samples[i] = ( 5.0 * analogRead(sensorPin) * 100.0) / 1024.0;
// Se atingimos o maximo de leituras que queremos
if(nLeituras == maxLeituras){
nleituras = 0; // recomecamos no proximo ciclo
// vamos calcular a media
for(i = 0; i<=7; i++) tempc = tempc + samples[i];
tempc = tempc/8.0; // Calcula-se a média
// para mostrar nos displays de 7 segmentos...
// Calcula-se o dígito da esquerda e da direita
int num1 = 0;
do{
num1++;
tempc = tempc - 10;
}while(tempc >= 10);
dataEsq = esq[num1];
dataDir = dir[tempc];
// Enquanto estivermos a transmitir, o pino "latch" tem de estar a LOW
digitalWrite(latchPin, 0);
// Enviar os bytes
shiftOut(dataPin, clockPin, dataDir);
shiftOut(dataPin, clockPin, dataEsq);
// Voltamos a por o pino "latch" do CI a HIGH para lhe indicar que já acabámos
// de transmitir os dados
digitalWrite(latchPin, 1);
}
}
Esta parte serve só para a parte dos displays de 7 segmentos, não bloqueia o que puseres depois disto.
Podes voltar a usar a variável "tempc" para calculares o necessário a enviar para o LCD Smartie. (Essa parte não vi muito bem, tens de ser tu a juntar as peças) ;)
Muito obrigado pela dica!!! Logo já vou testar! Adoro este fórum!
-
LOL. ;D
Dá notícias!! ;)
-
LOL. ;D
Dá notícias!! ;)
Ena pá!!
Tive de alterar só uma pequena coisa.. estava a devolver valores de 10º ou 13º, ficou assim:
void loop() {
unsigned long currentMillis = millis();
if(currentMillis - previousMillis > interval) {
previousMillis = currentMillis;
nleituras++;
// Se atingimos o maximo de leituras que queremos
if(nleituras == maxLeituras){
nleituras = 0; // recomecamos no proximo ciclo
// vamos calcular a media
for(i = 0; i<=7; i++){
samples[i] = ( 5.0 * analogRead(sensorPin) * 100.0) / 1024.0;
tempc = tempc + samples[i];
}
tempc = tempc/8.0; // Calcula-se a média
// para mostrar nos displays de 7 segmentos...
// Calcula-se o dígito da esquerda e da direita
int num1 = 0;
do{
num1++;
tempc = tempc - 10;
}while(tempc >= 10);
dataEsq = esq[num1];
dataDir = dir[tempc];
// Enquanto estivermos a transmitir, o pino "latch" tem de estar a LOW
digitalWrite(latchPin, 0);
// Enviar os bytes
shiftOut(dataPin, clockPin, dataDir);
shiftOut(dataPin, clockPin, dataEsq);
// Voltamos a por o pino "latch" do CI a HIGH para lhe indicar que já acabámos
// de transmitir os dados
digitalWrite(latchPin, 1);
}
}
So alterei a localização do:
samples[i] = ( 5.0 * analogRead(sensorPin) * 100.0) / 1024.0;
que meti dentro do ciclo FOR
;D ;D
Agora demora mais tempo a actualizar os valores da temperatura (mas acho que tem a ver com o código do LCD pq qdo ligo o LcdSmartie e ele recebe dados já fica à velocidade normal) mas está bom assim.. fica tudo a funcionar ao mesmo tempo!!
Obrigadão!! Assim já posso continuar no meu código...! ;)
-
LOL. ;D
Dá notícias!! ;)
Ena pá!!
Tive de alterar só uma pequena coisa.. estava a devolver valores de 10º ou 13º, ficou assim:
void loop() {
unsigned long currentMillis = millis();
if(currentMillis - previousMillis > interval) {
previousMillis = currentMillis;
nleituras++;
// Se atingimos o maximo de leituras que queremos
if(nleituras == maxLeituras){
nleituras = 0; // recomecamos no proximo ciclo
// vamos calcular a media
for(i = 0; i<=7; i++){
samples[i] = ( 5.0 * analogRead(sensorPin) * 100.0) / 1024.0;
tempc = tempc + samples[i];
}
tempc = tempc/8.0; // Calcula-se a média
// para mostrar nos displays de 7 segmentos...
// Calcula-se o dígito da esquerda e da direita
int num1 = 0;
do{
num1++;
tempc = tempc - 10;
}while(tempc >= 10);
dataEsq = esq[num1];
dataDir = dir[tempc];
// Enquanto estivermos a transmitir, o pino "latch" tem de estar a LOW
digitalWrite(latchPin, 0);
// Enviar os bytes
shiftOut(dataPin, clockPin, dataDir);
shiftOut(dataPin, clockPin, dataEsq);
// Voltamos a por o pino "latch" do CI a HIGH para lhe indicar que já acabámos
// de transmitir os dados
digitalWrite(latchPin, 1);
}
}
So alterei a localização do:
samples[i] = ( 5.0 * analogRead(sensorPin) * 100.0) / 1024.0;
que meti dentro do ciclo FOR
;D ;D
Agora demora mais tempo a actualizar os valores da temperatura (mas acho que tem a ver com o código do LCD pq qdo ligo o LcdSmartie e ele recebe dados já fica à velocidade normal) mas está bom assim.. fica tudo a funcionar ao mesmo tempo!!
Obrigadão!! Assim já posso continuar no meu código...! ;)
Podes reduzir o tempo diminuindo o nº de samples ou diminuindo o tempo de intervalo.
De nada ;)
-
Bom.. após 3 dias a tentar descobrir a solução para isto não sou capaz :-[
A minha questão está associada ao código e Loop do Arduino..:
//LCD
#include <avr/interrupt.h>
#include <avr/io.h>
#include "LCD4Bit_mod.h"
LCD4Bit_mod lcd = LCD4Bit_mod(2);
//LM35
//Pin ST_CP (latch) do CI 74HC595
int latchPin = 3;
//Pin SH_CP (clock) do CI 74HC595
int clockPin = 2;
//Pin de dados do CI 74HC595
int dataPin = 12;
int nleituras = 0;
int maxLeituras = 8;
int interval = 50;
long previousMillis = 0;
//variáveis que ficam com os dados que vão ser passados para o ShiftOut()
byte dataEsq;
byte dataDir;
byte esq[10];
byte dir[10];
int sensorPin = 4; // Pin Analógico
int tempc = 0; // Variável para a temperatura
int samples[8]; // Variáveis para ter uma maior precisão
int i;
void setup() {
pinMode(latchPin, OUTPUT);
Serial.begin(19200);
lcd.init();
lcd.clear();
lcd.printIn("TESTE");
lcd.cursorTo(2,2);
lcd.printIn("Linha 2");
esq[0] = B11000000;
esq[1] = B11111001;
esq[2] = B10100100;
esq[3] = B10110000;
esq[4] = B10011001;
esq[5] = B10010010;
esq[6] = B10000010;
esq[7] = B11111000;
esq[8] = B10000000;
esq[9] = B10011000;
dir[0] = B11000000;
dir[1] = B11111001;
dir[2] = B10100100;
dir[3] = B10110000;
dir[4] = B10011001;
dir[5] = B10010010;
dir[6] = B10000010;
dir[7] = B11111000;
dir[8] = B10000000;
dir[9] = B10011000;
}
//LCD
byte serial_getch(){
int incoming;
while (Serial.available()==0){}
// read the incoming byte:
incoming = Serial.read();
return (byte) (incoming &0xff);
}
void loop() {
//TEMPERATURA E DISPLAYS DE SEGMENTOS
unsigned long currentMillis = millis();
if(currentMillis - previousMillis > interval) {
previousMillis = currentMillis;
nleituras++;
// Se atingimos o maximo de leituras que queremos
if(nleituras == maxLeituras){
nleituras = 0; // recomecamos no proximo ciclo
// vamos calcular a media
for(i = 0; i<=7; i++){
samples[i] = ( 5.0 * analogRead(sensorPin) * 100.0) / 1024.0;
tempc = tempc + samples[i];
}
tempc = tempc/8.0; // Calcula-se a média
// para mostrar nos displays de 7 segmentos...
// Calcula-se o dígito da esquerda e da direita
int num1 = 0;
do{
num1++;
tempc = tempc - 10;
}while(tempc >= 10);
dataEsq = esq[num1];
dataDir = dir[tempc];
// Enquanto estivermos a transmitir, o pino "latch" tem de estar a LOW
digitalWrite(latchPin, 0);
// Enviar os bytes
shiftOut(dataPin, clockPin, dataDir);
shiftOut(dataPin, clockPin, dataEsq);
// Voltamos a por o pino "latch" do CI a HIGH para lhe indicar que já acabámos
// de transmitir os dados
digitalWrite(latchPin, 1);
}
}
//LCD:
byte rxbyte;
byte temp;
rxbyte = serial_getch();
if (rxbyte == 254) //Matrix Orbital uses 254 prefix for commands
{
switch (serial_getch())
{
case 66: //backlight on (at previously set brightness)
// not implemented
break;
case 70: //backlight off
// not implemented
break;
case 71: //set cursor position
temp = (serial_getch() - 1); //get column byte
switch (serial_getch()) //get row byte
{
//line 1 is already set up
case 2:
temp += 0x40;
break;
case 3:
temp += 0x14;
break;
case 4:
temp += 0x54;
break;
default:
break;
}
lcd.commandWrite(0b10000000 + temp);
break;
case 72: //cursor home (reset display position)
lcd.commandWrite(2);
break;
case 74: //show underline cursor
lcd.commandWrite(0b00001110);
break;
case 75: //underline cursor off
case 84: //block cursor off
lcd.commandWrite(0b00001100);
break;
case 76: //move cursor left
lcd.commandWrite(16);
break;
case 77: //move cursor right
lcd.commandWrite(20);
break;
case 78: //define custom char
lcd.commandWrite(64 + (serial_getch() * 8)); //get+set char address
for (temp = 7; temp != 0; temp--)
{
lcd.print(serial_getch()); //get each pattern byte
}
break;
case 83: //show blinking block cursor
lcd.commandWrite(0b00001111);
break;
case 86: //GPO OFF
//implement later
break;
case 87: //GPO ON
/*temp = serial_getch();
if (temp == 1)
{
GPO1 = GPO_ON;
}*/
break;
case 88: //clear display, cursor home
lcd.commandWrite(1);
break;
case 152: //set and remember (doesn't save value, though)
case 153: //set backlight brightness
//not implemented
break;
//these commands ignored (no parameters)
case 35: //read serial number
case 36: //read version number
case 55: //read module type
case 59: //exit flow-control mode
case 65: //auto transmit keypresses
case 96: //auto-repeat mode off (keypad)
case 67: //auto line-wrap on
case 68: //auto line-wrap off
case 81: //auto scroll on
case 82: //auto scroll off
case 104: //init horiz bar graph
case 109: //init med size digits
case 115: //init narrow vert bar graph
case 118: //init wide vert bar graph
break;
default:
//all other commands ignored and parameter byte discarded
temp = serial_getch(); //dump the command code
break;
}
return;
} //END OF COMMAND HANDLER
//change accented char to plain, detect and change descenders
//NB descenders only work on 5x10 displays. This lookup table works
// with my DEM-20845 (Display Elektronik GmbH) LCD using KS0066 chip.
switch (rxbyte)
{
//chars that have direct equivalent in LCD charmap
/* case 0x67: //g
rxbyte = 0xE7;
break;
case 0x6A: //j
rxbyte = 0xEA;
break;
case 0x70: //p
rxbyte = 0xF0;
break;
case 0x71: //q
rxbyte = 0xF1;
break;
case 0x79: //y
rxbyte = 0xF9;
break;
*/ case 0xE4: //ASCII "a" umlaut
rxbyte = 0xE1;
break;
case 0xF1: //ASCII "n" tilde
rxbyte = 0xEE;
break;
case 0xF6: //ASCII "o" umlaut
rxbyte = 0xEF; //was wrong in v0.86
break;
case 0xFC: //ASCII "u" umlaut
rxbyte = 0xF5;
break;
//accented -> plain equivalent
//and misc symbol translation
case 0xA3: //sterling (pounds)
rxbyte = 0xED;
break;
/* case 0xB0: //degrees symbol
rxbyte = 0xDF;
break;
*/ case 0xB5: //mu
rxbyte = 0xE4;
break;
case 0xC0: //"A" variants
case 0xC1:
case 0xC2:
case 0xC3:
case 0xC4:
case 0xC5:
rxbyte = 0x41;
break;
case 0xC8: //"E" variants
case 0xC9:
case 0xCA:
case 0xCB:
rxbyte = 0x45;
break;
case 0xCC: //"I" variants
case 0xCD:
case 0xCE:
case 0xCF:
rxbyte = 0x49;
break;
case 0xD1: //"N" tilde -> plain "N"
rxbyte = 0x43;
break;
case 0xD2: //"O" variants
case 0xD3:
case 0xD4:
case 0xD5:
case 0xD6:
case 0xD8:
rxbyte = 0x4F;
break;
case 0xD9: //"U" variants
case 0xDA:
case 0xDB:
case 0xDC:
rxbyte = 0x55;
break;
case 0xDD: //"Y" acute -> "Y"
rxbyte = 0x59;
break;
/* case 0xDF: //beta //mucks up LCDSmartie's degree symbol??
rxbyte = 0xE2;
break;
*/ case 0xE0: //"a" variants except umlaut
case 0xE1:
case 0xE2:
case 0xE3:
case 0xE5:
rxbyte = 0x61;
break;
case 0xE7: //"c" cedilla -> "c"
rxbyte = 0x63;
break;
case 0xE8: //"e" variants
case 0xE9:
case 0xEA:
case 0xEB:
rxbyte = 0x65;
break;
case 0xEC: //"i" variants
case 0xED:
case 0xEE:
case 0xEF:
rxbyte = 0x69;
break;
case 0xF2: //"o" variants except umlaut
case 0xF3:
case 0xF4:
case 0xF5:
case 0xF8:
rxbyte = 0x6F;
break;
case 0xF7: //division symbol
rxbyte = 0xFD;
break;
case 0xF9: //"u" variants except umlaut
case 0xFA:
case 0xFB:
rxbyte = 0x75;
break;
default:
break;
}
lcd.print(rxbyte); //otherwise a plain char so we print it to lcd
}
// A função shiftOut (o coração do programa)
// Mais informações sobre o ShiftOut em:
// http://www.arduino.cc/en/Tutorial/ShiftOut
void shiftOut(int myDataPin, int myClockPin, byte myDataOut) {
int i=0;
int pinState;
pinMode(myClockPin, OUTPUT);
pinMode(myDataPin, OUTPUT);
digitalWrite(myDataPin, 0);
digitalWrite(myClockPin, 0);
for (i=7; i>=0; i--) {
digitalWrite(myClockPin, 0);
if ( myDataOut & (1<<i) ) {
pinState= 1;
}
else {
pinState= 0;
}
digitalWrite(myDataPin, pinState);
digitalWrite(myClockPin, 1);
digitalWrite(myDataPin, 0);
}
digitalWrite(myClockPin, 0);
return;
} }
O sistema está sempre a verificar se recebe algo através da porta série com a função byte serial_getch(), acontece o seguinte:
Quando não está a receber nada [programa LcdSmartie OFF] :
- O loop parece que não é feito da mesma forma, a actualização parece ser de minuto a minuto.., pois os displays de temperatura demoram imenso tempo a actualizar.
- Fica a enviar um caracter para o LCD indefenidamente, neste caso o "6"
Quando está a receber info [programa LcdSmartie ON] :
- O loop fica normal, a actualização da temperatura (execução do respectivo código) é feita normal
- Para o LCD vai apenas a info recebida, tudo ok+
Portanto, o problema resume-se apenas qdo ele não recebe nada vindo do PC, para além de enviar um caracter para o LCD não me executa o restante código (temperatura).
-> Fiz vários testes, um deles é se tiver a janela do "Serial Monitor", do software do arduino, aberta ele já não envia o "6", parece que é apenas qdo não tem nenhuma ligação activa. Reparei tb que se alterar o data rate o carecter enviado muda tb.. em vez de ser "6" é um "u" :-\
Mesmo não estando a receber e enviar info para o LCD o arduino não devia de executar o restante código (temperatura) ao mesmo ritmo de sempre?
Obg
-
O que deve acontecer é que ele pára na função "serial_getch()" porque tens lá um while...
Mete assim:
if(Serial.available() > 0)
rxbyte = serial_getch();
Assim, garantes que a função é executada apenas quando tens alguma coisa no buffer para ler...
-
O que deve acontecer é que ele pára na função "serial_getch()" porque tens lá um while...
Mete assim:
if(Serial.available() > 0)
rxbyte = serial_getch();
Assim, garantes que a função é executada apenas quando tens alguma coisa no buffer para ler...
Bom.. quase que resultava ::) mas isto está a ser teimoso.
Com o código
if(Serial.available() > 0)
rxbyte = serial_getch();
ele de facto já me executa todo o outro código e apenas vai à função serial_getch() quando recebe algo.
Mas desta forma o LCD não apresenta bem as coisas.. está sempre a limpar as linhas qdo deixa de receber info e não devia.
Testei meter tb o mesmo IF aqui:
if(Serial.available() > 0)
lcd.print(rxbyte); //otherwise a plain char so we print it to lcd
e de facto ficou a funcionar a 90%, apresenta as coisas sem apagar as linhas mas fica sempre um caracter (quadrado) no final que não desaparece.. grrr
Tou farto deste código >:(
-
Tem calma, não tinha reparado que a variável era iniciada dentro do Loop.
Passa isto:
byte rxbyte;
para fora do loop(), para ao pé das variáveis que tens declaradas no início do código.
Testa da forma que te disse, com o tal if.
-
Tem calma, não tinha reparado que a variável era iniciada dentro do Loop.
Passa isto:
byte rxbyte;
para fora do loop(), para ao pé das variáveis que tens declaradas no início do código.
Testa da forma que te disse, com o tal if.
Tem calma, não tinha reparado que a variável era iniciada dentro do Loop.
Passa isto:
byte rxbyte;
para fora do loop(), para ao pé das variáveis que tens declaradas no início do código.
Testa da forma que te disse, com o tal if.
Troquei o byte rxbyte; para fora do Loop e mantive IF dentro, o resultado é o LCD sempre a limpar as linhas e a aparecer caracteres estranhos..
Fiz um vídeo com o resultado da alteração: Fancontroller (http://www.youtube.com/watch?v=bFEY2EU0u44#)
Resolvi depois meter tb o IF na linha que envia para o LCD:
if(Serial.available() > 0)
lcd.print(rxbyte); //otherwise a plain char so we print it to lcd
O resultado é o mesmo, fica a aparecer +/- bem senão fosse o raio dum caracter no final da 2ª linha do lado direito, parece que não actualiza aquele bloco. Vídeo: FanII (http://www.youtube.com/watch?v=8MN2dFOeFt4#)
Código actual:
//LCD
#include <avr/interrupt.h>
#include <avr/io.h>
#include "LCD4Bit_mod.h"
LCD4Bit_mod lcd = LCD4Bit_mod(2);
byte rxbyte;
byte temp;
//LM35
//Pin ST_CP (latch) do CI 74HC595
int latchPin = 3;
//Pin SH_CP (clock) do CI 74HC595
int clockPin = 2;
//Pin de dados do CI 74HC595
int dataPin = 12;
int nleituras = 0;
int maxLeituras = 8;
int interval = 50;
long previousMillis = 0;
//variáveis que ficam com os dados que vão ser passados para o ShiftOut()
byte dataEsq;
byte dataDir;
byte esq[10];
byte dir[10];
int sensorPin = 4; // Pin Analógico
int tempc = 0; // Variável para a temperatura
int samples[8]; // Variáveis para ter uma maior precisão
int i;
void setup() {
pinMode(latchPin, OUTPUT);
Serial.begin(19200); //Alterei valor para o do LCD
lcd.init();
lcd.clear();
lcd.printIn("FanController v2");
lcd.cursorTo(2,2);
lcd.printIn(" *GrcByte*");
// A forma de escrever em binário no Arduino é pondo um 'B' atrás
// Aqui serão os códigos equivalentes aos dígitos 0 - 9
// ATENCAO - estes códigos devem ser ajustados, pois dependem das
// ligações que foram feitas ao CI.
esq[0] = B11000000;
esq[1] = B11111001;
esq[2] = B10100100;
esq[3] = B10110000;
esq[4] = B10011001;
esq[5] = B10010010;
esq[6] = B10000010;
esq[7] = B11111000;
esq[8] = B10000000;
esq[9] = B10011000;
dir[0] = B11000000;
dir[1] = B11111001;
dir[2] = B10100100;
dir[3] = B10110000;
dir[4] = B10011001;
dir[5] = B10010010;
dir[6] = B10000010;
dir[7] = B11111000;
dir[8] = B10000000;
dir[9] = B10011000;
}
//LCD
byte serial_getch(){
int incoming;
while (Serial.available() == 0){}
// read the incoming byte:
incoming = Serial.read();
return (byte) (incoming &0xff);
}
void loop() {
//TEMPERATURA E DISPLAYS DE SEGMENTOS
unsigned long currentMillis = millis();
if(currentMillis - previousMillis > interval) {
previousMillis = currentMillis;
nleituras++;
// Se atingimos o maximo de leituras que queremos
if(nleituras == maxLeituras){
nleituras = 0; // recomecamos no proximo ciclo
// vamos calcular a media
for(i = 0; i<=7; i++){
samples[i] = ( 5.0 * analogRead(sensorPin) * 100.0) / 1024.0;
tempc = tempc + samples[i];
}
tempc = tempc/8.0; // Calcula-se a média
// para mostrar nos displays de 7 segmentos...
// Calcula-se o dígito da esquerda e da direita
int num1 = 0;
do{
num1++;
tempc = tempc - 10;
}while(tempc >= 10);
dataEsq = esq[num1];
dataDir = dir[tempc];
// Enquanto estivermos a transmitir, o pino "latch" tem de estar a LOW
digitalWrite(latchPin, 0);
// Enviar os bytes
shiftOut(dataPin, clockPin, dataDir);
shiftOut(dataPin, clockPin, dataEsq);
// Voltamos a por o pino "latch" do CI a HIGH para lhe indicar que já acabámos
// de transmitir os dados
digitalWrite(latchPin, 1);
}
}
//LCD
if(Serial.available() > 0)
rxbyte = serial_getch();
if (rxbyte == 254) //Matrix Orbital uses 254 prefix for commands
{
switch (serial_getch())
{
case 66: //backlight on (at previously set brightness)
// not implemented
break;
case 70: //backlight off
// not implemented
break;
case 71: //set cursor position
temp = (serial_getch() - 1); //get column byte
switch (serial_getch()) //get row byte
{
//line 1 is already set up
case 2:
temp += 0x40;
break;
case 3:
temp += 0x14;
break;
case 4:
temp += 0x54;
break;
default:
break;
}
lcd.commandWrite(0b10000000 + temp);
break;
case 72: //cursor home (reset display position)
lcd.commandWrite(2);
break;
case 74: //show underline cursor
lcd.commandWrite(0b00001110);
break;
case 75: //underline cursor off
case 84: //block cursor off
lcd.commandWrite(0b00001100);
break;
case 76: //move cursor left
lcd.commandWrite(16);
break;
case 77: //move cursor right
lcd.commandWrite(20);
break;
case 78: //define custom char
lcd.commandWrite(64 + (serial_getch() * 8)); //get+set char address
for (temp = 7; temp != 0; temp--)
{
lcd.print(serial_getch()); //get each pattern byte
}
break;
case 83: //show blinking block cursor
lcd.commandWrite(0b00001111);
break;
case 86: //GPO OFF
//implement later
break;
case 87: //GPO ON
/*temp = serial_getch();
if (temp == 1)
{
GPO1 = GPO_ON;
}*/
break;
case 88: //clear display, cursor home
lcd.commandWrite(1);
break;
case 152: //set and remember (doesn't save value, though)
case 153: //set backlight brightness
//not implemented
break;
//these commands ignored (no parameters)
case 35: //read serial number
case 36: //read version number
case 55: //read module type
case 59: //exit flow-control mode
case 65: //auto transmit keypresses
case 96: //auto-repeat mode off (keypad)
case 67: //auto line-wrap on
case 68: //auto line-wrap off
case 81: //auto scroll on
case 82: //auto scroll off
case 104: //init horiz bar graph
case 109: //init med size digits
case 115: //init narrow vert bar graph
case 118: //init wide vert bar graph
break;
default:
//all other commands ignored and parameter byte discarded
temp = serial_getch(); //dump the command code
break;
}
return;
} //END OF COMMAND HANDLER
//change accented char to plain, detect and change descenders
//NB descenders only work on 5x10 displays. This lookup table works
// with my DEM-20845 (Display Elektronik GmbH) LCD using KS0066 chip.
switch (rxbyte)
{
//chars that have direct equivalent in LCD charmap
/* case 0x67: //g
rxbyte = 0xE7;
break;
case 0x6A: //j
rxbyte = 0xEA;
break;
case 0x70: //p
rxbyte = 0xF0;
break;
case 0x71: //q
rxbyte = 0xF1;
break;
case 0x79: //y
rxbyte = 0xF9;
break;
*/ case 0xE4: //ASCII "a" umlaut
rxbyte = 0xE1;
break;
case 0xF1: //ASCII "n" tilde
rxbyte = 0xEE;
break;
case 0xF6: //ASCII "o" umlaut
rxbyte = 0xEF; //was wrong in v0.86
break;
case 0xFC: //ASCII "u" umlaut
rxbyte = 0xF5;
break;
//accented -> plain equivalent
//and misc symbol translation
case 0xA3: //sterling (pounds)
rxbyte = 0xED;
break;
/* case 0xB0: //degrees symbol
rxbyte = 0xDF;
break;
*/ case 0xB5: //mu
rxbyte = 0xE4;
break;
case 0xC0: //"A" variants
case 0xC1:
case 0xC2:
case 0xC3:
case 0xC4:
case 0xC5:
rxbyte = 0x41;
break;
case 0xC8: //"E" variants
case 0xC9:
case 0xCA:
case 0xCB:
rxbyte = 0x45;
break;
case 0xCC: //"I" variants
case 0xCD:
case 0xCE:
case 0xCF:
rxbyte = 0x49;
break;
case 0xD1: //"N" tilde -> plain "N"
rxbyte = 0x43;
break;
case 0xD2: //"O" variants
case 0xD3:
case 0xD4:
case 0xD5:
case 0xD6:
case 0xD8:
rxbyte = 0x4F;
break;
case 0xD9: //"U" variants
case 0xDA:
case 0xDB:
case 0xDC:
rxbyte = 0x55;
break;
case 0xDD: //"Y" acute -> "Y"
rxbyte = 0x59;
break;
/* case 0xDF: //beta //mucks up LCDSmartie's degree symbol??
rxbyte = 0xE2;
break;
*/ case 0xE0: //"a" variants except umlaut
case 0xE1:
case 0xE2:
case 0xE3:
case 0xE5:
rxbyte = 0x61;
break;
case 0xE7: //"c" cedilla -> "c"
rxbyte = 0x63;
break;
case 0xE8: //"e" variants
case 0xE9:
case 0xEA:
case 0xEB:
rxbyte = 0x65;
break;
case 0xEC: //"i" variants
case 0xED:
case 0xEE:
case 0xEF:
rxbyte = 0x69;
break;
case 0xF2: //"o" variants except umlaut
case 0xF3:
case 0xF4:
case 0xF5:
case 0xF8:
rxbyte = 0x6F;
break;
case 0xF7: //division symbol
rxbyte = 0xFD;
break;
case 0xF9: //"u" variants except umlaut
case 0xFA:
case 0xFB:
rxbyte = 0x75;
break;
default:
break;
}
if(Serial.available() > 0)
lcd.print(rxbyte); //otherwise a plain char so we print it to lcd
}
// A função shiftOut (o coração do programa)
// Mais informações sobre o ShiftOut em:
// http://www.arduino.cc/en/Tutorial/ShiftOut
void shiftOut(int myDataPin, int myClockPin, byte myDataOut) {
int i=0;
int pinState;
pinMode(myClockPin, OUTPUT);
pinMode(myDataPin, OUTPUT);
digitalWrite(myDataPin, 0);
digitalWrite(myClockPin, 0);
for (i=7; i>=0; i--) {
digitalWrite(myClockPin, 0);
if ( myDataOut & (1<<i) ) {
pinState= 1;
}
else {
pinState= 0;
}
digitalWrite(myDataPin, pinState);
digitalWrite(myClockPin, 1);
digitalWrite(myDataPin, 0);
}
digitalWrite(myClockPin, 0);
return;
}
-
Bom, meti o código associado ao LCD todo dentro de duas "{" e parece que melhorou:
if(Serial.available() > 0) {
rxbyte = serial_getch();
if (rxbyte == 254) //Matrix Orbital uses 254 prefix for commands
{
switch (serial_getch())
{
case 66: //backlight on (at previously set brightness)
// not implemented
break;
case 70: //backlight off
// not implemented
break;
case 71: //set cursor position
temp = (serial_getch() - 1); //get column byte
switch (serial_getch()) //get row byte
{
//line 1 is already set up
case 2:
temp += 0x40;
break;
case 3:
temp += 0x14;
break;
case 4:
temp += 0x54;
break;
default:
break;
}
lcd.commandWrite(0b10000000 + temp);
break;
case 72: //cursor home (reset display position)
lcd.commandWrite(2);
break;
case 74: //show underline cursor
lcd.commandWrite(0b00001110);
break;
case 75: //underline cursor off
case 84: //block cursor off
lcd.commandWrite(0b00001100);
break;
case 76: //move cursor left
lcd.commandWrite(16);
break;
case 77: //move cursor right
lcd.commandWrite(20);
break;
case 78: //define custom char
lcd.commandWrite(64 + (serial_getch() * 8)); //get+set char address
for (temp = 7; temp != 0; temp--)
{
lcd.print(serial_getch()); //get each pattern byte
}
break;
case 83: //show blinking block cursor
lcd.commandWrite(0b00001111);
break;
case 86: //GPO OFF
//implement later
break;
case 87: //GPO ON
/*temp = serial_getch();
if (temp == 1)
{
GPO1 = GPO_ON;
}*/
break;
case 88: //clear display, cursor home
lcd.commandWrite(1);
break;
case 152: //set and remember (doesn't save value, though)
case 153: //set backlight brightness
//not implemented
break;
//these commands ignored (no parameters)
case 35: //read serial number
case 36: //read version number
case 55: //read module type
case 59: //exit flow-control mode
case 65: //auto transmit keypresses
case 96: //auto-repeat mode off (keypad)
case 67: //auto line-wrap on
case 68: //auto line-wrap off
case 81: //auto scroll on
case 82: //auto scroll off
case 104: //init horiz bar graph
case 109: //init med size digits
case 115: //init narrow vert bar graph
case 118: //init wide vert bar graph
break;
default:
//all other commands ignored and parameter byte discarded
temp = serial_getch(); //dump the command code
break;
}
return;
} //END OF COMMAND HANDLER
//change accented char to plain, detect and change descenders
//NB descenders only work on 5x10 displays. This lookup table works
// with my DEM-20845 (Display Elektronik GmbH) LCD using KS0066 chip.
switch (rxbyte)
{
//chars that have direct equivalent in LCD charmap
/* case 0x67: //g
rxbyte = 0xE7;
break;
case 0x6A: //j
rxbyte = 0xEA;
break;
case 0x70: //p
rxbyte = 0xF0;
break;
case 0x71: //q
rxbyte = 0xF1;
break;
case 0x79: //y
rxbyte = 0xF9;
break;
*/ case 0xE4: //ASCII "a" umlaut
rxbyte = 0xE1;
break;
case 0xF1: //ASCII "n" tilde
rxbyte = 0xEE;
break;
case 0xF6: //ASCII "o" umlaut
rxbyte = 0xEF; //was wrong in v0.86
break;
case 0xFC: //ASCII "u" umlaut
rxbyte = 0xF5;
break;
//accented -> plain equivalent
//and misc symbol translation
case 0xA3: //sterling (pounds)
rxbyte = 0xED;
break;
/* case 0xB0: //degrees symbol
rxbyte = 0xDF;
break;
*/ case 0xB5: //mu
rxbyte = 0xE4;
break;
case 0xC0: //"A" variants
case 0xC1:
case 0xC2:
case 0xC3:
case 0xC4:
case 0xC5:
rxbyte = 0x41;
break;
case 0xC8: //"E" variants
case 0xC9:
case 0xCA:
case 0xCB:
rxbyte = 0x45;
break;
case 0xCC: //"I" variants
case 0xCD:
case 0xCE:
case 0xCF:
rxbyte = 0x49;
break;
case 0xD1: //"N" tilde -> plain "N"
rxbyte = 0x43;
break;
case 0xD2: //"O" variants
case 0xD3:
case 0xD4:
case 0xD5:
case 0xD6:
case 0xD8:
rxbyte = 0x4F;
break;
case 0xD9: //"U" variants
case 0xDA:
case 0xDB:
case 0xDC:
rxbyte = 0x55;
break;
case 0xDD: //"Y" acute -> "Y"
rxbyte = 0x59;
break;
/* case 0xDF: //beta //mucks up LCDSmartie's degree symbol??
rxbyte = 0xE2;
break;
*/ case 0xE0: //"a" variants except umlaut
case 0xE1:
case 0xE2:
case 0xE3:
case 0xE5:
rxbyte = 0x61;
break;
case 0xE7: //"c" cedilla -> "c"
rxbyte = 0x63;
break;
case 0xE8: //"e" variants
case 0xE9:
case 0xEA:
case 0xEB:
rxbyte = 0x65;
break;
case 0xEC: //"i" variants
case 0xED:
case 0xEE:
case 0xEF:
rxbyte = 0x69;
break;
case 0xF2: //"o" variants except umlaut
case 0xF3:
case 0xF4:
case 0xF5:
case 0xF8:
rxbyte = 0x6F;
break;
case 0xF7: //division symbol
rxbyte = 0xFD;
break;
case 0xF9: //"u" variants except umlaut
case 0xFA:
case 0xFB:
rxbyte = 0x75;
break;
default:
break;
}
//
lcd.print(rxbyte); //otherwise a plain char so we print it to lcd
}
Resultado: FanController Ok (http://www.youtube.com/watch?v=MC4gSpZHqno#), existem uns promenores mas nada de grave.
A diferença do Arduino para outro projecto que fiz igual mas usando um PIC é por exemplo nas barras do spectrum analyzer que ficam mais lentas.., só que não dá para melhorar :( Resultado: FanController Barras (http://www.youtube.com/watch?v=jRAs-5jUHlQ#) (se aumentar o "Refresh Interval" no LcdSmartie fica tudo marado no LCD) .
Será possível bloquear o envio de caracteres quando o LCD Smartie está OFF, ou seja, apenas tenho o cabo USB ligado e ele de x em x tempo vai enviado isto para o LCD: Erro1 (http://www.youtube.com/watch?v=P3ffBYF7zOU#)
-
:o Continuo às turras com o "66666" enviado para o LCD :P
Agora consigo que ao inicio de tudo ele não envie estes caracteres, coloquei uma variável rxbyte2 e que apenas envia para o LCD qdo lhe que atribuo o valor de 254, ou seja, apenas qdo o LCDSmartie é ligado. O problema é qdo desligo o LCDSmartie, não sei como identificar qdo é que é desligado para voltar a definir a variável rxbyte2=0
//LCD
#include <avr/interrupt.h>
#include <avr/io.h>
#include "LCD4Bit_mod.h"
LCD4Bit_mod lcd = LCD4Bit_mod(2);
byte rxbyte;
byte temp;
int rxbyte2=0;
//LM35
//Pin ST_CP (latch) do CI 74HC595
int latchPin = 3;
//Pin SH_CP (clock) do CI 74HC595
int clockPin = 2;
//Pin de dados do CI 74HC595
int dataPin = 12;
int nleituras = 0;
int maxLeituras = 8;
int interval = 50;
long previousMillis = 0;
//variáveis que ficam com os dados que vão ser passados para o ShiftOut()
byte dataEsq;
byte dataDir;
byte esq[10];
byte dir[10];
int sensorPin = 4; // Pin Analógico
int tempc = 0; // Variável para a temperatura
int samples[8]; // Variáveis para ter uma maior precisão
int i;
void setup() {
pinMode(latchPin, OUTPUT);
Serial.begin(19200); //Alterei valor para o do LCD
lcd.init();
lcd.clear();
lcd.printIn("FanController v2");
lcd.cursorTo(2,2);
lcd.printIn(" *GrcByte*");
// A forma de escrever em binário no Arduino é pondo um 'B' atrás
// Aqui serão os códigos equivalentes aos dígitos 0 - 9
// ATENCAO - estes códigos devem ser ajustados, pois dependem das
// ligações que foram feitas ao CI.
esq[0] = B11000000;
esq[1] = B11111001;
esq[2] = B10100100;
esq[3] = B10110000;
esq[4] = B10011001;
esq[5] = B10010010;
esq[6] = B10000010;
esq[7] = B11111000;
esq[8] = B10000000;
esq[9] = B10011000;
dir[0] = B11000000;
dir[1] = B11111001;
dir[2] = B10100100;
dir[3] = B10110000;
dir[4] = B10011001;
dir[5] = B10010010;
dir[6] = B10000010;
dir[7] = B11111000;
dir[8] = B10000000;
dir[9] = B10011000;
}
//LCD
byte serial_getch(){
int incoming;
while (Serial.available() == 0){}
// read the incoming byte:
incoming = Serial.read();
return (byte) (incoming &0xff);
}
void loop() {
//TEMPERATURA E DISPLAYS DE SEGMENTOS
unsigned long currentMillis = millis();
if(currentMillis - previousMillis > interval) {
previousMillis = currentMillis;
nleituras++;
// Se atingimos o maximo de leituras que queremos
if(nleituras == maxLeituras){
nleituras = 0; // recomecamos no proximo ciclo
// vamos calcular a media
for(i = 0; i<=7; i++){
samples[i] = ( 5.0 * analogRead(sensorPin) * 100.0) / 1024.0;
tempc = tempc + samples[i];
}
tempc = tempc/8.0; // Calcula-se a média
// para mostrar nos displays de 7 segmentos...
// Calcula-se o dígito da esquerda e da direita
int num1 = 0;
do{
num1++;
tempc = tempc - 10;
}while(tempc >= 10);
dataEsq = esq[num1];
dataDir = dir[tempc];
// Enquanto estivermos a transmitir, o pino "latch" tem de estar a LOW
digitalWrite(latchPin, 0);
// Enviar os bytes
shiftOut(dataPin, clockPin, dataDir);
shiftOut(dataPin, clockPin, dataEsq);
// Voltamos a por o pino "latch" do CI a HIGH para lhe indicar que já acabámos
// de transmitir os dados
digitalWrite(latchPin, 1);
}
}
//LCD
if(Serial.available() > 0) {
rxbyte = serial_getch();
if (rxbyte == 254) //Matrix Orbital uses 254 prefix for commands
{
rxbyte2=254;
switch (serial_getch())
{
case 66: //backlight on (at previously set brightness)
// not implemented
break;
case 70: //backlight off
// not implemented
break;
case 71: //set cursor position
temp = (serial_getch() - 1); //get column byte
switch (serial_getch()) //get row byte
{
//line 1 is already set up
case 2:
temp += 0x40;
break;
case 3:
temp += 0x14;
break;
case 4:
temp += 0x54;
break;
default:
break;
}
lcd.commandWrite(0b10000000 + temp);
break;
case 72: //cursor home (reset display position)
lcd.commandWrite(2);
break;
case 74: //show underline cursor
lcd.commandWrite(0b00001110);
break;
case 75: //underline cursor off
case 84: //block cursor off
lcd.commandWrite(0b00001100);
break;
case 76: //move cursor left
lcd.commandWrite(16);
break;
case 77: //move cursor right
lcd.commandWrite(20);
break;
case 78: //define custom char
lcd.commandWrite(64 + (serial_getch() * 8)); //get+set char address
for (temp = 7; temp != 0; temp--)
{
lcd.print(serial_getch()); //get each pattern byte
}
break;
case 83: //show blinking block cursor
lcd.commandWrite(0b00001111);
break;
case 86: //GPO OFF
//implement later
break;
case 87: //GPO ON
/*temp = serial_getch();
if (temp == 1)
{
GPO1 = GPO_ON;
}*/
break;
case 88: //clear display, cursor home
lcd.commandWrite(1);
break;
case 152: //set and remember (doesn't save value, though)
case 153: //set backlight brightness
//not implemented
break;
//these commands ignored (no parameters)
case 35: //read serial number
case 36: //read version number
case 55: //read module type
case 59: //exit flow-control mode
case 65: //auto transmit keypresses
case 96: //auto-repeat mode off (keypad)
case 67: //auto line-wrap on
case 68: //auto line-wrap off
case 81: //auto scroll on
case 82: //auto scroll off
case 104: //init horiz bar graph
case 109: //init med size digits
case 115: //init narrow vert bar graph
case 118: //init wide vert bar graph
break;
default:
//all other commands ignored and parameter byte discarded
temp = serial_getch(); //dump the command code
break;
}
return;
} //END OF COMMAND HANDLER
//change accented char to plain, detect and change descenders
//NB descenders only work on 5x10 displays. This lookup table works
// with my DEM-20845 (Display Elektronik GmbH) LCD using KS0066 chip.
switch (rxbyte)
{
//chars that have direct equivalent in LCD charmap
/* case 0x67: //g
rxbyte = 0xE7;
break;
case 0x6A: //j
rxbyte = 0xEA;
break;
case 0x70: //p
rxbyte = 0xF0;
break;
case 0x71: //q
rxbyte = 0xF1;
break;
case 0x79: //y
rxbyte = 0xF9;
break;
*/ case 0xE4: //ASCII "a" umlaut
rxbyte = 0xE1;
break;
case 0xF1: //ASCII "n" tilde
rxbyte = 0xEE;
break;
case 0xF6: //ASCII "o" umlaut
rxbyte = 0xEF; //was wrong in v0.86
break;
case 0xFC: //ASCII "u" umlaut
rxbyte = 0xF5;
break;
//accented -> plain equivalent
//and misc symbol translation
case 0xA3: //sterling (pounds)
rxbyte = 0xED;
break;
/* case 0xB0: //degrees symbol
rxbyte = 0xDF;
break;
*/ case 0xB5: //mu
rxbyte = 0xE4;
break;
case 0xC0: //"A" variants
case 0xC1:
case 0xC2:
case 0xC3:
case 0xC4:
case 0xC5:
rxbyte = 0x41;
break;
case 0xC8: //"E" variants
case 0xC9:
case 0xCA:
case 0xCB:
rxbyte = 0x45;
break;
case 0xCC: //"I" variants
case 0xCD:
case 0xCE:
case 0xCF:
rxbyte = 0x49;
break;
case 0xD1: //"N" tilde -> plain "N"
rxbyte = 0x43;
break;
case 0xD2: //"O" variants
case 0xD3:
case 0xD4:
case 0xD5:
case 0xD6:
case 0xD8:
rxbyte = 0x4F;
break;
case 0xD9: //"U" variants
case 0xDA:
case 0xDB:
case 0xDC:
rxbyte = 0x55;
break;
case 0xDD: //"Y" acute -> "Y"
rxbyte = 0x59;
break;
/* case 0xDF: //beta //mucks up LCDSmartie's degree symbol??
rxbyte = 0xE2;
break;
*/ case 0xE0: //"a" variants except umlaut
case 0xE1:
case 0xE2:
case 0xE3:
case 0xE5:
rxbyte = 0x61;
break;
case 0xE7: //"c" cedilla -> "c"
rxbyte = 0x63;
break;
case 0xE8: //"e" variants
case 0xE9:
case 0xEA:
case 0xEB:
rxbyte = 0x65;
break;
case 0xEC: //"i" variants
case 0xED:
case 0xEE:
case 0xEF:
rxbyte = 0x69;
break;
case 0xF2: //"o" variants except umlaut
case 0xF3:
case 0xF4:
case 0xF5:
case 0xF8:
rxbyte = 0x6F;
break;
case 0xF7: //division symbol
rxbyte = 0xFD;
break;
case 0xF9: //"u" variants except umlaut
case 0xFA:
case 0xFB:
rxbyte = 0x75;
break;
default:
break;
}
if (rxbyte2 == 254){
lcd.print(rxbyte); //otherwise a plain char so we print it to lcd
}
}
}
// A função shiftOut (o coração do programa)
// Mais informações sobre o ShiftOut em:
// http://www.arduino.cc/en/Tutorial/ShiftOut
void shiftOut(int myDataPin, int myClockPin, byte myDataOut) {
int i=0;
int pinState;
pinMode(myClockPin, OUTPUT);
pinMode(myDataPin, OUTPUT);
digitalWrite(myDataPin, 0);
digitalWrite(myClockPin, 0);
for (i=7; i>=0; i--) {
digitalWrite(myClockPin, 0);
if ( myDataOut & (1<<i) ) {
pinState= 1;
}
else {
pinState= 0;
}
digitalWrite(myDataPin, pinState);
digitalWrite(myClockPin, 1);
digitalWrite(myDataPin, 0);
}
digitalWrite(myClockPin, 0);
return;
}
Testei voltar às origens e programar o Arduino com o código original http://www.nuelectronics.com/estore/?p=9 (http://www.nuelectronics.com/estore/?p=9) mas acontece o mesmo, ou é defeito ou feitio :-\
-
Se calhar é o que o LCD Smartie envia quando desliga. E depois como não recebes mais nada, fica assim...
-
Se calhar é o que o LCD Smartie envia quando desliga. E depois como não recebes mais nada, fica assim...
Não.. pq se iniciar o Arduino sem ligar o LCD Smartie ou o Serial Monitor (do software do arduino) ele faz o mesmo.. :o Mas para o arranque consegui resolver colocando uma variável, mas para qdo desligo o LcdSmartie é que não..
enfim.. vou ter que viver com os "6" :P
-
Se calhar é o que o LCD Smartie envia quando desliga. E depois como não recebes mais nada, fica assim...
Não.. pq se iniciar o Arduino sem ligar o LCD Smartie ou o Serial Monitor (do software do arduino) ele faz o mesmo.. :o Mas para o arranque consegui resolver colocando uma variável, mas para qdo desligo o LcdSmartie é que não..
enfim.. vou ter que viver com os "6" :P
Podes definir um tempo máximo para receber coisas do LCDSmartie. Passado X tempo se não receberes nada, limpas o LCD com o Arduino.
-
microbyte enviei um mail para ti mas faz mais sentido colocar aqui no fórum ::) sorry.
A minha dúvida de agora é em tentar perceber pq aumenta 1 grau ao alterar o código no Loop da temperatura.
Tenho um botão que liga\desliga os displays de segmentos, mas pretendo que o cálculo da variável tempc continue a ser feito mesmo qdo estão off.
O código que tenho é este:
void loop() {
buttonState3 = digitalRead(botao3);
if (buttonState3 == HIGH) { //tudo OK com esta parte
unsigned long currentMillis = millis();
if(currentMillis - previousMillis > interval) {
previousMillis = currentMillis;
nleituras++;
// Se atingimos o maximo de leituras que queremos
if(nleituras == maxLeituras){
nleituras = 0; // recomecamos no proximo ciclo
// vamos calcular a media
for(i = 0; i<=9; i++){
samples[i] = ( 5.0 * analogRead(sensorPin) * 100.0) / 1024.0;
tempc = tempc + samples[i];
}
tempc = tempc/10.0; // Calcula-se a média
//Serial.println(tempc);
// para mostrar nos displays de 7 segmentos...
// Calcula-se o dígito da esquerda e da direita
int num1 = 0;
do{
num1++;
tempc = tempc - 10;
}while(tempc >= 10);
dataEsq = esq[num1];
dataDir = dir[tempc];
// Enquanto estivermos a transmitir, o pino "latch" tem de estar a LOW
digitalWrite(latchPin, 0);
// Enviar os bytes
shiftOut(dataPin, clockPin, dataDir);
shiftOut(dataPin, clockPin, dataEsq);
// Voltamos a por o pino "latch" do CI a HIGH para lhe indicar que já acabámos
// de transmitir os dados
digitalWrite(latchPin, 1);
}
}
}
if (buttonState3 == LOW) { // O problema é nesta parte
unsigned long currentMillis = millis();
if(currentMillis - previousMillis > interval) {
previousMillis = currentMillis;
nleituras++;
// Se atingimos o maximo de leituras que queremos
if(nleituras == maxLeituras){
nleituras = 0; // recomecamos no proximo ciclo
// vamos calcular a media
for(i = 0; i<=9; i++){
samples[i] = ( 5.0 * analogRead(sensorPin) * 100.0) / 1024.0;
tempc = tempc + samples[i];
}
tempc = tempc/10.0; // Calcula-se a média
Serial.println(tempc);
// para mostrar nos displays de 7 segmentos...
// Calcula-se o dígito da esquerda e da direita
int num1 = 0;
do{
num1++;
tempc = tempc - 10;
}while(tempc >= 10);
dataEsq = esq[num1];
dataDir = dir[tempc];
// Enquanto estivermos a transmitir, o pino "latch" tem de estar a LOW
digitalWrite(latchPin, 0);
// Enviar os bytes
shiftOut(dataPin, clockPin, dataDir);
shiftOut(dataPin, clockPin, dataEsq);
// Voltamos a por o pino "latch" do CI a HIGH para lhe indicar que já acabámos
// de transmitir os dados
digitalWrite(latchPin, 1);
}
}
}
Testei duas coisas, remover o envio para os Segmentos qdo o botão está LOW e deixar apenas o cálculo da variável tempc, ele aumenta 1 grau em relação ao código do ciclo anterior (de qdo o botão está HIGH).
Depois para desligar mesmo os displays de segmentos testei adicionar as seguintes linhas no binário definido anteriormente:
esq[10]= B11111111; //OFF
dir[10]= B11111111; //OFF
e apenas alterei no ciclo LOW os valores enviados para a função ShiftOut (dataEsq = esq[10]; e dataDir = dir[10];):
if (buttonState3 == LOW) {
unsigned long currentMillis = millis();
if(currentMillis - previousMillis > interval) {
previousMillis = currentMillis;
nleituras++;
// Se atingimos o maximo de leituras que queremos
if(nleituras == maxLeituras){
nleituras = 0; // recomecamos no proximo ciclo
// vamos calcular a media
for(i = 0; i<=9; i++){
samples[i] = ( 5.0 * analogRead(sensorPin) * 100.0) / 1024.0;
tempc = tempc + samples[i];
}
tempc = tempc/10.0; // Calcula-se a média
Serial.println(tempc);
// para mostrar nos displays de 7 segmentos...
// Calcula-se o dígito da esquerda e da direita
int num1 = 0;
do{
num1++;
tempc = tempc - 10;
}while(tempc >= 10);
dataEsq = esq[10];
dataDir = dir[10];
// Enquanto estivermos a transmitir, o pino "latch" tem de estar a LOW
digitalWrite(latchPin, 0);
// Enviar os bytes
shiftOut(dataPin, clockPin, dataDir);
shiftOut(dataPin, clockPin, dataEsq);
// Voltamos a por o pino "latch" do CI a HIGH para lhe indicar que já acabámos
// de transmitir os dados
digitalWrite(latchPin, 1);
}
}
}
Desta forma resulta, os segmentos ficam OFF tal como queria, mas aumenta também 1 grau ao valor calculado para tempc :)
O Cálculo da variável tempc é influenciado por esta parte do código de envio para os segmentos?
-
:o ena apercebi-me de uma coisa relativamente à diferença de 1 grau
Na placa tenho um dip switch de 4, os 3 primeiros estão ligados a Pinos analógicos do arduino (inclusivé o que Liga\Desliga os displays de segmentos) e o último serve mesmo de interruptor para o backlight do Lcd 16x2.
Reparei que ao ligar ou desligar os 3 botões, altera o valor da temperatura, por exemplo, tenho 26º se ligar o backlight do Lcd ele aumenta para 27º :D há coisas incríveis :) Por algum motivo deve interferir com a sensibilidade do LM35 e altera.. mas pronto. Os 3 botões do Dip-Switch liguei segundo este esquema http://webzone.k3.mah.se/projects/arduino-workshop/projects/arduino_meets_processing/instructions/8switches.html (http://webzone.k3.mah.se/projects/arduino-workshop/projects/arduino_meets_processing/instructions/8switches.html) por isso penso que está correcto.
Enfim.. vou prosseguir para outra tarefa.
-
Relativamente à alteração do valor calculado para a temperatura sempre que ligo/desligo os botões ou mexo um potênciometro alguém disse para fazer isto:
"colocar um resistor "pulldown" de 10k entre o fio que vem do sensor para a arduino e o terra"
Vou testar a ver se resolve! :P
-
Bom.. acho que vou desistir desta ideia de ter todos os circuitos/projectos na mesma placa e ao mesmo tempo..
Os valores obtidos do LM35 já estavam a oscilar se ligar ou desligar os botões ou o Backlight do Lcd, mas não era muito grave, apenas 1 ou 2 graus.
Ontem testei ligar as Fans e introduzir no Loop o envio do valor PWM conforme a temperatura e com as ventoinhas ligadas passa de uns 28º para uns 40º :'( se deixar apenas uma das duas Fans ligadas é capaz de ficar nos 36/38º...
Testei com 1 fonte 12v 500ma e 2A, com um regulador de tensão envio apenas 5v para o arduino e ligo directamente os V+ do circuito das Fans aos 12v, os GRND do circuito das Fans estou a ligar ao GRND do arduino.
e qdo ligo as fans à placa parece que "roubam" corrente e interferem com o restante circuito, tenho 2 LEDs verdes e ficam logo mais apagados qdo as ligo. Não sei se tem a ver com esta ligação GRND.. num percebo! dam
-
esperimenta usar outro termometro, tipo DS1820, há um one-wire, mas é digital, ao contrário do que usas, que é analogico, penso que com o DS1820 não terás temperaturas malucas, e se tiveres na mesma não perdes nada...
Ou então fazes como foi falado no electronica pt, tiras montes de temperaturas, e fazes a média, uma temperatura alta, ou baixa demais será quase anulada pelas temperaturas certas.
Não estive a seguir este tópico a 100% por isso se falei em algo que já foi falado, peço desculpa.
-
esperimanta usar outro termometro, tipo DS1820, á um one-wire, mas é digital, ao contrário do que usas, que é analogico, penso que com o DS1820 não terás temperaturas malucas, e se tiveres na mesma não perdes nada...
Ou então fazes como foi falado no electronica pt, tiras montes de temperaturas, e fazes a média, uma temperatura alta, ou baixa demais será quase anulada pelas temperaturas certas.
Não estive a seguir este tópico a 100% por isso se falei em algo que já foi falado, peço desculpa.
vou tentar tirar mais samples de temperaturas... qto ao sensor, por acaso comprei o DS18B20 mas ainda não chegou a casa! mas depois vou testar com ele tb
-
Então a fonte é 500mA ou 2A?
O problema que tu tens é falta de corrente e provavelmente má distruibuição de massa, e interferencias entre sinais com fartura.
Se os led's quase que se apagam é garantido que estás com falta de corrente e admira-me o atmega ainda não ter começado a fazer resets por falta de energia.
-
Então a fonte é 500mA ou 2A?
O problema que tu tens é falta de corrente e provavelmente má distruibuição de massa, e interferencias entre sinais com fartura.
Se os led's quase que se apagam é garantido que estás com falta de corrente e admira-me o atmega ainda não ter começado a fazer resets por falta de energia.
Testei com ambas..
O melhor é fazer tudo de novo numa breadboard a ver o resultado.. :-\
-
Uma breadboard não será melhor, pode ser até pior.
Experimenta com a fonte do pc, porque 2A com 4 ventoinhas, atmega, sensores, led's, resistencias, lcd's e não sei que mais é pouco.
-
Uma breadboard não será melhor, pode ser até pior.
Experimenta com a fonte do pc, porque 2A com 4 ventoinhas, atmega, sensores, led's, resistencias, lcd's e não sei que mais é pouco.
Testei com uma fonte do PC: Vídeo Lm35+Fans (http://www.youtube.com/watch?v=igX59LlsfJU#)
Reparei tb que ao desligar/ligar o cabo USB tb faz variar o LM35 :o será que tenho de dar mais que 5v ao Arduino? Liguei os 12v apenas para o + das Fans e o Arduino ficou com 5v
-
Isso tens de ter ai algo mal ligado, ou então precisas de uns condensadores de decoupling maiores no arduino e tambem meter um condensador ou um pequeno filtro LC no pino Aref.
-
Isso tens de ter ai algo mal ligado, ou então precisas de uns condensadores de decoupling maiores no arduino e tambem meter um condensador ou um pequeno filtro LC no pino Aref.
Eu testei antes disto meter 1 condensador de 100uf nos pinos de alimentação de cada Fan.. só se testar com outros maiores!
Como não sou grande expert não sei como resolver, mas possivelmente é como dizes, algo pode estar mal ligado ou não deveria estar ligado desta forma..
-
Bom.. como não gosto muito de desistir das coisas, antes de fazer várias tentativas, vou ligar novamente circuito a circuito em breadboard e ver quando é que começou a ter problemas.
Desta forma vou abandonar aquele circuito (http://www.uchobby.com/index.php/2007/09/23/arduino-temperature-controlled-pc-fan/#more-70)para controlar as Fans e acho que vou antes fazer este:
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg695.imageshack.us%2Fimg695%2F4291%2Ftip120.th.jpg&hash=53a648460f8272d18d45aac3c8e213289bbeed41) (http://img695.imageshack.us/i/tip120.jpg/)
Altero só o Diodo e meto nos dois polos das Fans e consigo ter até 5A ;D pode ser que corra bem.. amanhã já vou ver dos TIP120
-
Boas noites, eu infelizmente não gosto de fazer isto mas vai ter de ser( no meu ponto de vista) nunca mas nunca se desiste o max que se pode fazer é adiar mas agora desistir é mesmo radical mas continua abraços ;)
-
Pega no teu circuito montado, faz um diagrama do circuito a apartir dele e coloca-o aqui para a gente ver. Isto vai dar para a gente ver como está exactamente o teu circuito e também vai servir para tu próprio fazeres uma revisão de todas as ligações.
Repara que é super importante investires o tempo que for preciso a pôr isso a funcionar, pois vais sem dúvida aprender imenso... eu "no meu tempo" desistia imenso, mas também não tinha ninguém a quem fazer perguntas! Hoje em dia com a Net só mesmo os fracos é que desistem :)
Já experimentaste esta técnica? O "AVR core" é o arduino.
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg256.imageshack.us%2Fimg256%2F3703%2Fstablemicropower.png&hash=503d2e31848f9a476f7861ed808a5eff4bdff5d9)
Deve servir pelo menos para teres o Arduino sempre a funcionar sem interferências. Deverias usar um diodo schotkky para isto, mas só para experimentar um díodo normal (1N4148) também serve.
Se puderes mete o LM também a seguir ao diodo (se ele funcionar com 4.5V, agora de cor não sei).
Quando às ventoínhas de PC... sinceramente não sei se podes fazer PWM com elas, porque elas já têm electrónica lá dentro e não sei se a electrónica se vai portar bem com PWM. Se tens PWM activo a controlar alguma coisa, desliga-o e faz os teus testes.
Já agora.... tens as massas bem ligadas (a dos 5V com a dos 12V)?
-
Boas mais uma vez segue o conselho do Njay e assim tanto aprendes como ajudas a aprender ( ajudas membros como eu que estão no inicio e toda a info é pouca) como ele próprio diz "eu "no meu tempo" desistia imenso, mas também não tinha ninguém a quem fazer perguntas! Hoje em dia com a Net só mesmo os fracos é que desistem .." por ex: no meu caso eu tenho um projecto do I-Droid não desisti so esta parado ate perceber o que lhe tenho de fazer abraços e força nisso conta com o meu apoio
Abraços e boa continuação ;)
-
Se for fonte de pc as massas já estão ligadas, aliás só existe uma.
Pois, regra geral pwm com ventoinhas até funciona mais ou menos, mas depende das ventoinhas, as vezes com um filtro rc fica bom, outras vezes nem assim.
Isso cheira-me a problema de ligações e tal, se já tens quase tudo funcional, perde ai mais um bocadinho para isso ficar perfeito.
-
Obrigado!
Neste momento vou iniciar os testes pouco a pouco e implementando circuito a circuito..
Vou começar pela parte de controlar as ventoinhas, usei um TIP122:
http://www.youtube.com/watch?v=j8Axa2Mbc4o# (http://www.youtube.com/watch?v=j8Axa2Mbc4o#)
Esquema:
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg227.imageshack.us%2Fimg227%2F4747%2Ftip122fan.th.png&hash=996ba6c7d3fad7e2f930fe8106393526c0619505) (http://img227.imageshack.us/i/tip122fan.png/)
Enquanto com o esquema antigo o BD137 aquecia, este não aquece e funciona lindamente (até agora). :)
-
Bom cá está o chato outra vez ;)
Estou a montar tudo de nova em breadboard, já tenho 3Fans a funcionar com o esquema acima e adicionei mais uns botões, potenciometro e o LM35 para controlar a temperatura.
Ao contrário da placa que fiz no inicio deste tópico, o valor obtido do LM35 já não oscila qdo ligo/desligo as ventoinhas ;D mas.. há sempre um mas... ::)
Estou a alimentar tudo da mesma "molex" de uma fonte Atx, os 5v vão para o arduino e Lm35, os 12v vão para as Fans e as massas estão unidas:
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg411.imageshack.us%2Fimg411%2F2756%2Flm35001.th.png&hash=b3ad5aa9813fb5e0f36b6e4d15f7fcbec5fe5810) (http://img411.imageshack.us/i/lm35001.png/)
Agora a oscilação de +/- 2 a 3 graus é quando desligo ou ligo o cabo USB no arduino... faz algum sentido? Qdo está ligado (pq preciso de receber info via serial) baixa, qdo desligo e fica só alimentado com a fonte externa aumenta.. :o
-
Se meteres um multimetro na linha dos 5v do molex e na linha de 5v do arduino vais ver que nenhum deles está exactamente a 5v, e o mais certo é o usb estar um pouco abaixo dos 5v, ai na casa dos 4.8 ou 4.9v e os 5v do molex devem estar a uns 5.1 ou 5.2v
-
Se meteres um multimetro na linha dos 5v do molex e na linha de 5v do arduino vais ver que nenhum deles está exactamente a 5v, e o mais certo é o usb estar um pouco abaixo dos 5v, ai na casa dos 4.8 ou 4.9v e os 5v do molex devem estar a uns 5.1 ou 5.2v
Eu já testei alimentar o LM35 através de um regulador de tensão 5v, mas não resultou.. secalhar vou deixar assim..já vi que o LM35 é um circuito muito sensível
P..S. Qdo ligo o USB eu continuo a deixar ligada a fonte 5v externa.. supostamente o arduino continua a alimentar-se por ela e não pelo Usb
-
Ok, uma vez que todo o circuito vai buscar directamente corrente à fonte ATX, nem preciso de ter o Arduino ligado à fonte externa (e aos 5v), basta-me alimentá-lo pelo USB e ligar o GRND do arduino aos GRND da fonte certo? :P
-
Se a fonte faz parte do pc onde estás a ligar o usb as massas já são partilhadas e adicionar outra ligação pode criar um loop de massas.
-
Bom.. estive a tentar estabilizar o sensor de temperatura e consegui usando um DS18B20 ;D e ligando ou desligando botões e ventoinhas ele não altera os valores! Porreiro!
-
Update de hoje!
O Software que me vai permitir obter e configurar os valores de rotação a associar às ventoinhas (conforme a temperatura) está feito:
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg823.imageshack.us%2Fimg823%2F5327%2Ffancontroller.th.png&hash=1d73c77ece213fb9511889ce30c553d0316347c7) (http://img823.imageshack.us/i/fancontroller.png/)
- Liga-se ao Hardware (Arduino) escolhendo a COM e BaudRate
- Podemos, em tempo real, pedir o valor da temperatura e é apresentada no programa
- Podemos pedir os 11 valores (de 1 a 255) gravados na memória que correspondem à velocidade a atribuir às ventoinhas
- Podemos gravar novos valores na memória
- Podemos tb testar os valores seleccionados antes de os gravarmos, para ver o efeito que causa sem ser preciso gravar na memória
Tudo isto está já a funcionar juntamente com o Arduino, só me falta acabar a caixa que tou a fazer em acrílico e soldar uma placa com as ligações entre componentes.
Algumas fotos...
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg41.imageshack.us%2Fimg41%2F8089%2Fimg7707.th.png&hash=8e0a1f8cab062e04766c5f88aa9b88ee4f5fcfcf) (http://img41.imageshack.us/i/img7707.png/)
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg576.imageshack.us%2Fimg576%2F2450%2Fimg7708.th.png&hash=598103a8be408e38e00c3d90ec38f2b63753e428) (http://img576.imageshack.us/i/img7708.png/)
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg839.imageshack.us%2Fimg839%2F6392%2Fimg7709.th.png&hash=ae348e4f83058472717fd2370fd30bb849c95498) (http://img839.imageshack.us/i/img7709.png/)
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg814.imageshack.us%2Fimg814%2F3694%2Fimg7710.th.png&hash=0b351b3cc5194ac21a0bbca71b91abf67464eb69) (http://img814.imageshack.us/i/img7710.png/)
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg411.imageshack.us%2Fimg411%2F1359%2Fimg7711.th.png&hash=0cd5706843345a7a0815dff21b6ae9e8897b4980) (http://img411.imageshack.us/i/img7711.png/)
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg217.imageshack.us%2Fimg217%2F4881%2Fimg7712.th.png&hash=8fcb1f6ea3649f46fddcc858eeef8e402cc6216a) (http://img217.imageshack.us/i/img7712.png/)
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg39.imageshack.us%2Fimg39%2F1125%2Fimg7713.th.png&hash=39cfae4e35516ada426b7ae8339cd7c35e03322e) (http://img39.imageshack.us/i/img7713.png/)
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg412.imageshack.us%2Fimg412%2F7162%2Fimg7714.th.png&hash=911ecf481c3ddab0dd134f3496a1b98198f30cdd) (http://img412.imageshack.us/i/img7714.png/)
Falta passar isto tudo para a caixa que estou a fazer :)
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg810.imageshack.us%2Fimg810%2F2212%2Fimg7715.th.png&hash=be01b94d86773439fd2277062d19ad6aca059e8d) (http://img810.imageshack.us/i/img7715.png/)
-
;D No caso de alguém estar a ler isto
Apenas me falta criar a PCB final e colocar tudo na caixa que fiz em acrílico (c/ medidas de uma baía de 5.25).
Recapitulando o que faz a nível geral:
- Ao iniciar faz um diagnóstico aos componentes
- No 1º arranque aguarda 5 segundos ("Boot Waiting") se quiser estabelecer ligação ao Software no PC que fiz em VB, caso contrário prossegue com o aranque
- 2 botões, 1 para iniciar o modo de configuração onde podemos Desligar/Ligar os vários compoenentes [Fans, Displays, Lcd, Bezouro], 1 Botão escolhe o Modo o outro altera o Estado
O Software que desenvolvi para comunicar com o hardware (Arduino):
- Estabelece e testa a ligação com o Arduino
- Podemos Obter os valores PWM guardados na memória do Arduino (11 valores que estão associados a 11 diferenças de temperaturas de <10 até >60), isto para os 2 grupos de Fans (cada um com 4 fans)
- Podemos obter a temperatura actual do sensor
- podemos Ligar /Desligar o aviso sonoro (bezouro) e configurar uma temperatura máx. para a qual ele apita caso seja atingida
- Podemos tb definir o intervalo em segundos (que depois converte para milisegundos) para que seja lida a temperatura do sensor (pelo Arduino)
Frontend da aplicação:
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg203.imageshack.us%2Fimg203%2F8638%2F001jl.th.png&hash=7aecb8f929f6f828ea32610d66fc40ea7aa12358) (http://img203.imageshack.us/i/001jl.png/)
http://img203.imageshack.us/img203/8638/001jl.png (http://img203.imageshack.us/img203/8638/001jl.png)
VÍDEO de 10-09-2010 / Semi-Final: Fan Controller - Arduino (http://www.youtube.com/watch?v=KzCwqUPEYBw#)
-
Parabens, muito bom mesmo ;D
-
Imagens da placa "agregadora" dos componentes para interligar tudo com o Arduino, etc.:
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg829.imageshack.us%2Fimg829%2F581%2Fimg8308.th.png&hash=410c76c3117541234245787f76a8aa43e311c801) (http://img829.imageshack.us/i/img8308.png/)
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg822.imageshack.us%2Fimg822%2F4450%2Fimg8309.th.png&hash=deeea234e82b2697392c143019f820dd506c5d27) (http://img822.imageshack.us/i/img8309.png/)
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg215.imageshack.us%2Fimg215%2F1751%2Fimg8310.th.png&hash=be7e0b5868b63910fe9621ee2b6e2c9219dc6b49) (http://img215.imageshack.us/i/img8310.png/)
Caixa de acrílico preparada:
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg517.imageshack.us%2Fimg517%2F1997%2Fimg8312.th.png&hash=d4c0a3732fffd3c35a2848e8ae82e04c031e25c4) (http://img517.imageshack.us/i/img8312.png/)
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg801.imageshack.us%2Fimg801%2F130%2Fimg8313.th.png&hash=b11dcff6d479de834d5eff8904fcdb9b52857135) (http://img801.imageshack.us/i/img8313.png/)
Exemplo do aspecto final:
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg84.imageshack.us%2Fimg84%2F6984%2Fimg8314.th.png&hash=6f2085ac6c0a42a417a9525ce097f0ded60f6d5b) (http://img84.imageshack.us/i/img8314.png/)
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg265.imageshack.us%2Fimg265%2F3541%2Fimg8315.th.png&hash=3514ce5b0bf1d9adbfb5a1609f108c0d2b87db47) (http://img265.imageshack.us/i/img8315.png/)
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg529.imageshack.us%2Fimg529%2F2789%2Fimg8316.th.png&hash=cd16546a2f9282c6b159cb03575f35f64064c623) (http://img529.imageshack.us/i/img8316.png/)
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg20.imageshack.us%2Fimg20%2F6712%2Fimg8317.th.png&hash=1f05eeb413af0c4825a88f9c80a1e6b4ce2fe72d) (http://img20.imageshack.us/i/img8317.png/)
-
awesome :D
-
Muito bom aspecto!
As minhas incursões no acrilico deram sempre maus resultados... mas o teu trabalho está fantástico :)
-
Bom.. está mesmo quase concluído e ainda preciso de uma ajudinha com a parte dos displays de segmentos ;D
Eu para não estar sempre a enviar instruções ao Shift Register 74HC595, envio apenas quando o valor lido da temperatura do sensor é diferente do valor que está no momento nos displays.. mas passado um tempinho (se a temperatura for sempre a mesma e não se enviar nada) parece que os displays ficam malucos e começam a mostrar coisas ao calhas até existir uma actualização de temperatura.. será normal?
Tenho de estar sempre a enviar a instrução com o valor actual ou é algo diferente que me ultrapassa?
Ex.:
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg831.imageshack.us%2Fimg831%2F4007%2Fimg8440.th.png&hash=40740db9b0ff5cae2bd14a078fdc34d324d74327) (http://img831.imageshack.us/i/img8440.png/)
-
Tens a certeza que nada de nada está a interferir no sinal de clock ou de latch dos shift registers?
Os displays têm todos resistências para limitar a corrente?
-
Têm uma resistência ligada ao pino 3, pois é o único pino positivo de cada que ligo aos 5v, os restantes ligam directamente ao shift register..
No código não tenho nada a interferir, é estranho.. mas vou dividir o código todo aos bocados e ir testando pouco a pouco.. é parvo pq posso estar 10 minutos e está tudo Ok como pode tb começar logo a variar!
P.s.: Fiz o upload de um bocado de código:
int tempc2 =0;
// SEGMENTOS
//Pin ST_CP (latch) do CI 74HC595
int latchPin = 3;
//Pin SH_CP (clock) do CI 74HC595
int clockPin = 2;
//Pin de dados do CI 74HC595
int dataPin = 12;
//variáveis que ficam com os dados que vão ser passados para o ShiftOut()
byte dataEsq;
byte dataDir;
byte esq[10];
byte dir[10];
void setup() { //SETUP
Serial.begin(19200);
pinMode(latchPin, OUTPUT);
esq[0] = B11000000;
esq[1] = B11111001;
esq[2] = B10100100;
esq[3] = B10110000;
esq[4] = B10011001;
esq[5] = B10010010;
esq[6] = B10000010;
esq[7] = B11111000;
esq[8] = B10000000;
esq[9] = B10011000;
// esq[10]= B11111111; //OFF
dir[0] = B11000000;
dir[1] = B11111001;
dir[2] = B10100100;
dir[3] = B10110000;
dir[4] = B10011001;
dir[5] = B10010010;
dir[6] = B10000010;
dir[7] = B11111000;
dir[8] = B10000000;
dir[9] = B10011000;
// dir[10]= B11111111; //OFF
//TESTAR displays de 7 segmentos: 0-9
for (int numCiclo=0; numCiclo < 10; numCiclo++){
dataEsq = esq[numCiclo];
dataDir = dir[numCiclo];
digitalWrite(latchPin, 0);
shiftOut(dataPin, clockPin, dataDir);
shiftOut(dataPin, clockPin, dataEsq);
digitalWrite(latchPin, 1);
delay(400);
if (numCiclo==9){
dataEsq = B11111111;
dataDir = B11111111;
digitalWrite(latchPin, 0);
shiftOut(dataPin, clockPin, dataDir);
shiftOut(dataPin, clockPin, dataEsq);
digitalWrite(latchPin, 1);
delay(200);
}
}
tempc2=23;
int num1 = 0;
do{
num1++;
tempc2 = tempc2 - 10;
}while(tempc2 >= 10);
dataEsq = esq[num1];
dataDir = dir[tempc2];
// para mostrar nos displays de 7 segmentos...
//Envia para o CI o valor da temperatura calculada
// Enquanto estivermos a transmitir, o pino "latch" tem de estar a LOW
digitalWrite(latchPin, 0);
// Enviar os bytes
shiftOut(dataPin, clockPin, dataDir);
shiftOut(dataPin, clockPin, dataEsq);
// Voltamos a por o pino "latch" do CI a HIGH para lhe indicar que já acabámos
// de transmitir os dados
digitalWrite(latchPin, 1);
}
void loop()
{
}
void shiftOut(int myDataPin, int myClockPin, byte myDataOut) {
int i=0;
int pinState;
pinMode(myClockPin, OUTPUT);
pinMode(myDataPin, OUTPUT);
digitalWrite(myDataPin, 0);
digitalWrite(myClockPin, 0);
for (i=7; i>=0; i--) {
digitalWrite(myClockPin, 0);
if ( myDataOut & (1<<i) ) {
pinState= 1;
}
else {
pinState= 0;
}
digitalWrite(myDataPin, pinState);
digitalWrite(myClockPin, 1);
digitalWrite(myDataPin, 0);
}
digitalWrite(myClockPin, 0);
return;
}
e apenas fazendo isso, não colocando nada no Loop, enviando apenas "23" no Setup ele tb se "Passa", os displays começaram a variar passado um tempo..
sendo assim é algo nas ligações ::) raios! confirmei tudo 2x e estava tdo bem ligado.. será algum mau contacto entre os pinos dos segmentos? foi a única coisa que me deu luta mas consegui encaixá-los bem.. (tanto que no teste inicial os digitios de 0 a 9 aparecem todos bem)
-
Devias limitar a corrente em cada pino e não no comum, assim a intensidade varia consoante o numero de segmentos ligados.
Que resistencia estás a usar?
Não tens os displays soldados, só encaixados em sockets?
Mesmo assim não deviam fazer mau contacto, tens de ir investigar isso..
-
Ok, investiguei!
Meti os displays numa breadboard e de facto já estão bem ::) por algum motivo devia de estar a fazer algum mau contacto e fazia isto.. não faço ideia! De qualquer maneira vou deixar isto ligado toda a noite a ver se falham
[]
-
Pode ser algum fio entre os shift registers e os displays na tua placa.
-
Bom, alterei o encaixe dos Segmentos e deixei ligado 24h e tão bem, deverá estar resolvido :D o sensor tb me parece estar fixe..
Resultado: http://www.youtube.com/watch?v=kJ9JyoF3bBk
-
Hey, fantástico trabalho! Aposto que te estás a sentir mesmo bem com aquilo que atingiste, e que aprendeste imenso e ganhaste vontade de ir mais longe. Parabéns :D!
-
Estou a gostar bastante! :)
No meu caso, preferi controlar tudo por software (aka windows) deixando o arduino controlar o resto, mas a solução dos botões pode ser útil também :)
Parabens ;)
-
Pode ser algum fio entre os shift registers e os displays na tua placa.
Ainda este assunto, reparei agora numa coisa e a causa desta situação dos segmentos, isto apenas acontece quando ligo apenas o Arduino ao USB (alimentado pela USB dum computador) e ligo os restantes componentes (incluindo os segmentos e shift registers) a uma fonte diferente (neste caso uma ATX que tenho aqui a servir de fonte de bancada), eu tenho as massas ligadas (o - do Arduino ligado com o - desta fonte), mas não sei pq acontece aquilo com os segmentos..
De qualquer forma só liguei desta forma para ser mais fácil testar isto, pois o objectivo é tudo ser alimentado da mesma fonte, e fazendo isso este problema já não ocorre!
-
;D ;D ;D ;D ;D ;D ;D
Tchan Ran:
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg830.imageshack.us%2Fimg830%2F2096%2Fimg8561.th.png&hash=d71430d415ff233c44b23988222e9f50a91ce3ad) (http://img830.imageshack.us/i/img8561.png/)
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg823.imageshack.us%2Fimg823%2F7417%2Fimg8563.th.png&hash=d440b7833ccfe17385b247849d08e94ed2fd8815) (http://img823.imageshack.us/i/img8563.png/)
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg525.imageshack.us%2Fimg525%2F1982%2Fimg8564.th.png&hash=6efb679783a7ba98be36d6ee43c6da1a93d64cef) (http://img525.imageshack.us/i/img8564.png/)
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg35.imageshack.us%2Fimg35%2F3426%2Fimg8565.th.png&hash=1a080c6d8eff9456a68e9cb90c99156698e3f801) (http://img35.imageshack.us/i/img8565.png/)
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg176.imageshack.us%2Fimg176%2F7180%2Fimg8566.th.png&hash=f8034b801046d9ac898491a0bdb8fcd54e568649) (http://img176.imageshack.us/i/img8566.png/)
Vídeo:
FanController in a PC Case (http://www.youtube.com/watch?v=gon4R5OdoNc#)
-
boas,
penso que o projecto esteja acabado, por isso para o pessoal que comece a ler o post de inicio, podias por todas as imagens e vídeos no 1º tópico.
cump
-
bem visto, qdo tiver um tempinho ja faço isso! 8)
-
já, dou-te os parabens pelo projecto esta com bom aspecto,
já agora que tipo de material tens á frente do lcd para n se ver nd lá atrás?
-
já, dou-te os parabens pelo projecto esta com bom aspecto,
já agora que tipo de material tens á frente do lcd para n se ver nd lá atrás?
é também acrílico só que mais escuro, o objectivo é apenas ver o segmentos e o lcd qdo estão ligados :)
-
Para quem está a ler isto, pode ir ao 1º post que tem lá tudo resumido :) Post actualizado.
-
já, dou-te os parabens pelo projecto esta com bom aspecto,
já agora que tipo de material tens á frente do lcd para n se ver nd lá atrás?
é também acrílico só que mais escuro, o objectivo é apenas ver o segmentos e o lcd qdo estão ligados :)
sim é essa a minha ideia :P
vamos lá ver é se encontro isso em lojas perto da minha casa
-
já, dou-te os parabens pelo projecto esta com bom aspecto,
já agora que tipo de material tens á frente do lcd para n se ver nd lá atrás?
é também acrílico só que mais escuro, o objectivo é apenas ver o segmentos e o lcd qdo estão ligados :)
sim é essa a minha ideia :P
vamos lá ver é se encontro isso em lojas perto da minha casa
Ao pé da minha casa tb tinha mas comprei em Lisboa na Dimofel. 8)
-
Akis e companhia costumam ter alguns tipos de acrilico.
-
Para quem está a ler isto, pode ir ao 1º post que tem lá tudo resumido :) Post actualizado.
O projecto está excelente, e com tudo descrito no primeiro post, não se desiste de ler.