desktop

Extraer hora y fecha del PC (Windows)

Hola, buenas a todos.

Supongo que todos conoceréis el RTC DS1307. Mi intención es integrarlo en un proyecto para contar con la información temporal. Pero bueno, vamos al grano.

Me gustaría saber cómo puedo hacer para extraer la fecha y hora del PC (la de Windows), de esta forma puedo poner un trozo de código inicial en el que la hora se sincronice adecuadamente sin necesidad de configurar unos parámetros iniciales y tener que compilar el código a la de 1, a la de 2 y a la de... tres!

Antes de que me salten al cuello, he estado googleando por ahí. He visto que existe una librería Time.h en Arduino, pero no tiene nada que ver con la de C++. En este caso, la librería Time.h cuenta con una serie de funciones que permiten jugar con la hora interna DEL ARDUINO, en lugar de la del PC. Arduino cuenta con un reloj interno que se reinicia cada vez que recibe la alimentación por primera vez (obviamente sólo funciona cuando está alimentado). Y yo ni sabía que Arduino tenía un reloj interno...

Bueno, si se os ocurre alguna forma de extraer la hora del PC os estaría muy agradecidos. Ya sea por puerto serie o similar. La verdad es que no tengo muy claro cómo comunicar el Arduino. Supongo que habrá que hacer un programa (en Qt por ejemplo) para recibir y enviar paquetes y ahí establecer un mini protocolo de comunicación con la hora y fecha.

Gracias de antemano.

Un saludo. ...
 
pues lo puedes hacer por puerto serie desde vb6 solo pones por ejemplo
Código:
    Text1.Text = Time + Date
    Text1.Text = Format(Text1.Text, "HH:mm:ss MM,dd,yyyy")
ya con eso obtienes y le das formato de tiempo horas, minutos y segundos, mes, dia y año puedes omitir lo de dia, mes y año si no lo ocupas, esto lo puedes guardar en una variable y ya depues solo la mandas por serial.
 
no se en que estas programando si en el arcaico y dinosaurico DEV C++

o en visual C++

en visual studio tenemos una herramienta llamada dateTimePicker
que es parecido al SerialPort o al ColorDialog pero este no es visible solo es un objeto que sera llamado en nuestro programa.
yo declare unas variables globales llamadas hora, minuto,etc.
que despues las envie por USB a un pic18f2550 con un DS1320 algo parecido a lo que andas haciendo


Código:
[COLOR="Red"][B]
       hora		= dateTimePicker1->Value.Hour;
	minuto	= dateTimePicker1->Value.Minute;
	segundo	= dateTimePicker1->Value.Second;
	dia		= dateTimePicker1->Value.Day;
	mes		= dateTimePicker1->Value.Month;
	año		= dateTimePicker1->Value.Year-2000;[/B][/COLOR]

asi de facil se obtiene lecutras de cada uno de los elementos.

respecto al arduino

que yo sepa esos ATmega no tienen reloj interno lo que puede que pase es que alguien hiso una libreria y tenga un calendario reloj pero a software



otra respecto al protocolo es muy facil

envias una cantidad de bytes definidas digamos 10 bytes

donde nuestro primer byte seleccionara un caso en particular y los 9 bytes restantes son informacion

solo haces un switch dentro del programa del micro
y en el programa de la PC envias un byte para el switch



ejemplo PC:

declaro un array buffer de 4 elementos NO te dire como pues debes averiguarlo ;)

Código:
byte[0] = 0x00;  // seleccionara el case en el switch del micro
byte[1]= hora;
byte[2]= minuto;
byte[3]= segundo;

enviar(byte,4);  //ejemplo burdo como enviar en el puerto serie es diferente la manera a enviar

byte[0] = 0x01;  // seleccionara el case en el switch del micro
byte[1]= PWM;
byte[2]= LED;
byte[3]= buzzer;

enviar(byte,4);  //ejemplo burdo como enviar en el puerto serie es diferente la manera a enviar


ejemplo de el lado de el micro:


switch(buffer[0])
{
case 0x00:
hora = buffer[1];
minuto = buffer[2];
segundo = buffer[3];

break;

case 0x01:

PWM = buffer[1];
LED = buffer[2];
buzzer = buffer[3];

break;
}
 
Última edición:
En primer lugar mil gracias por tu completa respuesta, TRILO-BYTE.

Uso Visual Studio, como dices. Y la verdad es que no conocía esa herramienta, pero me parece muy útil, así que muchas gracias, la probaré.

