LusoRobótica - Robótica em Português
Robótica => Projectos de robótica => Tópico iniciado por: danuca em 07 de Setembro de 2012, 14:40
-
Boas
Estou a fazer um Sistema de rega automático com interface VB para facilitar a interacçao com o utilizador.
A programação tem de ser em arduino UNO, ou seja nao precisamos do pc ligado para funcionar.
Fiz um relógio em arduino, que funciona bem, o meu problema para já é como fazer para acertar o relógio.
O meu programa é este:
char hor,*hor2;
int horas;
int seg=0;
int minu=0;
void setup()
{
Serial.begin(9600);
}
void loop()
{
processSyncMessage();
if(horas < 24 && horas >0){
static unsigned long ult_tempo=0;
int tempo = millis();
if(tempo - ult_tempo >= 1000){
ult_tempo=tempo;
seg++;
}
if (seg>=60) {
seg=0;
minu++;
}
if (minu>=60) {
minu=0;
horas++;
}
if (horas>=24) {
horas=0;
minu=0;
}
Serial.print(horas);
Serial.print(":");
Serial.print(minu);
Serial.print(":");
Serial.println(seg);
delay(1000);
}
}
void processSyncMessage() {
if(Serial.available()>0 )
{
for(int i=0; i<2; i++) {
hor=Serial.read();
if( hor >= '0' && hor <= '9'){
*hor2=hor;
horas=atoi(hor2);
}
}
//Serial.println(horas);
}
}
O problema é que inserindo por exemplo 22 no serial monitor, o relógio apenas fica com o valor de horas 2, e eu nao percebo porquê.
Desde já obrigado.
Cumprimentos
-
Isso assim vai atrasar rapidamente.
O melhor é comprares um módulo "real time clock" ou então podes usar esta biblioteca:
http://arduino.cc/playground/Code/Time (http://arduino.cc/playground/Code/Time)
-
Sim, sem um RTC não vais longe, comunicam via I²C e o acerto pode ser realizado por interface do arduino ao PC.
Deve-se manter o RTC em funcionamento quando o arduino está desligado, o consumo é insignificante pelo que funciona com pilha tipo botão de 3V ou supercap (em caso de falha de alimentação).
-
Pois, mas não posso mesmo comprar o RTC, eu já tinha visto muito pessoal a dizer que era muito porreiro mas o máximo que posso fazer é usar a biblioteca TIMER. Eu também já tinha tentado fazer o relógio com a biblioteca Time, mas usando o exemplo que eles têm do TimeSerial, nao consigo acerta-lo.
Por exemplo: usando a biblioteca deles do TimeSerial, eles têm esta função que calcula o tempo:
void processSyncMessage() {
// if time sync available from serial port, update time and return true
while(Serial.available() >= TIME_MSG_LEN ){ // time message consists of a header and ten ascii digits
char c = Serial.read() ;
Serial.print(c);
if( c == TIME_HEADER ) {
time_t pctime = 0;
for(int i=0; i < TIME_MSG_LEN -1; i++){
c = Serial.read();
if( c >= '0' && c <= '9'){
pctime = (10 * pctime) + (c - '0') ; // convert digits to a number
}
}
setTime(pctime); // Sync Arduino clock to the time received on the serial port
}
}
}
Só que esta função pelo que eu entendo transforma 10 caracteres ascii numa data e o que eu queria era que por exemplo ao escrever no serial monitor 23:10:00 12/12/2012
acertasse a hora, e nao como eles têm.
Obrigado pelas rápidas respostas.
Cumprimentos
-
uma duvida isso vais estar sempre ligado a um pc ? (ou seja para realizar a comunicação com o visual basic ?)
-
Vai estar sempre ligado ao pc, mas se desligares o pc o objectivo é que ele continue a funcionar, daí eu precisar de fazer o relógio e as comparações no arduino. Ou seja, marcamos uma hora com o pc para ele regar, e mesmo despois do pc desligado, o objectivo é ele continuar a funcionar. Mas eu pra já apenas queria era fazer o relógio com o TimeSerial e conseguir acerta-lo.
Cumprimentos
-
Boas
Consegui resolver o primeiro problema: ou seja, tennho um relógio e consigo programa-lo pelo serial monitor:
#include <Time.h>
String readString;
void setup() {
Serial.begin(9600);
Serial.println("Waiting for sync message");
}
void loop(){
if(Serial.available() )
{
processSyncMessage();
}
delay(1000);
digitalClockDisplay();
}
void digitalClockDisplay(){
// digital clock display of the time
Serial.print(hour());
printDigits(minute());
printDigits(second());
Serial.print(" ");
Serial.print(day());
Serial.print(" ");
Serial.print(month());
Serial.print(" ");
Serial.print(year());
Serial.println();
}
void printDigits(int digits){
// utility function for digital clock display: prints preceding colon and leading 0
Serial.print(":");
if(digits < 10)
Serial.print('0');
Serial.print(digits);
}
void processSyncMessage() {
if(Serial.available() >= 8 ){
char number1[3] = { Serial.read(), Serial.read() , ':'};
Serial.read();//flush the delim
char number2[3] = { Serial.read(), Serial.read() , ':' };
Serial.read();//flush the delim
char number3[3] = { Serial.read(), Serial.read() , '-' };
Serial.read();//flush the delim
char number4[3] = { Serial.read(), Serial.read() , '/' };
Serial.read();//flush the delim
char number5[3] = { Serial.read(), Serial.read() , '/' };
Serial.read();//flush the delim
char number6[5] = { Serial.read(), Serial.read() , Serial.read(), Serial.read(), '\0' };
int number10=atoi(number1);
Serial.println(number10);
int number11=atoi(number2);
Serial.println(number11);
int number12=atoi(number3);
Serial.println(number12);
int number13=atoi(number4);
Serial.println(number13);
int number14=atoi(number5);
Serial.println(number14);
int number15=atoi(number6);
Serial.println(number15);
setTime(number10,number11,number12,number13,number14,number15);
}
}
e com este programa fico com este output:
0:00:17 1 1 1970
0:00:18 1 1 1970
0:00:19 1 1 1970
22
10
2
9
10
2011
22:10:03 9 10 2011
22:10:04 9 10 2011
22:10:05 9 10 2011
22:10:06 9 10 2011
O problema é que agora eu precisava de enviar uma string pelo visual basic ( ex: uma textbox) e depois precisava de guardar essa string para depois o programa inicializar com o novo horário.
Alguém tem alguma ideia ?
-
Acho que é melhor pores um botão (ou então mesmo no início do programa VB) com uma função que vê a hora do PC e envia-a para o Arduino.
-
Sim e eu coloquei um botão no VB. Só que eu nao quero enviar a hora do pc para o arduino, apenas quero enviar uma string que acerta a hora.
Porque eu já tenho um relógio em arduino, que começa por defeito em 1970. Só que interessa-me agora que seja o utilizador e acertar o relógio, a dizer a que horas é que o sistema activa a rega, essas coisas.. mas isso em VB, para ser mais fácil para o utilizador.
Só que já fiz uma pesquisa e não encontro nada de como enviar uma string do VB para o arduino.
-
Não sei se é bem isso que queres, mas não seria melhor acertar o relógio do Arduino com o do PC, e depois o utilizador dizia a que horas era para ligar? Horas estas que eram enviadas para o Arduino.
Quando ao enviar dados do VB.net para o Arduino, tens este tutorial aqui:
http://www.instructables.com/id/Using-Visual-Basic-to-control-Arduino-Uno/ (http://www.instructables.com/id/Using-Visual-Basic-to-control-Arduino-Uno/)
-
acho que primeiro tens de fazer a leitura do relógio do arduino para uma label no visual basic e depois enviar o acerto para la.
eu também tive este problema mas acabei por resolver, sem querer eu comprei um Magalhães 10€ liguei la o arduino e estou a fazer uma aplicação com as comunicações serial e tcp/ip este é para depois comunicar com uma web form, e os tempos é dado pela minha aplicação em vb como esta sempre ligado
-
Para não estares sempre preocupado a ver a porta a que o arduino está ligado podes através da função Serialportx.getportnames() (não tenho a certeza se é assim, mas é algo parecido) e obter todas as portas seriais ligadas ao computador. Depois com um for loop envias para todas as portas um byte qualquer ou vários bytes.
Programas o arduino para quando receber x byte ou x bytes enviar outro byte/s de resposta e o software que criares vai identificar a porta a que o arduino está ligado assim. No outro dia fiz isto e ficou fixe, detectava sempre a porta. Acho que não guardei o código, mas não é complicado.
-
Boas pessoal
Com as vossas sugestões estive a tentar concluir este problema mas não consegui.
O que eu queria para já, era enviar uma data e hora pelo Visual basic usando a porta série, e depois, usando o serial monitor do arduino, verificar se o meu relógio fica ou não acertado. Pelo que percebi é impossível, pois vai-me dar conflitos entre portas.
Porque como estou com o serial monitor aberto, ao carregar no botao que supostamente envia a hora do textbox ele da-me logo erro de conflitos de porta.
Alguém tem alguma solução para isto ?
Deixo aqui os dois programas de teste que estive a fazer:
VB
Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
SerialPort1.Close()
SerialPort1.BaudRate = 9600
SerialPort1.DataBits = 8
SerialPort1.StopBits = IO.Ports.StopBits.One
SerialPort1.Parity = IO.Ports.Parity.None
SerialPort1.PortName = "COM7"
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim horario As String
horario = TextBox1.Text
SerialPort1.Open()
SerialPort1.Write("horario")
SerialPort1.Close()
End Sub
End Class
----------------------------------------------------------------//------------------------------------------------------------
ARDUINO
void setup() {
Serial.begin(9600);
Serial.println("Waiting for sync message");
}
void loop(){
if(Serial.available() )
{
int val= Serial.read() - '0';
Serial.println(val);
}
Serial.flush();
}
PEDROCK: o toturial que me deste tá muito porreiro, mas o gajo diz mesmo que para conseguir correr os programas, teve de deixar o serial monitor desligado, senao dáva conflitos.
Se alguém tiver alguma sugestão como dar a volta a isto agradecia.
Cumprimentos
-
porta fechada
SerialPort1.Close()
mete em open ou primeiro fecha e abre a seguir
-
Não podes ter duas aplicações a aceder á mesma porta COM/serial, porque é que não lês o tempo no programa em VB ou então envias tudo pelo Monitor Serial, se bem que esse monitor não é grande coisa.
-
Se criares uma richtextbox e criares um sub para quando houver informação para ler na serial port podes mostrar a informação numa richtextbox. Não podes ter 2 programas abertos a usar a mesma serial port.
EDIT: Podes usar Serialportx.write(). Dá para enviares bytes assim, ou seja, valores entre 0 e 255. O arduino vai ler também valores entre 0 e 255. Assim não tens de subtrair 48 ou '0'. Como as horas e datas não ultrapassam valores de 255...
-
Mas eu no VB abri primeiro a porta e depois fechei .
Eu pra já só queria ver no serial monitor porque eu prefiro fazer a programação por passos. No final é pra ficar tudo visivel no VB.
Se puderem pegar nos meus exemplos e exemplificarem por favor, nao estou a perceber muito bem o porquê de isto funcionar, se eu abro a porta e depois fecho.
-
posta aí uns print screens do teu interface e da evoluçao do projecto para irmos regalando os olhos! ::)
ja agora pk n metes um RTC ou entao um receptor do sinal atomico europeu? terias smp as horas certas!
-
Porque é um projecto de faculdade, e nao dá pa gastar muito dinheiro. Acaba por nao ser importante ter as horas completamente certas.
Ainda nao tá acabado, mas fica aí o que tenho pra já. Os tomates e pimentos são apenas ilustrativos lol
-
fiz isto para de explicar
ve o anexo
espero que ajude
-
Obrigado SextaFeira. Diz-me só uma coisa, como fizeste para abrires a ' private sub Form1_FormClosed' ?
-
Obrigado SextaFeira. Diz-me só uma coisa, como fizeste para abrires a ' private sub Form1_FormClosed' ?
É um evento. Nessa imagem, em cima, onde diz "Button2", clica aí e escolhe Form1. À direita, onde na imagem diz "Click", escolhe "FormClosed".
-
SextaFeira eu testei o teu programa. E pelo que percebi, enviamos informação pela porta serie do textbox 3 para o textbox2 certo ?
O que eu precisava era de quando enviasse a string da hora para o arduino, ele guardasse essa string, e depois podia ser com o VB desligado, o relógio em arduino começasse da hora que foi inserida pelo VB. É possível isto ?
Porque eu nunca vou usar o serial monitor do arduino, só preciso é que ele tenha um relógio sempre a funcionar, e que as ordens sejam dadas pelo VB, por exemplo: quero que ligue um led ás 22h de hoje, digito as 22h no VB, desligo o computador, e o arduino as 22h liga o LED.
Desculpem se nao estou a ser muito claro.
-
Dá uma vista de olhos no código que usei para o transmissor:
http://lusorobotica.com/index.php?topic=5125.0 (http://lusorobotica.com/index.php?topic=5125.0)
Enviavas uma string pelo serial monitor e a string era guardada no arduino. Não sei se ajuda alguma coisa.
-
Pois, eu pelo serial monitor consigo enviar uma string e imprimi-la, pelo VB é que não, porque só sei fazer pelo exemplo que o PEDROCK me deu daquele toturial, que faz o envio mas nao posso abrir o serial monitor. Eu gostava de saber se é possível enviar a string pelo VB, guarda-la no arduino, fechar o VB, e abrir o serial monitor do arduino e o relógio começar a dar com a string que foi guardada.
-
Possível é... Se leres o código que eu meti para o transmissor vês uma forma de guardar todos os bytes que envias pelo vb numa char array.
Depois abres o serial monitor, e se tiveres programado o arduino para se por exemplo receber um byte qualquer te enviar a string que tinha guardada...
Lembrei-me agora que quando abres o serial monitor do arduino IDE o arduino faz reset, portanto esquece esse serial monitor, tenta arranjar outro software para isso. Ou então podes fazer no vb como já te disseram...
-
Pois, também já tinha lido que o serial monitor faz reset ao arduino. Vou tentar enviar as horas para o VB então.
-
a text 3 é para envio
a text 2 le esta associada a um timer que esta sempre a ler a porta serial o que la cair aparece na text 2
envia em separado 2 mais 2 que ira fazer 22
Serial.write 2
Serial.write 2
depois no arduino fazes duas variáveis e colocas o 2 numa e outro noutra variável e depois fazes a soma das duas e guardas
ideia estúpida mas pode ser que resulte
-
Porque é um projecto de faculdade, e nao dá pa gastar muito dinheiro.
danuca,
Não leves a mal o pessoal insistir mas já viste o preço de um RTC?
http://www.dealextreme.com/p/i2c-rtc-ds1307-24c32-real-time-clock-module-for-arduino-blue-149493?item=4 (http://www.dealextreme.com/p/i2c-rtc-ds1307-24c32-real-time-clock-module-for-arduino-blue-149493?item=4)
-
Pois, também já tinha lido que o serial monitor faz reset ao arduino. Vou tentar enviar as horas para o VB então.
Podes ter sempre um cartão de memória ligado ao arduino e em vez de guardar no arduino guardas num .txt dentro do cartão depois e só fazer o read() do cartão para o arduino, e mesmo que o arduino faça reset tens lá sempre os dados no cartão...
-
Mas o tempo não aumenta enquanto o arduino está a fazer reset, fica logo com o tempo errado.
O mais facil é mesmo usar um rtc, até pode pedir uma amostra, compra a pilha e o cristal e gasta 1€.
-
Eu vou falar com o meu prof mas em principio nao vai dar.
Eu agora estou a ler no VB a hora do arduino, apesar de ainda nao estar a conseguir ler os valores correctos, mas acho que nao vou conseguir acertar isto :S
-
Mas o tempo não aumenta enquanto o arduino está a fazer reset, fica logo com o tempo errado.
O mais facil é mesmo usar um rtc, até pode pedir uma amostra, compra a pilha e o cristal e gasta 1€.
Esqueci-me desse pormenor...
Um pouco fora de comum, sabendo o tempo de reset do arduino nao dava para "acertar" as horas sempre que ele fizesse reset??
-
Mas o tempo não aumenta enquanto o arduino está a fazer reset, fica logo com o tempo errado.
O mais facil é mesmo usar um rtc, até pode pedir uma amostra, compra a pilha e o cristal e gasta 1€.
Esqueci-me desse pormenor...
Um pouco fora de comum, sabendo o tempo de reset do arduino nao dava para "acertar" as horas sempre que ele fizesse reset??
E como sabes se foi um simples reset ou se esteve desligado durante 12h?
-
Não sei zordlyon mas talvez funcionasse.
Mas eu neste momento queria era ter isto a funcionar. Vou deixar aqui em anexo o meu programa arduino e VB 2010.
Tenho uma label no VB que deveria ler as horas, mas nem sempre lê bem, por exemplo depois de ligado fica a ler, mas passado cerca de 2 min desaparece, ou entao aparecem caracteres estranhos.
O botao que tenho no VB é para acertar a hora que é digitada na única textbox que lá tenho, mas nao estou a conseguir pôr a dar.
Se alguém tiver um tempinho e possa dar uma vista de olhos no meu programa agradecia.
É que depois de eu conseguir acertar a hora, penso que depois será mais fácil receber outros valores para accionar a rega e assim, se alguém me puder ajudar era fantástico.
-
Acho que estão a complicar isto um bocado...
Se não pode usar RTC, usa a biblioteca Time, que é acertada pelo PC.
Depois o PC envia a que horas é que é para ligar e o Arduino guarda essa informação.
O Arduino vai verificando se já chegou a essa hora, e caso sim, liga a rega.
EDIT:
Estive a ver o teu código...
SerialPort1.Write("TextBox1.Text") ::) Tira as aspas.
e
System.Threading.Thread.Sleep(250) num timer...
EDIT2:
E tem vários problemas.
Abres o serial no início e fechas no fim, mas durante o programa estás sempre a abri-las e fechá-las. Isso está mal. E não precisas disto: System.Threading.Thread.Sleep(250) se tirares os SerialPort1.Open() e SerialPort1.Close(), mas tens que fazer umas alterações...
EDIT3:
O programa do Arduino também não está bem. O que é isto?:
Serial.read();//flush the delim
-
Mas o tempo não aumenta enquanto o arduino está a fazer reset, fica logo com o tempo errado.
O mais facil é mesmo usar um rtc, até pode pedir uma amostra, compra a pilha e o cristal e gasta 1€.
Esqueci-me desse pormenor...
Um pouco fora de comum, sabendo o tempo de reset do arduino nao dava para "acertar" as horas sempre que ele fizesse reset??
E como sabes se foi um simples reset ou se esteve desligado durante 12h?
True...esquece lá a ideia...há coisas que mais valia a pena estarmos calados... ;D
-
PEDROCK: desde já obrigado pela disponibilidade. Esta linha no arduino 'Serial.read();//flush the delim' eu nao sei o que faz, só sei que se correres o programo arduino que eu enviei, e se meteres por exemplo:22:22:12-01/02/1992' no serial monitor, ele acerta as horas, no entanto se tirar isso como disseste já nao dá.
Em relação ao VB, eu preciso mesmo de abrir e fechar as portas porque eu nao quero estar sempre a enviar os mesmos caracteres pelo SerialPort, porque se vires nas imagens que eu deixei, a form4 vai ter várias funções, ou seja acho que vou ter de estar sempre a abrir e fechar o SerialPort, mas não tenho a certeza.
Tirei as aspas no SerialPort1.Write("TextBox1.Text") mas continuo sem conseguir valores nenhuns, e o mais estranho é a label nao receber correctamente os valores da hora default.
Mas diz-me o que achas que tenho de mudar para pôr isto a dar.
-
Esse serial.read() serve para "comer" os caracteres que usas como delimitador de cada valor, ou seja os : / e - que não são numeros, é uma maneira um bocado feia de fazer isso..
Isso resolve-se numa linha usando o sscanf, recebes a string toda e parsas com o scanf e ficas logo com os valores todos separados em variaveis.
-
Boas novamente pessoal
Sei que já é um bocado tarde, mas consegui agora o que queria para já. Ou seja, tenho o relógio no arduino sempre a funcionar, consigo envia-lo para o VB, e consigo alterar a hora no VB.
Com as dicas do PEDROCK e mudando a linha do VB ' ReadExisting' para 'Readline' consegui pôr a dar.
Deixo aqui os dois programas para quem quiser ver ou experimentar.
Em principio terei mais problemas antes de acabar o projecto, por isso devo vir aqui chatear a cabeça ao pessoal.
Obrigado pela ajuda .
-
Boas pessoal
Como eu calculei, vou precisar novamente da vossa ajuda se puderem.
Se ainda se lembram, eu neste momento consigo ler o relógio do arduino no VB, e acerta-lo no VB.
Adicionei uma nova textbox e um novo botao, para enviar um horário e ligar um led quando esse horário coincidisse com a hora actual. O problema é que como estou a usar muito o serial read, isto está uma confusão. O que me está a acontecer quando envio o novo horário para ligar o LED, é que ele assume o serial read, e corrige a hora.
Alguém tem uma ideia para o novo horário apenas servir de comparação com o horário actual ?
código VB
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
SerialPort1.Open()
SerialPort1.Write("c")
SerialPort1.Write(TextBox2.Text)
SerialPort1.Close()
End Sub
End Class
-----------------//--------------------
ARDUINO
#include <Time.h>
String readString;
int ledPin=13;
void setup() {
Serial.begin(9600);
//Serial.println("Waiting for sync message");
pinMode(ledPin,OUTPUT);
digitalWrite(ledPin,LOW);
}
void loop(){
char on_sensor = 'n';
if(Serial.available()>0)
{
on_sensor=Serial.read();
}
if(on_sensor == 'c')
{
time_t t= now();
char on_rega[20] = { Serial.read(), Serial.read() , ':',Serial.read(), Serial.read() , ':', Serial.read(), Serial.read() , '-', Serial.read(), Serial.read() , '/', Serial.read(), Serial.read() , '/',Serial.read(), Serial.read() , Serial.read(), Serial.read() };
if (on_rega[20] == t)
{
digitalWrite(ledPin,HIGH);
}
}
(...)
Obrigado
-
eu fiz assim
criei duas variáveis,
envio o "R" para a porta e o arduino fica em modo de read só lê a serial.
envio o "W" para a porta e o arduino fica em modo write, ou seja faz os serial prints e writes mas não le
isto eu fiz para a configuração de um delay para poder variar o tempo pelo vb e chamar diferentes sub rotinas.
os read é só para ler as entradas e etc.
poderá existir outras formas, mas de arduino não percebo nada...um exemplo era enviar para serial "W800"
em que W serial de write e os "800" para a variável, para isso serial necessário um split ou mid qualquer assim. xD
-
Mas o problema é que eu estou sempre a enviar as horas actuais, e dá conflito com a hora que eu quero enviar para regar. A minha prof sugeriu comprar um RTC:
http://pt.farnell.com/microchip/mcp7940m-i-ms/rtc-i2c-64bytes-sram-8msop/dp/2098889?in_merch=Produtos%20novos&MER=i-9b10-00002068 (http://pt.farnell.com/microchip/mcp7940m-i-ms/rtc-i2c-64bytes-sram-8msop/dp/2098889?in_merch=Produtos%20novos&MER=i-9b10-00002068)
Sabem onde posso comprar um deste género ?
Alguém já trabalhou com algum destes RTC e com arduino ?
Cumps
-
Mas o problema é que eu estou sempre a enviar as horas actuais, e dá conflito com a hora que eu quero enviar para regar. A minha prof sugeriu comprar um RTC:
http://pt.farnell.com/microchip/mcp7940m-i-ms/rtc-i2c-64bytes-sram-8msop/dp/2098889?in_merch=Produtos%20novos&MER=i-9b10-00002068 (http://pt.farnell.com/microchip/mcp7940m-i-ms/rtc-i2c-64bytes-sram-8msop/dp/2098889?in_merch=Produtos%20novos&MER=i-9b10-00002068)
Sabem onde posso comprar um deste género ?
Alguém já trabalhou com algum destes RTC e com arduino ?
Cumps
fala com a G7, eles têem lá outro parecido mas que tem muito código espalhado na internet já feito.
-
ASENA: estás a falar deste correcto ?
http://www.g7electronica.net/pt/ics/329-ds1307.html (http://www.g7electronica.net/pt/ics/329-ds1307.html)
-
ASENA: estás a falar deste correcto ?
http://www.g7electronica.net/pt/ics/329-ds1307.html (http://www.g7electronica.net/pt/ics/329-ds1307.html)
correcto.
-
Boas pessoal
Como foi sugerido por voces, comprei um módulo RTC ds1307.
Experimentei vários códigos hoje, inclusive um de um toturial que estava aqui do tr3s, e tenho sempre o mesmo output, e nao consigo perceber porquê.
EX1:
45:85:85 165/45/2165
45:85:85 165/45/2165
45:85:85 165/45/2165
45:85:85 165/45/2165
45:85:85 165/45/2165
45:85:85 165/45/2165
45:85:85 165/45/2165
45:85:85 165/45/2165
45:85:85 165/45/2165
Ex2:
Sao: 45:85:85 DiaDeSaoNunca-feira dia 45 de Oufevulhosto de 2165
Sao: 45:85:85 DiaDeSaoNunca-feira dia 45 de Oufevulhosto de 2165
Sao: 45:85:85 DiaDeSaoNunca-feira dia 45 de Oufevulhosto de 2165
Sao: 45:85:85 DiaDeSaoNunca-feira dia 45 de Oufevulhosto de 2165
Sao: 45:85:85 DiaDeSaoNunca-feira dia 45 de Oufevulhosto de 2165
Sao: 45:85:85 DiaDeSaoNunca-feira dia 45 de Oufevulhosto de 2165
Sao: 45:85:85 DiaDeSaoNunca-feira dia 45 de Oufevulhosto de 2165
Sao: 45:85:85 DiaDeSaoNunca-feira dia 45 de Oufevulhosto de 2165
Sao: 45:85:85 DiaDeSaoNunca-feira dia 45 de Oufevulhosto de 2165
Sao: 45:85:85 DiaDeSaoNunca-feira dia 45 de Oufevulhosto de 2165
Acho um bocado estranho darem exactamente os mesmos valores, além disso o tempo nunca é incrementado em todos os programas que experimentei, por isso certamente nao será dos programas. Alguém tem alguma ideia ?
Cumps
-
Boas pessoal
Como foi sugerido por voces, comprei um módulo RTC ds1307.
Experimentei vários códigos hoje, inclusive um de um toturial que estava aqui do tr3s, e tenho sempre o mesmo output, e nao consigo perceber porquê.
EX1:
45:85:85 165/45/2165
45:85:85 165/45/2165
45:85:85 165/45/2165
45:85:85 165/45/2165
45:85:85 165/45/2165
45:85:85 165/45/2165
45:85:85 165/45/2165
45:85:85 165/45/2165
45:85:85 165/45/2165
Ex2:
Sao: 45:85:85 DiaDeSaoNunca-feira dia 45 de Oufevulhosto de 2165
Sao: 45:85:85 DiaDeSaoNunca-feira dia 45 de Oufevulhosto de 2165
Sao: 45:85:85 DiaDeSaoNunca-feira dia 45 de Oufevulhosto de 2165
Sao: 45:85:85 DiaDeSaoNunca-feira dia 45 de Oufevulhosto de 2165
Sao: 45:85:85 DiaDeSaoNunca-feira dia 45 de Oufevulhosto de 2165
Sao: 45:85:85 DiaDeSaoNunca-feira dia 45 de Oufevulhosto de 2165
Sao: 45:85:85 DiaDeSaoNunca-feira dia 45 de Oufevulhosto de 2165
Sao: 45:85:85 DiaDeSaoNunca-feira dia 45 de Oufevulhosto de 2165
Sao: 45:85:85 DiaDeSaoNunca-feira dia 45 de Oufevulhosto de 2165
Sao: 45:85:85 DiaDeSaoNunca-feira dia 45 de Oufevulhosto de 2165
Acho um bocado estranho darem exactamente os mesmos valores, além disso o tempo nunca é incrementado em todos os programas que experimentei, por isso certamente nao será dos programas. Alguém tem alguma ideia ?
Cumps
# Já acertaste as horas no chip? Esses valores podem estar a "crashar" a lógica interna e pode ser por isso que ele não incrementa.
# Tens que ligar o oscilador interno, para ele começar a contar o tempo. Datasheet explica tudo.
-
Como é que tens isso ligado?
Já usei a biblioteca da Adafruit, com tutorial, aqui:
http://www.ladyada.net/learn/breakoutplus/ds1307rtc.html (http://www.ladyada.net/learn/breakoutplus/ds1307rtc.html)
-
Já estive a ver o datasheet:
The contents of the time and calendar registers are in the BCD format. Bit 7 of register 0
is the clock halt (CH) bit. When this bit is set to a 1, the oscillator is disabled. When cleared to a 0, the
oscillator is enabled.
Please note that the initial power-on state of all registers is not defined. Therefore, it is important
to enable the oscillator (CH bit = 0) during initial configuration.
MAs eu acho que o toturial do tr3s faz enable ao oscilador...
Liguei exactamente como neste toturial:
http://www.glacialwanderer.com/hobbyrobotics/?p=12 (http://www.glacialwanderer.com/hobbyrobotics/?p=12)
-
Mas compraste o chip, ou uma placa com o chip soldado, com o cristal, condensador de decoupling e suporte de bateria?
-
Comprei a placa toda, com ship cristal bateria..
o toturial faz enable ao CH:
if(v<60 && v>-1){ // Desta forma consegue-se manter o clock actual
§byte state=rtc_bcd[DS1307_SEG] & DS1307_CLOCKHALT;
-
Cheira-me a bugs pelo código..
Que simbolo é este:
§
Está no inicio da segunda linha.
-
Esse símbolo foi um erro meu a copiar, desculpa.
Eu usei o código do tr3s, toda a gente tava a dizer que dava, pra mim o mais estranho é o relógio nem sequer incrementar..
-
senso:
Com essa biblioteca o output muda realmente, mas ainda fica pior:
Ì¥ÚáÆcF³?)Ô§ÂÃB'©ä"åKMÉSÀcBsèAaùRL¡«9?âöâ ItùRLå¯9?âÖâ I È"çKMÉSÈcbsèA2M?ù7¸YÙ3/&ÂâB:'Ï+»ù"Y£Á;Ðbbr
Aconteceu-te isto ?
-
Já descobri. O baudrate estava mal
Mas tenhos os mesmos valores que os outros programas :s
2165/165/165 165:165:85
since midnight 1/1/1970 = 1402703185s = 16234d
now + 7d + 30s: 2014/6/20 23:46:55
-
De onde compras-te a placa, manda link e tira umas fotos, tens os pull-ups nas linhas do i2c?
-
http://www.ebay.com/itm/5V-I2C-RTC-DS1307-module-/270992195070?pt=UK_BOI_Electrical_Components_Supplies_ET&hash=item3f1864bdfe (http://www.ebay.com/itm/5V-I2C-RTC-DS1307-module-/270992195070?pt=UK_BOI_Electrical_Components_Supplies_ET&hash=item3f1864bdfe)
Sim tenho duas resistencias de 2,2k. e já utilizei também de 4.7k
-
Nenhuma das patas do cristal está partida?
Como está solto(pelo menos nas fotos), pode-se ter partido com vibração, e já agora, experimenta tirar a bateria e desligar o rtc da alimentação durante uns minutos, pode ter a bateria descarregada e ter ficado nalgum estado estranho.
-
Não, está impecável.
Tirei a bateria, e fiz o upload sem a pilha e tenho este output:
Sao: 23:15:0 Quinta-feira dia 12 de Marco de 2009
Sao: 0:0:0 Segunda-feira dia 1 de Fevereiro de 2000
Sao: 0:0:0 Segunda-feira dia 1 de Fevereiro de 2000
Sao: 0:0:0 Segunda-feira dia 1 de Fevereiro de 2000
Sao: 0:0:0 Segunda-feira dia 1 de Fevereiro de 2000
Sao: 0:0:0 Segunda-feira dia 1 de Fevereiro de 2000
Sao: 0:0:0 Segunda-feira dia 1 de Fevereiro de 2000
Sao: 0:0:0 Segunda-feira dia 1 de Fevereiro de 2000
mas depois volto a por a pilha e volta ao mesmo output de á bocado :s
-
Mostra o teu código sff, o primeiro print é da hora de compilação se estás a usar a biblioteca da Adafruit, depois disso faz reset, portanto algo deve estar errado no código, mede a voltagem da bateria e não a montes, porque o rtc só precisa dela para continuar a funcionar se perder a alimentação principal, se volta ao estado estranho, a bateria deve estar morta.
-
// Date and time functions using a DS1307 RTC connected via I2C and Wire lib
#include <Wire.h>
#include "RTClib.h"
RTC_DS1307 RTC;
void setup () {
Serial.begin(9600);
Wire.begin();
RTC.begin();
if (! RTC.isrunning()) {
Serial.println("RTC is NOT running!");
// following line sets the RTC to the date & time this sketch was compiled
RTC.adjust(DateTime(__DATE__, __TIME__));
}
}
void loop () {
DateTime now = RTC.now();
Serial.print(now.year(), DEC);
Serial.print('/');
Serial.print(now.month(), DEC);
Serial.print('/');
Serial.print(now.day(), DEC);
Serial.print(' ');
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
Serial.print(':');
Serial.print(now.second(), DEC);
Serial.println();
Serial.print(" since midnight 1/1/1970 = ");
Serial.print(now.unixtime());
Serial.print("s = ");
Serial.print(now.unixtime() / 86400L);
Serial.println("d");
// calculate a date which is 7 days and 30 seconds into the future
DateTime future (now.unixtime() + 7 * 86400L + 30);
Serial.print(" now + 7d + 30s: ");
Serial.print(future.year(), DEC);
Serial.print('/');
Serial.print(future.month(), DEC);
Serial.print('/');
Serial.print(future.day(), DEC);
Serial.print(' ');
Serial.print(future.hour(), DEC);
Serial.print(':');
Serial.print(future.minute(), DEC);
Serial.print(':');
Serial.print(future.second(), DEC);
Serial.println();
Serial.println();
delay(3000);
}
OUTPUT sem a pilha:
RTC is NOT running!
2012/9/13 2:49:16
since midnight 1/1/1970 = 1347504556s = 15596d
now + 7d + 30s: 2012/9/20 2:49:46
2000/1/1 0:0:0
since midnight 1/1/1970 = 946684800s = 10957d
now + 7d + 30s: 2000/1/8 0:0:30
2000/1/1 0:0:0
since midnight 1/1/1970 = 946684800s = 10957d
now + 7d + 30s: 2000/1/8 0:0:30
2000/1/1 0:0:0
since midnight 1/1/1970 = 946684800s = 10957d
now + 7d + 30s: 2000/1/8 0:0:30
2000/1/1 0:0:0
since midnight 1/1/1970 = 946684800s = 10957d
now + 7d + 30s: 2000/1/8 0:0:30
É mesmo estranho porque o primeiro print ele fica com a hora actual
-
Senso: a bateria tem 3,2V por isso está boa :S
-
Descobri o erro. Soldei mal a perna do GND, testei com o multimetro e vi que nao estavam em contacto. Agora todos os programas funcionam.
Mais uma vez obrigado pelas ajudas.
Cumps
-
Pessoal, tenho outra dúvida. Já tenho o relógio a funcionar, as horas no Visual Basic, e consigo por a ligar um LED á hora que quiser.
Agora eu queria que passado x tempo, em x é dado pelo utilizador( ou seja pelo VB, tem uma textbox e um botao), o led desligasse, e simulasse o final da rega.
Alguém tem alguma ideia ?
Vou deixar os dois códigos que tou a usar:
VB:
Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
SerialPort1.BaudRate = 9600
SerialPort1.DataBits = 8
SerialPort1.StopBits = IO.Ports.StopBits.One
SerialPort1.Parity = IO.Ports.Parity.None
SerialPort1.PortName = "COM7"
Timer1.Enabled = True
End Sub
Private Sub Label1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Label1.Click
End Sub
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
SerialPort1.Open()
'SerialPort1.Write("a")
'System.Threading.Thread.Sleep(250)
Dim i As String = SerialPort1.ReadLine
Label1.Text = i
ListBox1.Items.Add(i)
SerialPort1.Close()
End Sub
Private Sub TextBox2_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox2.TextChanged
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
SerialPort1.Open()
SerialPort1.Write(TextBox2.Text)
SerialPort1.Close()
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
SerialPort1.Open()
SerialPort1.Write(TextBox1.Text)
SerialPort1.Close()
End Sub
End Class
-------------------------------//-----------------------------------
ARDUINO:#include <Wire.h> // Para a EEPROM 24LC256 DS1621 DS1307 e dispositivos i2c
#define HORAS 2 // S?o os mesmos valores que est?o definidos no ficheiro ds1307.pde, os de offset
#define MINUTOS 1
#define SEGUNDOS 0
#define DIASEMANA 3 // QUAL ? O MELHOR N?MERO? :D
#define DIAMES 4
#define MES 5
#define ANO 6
int horas2;
int minutos2;
int segundos2;
int ledPin=13;
int HORAS3;
int MINUTOS3;
int SEGUNDOS3;
void setup(void){
Serial.begin(9600); // Valor pequeno mas bom, eu gosto assim :D
Wire.begin(); // Iniciar liga??es i2c - IMPORTANT?SSIMO
//ds1307setup(); // Se for a primeira vez que o RTC ? iniciado/ligado esta chamada ? necess?ria para o RTC come?ar a contar
pinMode(ledPin,OUTPUT);
digitalWrite(ledPin,LOW);
}
void loop(){
printData();
delay(1000);
if(Serial.available()>0)
{
char horas[3] = { Serial.read(), Serial.read(), ':'};
Serial.read();
horas2=atoi(horas);
Serial.println(horas2);
char minutos[3] = { Serial.read(), Serial.read(), ':'};
Serial.read();
minutos2=atoi(minutos);
Serial.println(minutos2);
char segundos[3] = { Serial.read(), Serial.read(), ':'};
Serial.read();
segundos2=atoi(segundos);
Serial.println(segundos2);
}
if(horas2==HORAS3 && minutos2==MINUTOS3 && minutos2==SEGUNDOS3){
digitalWrite(ledPin,HIGH);}
}
void printData(){
int rtc[7];
ds1307get(rtc,true);
Serial.print("Sao: ");
HORAS3=rtc[HORAS];
Serial.print(HORAS3,DEC);
Serial.print(":");
MINUTOS3=rtc[MINUTOS];
Serial.print(MINUTOS3,DEC);
Serial.print(":");
SEGUNDOS3=rtc[SEGUNDOS];
Serial.print(SEGUNDOS3,DEC);
/*switch(rtc[DIASEMANA]){
case 0:Serial.print(" Domingo"); break;
case 1:Serial.print(" Segunda-feira"); break;
case 2:Serial.print(" Ter?a-feira"); break;
case 3:Serial.print(" Quarta-feira"); break;
case 4:Serial.print(" Quinta-feira"); break;
case 5:Serial.print(" Sexta-feira"); break;
case 6:Serial.print(" Sabado"); break;
default:Serial.print(" DiaDeSaoNunca-feira");
}*/
Serial.print(" dia ");
Serial.print(rtc[DIAMES]);
Serial.print(" de");
switch(rtc[MES]){
case 0:Serial.print(" Janeiro"); break;
case 1:Serial.print(" Fevereiro"); break;
case 2:Serial.print(" Marco"); break;
case 3:Serial.print(" Abril"); break;
case 4:Serial.print(" Maio"); break;
case 5:Serial.print(" Junho"); break;
case 6:Serial.print(" Julho"); break;
case 7:Serial.print(" Agosto"); break;
case 8:Serial.print(" Setembro"); break;
case 9:Serial.print(" Outubro"); break;
case 10:Serial.print(" Novembro"); break;
case 11:Serial.print(" Dezembro"); break;
default:Serial.print(" Oufevulhosto");
}
Serial.print(" de ");
Serial.println(rtc[ANO],DEC);
}
Cumps