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

Título: Projecto FanController
Enviado 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:

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:

Software:

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#)

Título: Re: Projecto FanController
Enviado por: Fifas em 09 de Junho de 2010, 23:37
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?
Título: Re: Projecto FanController
Enviado por: AcidDagger em 10 de Junho de 2010, 00:09
Acho que ja vi este rapaz noutro forum :P

Pessoal do modding é que é  ;D

Grande projecto :P
Título: Re: Projecto FanController
Enviado por: almamater em 10 de Junho de 2010, 01:01
 :) 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:

Código: [Seleccione]
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


Título: Re: Projecto FanController
Enviado por: Fifas em 10 de Junho de 2010, 01:54
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?
Título: Re: Projecto FanController
Enviado por: senso em 10 de Junho de 2010, 01:58
Pelo pedacinho de código que ele mostrou, um atmega168 ou 328 aka arduino.
Título: Re: Projecto FanController
Enviado por: Fifas em 10 de Junho de 2010, 02:00
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
Título: Re: Projecto FanController
Enviado por: senso em 10 de Junho de 2010, 02:40
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..
Título: Re: Projecto FanController
Enviado por: almamater em 10 de Junho de 2010, 11:26
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?  :-[
Título: Re: Projecto FanController
Enviado por: Fifas em 10 de Junho de 2010, 11:56
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
Título: Re: Projecto FanController
Enviado por: almamater em 10 de Junho de 2010, 12:03
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..  :( >:(
Título: Re: Projecto FanController
Enviado por: senso em 10 de Junho de 2010, 16:09
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.
Título: Re: Projecto FanController
Enviado por: Fifas em 10 de Junho de 2010, 22:26
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
Título: Re: Projecto FanController
Enviado por: almamater em 11 de Junho de 2010, 09:36
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".
Título: Re: Projecto FanController
Enviado por: microbyte em 11 de Junho de 2010, 10:00
Mas esse código que estás a usar, gera saídas para o display de 7 segmentos.
Tu estás a usá-los?
Título: Re: Projecto FanController
Enviado por: almamater em 11 de Junho de 2010, 10:03
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
Título: Re: Projecto FanController
Enviado por: microbyte em 11 de Junho de 2010, 10:07
Então posso perguntar para que é que queres pôr um delay no código?
Título: Re: Projecto FanController
Enviado por: almamater em 11 de Junho de 2010, 10:19
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:

Código: [Seleccione]
#
// 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):

Código: [Seleccione]
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
Título: Re: Projecto FanController
Enviado por: microbyte em 11 de Junho de 2010, 11:46
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:

Código: [Seleccione]
#
// 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):

Código: [Seleccione]
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:
Código: [Seleccione]
int nLeituras = 0;
int maxLeituras = 8;
int interval = 50;

E agora no loop metes assim:
Código: [Seleccione]
  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)  ;)
Título: Re: Projecto FanController
Enviado por: almamater em 11 de Junho de 2010, 11:49
Citar
Lol, caso ainda não tenhas reparado, eu sou o Ricardo...  :P

 ;D ;D Muito bom!! Nem tinha reparado/associado  :o

Citar
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:
Código: [Seleccione]
int nLeituras = 0;
int maxLeituras = 8;
int interval = 50;

E agora no loop metes assim:
Código: [Seleccione]
  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!
Título: Re: Projecto FanController
Enviado por: microbyte em 11 de Junho de 2010, 11:51
LOL.  ;D
Dá notícias!!  ;)
Título: Re: Projecto FanController
Enviado por: almamater em 11 de Junho de 2010, 20:18
LOL.  ;D
Dá notícias!!  ;)

Ena pá!!

Tive de alterar só uma pequena coisa.. estava a devolver valores de 10º ou 13º, ficou assim:

Código: [Seleccione]
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:
 
Código: [Seleccione]
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...!  ;)
Título: Re: Projecto FanController
Enviado por: microbyte em 11 de Junho de 2010, 20:21
LOL.  ;D
Dá notícias!!  ;)

Ena pá!!

Tive de alterar só uma pequena coisa.. estava a devolver valores de 10º ou 13º, ficou assim:

Código: [Seleccione]
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:
 