El código que pones para enviar datos es algo parecido a lo que quería hacer yo, con ese o cualquier otro protocolo, pero en esencia eso. El problema es que enviar datos por puerto serie me está dando más problemas de lo que pensaba... Estoy empleando el siguiente código (en Visual Studio):

Código:
#include <windows.h>
#include <iostream>

#define STRING_SIZE 100

using std::cout;
using std::cin;

int main()
{
	HANDLE hComPort;
	DWORD dwBytesWritten;
	DWORD dwBytesRead;
	DWORD dwBufferSize;
	TCHAR szBuffer[STRING_SIZE];

	dwBufferSize = sizeof(TCHAR) * STRING_SIZE;

	hComPort = CreateFile(_T("COM1:"),
		GENERIC_READ | GENERIC_WRITE, // solo pueden ser estos valores
		0,
		0,
		OPEN_EXISTING, // solo puede ser OPEN_EXISTING
		FILE_FLAG_OVERLAPPED,
		0);
	if (hComPort == INVALID_HANDLE_VALUE)
	{    // no se pudo abrir el puerto COM1:
		cout << "No se pudo abrir el puerto COM1." << endl;
	}
	else
	{
		// leer datos desde el puerto serial
		ReadFile(hComPort, szBuffer, dwBufferSize, &dwBufferRead, NULL);
		cout << "Se leyeron " << dwBufferRead << " bytes. " <<
			"Buffer: " << szBuffer << endl;

		// etcétera: podemos emplear WriteFile para escribir bytes.
	}

	// finalmente, cerramos el manejador
	CloseHandle(hComPort);

	return EXIT_SUCCESS;
}

Esto es un primer código de prueba, para poder probar la comunicación por puerto serie. En su debido momento lo adaptaré al envío de datos temporales.

El problema es que al intentar compilar me produce los siguientes errores:

Error 1 error C3861: '_T': no se encontró el identificador c:\users\emi\emi\otras cosas\arduino\códigos\reloj lectura sistema\enviarfechahora\enviarfechahora\enviarfechahora.cpp 19 1 EnviarFechaHora
Error 2 error C2065: 'endl' : identificador no declarado c:\users\emi\emi\otras cosas\arduino\códigos\reloj lectura sistema\enviarfechahora\enviarfechahora\enviarfechahora.cpp 28 1 EnviarFechaHora
Error 3 error C2065: 'dwBufferRead' : identificador no declarado c:\users\emi\emi\otras cosas\arduino\códigos\reloj lectura sistema\enviarfechahora\enviarfechahora\enviarfechahora.cpp 33 1 EnviarFechaHora
Error 4 error C2065: 'dwBufferRead' : identificador no declarado c:\users\emi\emi\otras cosas\arduino\códigos\reloj lectura sistema\enviarfechahora\enviarfechahora\enviarfechahora.cpp 34 1 EnviarFechaHora
Error 5 error C2065: 'endl' : identificador no declarado c:\users\emi\emi\otras cosas\arduino\códigos\reloj lectura sistema\enviarfechahora\enviarfechahora\enviarfechahora.cpp 35 1 EnviarFechaHora
6 IntelliSense: el identificador "_T" no está definido c:\Users\Emi\EMI\Otras cosas\Arduino\Códigos\Reloj lectura sistema\EnviarFechaHora\EnviarFechaHora\EnviarFechaHora.cpp 19 24 EnviarFechaHora
7 IntelliSense: el identificador "endl" no está definido c:\Users\Emi\EMI\Otras cosas\Arduino\Códigos\Reloj lectura sistema\EnviarFechaHora\EnviarFechaHora\EnviarFechaHora.cpp 28 49 EnviarFechaHora
8 IntelliSense: el identificador "dwBufferRead" no está definido c:\Users\Emi\EMI\Otras cosas\Arduino\Códigos\Reloj lectura sistema\EnviarFechaHora\EnviarFechaHora\EnviarFechaHora.cpp 33 47 EnviarFechaHora
9 IntelliSense: el identificador "endl" no está definido c:\Users\Emi\EMI\Otras cosas\Arduino\Códigos\Reloj lectura sistema\EnviarFechaHora\EnviarFechaHora\EnviarFechaHora.cpp 35 30 EnviarFechaHora

El código lo saqué de internet, trasteando un poco. En cuanto a los encabezados precompilados, lo tengo desactivado.

No sé de qué puede tratarse. La verdad es que no conozco muy bien las librerías de C++ para el envío de datos por puerto serie, pero todo lo que he probado me ha dado error.
 
Eso se ve que es modo consola, el Visual Studio soporta modo consola, pero eso se hace de manera diferente.

