LusoRobótica - Robótica em Português

Sistemas específicos => Arduino / AVR => Tópico iniciado por: NunoAzevedo em 21 de Março de 2015, 10:33

Título: Ajuda num Display 20x4 caracteres estranhos
Enviado por: NunoAzevedo em 21 de Março de 2015, 10:33
Bom dia, este e o meu primeiro topico no forum. Sou um estudante de 17 anos que esta a tirar o curso de eletronica e neste momento estou a fazer um pequeno projeto com um Leitor RFID 125KHz (SEN11425P), um RTC Relogio tempo Real DS1307 e um Display 20x4 Green com um arduino uno. O problema e que o Display escreve o que eu quero em sitios diferentes, as vezes nao aparece nada do que eu quero. Alguem me pode ajudar?

Codigo que estou a usar:

#include <SoftwareSerial.h>
SoftwareSerial RFID(2, 3);
#include "Wire.h"

#define DS1307_ADDRESS 0x68

byte zero = 0x00;

 int segundos = 0;
 int  minutos = 0;
 int  horas = 0;
 int  diadasemana = 0;
 int  diadomes = 0;
 int  mes = 0;
 int  ano = 0;
void setup()
{
  Wire.begin();
  RFID.begin(9600);
  Serial.write(char(12));
  Serial.begin(9600);

  //SelecionaDataeHora();

  Serial.write(char(12));
  Serial.write(char(19));
  Serial.write(char(4));


}
int Tempo=0;
void loop()
{
 char i;
  if (RFID.available() > 0)
{
i = RFID.read();

if (i==2){

  Serial.print(char(1));


Serial.print(char(10));
Serial.print(char(10));
Serial.print(char(10));}
if (i>47)Serial.print(char(i));



}
 
  //_____________________________________________//
 
  if(Tempo>1000 & !RFID.available()){
  Mostrarelogio();
  Tempo=0;
    Serial.print(char(1));


  Serial.print("    NUNO / TIAGO   ");
  Serial.print(char(0x01));
  Serial.print(char(10));
  Serial.print(horas);
  Serial.print(":");
  Serial.print(minutos);
  Serial.print(":");
  Serial.print(segundos);
  Serial.print("   ");
  Serial.print(diadomes);
  Serial.print("/");
  Serial.print(mes);
  Serial.print("/");
  Serial.print(ano);
  Serial.print(" ");


   }
   
  delay(4);
  Tempo=Tempo+4;
 
}

void SelecionaDataeHora()   //Seta a data e a hora do DS1307
{
  byte segundos = 0; //Valores de 0 a 59
  byte minutos = 24; //Valores de 0 a 59
  byte horas = 11; //Valores de 0 a 23
  byte diadasemana = 4; //Valores de 0 a 6 - 0=Domingo, 1 = Segunda, etc.
  byte diadomes = 12; //Valores de 1 a 31
  byte mes = 2; //Valores de 1 a 12
  byte ano = 15; //Valores de 0 a 99
  Wire.beginTransmission(DS1307_ADDRESS);
  Wire.write(zero);

  Wire.write(ConverteParaBCD(segundos));
  Wire.write(ConverteParaBCD(minutos));
  Wire.write(ConverteParaBCD(horas));
  Wire.write(ConverteParaBCD(diadasemana));
  Wire.write(ConverteParaBCD(diadomes));
  Wire.write(ConverteParaBCD(mes));
  Wire.write(ConverteParaBCD(ano));
  Wire.write(zero); //Start no CI
  Wire.endTransmission();
}

byte ConverteParaBCD(byte val){ //Converte o número de decimal para BCD
  return ( (val/10*16) + (val%10) );
}

byte ConverteparaDecimal(byte val)  { //Converte de BCD para decimal
  return ( (val/16*10) + (val%16) );
}

void Mostrarelogio()
{
  Wire.beginTransmission(DS1307_ADDRESS);
  Wire.write(zero);
  Wire.endTransmission();
  Wire.requestFrom(DS1307_ADDRESS, 7);
   segundos = ConverteparaDecimal(Wire.read());
   minutos = ConverteparaDecimal(Wire.read());
   horas = ConverteparaDecimal(Wire.read() & 0b111111);
   diadasemana = ConverteparaDecimal(Wire.read());
   diadomes = ConverteparaDecimal(Wire.read());
   mes = ConverteparaDecimal(Wire.read());
   ano = ConverteparaDecimal(Wire.read());
 
}
Título: Re: Ajuda num Display 20x4 caracteres estranhos
Enviado por: StarRider em 21 de Março de 2015, 10:56
Ajudar até podia ... mas não vou !