Código: [Seleccione]
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 ;)
Título: Re: Projecto FanController
Enviado por: almamater em 16 de Junho de 2010, 09:57
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..:
Código: [Seleccione]
//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] :

Quando está a receber info [programa LcdSmartie ON] :

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
Título: Re: Projecto FanController
Enviado por: microbyte em 16 de Junho de 2010, 10:27
O que deve acontecer é que ele pára na função "serial_getch()" porque tens lá um while...

Mete assim:
Código: [Seleccione]
if(Serial.available() > 0)
  rxbyte = serial_getch();

Assim, garantes que a função é executada apenas quando tens alguma coisa no buffer para ler...
Título: Re: Projecto FanController
Enviado por: almamater em 17 de Junho de 2010, 13:00
O que deve acontecer é que ele pára na função "serial_getch()" porque tens lá um while...

Mete assim:
Código: [Seleccione]
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

Código: [Seleccione]
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:

Código: [Seleccione]
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  >:(
Título: Re: Projecto FanController
Enviado por: microbyte em 17 de Junho de 2010, 15:44
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.
Título: Re: Projecto FanController
Enviado por: almamater em 17 de Junho de 2010, 22:37
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:

Código: [Seleccione]
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:

Código: [Seleccione]
//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;     
       
               }

Título: Re: Projecto FanController
Enviado por: almamater em 18 de Junho de 2010, 20:32
Bom, meti o código associado ao LCD todo dentro de duas "{" e parece que melhorou:

Código: [Seleccione]
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#)
Título: Re: Projecto FanController
Enviado por: almamater em 20 de Junho de 2010, 10:35
 :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

Código: [Seleccione]
//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  :-\
Título: Re: Projecto FanController
Enviado por: microbyte em 20 de Junho de 2010, 10:56
Se calhar é o que o LCD Smartie envia quando desliga. E depois como não recebes mais nada, fica assim...
Título: Re: Projecto FanController
Enviado por: almamater em 21 de Junho de 2010, 10:30
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
Título: Re: Projecto FanController
Enviado por: microbyte em 21 de Junho de 2010, 14:52
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.
Título: Re: Projecto FanController
Enviado por: almamater em 22 de Junho de 2010, 13:21
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:
Código: [Seleccione]
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:
Código: [Seleccione]
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];):
Código: [Seleccione]
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?
Título: Re: Projecto FanController
Enviado por: almamater em 23 de Junho de 2010, 22:31
 :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.
Título: Re: Projecto FanController
Enviado por: almamater em 28 de Junho de 2010, 14:49
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
Título: Re: Projecto FanController
Enviado por: almamater em 30 de Junho de 2010, 15:37
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
Título: Re: Projecto FanController
Enviado por: amando96 em 30 de Junho de 2010, 15:56
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.
Título: Re: Projecto FanController
Enviado por: almamater em 30 de Junho de 2010, 15:59
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
Título: Re: Projecto FanController
Enviado por: senso em 30 de Junho de 2010, 18:27
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.
Título: Re: Projecto FanController
Enviado por: almamater em 30 de Junho de 2010, 18:59
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..  :-\
Título: Re: Projecto FanController
Enviado por: senso em 30 de Junho de 2010, 19:32
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.
Título: Re: Projecto FanController
Enviado por: almamater em 01 de Julho de 2010, 00:21
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
Título: Re: Projecto FanController
Enviado por: senso em 01 de Julho de 2010, 00:46
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.
Título: Re: Projecto FanController
Enviado por: almamater em 01 de Julho de 2010, 09:02
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..
Título: Re: Projecto FanController
Enviado por: almamater em 04 de Julho de 2010, 22:22
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

Título: Re: Projecto FanController
Enviado por: LoneWolf em 04 de Julho de 2010, 23:10
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  ;)
Título: Re: Projecto FanController
Enviado por: Njay em 04 de Julho de 2010, 23:28
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)?
Título: Re: Projecto FanController
Enviado por: LoneWolf em 04 de Julho de 2010, 23:36
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  ;) 
Título: Re: Projecto FanController
Enviado por: senso em 04 de Julho de 2010, 23:38
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.
Título: Re: Projecto FanController
Enviado por: almamater em 05 de Julho de 2010, 19:46
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). :)

