LusoRobótica - Robótica em Português

Sistemas específicos => Arduino / AVR => Tópico iniciado por: ghostbuster em 21 de Julho de 2009, 15:52

Título: temporizador+lcd
Enviado por: ghostbuster em 21 de Julho de 2009, 15:52
pessoal alguem tem um tutú dum temporizador com o tal lcd que a gente tem...?, é que amanha chegam as lampadas para a insuladora e queria fazer uns testes como deve ser
Título: Re:temporizador+lcd
Enviado por: metRo_ em 21 de Julho de 2009, 18:59
Podes usar algum relógio, tens um tutorial aquilo no fórum.
Ou então usar a biblioteca MsTimer2 http://www.arduino.cc/playground/Main/MsTimer2 e crias uma variável que é incrementada de 1 em 1 segundo ou algo do género.
Título: Re:temporizador+lcd
Enviado por: ghostbuster em 22 de Julho de 2009, 01:00
bem eu juntei aos bocados o que achei pela net, e de nisto
Citar

#include <LiquidCrystal.h>
// LiquidCrystal display with:
// rs on pin 12
// rw on pin 11
// enable on pin 10
// d4, d5, d6, d7 on pins 5, 4, 3, 2
LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2);
void setup()
{
  // limpa o ecra
  lcd.clear();
  // setCursor(coluna [0-15], linha [0-1])
  lcd.setCursor(0,0);
  lcd.print("hello, world!"); 
  delay(2000);
}

void loop()
{
}
int ledPin = 8;int clock = 998;int hour = 10;
int min = 27;
int sec = 0;void setup() {
  Serial.begin(9600);
  pinMode(ledPin, OUTPUT);
}void loop() {
  delay(clock);

  sec = sec + 1;  // basic conditionals
  if (sec <= 20) {
    digitalWrite(ledPin, HIGH);
  }  if (sec > 20) {
    digitalWrite(ledPin, LOW);
  }

  /* if (min > 20 && min < 40) {
    digitalWrite(ledPin, HIGH);
  } else {
     digitalWrite(ledPin, LOW);
  } */

  // time keeping stuff
  if (sec > 59) {
    sec = 0;
    min = min + 1;
  }  if (min > 59) {
    min = 0;
    hour = hour + 1;
  }  if (hour > 23) {
    hour = 0;
  }
  lcd.setCursor(0,1);
  lcd.print(hour);
  lcd.print(":");
  lcd.print(min);
  lcd.print(":");
  lcd.print(sec);
  lcd.print("n");
}

mas da erro ao compilar
Título: Re:temporizador+lcd
Enviado por: TigPT em 22 de Julho de 2009, 01:28
Gabo o teu trabalho a meter as cores todas :D


Deve de rebentar logo aqui, pois fechas a função loop e de seguida começas a meter código que não está dentro de função nenhuma.
Código: [Seleccione]
void loop()
{
}
Isto para não dizer que tens duas vezes a função void loop() o que vai dar também erro pois o mesmo método não pode existir duas vezes declarado no código.
Título: Re:temporizador+lcd
Enviado por: ricardo-reis em 22 de Julho de 2009, 01:33
duas setup, duas loop, codigo fora das funções.. isso é mm capaz de rebentar por todo o lado..
Título: Re:temporizador+lcd
Enviado por: ghostbuster em 22 de Julho de 2009, 01:41
 ;D realmente nao reparei que haviam duas iguais, mas tambem é a primeira vez que trabalho com isto  a nao ser vb, enquanto as cores o ide arduino tem la uma opção copy for forum  ;) e mete as cores sozinho... e agora analizando melhor o codigo ele nem faz o que eu quero.., ou seja no lcd na linha de cima pode aparecer o hello world ou tanto faz que é so para testes :p e na linha de baixo quero so minutos:e segundos.. começa no zero, e cada vez que carrego num butão acrescente 10 segundos.., depois carrego start começa a fazer countdown e quando chegar a 0 segundos um digital passa para low.Um projecto igual ate ja existe feito mas o link esta down :-s
Título: Re:temporizador+lcd
Enviado por: TigPT em 22 de Julho de 2009, 01:54
A ideia é aprenderes? ou apresentares isso feito a alguém até uma determinada data? é que essa do existe feito por isso nem devia de me preocupar mt com isto n cabe na minha cabeça. Acho k as coisas já feitas só servem para as analisarmos, compreendermos outro tipo de abordagem às problemáticas e aprender com elas.

