Go Down

Topic: Meu projeto nao esta dando certo, é simples (Read 1 time) previous topic - next topic

alessandro_0606

Boa noite, vou mandar o codigo do meu projeto, nao esta funcionando, a ideia é, primeiro verificar se presica de mais luz e avisar caso precise (no led), além de um buzzer tocar, após isso, exibir um menu no lcd, e calculando o tempo que eu fiquei apertando o botao, eu devo ou nao acender um outro led nao usado ainda

Quote
#include<LiquidCrystal.h>
const int BUTTON=1;
const int LEDL=8;
const int LEDH=13;
const int SENSOR=0;
const int BUZZER=7;
int statelight,statebutton=0,option,cont=0,untilhere,time;
LiquidCrystal lcd(12,11,5,4,3,2);
void turnBuzzer()
{
  digitalWrite(BUZZER,HIGH);
  delay(800);
  digitalWrite(BUZZER,LOW);
}
void showMenu()
{
  lcd.setCursor(0,0);
  lcd.print("1s para acender");
  lcd.setCursor(0,1);
  lcd.print("5s para apagar");
}
void modifyLights()
{
  statelight=analogRead(SENSOR);
  if(statelight<=250)
  {
    turnBuzzer();
    digitalWrite(LEDH,HIGH);
    lcd.setCursor(0,0);
    lcd.print("Luz de emergencia ativado");
    lcd.setCursor(0,1);
    lcd.print("Problema de luz resolvido");
    delay(2000);
    showMenu();
  }
  else{
    digitalWrite(LEDH,LOW);}
}
int readButton()
{
  while(statebutton!=HIGH)
  {
  modifyLights();
  statebutton=digitalRead(BUTTON);
  if(statebutton==HIGH)
  {
    untilhere=millis();
    while(statebutton==HIGH)
    {
       statebutton=digitalRead(BUTTON);
    }
    time=millis()-untilhere;
  }
  }
  if(time>=800 && time <=1200)
  {
    return 1;}
  else if(time>=4000 && time<=6000){
    return 2;}
  else if(time>8000){
    return 3;}
}
void setup ()
{
  lcd.begin(16,2);
  lcd.setCursor(0,0);
  lcd.print("INICIO PROJETO VENTO DE CORES ");
  delay(5000);
  pinMode(BUTTON,INPUT);
  pinMode(LEDL,OUTPUT);
  pinMode(LEDH,OUTPUT);
  pinMode(BUZZER,OUTPUT);

void loop()
{
  showMenu();
  option=readButton();
  if(option==1)
  {
     turnBuzzer();
     lcd.setCursor(0,0);
     lcd.print("Led aceso");
     digitalWrite(LEDL,HIGH);
  }
  else if(option==2)
  {
     turnBuzzer();
     lcd.setCursor(0,0);
     lcd.print("Led apagado");
     digitalWrite(LEDL,LOW);
  }
  else if(option==3)
  {
     turnBuzzer();
     lcd.setCursor(0,0);
     lcd.print("xxx"); // aqui é só uma brincadeira que eu fiz, ignorem a opção 3
  }
}

bubulindo

Sem dizeres exactamente o que não está a funcionar é difícil de conseguir resolver o teu problema... não achas?

Explica bem o que não está a acontecer, ou está a acontecer erradamente para podermos ajudar melhor.
This... is a hobby.

alessandro_0606

Então... o led não acende quando eu apago a luz...( e a função que acende ou nao o led esta em um loop até o botao ser pressionado) e o buzzer também nao toca... e quando mostra o menu no lcd e eu pressiono o botão, nada acontece

bubulindo

Acho que tens de rever a função readButton...

Enquanto o stateButton for igual a zero, tu chamas a função modifyLights... essa função tem um delay lá dentro que vai deitar por terra toda a lógica que pretendes implementar com a temporização. Tu carregas no botão, mas o chip ainda está a processar o delay, deixando o sistema muito pouco funcional ou só funcionando de quando em vez quando tiveres a sorte de carregar no botão no momento certo. :\

Também estás a prender o programa em muitos sítios... o que nem sempre é bom, mas não me parece que esteja a ser o problema aqui.

Já pensaste em resolver isto com uma máquina de estados?

A tua variável time está definida como um int. O millis retorna unsigned long. Eu compreendo que não tencionas usar 66 segundos no programa... mas se alguém o decidir fazer estoura com o sistema. Muda a variável time para unsigned long para evitar também problemas com isso.

Coloca uns serial print para teres uma ideia do valor que sai do sensor de luz... talvez isso também não esteja a sair como pretendes.

This... is a hobby.

alessandro_0606

Pois é, voce tinha razão quanto a readbutton... ja corrigi ja, FUNCIONOU!
Problema resolvido, brigadao

Go Up