STRUCT

Hola a todos. tengo un struct como el de abajo en un .h cuando quiero iniocializar un objeto ( este en concreto);

struct udtTime fechaHora = {2010, 3, 26, 12, 00, 00}; //creo un objeto esto lo escribo antes del setup. porque me sale el siguiente error compilando? cual seria la solucion? has initializader but imcomplete type

Un saludo.

struct cTime {

int iYear; int iMonth; int iDay; double dHours; double dMinutes; double dSeconds; };

Lo primero que veo mal es que tu estructura la definiste como cTime y luego asignas con udtTime Entonces uniformiza a uno u otro nombre.

Lo segundo que veo es que defines hora, min, seg como double pero luego asignas como entero. debes poner

struct cTime fechaHora = {2010, 3, 26, 12.0, 0.0, 0.0}; //creo un objeto con los puntos decimales. a ver si funciona tal como tu lo planteaste.

Ahora mi consejo es que no uses double en hora, min, seg sino sigue con entero a menos que trabajes con un GPS y sean datos que vengan de ahi, entonces es posible que si los necesites.

gracias surbyte por contestar. Lo he hecho como tu dices y el compilador dice lo mismo. tabien tengo en el .h la siguiente funcion : void sunpos(cTime udtTime,cLocation udtLocation, cSunCoordinates *udtSunCoordinates) en la cual creo un objeto en la misma funcion, no se si valdra asi, pero creo que si, porque en dev c++ funciona a la perfeccion un saludo

Porque no subes las librerías que estas usando asi podemos reproducir el problema. haz un pequeño ejemplo asignando que repita el error si no quieres mostrar tu código.

ok no tengo problema por enseñar el codigo.

.h

// This file is available in electronic form at Plataforma Solar de Almería - PSA Algorithm Files

#ifndef __SUN_H
#define __SUN_H
#include “Arduino.h”

// Declaration of some constants
#define pi 3.14159265358979323846
#define twopi (2*pi)
#define rad (pi/180)
#define dEarthMeanRadius 6371.01 // In km
#define dAstronomicalUnit 149597890 // In km

struct cTime
{

int iYear;
int iMonth;
int iDay;
double dHours;
double dMinutes;
double dSeconds;
};

struct cLocation
{
double dLongitude;
double dLatitude;
};

struct cSunCoordinates
{
double dZenithAngle;
double dAzimuth;
};

void sunpos(cTime udtTime, cLocation udtLocation, cSunCoordinates *udtSunCoordinates);

#endif

.cpp

// This file is available in electronic form at Plataforma Solar de Almería - PSA Algorithm Files
// Algorytm opisany i zaimplementowany przez:
// MANUEL BLANCO-MURIEL, DIEGO C. ALARCON-PADILLA, TEODORO LOPEZ-MORATALLA i MARTIN LARACOIRA
#include “sun.h”
#include <stdio.h>
#include <math.h>
#include “Arduino.h”

void sunpos(cTime udtTime,cLocation udtLocation, cSunCoordinates *udtSunCoordinates)
{
// Main variables
double dElapsedJulianDays;
double dDecimalHours;
double dEclipticLongitude;
double dEclipticObliquity;
double dRightAscension;
double dDeclination;

// Auxiliary variables
double dY;
double dX;

// Calculate difference in days between the current Julian Day
// and JD 2451545.0, which is noon 1 January 2000 Universal Time
{
double dJulianDate;
long int liAux1;
long int liAux2;
// Calculate time of the day in UT decimal hours
dDecimalHours = udtTime.dHours + (udtTime.dMinutes

  • udtTime.dSeconds / 60.0 ) / 60.0;
    // Calculate current Julian Day
    liAux1 =(udtTime.iMonth-14)/12;
    liAux2=(1461*(udtTime.iYear + 4800 + liAux1))/4 + (367*(udtTime.iMonth
  • 2-12liAux1))/12- (3((udtTime.iYear + 4900
  • liAux1)/100))/4+udtTime.iDay-32075;
    dJulianDate=(double)(liAux2)-0.5+dDecimalHours/24.0;
    // Calculate difference between current Julian Day and JD 2451545.0
    dElapsedJulianDays = dJulianDate-2451545.0;
    }

// Calculate ecliptic coordinates (ecliptic longitude and obliquity of the
// ecliptic in radians but without limiting the angle to be less than 2Pi
// (i.e., the result may be greater than 2
Pi)
{
double dMeanLongitude;
double dMeanAnomaly;
double dOmega;
dOmega=2.1429-0.0010394594dElapsedJulianDays;
dMeanLongitude = 4.8950630+ 0.017202791698
dElapsedJulianDays; // Radians
dMeanAnomaly = 6.2400600+ 0.0172019699dElapsedJulianDays;
dEclipticLongitude = dMeanLongitude + 0.03341607
sin( dMeanAnomaly )

  • 0.00034894sin( 2dMeanAnomaly )-0.0001134
    -0.0000203sin(dOmega);
    dEclipticObliquity = 0.4090928 - 6.2140e-9
    dElapsedJulianDays
    +0.0000396*cos(dOmega);
    }