Se quiseres aprender, podes contar connosco, agora se quiseres algo chave na mão para copy past, certamente que haverá ai algum membro disposto a ganhar uns trocos.
Título: Re:temporizador+lcd
Enviado por: ricardo-reis em 22 de Julho de 2009, 02:00
explica melhor o k keres k isso faça.. e olha pró tutorial do tr3s sobre o ds1307.. bem trabalhado é um ponto de partida.. se precisares d'ajuda apita..
Título: Re:temporizador+lcd
Enviado por: msaleiro em 22 de Julho de 2009, 02:01
Segundo o que ele me disse no msn ele quer fazer um temporizador para uma sensibilizadora de PCBs que ele quer fazer para uso doméstico. Mas concordo contigo TigPT, quem não aprende vai andar sempre a depender do código e dos projectos dos outros :) Ele com o tempo aprende :)
Título: Re:temporizador+lcd
Enviado por: TigPT em 22 de Julho de 2009, 02:05
Aconselho-te a tentar perceber o mínimo de código Arduino antes de fazeres algo desta complexidade. Caso contrário, nunca vai deixar de ser magia.

Dá uma olhadela neste tópico que te vai dar algumas luzes:
http://lusorobotica.com/index.php/topic,22.0.html
Título: Re:temporizador+lcd
Enviado por: ghostbuster em 22 de Julho de 2009, 02:15
obrigado pelas luzes pessoal, afinal vou optar por uma coisa mais facil.. um temporizador em vb que quando chega a zero manda por exemplo o pino dtr da serial ligar ou desligar :), e amanha quando receber o cabo usb-serial vou tentar o lcd-ds1620  :)
Título: Re:temporizador+lcd
Enviado por: ricardo-reis em 22 de Julho de 2009, 02:18
eu amanhã a ver se posto praí a interacção entre ds1307 e o lcd.. já o tenho feitohá uns dias mas como o código tem mais coisas n postei pra n complicar..
Título: Re:temporizador+lcd
Enviado por: TigPT em 22 de Julho de 2009, 02:18
Ok, no entanto gostei da ideia e acho que a deves de desenvolver, é bastante interessante. Deves é de começar por coisas mais simples para entenderes o que estás a fazer. Só assim é que se aprende ok!?

Ninguém aprende a fazer somar a olhar para primitivas e integrais.
Título: Re:temporizador+lcd
Enviado por: ricardo-reis em 22 de Julho de 2009, 02:21
primitivas e integrais.. k redundância.. :P
Título: Re:temporizador+lcd
Enviado por: ghostbuster em 22 de Julho de 2009, 02:25
pois é que tipo "analista" ate me desenrasco, pois sei o que o arduino faz e o que k o codigo tem que fazer... e ja tenho um aninho de vb, agora falta é martelar o codigo do arduino
Título: Re:temporizador+lcd
Enviado por: amgcgoncalves em 22 de Julho de 2009, 02:36
Posso fazer um bocadinho de off-topic?

Não há redundância entre primitiva e integral. Apesar do senhor Barrow ter descoberto que através de um se pode calcular o outro (o integral de uma função entre dois pontos é a diferença das primitivas nesses pontos), ambos podem ter usos completamente isolados. Quanto mais não seja porque o integral é uma área enquanto que a primitiva de uma função é o seu estado de variação com abstracção um nível acima (por exemplo, o momento linear é a primitiva da força, pelas razões óbvias). A culpa desta ligação "errada" que é tão usual acaba por ser de alguns professores de Análise Matemática do ensino superior... :P

Quanto ao código do Arduino, até eu que sou estudante de Engenharia Informática e de Computadores preferi pegar do zero e perder umas horinhas a ler os references, bem como a estudar os tutorials mais básicos. Afinal de contas, haverá algo melhor que possuir o conhecimento desde a raíz? Bugs e bugs que se evita com este tipo de aprendizagem. É a minha opinião.
Título: Re:temporizador+lcd
Enviado por: ghostbuster em 24 de Julho de 2009, 02:48
ja consegui qualquer coisinha :p , é assim, o timer arranca com a hora que esta definida no codigo, o led do digital8 esta ligado nos primeiros 20 segundos, desliga 40, liga 20 e sempre assim.Agora ja é tarde mas amanha vou martelar o codigo e fazer uma interface para introduzir os dados..., ja agora alguem tem uma ideia de como faço countdown?
offtopic:
o meu breaduino ja bomba :D tem que se carregar upload e esperar 3 segundos e carregar no reset, por isso este é o meu segundo projecto visto que o lcd+ds1620 ja o pus a funcionar hoje

