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
-
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());
}
-
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 >:(
-
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.
-
Display 20x4 Green
Tenta mudar para um Display 20x4 Red, funcionam melhores, creio ser esse o problema ::)
-
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)
-
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:
-
Tenho de mudar o tipo do display no setup?
-
tenho um desses, mas uso o picaxe para o seu controlo, o código é diferente
-
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
-
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?
-
estou a usar comunicação serial e nao i2c
-
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
-
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");
}
-
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
-
Vou testar
-
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.