Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
caolne

Arduino comando lcd.print trava arduino

Recommended Posts

Boa noite pessoal.

Estou ficando louco.

Há 3 dias que estou enfrentando problemas para trabalhar com display lcd I2C 20x4. O problema é o seguinte:

tenho um skecht que funciona perfeito e estou querendo implementar um display, porém ao enviar o comando lcd.print() o arduino trava.

Já testei um exemplo e funciona normal, mas quando passo para o meu skecht ele trava quando a condição é satisfeita. Já experimentei um monte de bibliotecas, até formatei o PC e nada.

 

 

Um exemplo que funciona:

 

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

// Inicializa o display no endereco 0x27
LiquidCrystal_I2C lcd(0x3F,2,1,0,4,5,6,7,3, POSITIVE);
 
void setup()
{
 lcd.begin (20,4);
}
 
void loop()
{
  lcd.setBacklight(HIGH);
  lcd.setCursor(0,0);
  lcd.print("Arduino e Cia !!");
  lcd.setCursor(0,1);
  lcd.print("LCD e modulo I2C");
  delay(1000);
  lcd.setBacklight(LOW);
  delay(1000);
}



O meu exemplo que trava: )só estou testando com um comando lcd.print)





#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F,2,1,0,4,5,6,7,3, POSITIVE);
const int bomba = 3;
const int sensor1 = 4;
const int sensor2 = 5;
const int reset = 6;
const int liga = 7;
const int ledbomba =  8;
const int ledalarme = 9;
int estadobomba = LOW;
int trava = 0;
int i=0;
int contaPulso;
float vazao;
float media=0;


void setup() {
  lcd.begin (20,4);
  lcd.setBacklight(HIGH);
  pinMode(bomba, OUTPUT);
  pinMode(ledbomba, OUTPUT);
  pinMode(ledalarme, OUTPUT);
  pinMode(sensor1, INPUT);
  pinMode(sensor2, INPUT);
  pinMode(reset, INPUT);
  pinMode(liga, INPUT);
  pinMode(2, INPUT);
  attachInterrupt(0, incpulso, RISING);
}

void loop() {

if (estadobomba == HIGH) {
    digitalWrite(bomba, HIGH);
    digitalWrite(ledbomba, HIGH);
    digitalWrite(ledalarme, LOW);
    lcd.print(" ligada!");

      }
  if (estadobomba == LOW) {
    digitalWrite(bomba, LOW);
    digitalWrite(ledbomba, LOW);
  }

  if ((digitalRead(sensor1) == LOW) && (digitalRead(sensor2) == LOW) && trava == 0) {
     estadobomba=HIGH;
  }
  if ((digitalRead(sensor1) == HIGH) && (digitalRead(sensor2) == HIGH)) {
    estadobomba=LOW;
    i = 0;
  }

  if (estadobomba == HIGH) {
  contaPulso = 0;
  sei();
  delay (1000);
  cli();
 
  vazao = contaPulso / 5.5;
  media=media+vazao;
  i++;

  if(i==30)
  {
    media = media/30;
    media = 0;
    i=0;
  }
  }
 
  if ((estadobomba == HIGH) && (contaPulso <= 10) && (i >= 10)){
    estadobomba = LOW;
    digitalWrite(ledalarme, HIGH);
    trava = 1;
  }

 if (digitalRead(reset) == HIGH) {
  trava = 0;
  i = 0;
  digitalWrite(ledalarme, LOW);
 }

 if ((digitalRead(liga) == HIGH) && (trava == 0)) {
  estadobomba = HIGH;
 }
 
}

void incpulso ()
{
  contaPulso++;
}

 

Editado por DiF
Botão CODE <>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Troquei o lcd, também troquei o Arduino e o problema persiste.

Ia esquecendo, estou usando o Arduino UNO.

Compartilhar este post


Link para o post
Compartilhar em outros sites

caminho seguir/refletir

-no exemplo que funciona não vi interrupt

-e nem nada sendo acionado. Algum ruído pode zoar o barraco

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Isadora Ferraz, abrigado pela resposta.

mas não é ruído, suspeito que seja a interrupção.

no novo sketch estou acionando um relé. deixa eu atualizar:

montei um novo sketch, porém sem esta parte:

 

 if (estadobomba == HIGH) {
    contaPulso = 0;
    sei();
    delay (1000);
    cli();
    vazao = contaPulso / 5.5;
    media=media+vazao;
    i++;

   if (i==30) {
     media = media/30;
     media = 0;
     i=0;
   }
  }

 

e está quase funcionando, percebi um detalhe, o comando print.lcd() não manda um comando e pára, ele continua atualizando a tela sempre, dá pra ver as letras piscando.

agora me vem outra dúvida, tem como usar outra coisa sem ser a interrupção?

adicionado 43 minutos depois

Mais uma atualização:

quase tudo resolvido, só um detalhe:

a causa do travamento é a interrupção, só foi desabilitar que o lcd funcionou, porém sem ela não sei contar pulos.

alguém me ajuda.

Editado por DiF
Botão CODE <>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Conte pulsos num contador de um timer e o capture quando necessario. Com linguagem arduína não vai rolar comigo. Aguarde algum arduineiro ou dá uma estudada no hw do mc dele.

Compartilhar este post


Link para o post
Compartilhar em outros sites
14 horas atrás, Isadora Ferraz disse:

contador de um timer

o famoso 555 serve pra isto?

Compartilhar este post


Link para o post
Compartilhar em outros sites
18 minutos atrás, caolne disse:

555 serve pra isto?

Não amigo. Por gentileza pesquise por atmega168 counter p.ex. . P. ex.:

Counter1%20-%20ATmega8.JPG

A ideia por trás da ideia é configurar Tn como a entrada do contador - seu sinal do contapulso() - e manipular TCNTn ao seu bel prazer.

 

Mas sei que o tal arduíno dá tudo mastigado mas infelizmente mesmo assim eu (eu) não consigo engolir. Alguém do ramo poderá te ajudar mais efetivamente se achar que deve...

Mas acho que falta pouco... sua interrupção pode estar demorando muito pra sair dela ou alguma coisa no circuito pode estar a provocando e ela fica com raiva...

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

agradeço pela ajuda, vamos esperar pra ver se alguém consegue dá uma luz.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tente limpar o lcd quando as condições não forem "estadobomba == HIGH"

 

exemplo:

if (estadobomba == LOW)

{    

   digitalWrite(bomba, LOW);    

   digitalWrite(ledbomba, LOW);  

   lcd.clear();

}

 

 

Editado por vnszava

Compartilhar este post


Link para o post
Compartilhar em outros sites

@vnszava, obrigado pela ajuda,

mas o arduino trava geral quando cai em algum comando para o lcd.

já testei todos e sempre trava tudo com qualquer um

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então apontemos os holofotes para o ldc...

Ele funciona de 2 formas: você envia o controle e espera ele retornar que está pronto para o próximo analisando   sinal busy. Outra... você envia o controle e espera um pouquinho antes de enviar o próximo. No caso do 1º pode ser que há alguma falha nesta comunicação. No 2º, pode estar raṕido d+. Se fosse você no controle ficaria fácil interpretar/adaptar algo. Mas como preferes os mastigados do arduíno, ... fizeste tua escolha.

Portanto a dica: aprofunde + nas rotinas mastigadas do arduino pra ver que método ele usa.

abç

Compartilhar este post


Link para o post
Compartilhar em outros sites

Faça um teste de printar na serial ao invés do lcd para verificar se o problema é o lcd ou o código em si, você pode também pela serial verificar as variáveis pra ver se tem algum problema com elas.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Isadora Ferraz, @vnszava

desconfio que seja falha do Arduino mesmo, pois como comentado mais acima funciona normalmente quando uso o serial.print no lugar do lcd.print, acompanho todas as informações no serial.

e quanto ao lcd já testei com outros sketchs que não usam interrupção, suspeito que o protocolo I2C usa a mesma interrupção que usei para contar os pulsos.

 

tava pensando e tive outra ideia, comprei vários Arduino unos, e pensei em usar um só para contar os pulsos com interrupçao e passar a informação para o outro que roda o sketch, será que funciona?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Já testou com lcd normal?

Pois já fiz projetos com interrupção + lcd e funcionou normalmente.

 

Quando aos dois arduinos interligados, acho que dá fazer usando os pinos TX e RX.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário






Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×