Título: Re: Projecto FanController
Enviado por: almamater em 07 de Julho de 2010, 19:54
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

Título: Re: Projecto FanController
Enviado por: senso em 07 de Julho de 2010, 20:00
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
Título: Re: Projecto FanController
Enviado por: almamater em 07 de Julho de 2010, 20:02
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
Título: Re: Projecto FanController
Enviado por: almamater em 07 de Julho de 2010, 22:53
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
Título: Re: Projecto FanController
Enviado por: senso em 07 de Julho de 2010, 23:24
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.
Título: Re: Projecto FanController
Enviado por: almamater em 29 de Julho de 2010, 23:10
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!

Título: Re: Projecto FanController
Enviado por: almamater em 10 de Agosto de 2010, 21:22
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/)


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/)
Título: Re: Projecto FanController
Enviado por: almamater em 10 de Setembro de 2010, 01:47
 ;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:


O Software que desenvolvi para comunicar com o hardware (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#)
Título: Re: Projecto FanController
Enviado por: AcidDagger em 10 de Setembro de 2010, 04:01
Parabens, muito bom mesmo  ;D
Título: Re: Projecto FanController
Enviado por: almamater em 21 de Setembro de 2010, 01:59
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/)
Título: Re: Projecto FanController
Enviado por: Fifas em 23 de Setembro de 2010, 10:30
awesome :D
Título: Re: Projecto FanController
Enviado por: Ricardo em 23 de Setembro de 2010, 11:19
Muito bom aspecto!

As minhas incursões no acrilico deram sempre maus resultados... mas o teu trabalho está fantástico :)


Título: Re: Projecto FanController
Enviado por: almamater em 08 de Outubro de 2010, 21:14
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/)




Título: Re: Projecto FanController
Enviado por: senso em 08 de Outubro de 2010, 21:42
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ítulo: Re: Projecto FanController
Enviado por: almamater em 08 de Outubro de 2010, 22:05
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:

Código: [Seleccione]
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)
Título: Re: Projecto FanController
Enviado por: senso em 08 de Outubro de 2010, 22:16
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..
Título: Re: Projecto FanController
Enviado por: almamater em 08 de Outubro de 2010, 22:54
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

[]
Título: Re: Projecto FanController
Enviado por: senso em 08 de Outubro de 2010, 23:27
Pode ser algum fio entre os shift registers e os displays na tua placa.
Título: Re: Projecto FanController
Enviado por: almamater em 11 de Outubro de 2010, 10:53
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
Título: Re: Projecto FanController
Enviado por: Njay em 11 de Outubro de 2010, 13:37
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!
Título: Re: Projecto FanController
Enviado por: Fifas em 12 de Outubro de 2010, 00:39
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 ;)

Título: Re: Projecto FanController
Enviado por: almamater em 12 de Outubro de 2010, 01:12
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!
Título: Re: Projecto FanController
Enviado por: almamater em 26 de Outubro de 2010, 22:26
 ;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#)
Título: Re: Projecto FanController
Enviado por: andre_f_carvalho em 28 de Outubro de 2010, 19:10
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
Título: Re: Projecto FanController
Enviado por: almamater em 28 de Outubro de 2010, 19:37
bem visto, qdo tiver um tempinho ja faço isso!  8)
Título: Re: Projecto FanController
Enviado por: andre_f_carvalho em 28 de Outubro de 2010, 23:42
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?
Título: Re: Projecto FanController
Enviado por: almamater em 29 de Outubro de 2010, 08:06
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 :)
Título: Re: Projecto FanController
Enviado por: almamater em 29 de Outubro de 2010, 14:11
Para quem está a ler isto, pode ir ao 1º post que tem lá tudo resumido :) Post actualizado.
Título: Re: Projecto FanController
Enviado por: andre_f_carvalho em 29 de Outubro de 2010, 16:14
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
Título: Re: Projecto FanController
Enviado por: almamater em 29 de Outubro de 2010, 16:20
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)
Título: Re: Projecto FanController
Enviado por: senso em 29 de Outubro de 2010, 16:27
Akis e companhia costumam ter alguns tipos de acrilico.
Título: Re: Projecto FanController
Enviado por: PDI em 29 de Outubro de 2010, 22:49
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.