// Calculate celestial coordinates ( right ascension and declination ) in radians
// but without limiting the angle to be less than 2Pi (i.e., the result may be
// greater than 2
Pi)
{
double dSin_EclipticLongitude;
dSin_EclipticLongitude= sin( dEclipticLongitude );
dY = cos( dEclipticObliquity ) * dSin_EclipticLongitude;
dX = cos( dEclipticLongitude );
dRightAscension = atan2( dY,dX );
if( dRightAscension < 0.0 ) dRightAscension = dRightAscension + twopi;
dDeclination = asin( sin( dEclipticObliquity )*dSin_EclipticLongitude );
}

// Calculate local coordinates ( azimuth and zenith angle ) in degrees
{
double dGreenwichMeanSiderealTime;
double dLocalMeanSiderealTime;
double dLatitudeInRadians;
double dHourAngle;
double dCos_Latitude;
double dSin_Latitude;
double dCos_HourAngle;
double dParallax;

dGreenwichMeanSiderealTime = 6.6974243242 +
0.0657098283*dElapsedJulianDays

  • dDecimalHours;
    dLocalMeanSiderealTime = (dGreenwichMeanSiderealTime*15
  • udtLocation.dLongitude)rad;
    dHourAngle = dLocalMeanSiderealTime - dRightAscension;
    dLatitudeInRadians = udtLocation.dLatitude
    rad;
    dCos_Latitude = cos( dLatitudeInRadians );
    dSin_Latitude = sin( dLatitudeInRadians );
    dCos_HourAngle= cos( dHourAngle );
    udtSunCoordinates->dZenithAngle = (acos( dCos_Latitude*dCos_HourAngle
    *cos(dDeclination) + sin( dDeclination )*dSin_Latitude));
    dY = -sin( dHourAngle );
    dX = tan( dDeclination )dCos_Latitude - dSin_LatitudedCos_HourAngle;
    udtSunCoordinates->dAzimuth = atan2( dY, dX );
    if ( udtSunCoordinates->dAzimuth < 0.0 )
    udtSunCoordinates->dAzimuth = udtSunCoordinates->dAzimuth + twopi;
    udtSunCoordinates->dAzimuth = udtSunCoordinates->dAzimuth/rad;
    // Parallax Correction
    dParallax=(dEarthMeanRadius/dAstronomicalUnit)
    *sin(udtSunCoordinates->dZenithAngle);
    udtSunCoordinates->dZenithAngle=(udtSunCoordinates->dZenithAngle
  • dParallax)/rad;
    }
    }

arduino

//GIRASOL SOLAR

//#include <sunpos.h>

struct udtTime fechaHora = {2010, 3, 26, 12.0, 0.0, 0.0}; //creo un objeto
struct cLocation Coordenadas;// creo un objeto = {51.109308,17.058477};
struct cSunCoordinates coordenadasSol; //creo un objeto

void setup()
{

Serial.begin(9600);
//inicializo los objetos
fechaHora = {2010, 3, 26, 12, 00, 00}; //Aqui se cambia la fecha y hora

Coordenadas = {51.109308,17.058477}; //Aqui la longuitud y latitud

sunpos(fechaHora, Coordenadas, &coordenadasSol); //mando los objetos a la libreria

//printf(“Azymut: %lf\nKat wzgledem zenitu: %lf”, pozycjaSlonca.dAzimuth, pozycjaSlonca.dZenithAngle);

}