Citar

#include <LiquidCrystal.h>

// LiquidCrystal display with:
// rs on pin 12
// rw on pin 11
// enable on pin 10
// d4, d5, d6, d7 on pins 5, 4, 3, 2
LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2);

int ledPin = 8;int clock = 998;int hour = 10;
int min = 27;
int sec = 0;

void setup()
{
  Serial.begin(9600);
  pinMode(ledPin, OUTPUT);
}

void loop()
{
  delay(clock);

  sec = sec + 1;  // basic conditionals
  if (sec <= 20) {
    digitalWrite(ledPin, HIGH);
  }  if (sec > 20) {
    digitalWrite(ledPin, LOW);
  }

  /* if (min > 20 && min < 40) {
    digitalWrite(ledPin, HIGH);
  } else {
     digitalWrite(ledPin, LOW);
  } */

  // time keeping stuff
  if (sec > 59) {
    sec = 0;
    min = min + 1;
  }  if (min > 59) {
    min = 0;
    hour = hour + 1;
  }  if (hour > 23) {
    hour = 0;
  } 
  lcd.setCursor(0,0);
  lcd.print(hour);
  lcd.print(":");
  lcd.print(min);
  lcd.print(":");
  lcd.print(sec);
 

}




Título: Re:temporizador+lcd
Enviado por: ricardo-reis em 24 de Julho de 2009, 03:59
eu n tou mt certo acerca da possibilidade de usares o clock do arduino pra simular um rtc, mas podes mt bem pegar no tutorial do tr3s do arduino + ds1307 (ou esperar que eu poste a interacção do mesmo com o nosso lcd) e a partir daí tens mais de metade do trabalho feito.. :)
Título: Re:temporizador+lcd
Enviado por: TigPT em 24 de Julho de 2009, 10:55
Podes utilizar a função millis() no loop principal para contar tempo.

quando fazes
Código: [Seleccione]
x = millis();
x fica com o valor de milisegundos desde que o arduino foi ligado. Assim, basta guardar o primeiro valor e comparar como no exemplo:

Código: [Seleccione]
inicio = millis(); //quando queres começar a contar o tempo.
//delay = quanto tempo queres esperar;
if( millis() > inicio + delay){ //significa que já passou delay desde a afectação da variável inicio.
//bloco de código a fazer quando o tempo acaba.
}

