Go Down

Topic: problemas com codigo (Read 247 times) previous topic - next topic

thiagao33

amigos bom dia estou com um problema que é o seguinte:

preciso fazer o arduino acionar dois reles no projeto tem um contador de voltas com um sensor IR quando atingir a volta de numero 20 aciona o rele1, esse mesmo rele1 deve ser acionado quando o contador marcar 40, 60, 80 e 100 voltas porem quando o contador chegar na volta de numero 100 aciona tambem o rele2 e zera a contagem voltando ao numero 1 e repetindo todo o loop.

podem me ajudar abaixo segue o codigo que fiz mais sem sucesso:


#include<LiquidCrystal.h> // Inclui a biblioteca do display
#define ir A0// Define o pino do sensor como entrada
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);// PINS FOR LCD
#define rele1 6 // Define o pino do rele de 20 voltas
#define rele2 7 // Define o pino do rele de 100 voltas
int count = 0;// Variavel para contar o numero de voltas

// observação os reles ligam em nivel baixo LOW e desligam em nivel alto HIGH.


void setup() {
  pinMode(2, OUTPUT); // Definição dos pinos do display LCD 16x2 e pinos do rele1 e rele2 e pino de entrada do sensor IR
  pinMode(3, OUTPUT); // display
  pinMode(4, OUTPUT); // display
  pinMode(5, OUTPUT); // display
  pinMode(11, OUTPUT); // display
  pinMode(12, OUTPUT); // display
  pinMode(A0, INPUT); // sensor porta A0
  pinMode(6, OUTPUT); // rele1
  pinMode(7, OUTPUT); // rele2
  digitalWrite(6, HIGH); // coloca o rele1 iniciando desligado
  digitalWrite(7, HIGH); // coloca o rele2 iniciando desligado
 

  lcd.begin(16, 2); // Ligando o Display
  lcd.clear();
  lcd.print("Contador de Voltas");
  lcd.setCursor(0, 2);
  lcd.print("       De       ");
  delay(1000);
  lcd.clear();
  lcd.print("Nikolas Anjos");
  lcd.setCursor(0, 2);
  lcd.print("Thiago G Lima");// Programador
  delay(1000);
 
}

void loop() {
  if (digitalRead(ir) == 1) // verificando entrada de sinal
  {
    while (digitalRead(ir) == 1) // aguardando entrada e saida
    {};
    count = count + 1; // Incremento do contador mais 1
    lcd.clear();
    lcd.print("No. de voltas:");
    lcd.setCursor(0, 2);
    lcd.print(count);// mostra no display o numero de voltas
    delay(50);
  }
  else
  {
    lcd.clear();// Caso um sinal seja recebino no sensor
    lcd.print("No. De Voltas:");
    lcd.setCursor(0, 2);
    lcd.print(count);
    delay(50);
 


  if (count == 20) {  // acionar rele1 na volta  20
  digitalWrite(rele1, LOW);
  delay(500);
  digitalWrite(rele1, HIGH);

  if (count == 40) { // acionar rele1 na volta 40
  digitalWrite(rele1, LOW);
  delay(500);
  digitalWrite(rele1, HIGH);

  if (count == 60){ //acionar rele1 na volta 60
  digitalWrite(rele1, LOW);
  delay(500);
  digitalWrite(rele1, HIGH);

  if (count == 80){ //acionar rele1 na volta80
  digitalWrite(rele1, LOW);
  delay(500);
  digitalWrite(rele1, HIGH);

  if (count == 100) { //acionar rele1 e rele2 na volta 100
  digitalWrite(rele1, LOW);
  digitalWrite(rele2, LOW);
  delay(500);
  digitalWrite(rele1, HIGH);
  digitalWrite(rele2, HIGH); 


  if (count == 100){ // zera o contador
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(" ");
  delay(1);
}
}
}
}
}
}
}
}

binhop

Boa tarde,

Uma coisa que me deixou confuso é o fato que você está lendo seu sensor em um pino analógico, mas você lê ele de maneira digital (analogRead). Isso é intencional? Se não, você deve usar analogRead().
Outra coisa, quando você usa o comando "lcd.setCursor(0, 2);", o primeiro parâmetro se refere a coluna que você quer escrever e o segundo a qual linha. E observe que a linha vai de 0 a 1 já que seu display é 16x2. Então o ponto (0,2) não existe.
A ultima coisa que eu pude perceber que está estranha é que você está desligando o relé 1 a cada 20 voltas e ligando ele 500ms depois, e ele se mantem acionado até dar 20 voltas novamente. (É intencional?) E também quando chega na volta 100, você está esquecendo de acionar o relé 1 e o 2.
Dê uma olhadinha no que eu falei e qualquer duvida coloca o código arrumado aqui que eu tento arrumar ele pra você e te explicar.

Att,
Fábio

leandro1301

Não intendi sua duvida. Sugiro uma otimização:

troque os IF'S por switch case possivelmente amenizara problemas de conflito:

switch(count) {

case 10:
//codigo aqui
break; // para e continua o loop
case 20:
//codigo aqui
break; // para e continua o loop
case 30:
//codigo aqui
break; // para e continua o loop
.....
case 100: //(o 100 você esta repetindo já que poderia apenas fazer isso:)
  digitalWrite(rele1, LOW);
  digitalWrite(rele2, LOW);
  delay(500);
  digitalWrite(rele1, HIGH);
  digitalWrite(rele2, HIGH);
 delay(100); // só para da uma suavizada
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(" ");
  delay(100); // tirei um para mais 100 só para suavizar
break; // para e continua o loop




}

bubulindo

O teu problema é com a contagem... apesar de não o teres dito. E muito provavelmente o que causa o problema é estares a usar delays no teu código.
This... is a hobby.

Go Up