Problemas com Buttons

Galera to tendo problemas com botões atualmente.
Não consigo encontrar nada de exemplos pelo web então recorri ao lugar certo :wink:

Oque eu preciso:

ligar um led quando aperta um botão, e desligar quando apertar o mesmo novamente.
ligar um led quando aperta um botão, temporisar por 5 segundos e desligar quando apertar o mesmo novamente.
ligar um led quando aperta um botão, acionar um segundo led temporisado.
ligar um led quando aperta um botão, temporisar e permitir um segundo botão ligar um segundo led.

Eu preciso apertar um botão1 para acender uma lampada temporisada por 1 minuto, enquanto a lampada tiver temporisada o botão2 tambem vai estar

Isso é para dar inicio em um grande projeto de automação automotivo, que logo postarei aqui.

PS montei agora um Sketch bem simples com 2 botões e 2 leds porem enquanto 1 ta aceso o outro botão não funciona!

const int sensorporta = 10; //sensor de porta entrada 
const int start = 9; // botão start entrada
const int acc = 3; //acc saida
const int ign = 4; // arranque saida
const int ilumi = 5; // iluminação cartão saida

int buttonState = 0;

void setup() {
  pinMode(sensorporta, INPUT);
  pinMode(start, INPUT);  
  pinMode(acc, OUTPUT);
  pinMode(ign, OUTPUT);
  pinMode(ilumi, OUTPUT);  
}

void loop()
 {
  buttonState = digitalRead(sensorporta);
  if (buttonState == HIGH) {      
  digitalWrite(acc, HIGH);  
  delay(120000);
}
else {
digitalWrite(acc, LOW);
}
buttonState = digitalRead(start);
if (buttonState == HIGH) {      
digitalWrite(ign, HIGH);  
delay(3000);
}
else {
digitalWrite(ign, LOW);
}
 }

O que quer dizer com lâmpada "temporisada"?
Usando a função "delay" não vai conseguir fazer outra coisa.
Use a função millis().

Tera que se basear neste codigo e evitar os delays:

FernandoGarcia:
O que quer dizer com lâmpada "temporisada"?
Usando a função "delay" não vai conseguir fazer outra coisa.
Use a função millis().

quando eu apertar o botão ela liga por um determinado tempo.
n posso usar delay então?

E vc viu que no codigo que eu fiz para testes quando aperta um botão o outro não funciona?
só depois que o delay acabar

Por isto não pode usar o delay. O delay "pausa" o processamento, não conseguindo fazer mais nada até terminar o tempo.

huum, entendi amigo, mais uma duvida eu tenho um display e apos usar a função lcd.clear() ele começou a piscar as ultimas linhas.
20x4 seria a linha 4 parece que falta energia, fica passando a tela como uma tv mal sintonizada.
Eu preciso atualizar ele para mostra a voltagem da bateria, rpm, combustivel, mistura, pressão oleo, pressão bomba, temperatura
data ,hora, porta aberta, etc... oque acha?

tenho 2 projetos a fazer um deles seria um computador de bordo automotivo.
O outro seria um acesso RFID ao carro, para dar a partida.
vou elaborar os dois e logo mais posto aqui.

Você teria um exemblo de millis()

Não podes fazer update do LCD muito rápido… se o fizeres ele pisca.

O blink without delay é um exemplo com millis.

ok mais oque usar para atualizar o lcd?
estou usando delay(1000) na ultima linha, paro de piscar o problema é se eu escrevo um testo com 18 caracteres e depois na mesma linha eu escrevo um com 10 ele não apaga os outros 8 caracteres. exemplo

minhacasaazul
perguntaaazul

primeiro texto = minhacasaazul
segundo texto = pergunta
fico na tela um pedaço do texto maior

lcd.clear();

bubulindo:

lcd.clear();

isso é o que eu uso!
Mas quando uso ele fica piscando o display, se eu coloco antes dele um delay(1000) ou delay(500) fica bom.
O problema é que para o processamento, ai os buttons não funcionan por meio segundo ou 1 segundo.

Então o teu problema não é com o lcd.clear... é com o delay.

Se vires o exemplo BlinkWihtoutDelay vês como criar uma temporização sem o delay. Já o fizeste???

Mete aqui o último código que tens.

Bom vamos ao meu codigo todos.
O principio seria basico, um display 4x20 que mostrase algumas informações sobre o estado do carro.
*Portas abertas (1 fio porta fechada entorno de 12v, porta aberta 0v) // sensor original do carro
*Data (usar RTC)
*Hora (usar RTC)
*Bateria (1 fio pinA0 Resolvido)
*Sonda Lambda (1 fio resultado de 0v ~ 1v) // sensor original do carro
*Temperatura (1 fio resultado 0v ~1v) // sensor original do carro
*RPM (pegar do sensor hall // sensor original do carro) http://api.ning.com/files/FqkiRUfegCh3oTr97YY67K0L1J9oMwB5yFwTKnSgipd7HBebIugmH8Kr6xAHDiJ4uf1eFRwqzxFmEOfwqC6mS57oqsqg1XfX/CKP_Sensor_Waveforms.gif olha no exemplo
*Combustivel (1 fio resultado 0v ~1v) // sensor original do carro

Até o momento só oque tive tempo de desenvolver foi oque citarei abaixo, só parei porque tive problemas com buttons

#include <LiquidCrystal.h>
int i=0; // multimetro bateria
const int portade = 8; // botao
const int portadd = 9; // botao
const int portamalas = 10; // botao
int buttonState = 0; // botao
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // pinos do display

void setup() {
   pinMode(portade, INPUT);//boato
   pinMode(portadd, INPUT);//boato
   pinMode(portamalas, INPUT);//boato
  lcd.begin(20, 4); // colunas e casas do display
}

void loop() {

  buttonState = digitalRead(portade); // le sinal de portade
  if (buttonState == HIGH) { // se tiver em HIGH
  lcd.setCursor(0, 0); // seta primeira linha do display
  lcd.print(" Porta DE Aberta"); // imprime na tela porta de aberta
  }
  else { // low não imprime nada
  }
  buttonState = digitalRead(portadd);
  if (buttonState == HIGH) {       
  lcd.setCursor(0, 0);
  lcd.print(" Porta DD Aberta");
  }
  else {
  }
  buttonState = digitalRead(portamalas);
  if (buttonState == HIGH) {       
  lcd.setCursor(0, 0);
  lcd.print(" Porta Malas Aberto");
  }
  else {
  }
  lcd.setCursor(0, 1); // seta segunda linha do display
  lcd.print("Bateria");  // imprime bateria
  int sensorValue = analogRead(A0); // le pino de entrada A0
  float voltage = sensorValue * (5.0 / 1023.0); // converte o calculo
  lcd.print(voltage); // imprime o resultado de voltage
  lcd.setCursor(0, 2); // seta terceira linha
  lcd.print("     KM: 4567800"); // imprime kilometragem (provisoria)
  lcd.setCursor(0, 3); // seta quarta linha
  lcd.print(" 19/04/2014   20:17 ");  // imprime data e hora (usar rtc para mostrar data e hora)
  delay(1000); // delay para atualizar informações
 }

Faz uma função updateLCD onde colocas tudo o que tem a ver com o lcd.

Depois com o exemplo do millis chamas essa função de segundo a segundo.