Podes consultar mais sobre a função millis aqui:
http://arduino.cc/en/Reference/Millis
Título: Re:temporizador+lcd
Enviado por: ghostbuster em 24 de Julho de 2009, 16:02
ontem a noite resolvi fazer um novo codigo de novo e ja tinha 50% feito quando fui dormir, mas carreguei em save as e puf a merda do ide desapareceu e nao mo guardou  :-\ ah alguma possibilidade de tirar o sketch do arduino? tipo download em vez de upload
Título: Re:temporizador+lcd
Enviado por: TigPT em 24 de Julho de 2009, 16:37
Que conheça não, mesmo que desse ias tirar o hexa, depois terias que fazer reverse para código, esquece completamente essa possibilidade.
Título: Re:temporizador+lcd
Enviado por: ghostbuster em 24 de Julho de 2009, 17:12
Que conheça não, mesmo que desse ias tirar o hexa, depois terias que fazer reverse para código, esquece completamente essa possibilidade.
pois  :-[ eu agora vou começar a fazer um novo codigo, e depois se funcionar correctamente faço um keypad com uma tela touchscreen que tenho de um navegador gps e ja testei a bocado com o arduino e funcionou
Título: Re:temporizador+lcd
Enviado por: ghostbuster em 25 de Julho de 2009, 21:51
como é que faço para que quando carrego no butao adicione 10 segundos ao sec e para?
   buttonState = digitalRead(buttonPin);
   if (buttonState == HIGH ) { 
       
     // turn LED on:   
     digitalWrite(ledPin, HIGH);
     sec=sec+10;
     }
   
    else {
     // turn LED off:
     digitalWrite(ledPin, LOW);
     
   }

assim como esta acima, ele adiciona 10 segundos e mais 10 e mais 10 se eu manter o butao pressionado, eu quero que so adicione 10 segundos e mesmo que continue pressionado nao faça mais nada a nao ser que tire o dedo do butao e carregue outra vez
Título: Re:temporizador+lcd
Enviado por: tr3s em 25 de Julho de 2009, 23:19
Quando fazes upload ele guarda uma versao do código num ficheiro cpp na pasta do Skectch. Vai ver se tens lá alguma coisa... se entretanto ja fizeste alguma coisa nesse sketch entao podes esquecer :P
Título: Re:temporizador+lcd
Enviado por: metRo_ em 26 de Julho de 2009, 01:37
como é que faço para que quando carrego no butao adicione 10 segundos ao sec e para?
   buttonState = digitalRead(buttonPin);
   if (buttonState == HIGH ) {  
        
     // turn LED on:    
     digitalWrite(ledPin, HIGH);
     sec=sec+10;
     }
    
    else {
     // turn LED off:
     digitalWrite(ledPin, LOW);
      
   }

assim como esta acima, ele adiciona 10 segundos e mais 10 e mais 10 se eu manter o butao pressionado, eu quero que so adicione 10 segundos e mesmo que continue pressionado nao faça mais nada a nao ser que tire o dedo do butao e carregue outra vez

Tens que criar uma variável que te indique o estado. Antes de explicar como se faz quero dizer que tens uma tag de code para inserir código.

Código: [Seleccione]
boolean botaoPressionado=false;

buttonState = digitalRead(buttonPin);
   if (buttonState == HIGH && !botaoPressionado) {
 
     botaoPressionado = true; //como agora a variavel botaoPressionado está a true ele não vai entrar neste if.    
     digitalWrite(ledPin, HIGH);
     sec=sec+10;

   } else if(buttonState==LOW && botaoPressionado){

     botaoPressioando = false; //Quando o botão é largado ele entra neste ciclo e so ai coloca a variavel botaoPressionado a false e só agora é possivel entrar no if anterior.
     digitalWrite(ledPin, LOW);

   }
Título: Re:temporizador+lcd
Enviado por: ghostbuster em 26 de Julho de 2009, 01:49
obrigado metRo_, agora tenho outro problema que apareceu assim a toa porque ate agora deu tudo certo. se eu tiver isto no void setup pinMode(buttonPin, INPUT); , ele nao mosntra nada no lcd, se o tirar ja monstra
Título: Re:temporizador+lcd
Enviado por: metRo_ em 26 de Julho de 2009, 02:03
Coloca isto "boolean botaoPressionado=false;" antes do void setup.

Em relação ao teu problema, como tens a ligação do botão? Tens uma resistencia a fazer pull-down ou pull-up?
Título: Re:temporizador+lcd
Enviado por: ghostbuster em 26 de Julho de 2009, 02:14
usei o circuito igual a esse http://www.arduino.cc/en/Tutorial/Button mas ate agora deu
Título: Re:temporizador+lcd
Enviado por: metRo_ em 26 de Julho de 2009, 02:23
Exactamente, isso é um pull-down, isto é, quando não estás a carregar no botão o circuito fexa-se pela resistência para 0V e quando carregas em fexa-se pelos 5V pois a corrente tem menos resistências por este caminho, tentando explicar isto de uma forma simples.

Devia funcionar quer tenhas o pinMode ou não.
Título: Re:temporizador+lcd
Enviado por: ghostbuster em 26 de Julho de 2009, 02:38
 ele agora quando carrego no butao adicioname um caracter esquesito no lcd neste momento o codigo esta assim,

Citar

#include <LiquidCrystal.h>

// LiquidCrystal display with:
// rs on pin 12
// rw on pin 11
// enable on pin 10
// d4, d5, d6, d7 on pins 5, 4, 3, 2
LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2);

int hour = 0;
int min = 0;
int sec = 0;
const int buttonPin = 10;     // the number of the pushbutton pin
const int ledPin =  8;
int buttonState = 0;

boolean botaoPressionado=false;


void setup()
{
        lcd.setCursor(0,0);
  lcd.print(hour);
  lcd.print(":");
  lcd.print(min);
  lcd.print(":");
  lcd.print(sec);
}

void loop()
{
   buttonState = digitalRead(buttonPin);
   if (buttonState == HIGH && !botaoPressionado) {
 
     botaoPressionado = true; //como agora a variavel botaoPressionado está a true ele não vai entrar neste if.   
     digitalWrite(ledPin, HIGH);
     sec=sec+10;

   } else if(buttonState==LOW && botaoPressionado){

     botaoPressionado = false; //Quando o botão é largado ele entra neste ciclo e so ai coloca a variavel botaoPressionado a false e só agora é possivel entrar no if anterior.
     digitalWrite(ledPin, LOW);

   }
   
 

  }
 