void loop()
{
// printf(“Polozenie Slonca dla:\n1. Pozycja geograficzna:\n- szerokosc %lf\n- dlugosc %lf\n2. Aktualny czas:\n%d:%d:%d %d.%d.%dr.\n\n”,
// polozenie.dLatitude, polozenie.dLongitude, (int)aktualnyCzas.dHours, (int)aktualnyCzas.dMinutes, (int)aktualnyCzas.dSeconds, aktualnyCzas.iDay,
// aktualnyCzas.iMonth, aktualnyCzas.iYear);

Serial.print("Azimuth: ");
Serial.println( coordenadasSol.dAzimuth);
delay (1000);

}

a ver si podemos hacer que esto funcione!

Mirá logre llegar hasta una situación bastante cercana

AyudaGPS.ino: In function ‘void setup()’:
AyudaGPS:16: error: expected primary-expression before ‘{’ token
AyudaGPS:16: error: expected ;' before '{' token AyudaGPS:18: error: expected primary-expression before '{' token AyudaGPS:18: error: expected ;’ before ‘{’ token

pero x hoy no puedo seguir. Debo atender otras cosas.
Te paso lo que hice en los adjuntos.

AyudaGPS.ino (1.07 KB)

sun.h (4.23 KB)

sunpos.h (3.93 KB)

Aparentemente quedó funcionando.

Adjunto los dos files

AyudaGPS.ino (1.22 KB)

sun.h (4.22 KB)

Maquina , ya funciona perfectamente.
Voy a a analizar lo que has hecho y te preguntare lo que no comprendo

Lo primero es que siempre los compiladores C o C++ guardan algunas peculiaridades. En este caso la librería de sunpos venía definiendo la estructura como tu bien indicaste.

struct cTime { int iYear; int iMonth; int iDay; double dHours; double dMinutes; double dSeconds; };

como no conocía el código pensé que no hacia falta poner como double a horas, min, seg pero claro, son datos geodésicos entonces arrastran información de precisión. Bueno visto eso, y el error busqué si estaba bien definida la estructura, en principio si, y esto me confundió mas http://playground.arduino.cc/Code/Struct

según esto el código debería funcionar bien, pero ambos sabemos que no. De todas formas si le sigues buscando la vuelta estoy seguro que funcionaría sin typedef. Por ultimo buscando respuesta a los errores, la sugerencia fue de usar typedef y asi hice pero no sin antes luchar con la asignación de la estructura. Si por ejemplo retiras la asignación que haces Arduino Solar, el programa da errores.

Te comento que encontré un programa espectacular que hace lo mismo que este pero con un plus viene con toda una electronica que permite ubicar al sol al igual que tu programa pero con el control de los servos para posicionarlo. Te interesa?

claro que me interesa surbayte, mandamelo cuando puedas a ver como es el codigo.

una pregunta si se le pasa a struct por punteros se debe trabajar con -> y tu has puesto coordenadasSol.dAzimuth y funciona a la perfeccion , como es eso?

Mira porque esta GENIALLLLLLLLL tremendo proyecto, con punto y coma. videos, explicación, TODO EN INGLES pero muy bien explicado. Hay foro por si tienes dudas. http://cerebralmeltdown.com/Sun_Tracking_and_Heliostats/

vaya pedazo de proyecto, si señor. gracias surbyte por la direccion.

Es maravilloso no te parece? Mira que tu idea de trabajo me gustó pero esta me encantó. Estoy pensando seriamente construirlo para mantener unos colectores solares que calienten agua. Pero ya veremos porque la magnitud de lo que quiero hacer me supera presupuestarmiente hoy, y mi pais no esta para hacer gastos innecesarios.

Haz como yo , casi todo lo cojo de las chatarrerias industriales, tengo todos los motores que quieros por cantidades ridiculas ylos tubos los compro tambien en los desguace y los corto a las medidas y despues se pintan y quedan como nuevo.

Buen consejo pero vivo en la Patagonia Argentina y no hay chatarrerias industriales. De todas maneras voy a programarme para hacerlo cuando este en buenos aires o córdoba de Argentina.