Problema con Sensores y RTC ds1307

Estimados, estoy haciendo un programa que me lee, 5 sensores, los cuales obviamente estan conectados a 5 entradas analogicas, hasta ahi, no tengo problemas, los problemas aparecen cuando quiero conectarle un reloj de tiempo real(ds1307), y por lo que he leido, se debe conectar a los pines 4 y 5 analogicos. Resumiendo, necesito 7 entradas analogicas pero el arduino duemilanove(atmega 328) solo tiene 6, y no se que hacer....quizas alguien sabe de alguna forma de "expandir" entradas analogicas, o de simular una entrada analogica con las entradas digitales, o conectar el ds1307 a otros pines, o alguna forma de llevar el tiempo en mi arduino, ya que es primordial que deba hacer esto. Quizas para simplicar las cosas, les sirva que solo necesito un reloj de 24 horas.(pero no puedo aplicar "delay" ya que necesito que el programa se siga ejecutando) Muy agradecido de ideas o soluciones me despido...

Tienes muchas alternativas:

  • Usar el equivalente al DS1307 en bus SPI ó 1-Wire
  • Usar multiplexores para las señales analógicas
  • Usar DACs (convertidor de analógico a digital) que funcionen por I2C/SPI/1-Wire

Si estás esperando cantidades no muy grandes de tiempo y no quieres usar delay, puedes usar millis().

Un saludo

mira, me llamo la atencion usar la funcion millis(), porque como te decia solo necesito 24 horas, pero mi duda esta en, se puede "resetear" millis(), por ejmplo despues de 24 horas contando, parta desde cero, pero que solo se resetee esta funcion, porque no puedo reiniciar el arduino, porque funciona con datos ingresados desde delphi, entonces al reiniciar el arduino, se borraria todo, a no ser de que exista alguna forma de guardar esos datos...

y lo otro, es una duda con el bus SPI, por lo que estuve leyendo, cuando se conecta el arduino al usb, este es el que se "adueña" de este bus, por lo tanto mientras este conectado al usb, no podria usar este bus SPI.

y lo ultimo, el clock de tiempo real (ds1307) usa el pin 4 y 5 (analogo) del arduino y por lo que lei, uno era para enviar datos del arduino al clock y el otro era para resivir, entonces habia pensado, que primero configuro el clock, con la hora que corresponda(usando los 2 pines analogicos) y despues que este configurado, solo utilizar un pin analogico, para recibir los datos, y el otro pin lo podria dejar libre, no se si pueda hacer eso.

Agradecido de que alguein me pueda aclarar esto, me despido.

Si la hora no te sirve, con millis lo podrías hacer fácilmente, pero si quires saber la hora a la que haces la lectura, lo más fácil es usar el DS1307. En un par de semanas tengo que empezar un proyecto de un sistema de adquisición de señales que las guarde en una SD y usaremos el DS1307 para escribir el momento de la conversión, a lo mejor también lo mandamos a pachube o similar mediante wifi, ya veremos hasta donde tenemos tiempo.

En cuanto al bus SPI, no veo razón alguna por la que el bus sea ocupado al conectarlo al PC, aunque nunca lo he probado, pero me parece bastante improbable.

Con respecto al I2C, necesita ambos cables ya que uno es el de sincronismo y otro el de recepción y transmisión de datos. El que usa un cable para recepción y otro para transmisión es el SPI, con las líneas MOSI y MISO.

Un saludo

Estimado, logre hacer un reloj de 24 horas, usando la funcion “micros()”, he imagino que se puede hacer un reloj del tiempo que se desee, adjunto el programa que hice, por si es que a alguien le sirve, o quizas si lo quieren publicar.

int   ledPin   =  13;  //para llevar un conteo visual de segundos    
int   led      =  12;
long  segundos =   0; //Segundos que lleva el programa Funcionando
int       i    =   1; //Contador que puse, para disminuir el error al conteo
int   minutos  =   0; //Minutos que lleva el programa funcionando
long interval  = 60000000;  // es el equivalente a un minuto en microsegundos        

void setup() {

  pinMode(ledPin, OUTPUT); //configuracion como salida 
  pinMode(led,OUTPUT);   //configuracion como salida
  Serial.begin(9600);  // iniciacion de comunicacion serial
}

void loop()
{
  
  unsigned long microsegundos = micros(); //la lectura de "micros(), la guardo en la variable microsegundos
 
  if(microsegundos<interval/2)
  {segundos=0;}

 /*Con estas  2 lineas anteriores vuelvo a cero la variable segundos, 
 para cuando "micros()" se reinicie, aproximadamente 70 minutos*/ 

  else {if(microsegundos - segundos > interval) { 
         segundos = microsegundos; 
 
 /*si la resta de microsegundos con segundos es mayor que interval,
 guardo el valor de segundos en microsegundos, es quiere decir que ha 
 transcurrido un minuto desde que se inicio el programa, por lo tanto
me pregunta el siguiento ciclo if, que me pregunta si minutos es 
menor que 1440 (equivalente a los minutos que hay en 24 horas(un dia)
si es menor, me incrementa en uno los minuteros, si es igual a 1440,
me resetea el minutero a cero, para empezar un nuevo dia de conteo*/   
           
         if(minutos<1440){
           minutos++;}
         if(minutos>=1440){
           minutos=0;}
         
     
 }
  }              
      Serial.print("Segundos  ");
      Serial.print((microsegundos-i)/1000000);
      i++;  //le resto esto, para que no sea tan grande el error
      Serial.print("\t");
      Serial.print("Minutos  ");
      Serial.println(minutos);

     /*las lineas que siguen son solo para llevar el conteo de los
segundos con unos led's conectados al pin 12 y 13*/ 
      digitalWrite(led,HIGH);
      digitalWrite(ledPin,LOW);
      delay(1000);
      digitalWrite(led,LOW);
      digitalWrite(ledPin,HIGH);
      delay(1000);
      
   
}

ojala les sirva y lo entiendan, trate de explicar todas las lineas que hice, cualquier duda me preguntan no mas…saludos…