o lcd print tem que estar no main ou no loop, é que funciona de qualquer maneira nos dois
Título: Re:temporizador+lcd
Enviado por: Njay em 26 de Julho de 2009, 03:00
A função setup() só é executada 1 vez, quando o programa arranca.

Normalmente os botões têm que ser "debounced". Quando carregas ou largas um botão, electricamente ele não passa directo de carregado para solto ou vice-versa; o que acontece é que há uma série de variações carregado/solto até estabilizar no novo valor, e muitos programas não se dão bem com isso. O botão "faz bounce" ("saltita") algumas vezes até que estabiliza.
No teu programa, um possível efeito do "bounce" do botão é cada vez que carregas 1 vez no botão ele contar várias vezes 10 seg (é como se tivesses carregado várias vezes seguidas muito depressa).
O "debounce" de um botão é eliminar, por exemplo em software, esses saltos que ocorrem durante a transição. Uma técnica possível é apenas considerar que o botão mudou de estado se já se manteve no novo estado durante por exemplo 100 ms.

Os pinos do Arduino têm pull-ups internos que podem ser ligados. Se os usares, não precisas da resistência cá fora.
Título: Re:temporizador+lcd
Enviado por: ghostbuster em 26 de Julho de 2009, 03:03
e como é que ligo os pullups internos?
Título: Re:temporizador+lcd
Enviado por: metRo_ em 26 de Julho de 2009, 03:03
Por exemplo, um delay(100); a seguir a leitura do estado do botão pode resolver o problema como o Njay disse.
Título: Re:temporizador+lcd
Enviado por: ghostbuster em 26 de Julho de 2009, 03:16
sim agora com o delay funciona 5 estrelas mas no lcd so adiciona caracteres depois do 0 se tiver o lcd print no main e se o tiver no loop ele monsttrame os dados uns atras dos outros...
Título: Re:temporizador+lcd
Enviado por: tcustodio em 26 de Julho de 2009, 05:06
e como é que ligo os pullups internos?

ligas os pull-ups definindo os pinos como input, e logo de seguida declarando

pinMode( pinoX , HIGH);

desta maneira estás a "ligar uma tensão" no pino, independentemente do pino ser input ou output,
no caso de ser input, estás a definir-lhe o estado "por defeito". Se o deixares a flutuar, ele vai estar sempre nos 5V, pois ligaste o pull-up.
Título: Re:temporizador+lcd
Enviado por: Njay em 26 de Julho de 2009, 06:25
Não sei onde colocaste o delay(100) mas dependendo de como o fizeste a coisa pode ou não funcionar sempre. Já não estou em grandes condições de fazer código mas podes tentar estas alterações:

Citar
... void ShowTime()
{
    lcd.setCursor(0,0);
    lcd.print(hour);
    lcd.print(":");
    lcd.print(min);
    lcd.print(":");
    lcd.print(sec);
}

boolean  oldButtonState = false;

void loop()
{
    delay(100);

    boolean  somethingChanged = false;

    buttonState = digitalRead(buttonPin);
    if (buttonState == oldButtonState)
    {
        if (buttonState == HIGH && !botaoPressionado)
        {
            botaoPressionado = true;
            digitalWrite(ledPin, HIGH);
            sec = sec + 10;
            somethingChanged = true;
        }
        else if(buttonState == LOW && botaoPressionado)
        {
            botaoPressionado = false;
            digitalWrite(ledPin, LOW);
            somethingChanged = true;
        }
    }
    oldButtonState = buttonState;

    if (somethingChanged)
    {
        ShowTime();
        // e fazer aqui + qq coisa q seja preciso qdo alguma coisa muda...
    }
}

A setup() fica vazia.
Quando é detectada uma mudança no estado do botão, ela só é considerada se 100ms depois essa mudança se mantiver.
Como tinhas, só estavas a escrever 1 vez no LCD, no arranque do programa. No excerto acima, escreves sempre que há "alterações", e apenas quando as há.

p.s.: Não é preciso chamar nenhuma função no setup() para inicializar o LCD?...
Título: Re:temporizador+lcd
Enviado por: ghostbuster em 26 de Julho de 2009, 17:39
pois ele assim nao monstra nada no lcd e nem o butao funciona, mas eu ja vou ver o codigo com atençao, obrigado