Este seu tópico é um exemplo acabado do que NÃO DEVE SER FEITO !
- Falta a educação para primeiro fazer a sua apresentação
- Este forum não é uma "oficina de reparações", não deve despejar para aqui
código e esperar que façam o trabalho por si.

Pela parte que me toca, tópicos de pessoas com esta atitude deviam ser sumáriamente
removidos !

É a tal coisa, arduino no seu melhor ... só serve para criar este tipo de situações, pessoas
mal educadas e preguiçosas !


...sim, acordei mal disposto  >:(
Título: Re: Ajuda num Display 20x4 caracteres estranhos
Enviado por: senso em 21 de Março de 2015, 12:41
Porque tal coisa não acontece com qualquer pessoa a usar qualquer micro quando agarra num display desses e numa biblioteca das internets.....

Que display é esse?
Certamente tem uma placa atrás para falar por serial.
Título: Re: Ajuda num Display 20x4 caracteres estranhos
Enviado por: dropes em 21 de Março de 2015, 12:51
Display 20x4 Green
Tenta mudar para um Display 20x4 Red, funcionam melhores, creio ser esse o problema  ::)
Título: Re: Ajuda num Display 20x4 caracteres estranhos
Enviado por: NunoAzevedo em 21 de Março de 2015, 13:20
Porque tal coisa não acontece com qualquer pessoa a usar qualquer micro quando agarra num display desses e numa biblioteca das internets.....

Que display é esse?
Certamente tem uma placa atrás para falar por serial.
O display e este http://www.robot-electronics.co.uk/htm/Lcd05tech.htm (http://www.robot-electronics.co.uk/htm/Lcd05tech.htm)
Título: Re: Ajuda num Display 20x4 caracteres estranhos
Enviado por: senso em 21 de Março de 2015, 13:24
Changing display type
Because there are four variations of the LCD display that the LCD05 connects to a software command can be used to switch between them.
Firstly a command of 24 must be issued, this is then followed by the display type attached:
Título: Re: Ajuda num Display 20x4 caracteres estranhos
Enviado por: NunoAzevedo em 21 de Março de 2015, 13:35
Tenho de mudar o tipo do display no setup?
Título: Re: Ajuda num Display 20x4 caracteres estranhos
Enviado por: andre_f_carvalho em 21 de Março de 2015, 17:36
tenho um desses, mas uso o picaxe para o seu controlo, o código é diferente
Título: Re: Ajuda num Display 20x4 caracteres estranhos
Enviado por: NunoAzevedo em 21 de Março de 2015, 17:45
O problema e que apos alguns segundos ele começa a escrever letras ao acaso e tenho de fazer reset no arduino para voltar ao normal
Título: Re: Ajuda num Display 20x4 caracteres estranhos
Enviado por: andre_f_carvalho em 21 de Março de 2015, 19:09
O problema e que apos alguns segundos ele começa a escrever letras ao acaso e tenho de fazer reset no arduino para voltar ao normal

pode ser falat de corrente e ele começa a atrofiar, tens as resistências na comunicação i2c?
Título: Re: Ajuda num Display 20x4 caracteres estranhos
Enviado por: NunoAzevedo em 21 de Março de 2015, 19:20
estou a usar comunicação serial e nao i2c
Título: Re: Ajuda num Display 20x4 caracteres estranhos
Enviado por: andre_f_carvalho em 21 de Março de 2015, 19:36
estou a usar comunicação serial e nao i2c

ah ok, eu na altura que andava a começar a tentar usar o lcd tambem me aparecia esses caracteres estranhos, mas era devido aos comandos que enviava para la
Título: Re: Ajuda num Display 20x4 caracteres estranhos
Enviado por: NunoAzevedo em 21 de Março de 2015, 19:44
mudei algumas coisas no codigo como podes ver
e aqui esta um video do funcionamento https://www.youtube.com/watch?v=LOEH346Uq8w&feature=youtu.be (https://www.youtube.com/watch?v=LOEH346Uq8w&feature=youtu.be)


#include <SoftwareSerial.h>
SoftwareSerial RFID(2, 3);
#include "Wire.h"

#define DS1307_ADDRESS 0x68

byte zero = 0x00;

int segundos = 0;
int  minutos = 0;
int  horas = 0;
int  diadasemana = 0;
int  diadomes = 0;
int  mes = 0;
int  ano = 0;
void setup()
{
  Wire.begin();
  RFID.begin(9600);
  Serial.begin(9600);
  //SelecionaDataeHora();

  clearLCD();
Hidecursor();
backlightOn();
}
int Tempo=0;
int Tempo2=0;
void loop()
{

char i;
  if (RFID.available() > 0)
{
i = RFID.read();

if (i==2){
cursorSet(1,61);

}
if (i>47){
  Serial.print(char(i));

}


}
if(Tempo>1000){
  Mostrarelogio();
  Tempo=0;

}
if(Tempo2>1000){
  titulo();
  Tempo2=0;

}
delay(4);
  Tempo=Tempo+4;
Tempo2=Tempo2+4;
}