El código que pones es más parecido al DevC++ o Borland C5.

Si sé programar en Borland C++ y en Dev C++ pero a mitad del 2015 no tiene caso programar en modo consola.

Abre Visual Studio y en proyecto nuevo le das en aplicación para Windows, le das un nombre y se guarda.
Se genera un WIN FORM, le picas en el win form y se abre el código.

A partir de ahí debes empezar a programar.
 
Última edición por un moderador:
sin progrmar C ni basic con la consola de windows
o en un archivo .CMD
prueba esto

Código:
date /t > com1 
time /t> com1

si no funciona le falta un echo date /t > com1
 
Lo que tienes que hacer es abrir el ordenador, localizar en la placa, en alguno de los chips, cuál de ellos puede estar utilizando el protocolo i2C. Averigua qué pines son los que tienes que pinchar, y eso son los que tienes que conectar al Arduino. Algunas veces puedes localizar el propio chip que almacena esa información.

Luego, en el Arduino, instalas la biblioteca de i2c.h. Ahora tienes que averiguar el número de dispositivo que corresponde al del reloj en tiempo real de la placa.

Sí, ya sé que esto es muy lioso, complicado, y a veces, imposible (no hay información de esos chips de esa placa), pero, si lo consigues, podrías hacer como un amigo mío, que le puso el típico reloj con display de 7 segmentos, en el frontal del ordenador, y funcionaba incluso con el ordenador apagado.
 
:eek:

Tantas cosas fuera de lo que preguntó el colega, sólo quería sacar fecha y hora de Windows para enviarlo al arduino.

Tan [Término innecesariamente vulgar] fácil que es hacerlo con DateTimePicker, digo, si ya tiene Visual Studio.

Es tan fácil como una presentación de PODER PUNTO.

Enviar 1 byte en SerialPort es fácil, escribir 1 línea de texto es diferente a escribir 1 byte.
A mi me gusta enviar byte por byte, porque se tiene más control del la trama.

Ejemplo:

Aparato 1 responde con el símbolo #, aparato 2 responde con el símbolo $
Eso sería nuestro primer byte.

El byte 2 enviamos 1 byte que nos haga la función switch para escoger un case dentro de nuestro programa del micro, podría ser 0X00.
A partir de ahí podemos enviar N bytes definidos.

Ejemplo para 5 bytes definidos:

#0x000x010x020x03

En el ejemplo puse.

# Que nos va a seleccionar el aparato conectado "cómo si fuera nuestra IP :p tenemos 255 posibilidades"

0x01 Seleccionaré un case del switch, como es un char, va de 0x00 a 0xFF.
Los bytes restantes son información.

Si nuestra trama queremos que mida 32 bytes, le restamos los 2 bytes de selección.
Nos dan 30 bytes de información.

Bueno, eso es muy particular de lo que queremos, puede medir 4 bytes con 1 byte de selección.
Puede dar lo que nuestra [Término innecesariamente vulgar] gana se nos da. ;)
 
Última edición por un moderador:
No os preocupéis por temas de protocolo o demás. Eso lo tengo claro, he hecho comunicaciones BLE, Zigbee, Wi Fi, etc etc... y al final todo se basa en diseñar un protocolo que ambos dispositivos tengan en común. La idea de TRILO-BYTE además es más o menos lo que tenía en mente.

Mi problema es que nunca he enviado bytes de información por puerto serie desde el PC al Arduino y no sé ni que API es recomendable usar ni qué funciones de ella se pueden usar. Probaré de momento a crear una aplicación para Windows como dice TRILO-BYTE. Y tantearé un poco las posibilidades que DataTimePicker ofrece. Pero no tengo claro aún qué debo hacer para enviar bytes por puerto serie.

Gracias a todos!
 
Es que todo mundo se cierra la mente buscando ARDUINO o buscando tutoriales en español.

No. La idea es estudiar, y mucho.
Cuando no me sale algo en la aplicación de windows form, busco el ejemplo de la función que normalmente microsoft pone ejemplos de cada función, ya sea en C#, C++ y en VB.

Pero todo está en inglés, aparte de que enviar arrays a través del puerto serie, que una vez que envías 1 byte independiente de un writeline, el mundo se empieza a abrir.

Yo uso C++ por cuestiones de compatibilidad, bueno, en aquel entonces había que instalar un framework y un dotnet5, me parece para poder correr aplicaciones en C#

Creo que ahora ya es indiferente con las actualizaciones del win7 para arriba.
 
Última edición por un moderador:
Atrás
Arriba