void SelecionaDataeHora()   //Seta a data e a hora do DS1307
{
  byte segundos = 0; //Valores de 0 a 59
  byte minutos = 24; //Valores de 0 a 59
  byte horas = 11; //Valores de 0 a 23
  byte diadasemana = 4; //Valores de 0 a 6 - 0=Domingo, 1 = Segunda, etc.
  byte diadomes = 12; //Valores de 1 a 31
  byte mes = 2; //Valores de 1 a 12
  byte ano = 15; //Valores de 0 a 99
  Wire.beginTransmission(DS1307_ADDRESS);
  Wire.write(zero);

  Wire.write(ConverteParaBCD(segundos));
  Wire.write(ConverteParaBCD(minutos));
  Wire.write(ConverteParaBCD(horas));
  Wire.write(ConverteParaBCD(diadasemana));
  Wire.write(ConverteParaBCD(diadomes));
  Wire.write(ConverteParaBCD(mes));
  Wire.write(ConverteParaBCD(ano));
  Wire.write(zero); //Start no CI
  Wire.endTransmission();
}

byte ConverteParaBCD(byte val){ //Converte o número de decimal para BCD
  return ( (val/10*16) + (val%10) );
}

byte ConverteparaDecimal(byte val)  { //Converte de BCD para decimal
  return ( (val/16*10) + (val%16) );
}

void Mostrarelogio()
{
  Wire.beginTransmission(DS1307_ADDRESS);
  Wire.write(zero);
  Wire.endTransmission();
  Wire.requestFrom(DS1307_ADDRESS, 7);
   segundos = ConverteparaDecimal(Wire.read());
   minutos = ConverteparaDecimal(Wire.read());
   horas = ConverteparaDecimal(Wire.read() & 0b111111);
   diadasemana = ConverteparaDecimal(Wire.read());
   diadomes = ConverteparaDecimal(Wire.read());
   mes = ConverteparaDecimal(Wire.read());
   ano = ConverteparaDecimal(Wire.read());
    cursorSet(1,21);
  Serial.print("   Hora: ");
  Serial.print(horas);
  Serial.print(":");
  Serial.print(minutos);
  Serial.print(":");
  Serial.print(segundos);
  Serial.print(" ");
   cursorSet(1,41);
  Serial.print("   Data: ");
  Serial.print(diadomes);
  Serial.print("/");
  Serial.print(mes);
  Serial.print("/");
  Serial.print(ano);
  Serial.print(" ");

}
void clearLCD(){
  Serial.write(12);
}


// start a new line
void newLine() {
  Serial.write(10);
}


// move the cursor to the home position
void cursorHome(){
  Serial.write(1);

}

// turn on backlight
void backlightOn(){
  Serial.write(char(19)); // use 0 minutes to turn the backlight on indefinitely   
}
void Hidecursor(){
Serial.write(4);
}
void cursorSet(int xpos, int ypos){ 
  Serial.write(char(3));               
  Serial.write(xpos);   //Column position   
  Serial.write(ypos); //Row position
}
void titulo(){
   cursorSet(1,1);
  Serial.print("   NUNO / TIAGO");
}
Título: Re: Ajuda num Display 20x4 caracteres estranhos
Enviado por: andre_f_carvalho em 21 de Março de 2015, 20:06
não seio como funciona o arduino, ve se não estas a escrever varias vezes por cima do que tens, ou tenta dar uma pausa entre cada escrita/ leitura na comunicação i2c para testar isso tipo 10ms
Título: Re: Ajuda num Display 20x4 caracteres estranhos
Enviado por: NunoAzevedo em 21 de Março de 2015, 20:26
Vou testar
Título: Re: Ajuda num Display 20x4 caracteres estranhos
Enviado por: pedromatos em 17 de Junho de 2015, 16:08
Boas, eu vou ajudar o que poder, se realmente ajuda.

1º - deverias entender o conseito de RFID que é leitura de cartões, ou seja é uma entrada de valor a armazenar numa variável (char) de preferência já que é um carácter lido, seja ele qual for.
2º - verificar se foi lido com a utilização da porta(9600) do programa do arduino.
3º - Entender a biblioteca dos LCD's, e como converter variáveis / matriz / caracteres / etc a amostrar no LCD.
4º - Entender como se utiliza o sistema de horas e qual o hardware que estas a utilizar.
5º -por ultimo juntar tudo. Relogio, RFID, LCD.

Parece-me que estas a querer fazer tudo ao mesmo tempo e não sabes interpretar o código que colocaste ou copias-te da net.

Abraços.