ERROR [Resuelto] Pero tengo otra pregunta

Prometo que antes de consultar esto he buscado pero no me aclaro con lo que he encontrado. :confused:
He configurado un Arduino Nano con un RTC DS1307 para temporizar dos alimentadores automáticos de un Acuario, que se encienden 4 veces al día.
Funcionan con 3.3v, les he colocado a cada uno un reductor de voltaje (AMS1117) de manera de hacerlos funcionar con los 5v de las salidas del Arduino.
Este el el sketch:

#include <Wire.h> 
#include <DS1307new.h>

uint16_t startAddr = 0x0000;            // Start address to store in the NV-RAM
uint16_t lastAddr;                      // new address for storing in NV-RAM
uint16_t TimeIsSet = 0xaa55;            // Helper that time must not set again

byte AlimentadorA=2;
byte GatilloA=4;
byte AlimentadorB=6;
byte GatilloB=8;

void setup()
{
  ConfiguraRTC();
  pinMode(AlimentadorA, OUTPUT);
  pinMode(GatilloA, OUTPUT);
  pinMode(AlimentadorB, OUTPUT);
  pinMode(GatilloB, OUTPUT);
  AlimentadorA = LOW;
  AlimentadorB = LOW;
  GatilloA = LOW;
  GatilloB = LOW;
}
void loop()
{
  VerHoraDS1307();
  if ((RTC.hour==12||RTC.hour==14||RTC.hour==16||RTC.hour==18) && (RTC.minute<6))
    {digitalWrite(AlimentadorA, HIGH);}
  else
    {digitalWrite(AlimentadorA= LOW);}
  if ((RTC.hour==12||RTC.hour==14||RTC.hour==16||RTC.hour==18) && (RTC.minute==0) && (RTC.second<10))
    {digitalWrite(GatilloA= HIGH);}
  else
    {digitalWrite(GatilloA= LOW);}
}


void VerHoraDS1307()
{
  RTC.getTime();
  if (RTC.hour < 10)                    // correct hour if necessary
  {Serial.print("0");   Serial.print(RTC.hour, DEC);} 
  else
  {Serial.print(RTC.hour, DEC); }
  Serial.print(":");
  if (RTC.minute < 10)                  // correct minute if necessary
  {Serial.print("0");
    Serial.print(RTC.minute, DEC); }
  else
  {Serial.print(RTC.minute, DEC);  }
  Serial.print(":");
  if (RTC.second < 10)                  // correct second if necessary
  {Serial.print("0");  Serial.print(RTC.second, DEC); }
  else
  {Serial.print(RTC.second, DEC);}
  Serial.print(" ");
  if (RTC.day < 10)                    // correct date if necessary
  {Serial.print("0"); Serial.print(RTC.day, DEC);}
  else
  {Serial.print(RTC.day, DEC); }
  Serial.print("-");
  if (RTC.month < 10)                   // correct month if necessary
  {Serial.print("0"); Serial.print(RTC.month, DEC); }
  else
  {Serial.print(RTC.month, DEC);}
  Serial.print("-");
  Serial.print(RTC.year, DEC);          // Year need not to be changed
  Serial.println(" ");
  delay(1000);                          // wait a second
}

void ConfiguraRTC()
{
  Serial.begin(9600);
  RTC.setRAM(0, (uint8_t *)&startAddr, sizeof(uint16_t));// Store startAddr in NV-RAM address 0x08 
/* Uncomment the next 2 lines if you want to SET the clock
   Comment them out if the clock is set.
   DON'T ASK ME WHY: YOU MUST UPLOAD THE CODE TWICE TO LET HIM WORK
   AFTER SETTING THE CLOCK ONCE.
  //TimeIsSet = 0xffff;
  //RTC.setRAM(54, (uint8_t *)&TimeIsSet, sizeof(uint16_t));*/

  RTC.getRAM(54, (uint8_t *)&TimeIsSet, sizeof(uint16_t));
  if (TimeIsSet != 0xaa55)
  { RTC.stopClock();
        
    RTC.fillByYMD(2017,4,30);
    RTC.fillByHMS(13,0,0);
    
    RTC.setTime();
    TimeIsSet = 0xaa55;
    RTC.setRAM(54, (uint8_t *)&TimeIsSet, sizeof(uint16_t));
    RTC.startClock();  }
  else
  { RTC.getTime(); }
}

Pero al compilar me aparece el siguiente error:

Arduino:1.8.1 (Windows 7), Tarjeta:"Arduino Nano, ATmega328"

C:\Users\Lunita\Documents\Arduino\libraries\Prueba_DS1307\Prueba_DS1307.ino\Prueba_DS1307.ino.ino: In function 'void loop()':

Prueba_DS1307.ino:32: error: too few arguments to function 'void digitalWrite(uint8_t, uint8_t)'

{digitalWrite(AlimentadorA= LOW);}

^

In file included from sketch\Prueba_DS1307.ino.ino.cpp:1:0:

C:\Users\Lunita\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.6.18\cores\arduino/Arduino.h:134:6: note: declared here

void digitalWrite(uint8_t, uint8_t);

^

Prueba_DS1307.ino:34: error: too few arguments to function 'void digitalWrite(uint8_t, uint8_t)'

{digitalWrite(GatilloA= HIGH);}

^

In file included from sketch\Prueba_DS1307.ino.ino.cpp:1:0:

C:\Users\Lunita\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.6.18\cores\arduino/Arduino.h:134:6: note: declared here

void digitalWrite(uint8_t, uint8_t);

^

Prueba_DS1307.ino:36: error: too few arguments to function 'void digitalWrite(uint8_t, uint8_t)'

{digitalWrite(GatilloA= LOW);}

^

In file included from sketch\Prueba_DS1307.ino.ino.cpp:1:0:

C:\Users\Lunita\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.6.18\cores\arduino/Arduino.h:134:6: note: declared here

void digitalWrite(uint8_t, uint8_t);

^

Se encontraron múltiples librerías para "Wire.h"
Usado: C:\Users\Lunita\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.6.18\libraries\Wire
No usado: C:\Program Files (x86)\Arduino\libraries\Wire
Se encontraron múltiples librerías para "DS1307new.h"
Usado: C:\Program Files (x86)\Arduino\libraries\ds1307new-master
No usado: C:\Program Files (x86)\Arduino\libraries\ds1307
Se encontraron múltiples librerías para "OneWire.h"
Usado: C:\Users\Lunita\Documents\Arduino\Libraries\libraries\OneWire
No usado: C:\Program Files (x86)\Arduino\libraries\OneWire
exit status 1
too few arguments to function 'void digitalWrite(uint8_t, uint8_t)'

Este reporte podría tener más información con
"Mostrar salida detallada durante la compilación"
opción habilitada en Archivo -> Preferencias.

En algún momento del código has cambiado de hacer lo correcto:
digitalWrite(a , HIGH);

A hacer esto otro:
digitalWrite(a = HIGH);

No es lo mismo una coma que un igual.

:frowning: :confused: :confused: que asno!!
Gracias :wink: :smiley:

Alberto, un consejo, no uses tantas veces el llamado RTC.hour RTC.minute

if ((RTC.hour==12||RTC.hour==14||RTC.hour==16||RTC.hour==18) && (RTC.minute<6))

crea variables temporales, las cargas con lo que tenga RTC y haces las comparaciones.

Una parte de tu error dice

Prueba_DS1307.ino:32: error: too few arguments to function 'void digitalWrite(uint8_t, uint8_t)'

     {digitalWrite(AlimentadorA= LOW);}

Al comienzo da el nombre de tu archivo Prueba DS1307.ino y luego dice :32 o sea en la linea 32 te muestra el error.
A continuacion dice error: too few arguments to function 'void digitalWrite(uint8_t, uint8_t)'
pocos argumentos en la función digitalWrite.

tienes la línea, sabes que hay pocos argumentos. Creo que puedes deducir que corregir para la próxima.

NOTA: Los errores tambien se deben postear como códigos, o sea usando etiquetas de códigos.

Gracias por las aclaraciones, surbyte, pero entiendo que el error es que escribía mal los argumentos de la función digitalWrite(), ya que lleva dos datos que debe pasar a la función (el pin y el estado del pin) y yo utilizaba el signo "=" en lugar de la coma, o sea que le pasaba un solo dato.

De todas formas lo que dices de utilizar en el "if" varias horas (en este caso 4 horarios diferentes durante el día), ¿es que debería escribir por ejemplo 4 condicionales "if" cada uno con un solo horario?

Pongo el Sketch "final":

/*
 * Programa que activa dos alimentadores automáticos controlados con Arduino Nano y RTC DS1307
 * Lleva un Step Down que reduce el voltaje de 12v DC a 6,5v DC para la alimentación del Arduino
 * Nano. Dos pulsadores Pull Down Activan el giro manual del alimentador, si se presiona menos de 
 * 1 segundo realiza un pequeño giro (para ajuste de la posición del depósito) y si se presiona más
 * de un segundo realiza el giro completo. Imagen: http://i.imgur.com/y4VgvVv.jpg
*/
#include <Wire.h> 
#include <DS1307new.h>

uint16_t startAddr = 0x0000;            // Start address to store in the NV-RAM
uint16_t lastAddr;                      // new address for storing in NV-RAM
uint16_t TimeIsSet = 0xaa55;            // Helper that time must not set again
int AlimentadorA=6;
int AlimentadorB=2;
int PulsadorA=10;
int PulsadorB=12;

void setup()
{
  ConfiguraRTC();
  pinMode(PulsadorA, INPUT);            //Pulsador Pull Down A
  pinMode(PulsadorB, INPUT);            //Pulsador Pull Down B
  pinMode(AlimentadorB, OUTPUT);        // El Pin 2 corresponde al Alimentador B 
  pinMode(AlimentadorA, OUTPUT);        // El Pin 6 corresponde al Alimentador A
  digitalWrite(AlimentadorB, 0);        // El Pin 2 corresponde al Alimentador B 
  digitalWrite(AlimentadorA, 0);        // El Pin 6 corresponde al Alimentador A
}
void loop()
{
  VerHoraDS1307();
  if ((RTC.hour==12||RTC.hour==14||RTC.hour==16||RTC.hour==18) && (RTC.minute==0) && (RTC.second<3))
    {ActivaA(9700);delay(3000);
     ActivaA(9700);delay(3000);
     ActivaA(9700);}
  else
    {digitalWrite(AlimentadorA, 0); Serial.println("Alimentador A OFF");}

  if ((RTC.hour==13||RTC.hour==17) && (RTC.minute==0) && (RTC.second<3))
    {ActivaB(6600);delay(3000);
     ActivaB(6600);}
  else
    {digitalWrite(AlimentadorB, 0); Serial.println("Alimentador B OFF");}

  if (digitalRead(PulsadorA)==HIGH)
      {ActivaA(500);delay(500);}        //Pequeño avance para ajustar el depósito si precisa.
      if (digitalRead(PulsadorA)==HIGH) //Si sigue presionado el pulsador más de 1 segundo
        {ActivaA(9200);}                //Completa el giro del depósito (9700 - 500)

  if (digitalRead(PulsadorB)==HIGH)
      {ActivaB(500);delay(600);}        //Pequeño avance para ajustar el depósito si precisa
      if (digitalRead(PulsadorB)==HIGH) //Si sigue presionado el pulsador más de 1 segundo
        {ActivaB(6100);}                //Completa el giro del depósito (6600 - 500)
}

void ActivaA(int Ciclo)                 //Ciclo: mseg durante los cuales gira el depósito
    {digitalWrite(AlimentadorA, 1); Serial.println("Conectado Alimentador A");
     delay(Ciclo); digitalWrite(AlimentadorA, 0);}

void ActivaB(int Ciclo)                 //Ciclo: mseg durante los cuales gira el depósito
    {digitalWrite(AlimentadorB, 1); Serial.println("Conectado Alimentador B");
    delay(Ciclo);digitalWrite(AlimentadorB, 0);}

void VerHoraDS1307()
  {RTC.getTime();
  if (RTC.hour < 10)                    // correct hour if necessary
  {Serial.print("0");   Serial.print(RTC.hour, DEC);} 
  else
  {Serial.print(RTC.hour, DEC); }
  Serial.print(":");
  if (RTC.minute < 10)                  // correct minute if necessary
  {Serial.print("0");
    Serial.print(RTC.minute, DEC); }
  else
  {Serial.print(RTC.minute, DEC);  }
  Serial.print(":");
  if (RTC.second < 10)                  // correct second if necessary
  {Serial.print("0");  Serial.print(RTC.second, DEC); }
  else
  {Serial.print(RTC.second, DEC);}
  Serial.print(" ");
  if (RTC.day < 10)                    // correct date if necessary
  {Serial.print("0"); Serial.print(RTC.day, DEC);}
  else
  {Serial.print(RTC.day, DEC); }
  Serial.print("-");
  if (RTC.month < 10)                   // correct month if necessary
  {Serial.print("0"); Serial.print(RTC.month, DEC); }
  else
  {Serial.print(RTC.month, DEC);}
  Serial.print("-");
  Serial.print(RTC.year, DEC);          // Year need not to be changed
  Serial.println(" ");
  delay(1000);}                          // wait a second

void ConfiguraRTC()
{
  Serial.begin(9600);
  RTC.setRAM(0, (uint8_t *)&startAddr, sizeof(uint16_t));// Store startAddr in NV-RAM address 0x08 
/* Uncomment the next 2 lines if you want to SET the clock
   Comment them out if the clock is set.
   DON'T ASK ME WHY: YOU MUST UPLOAD THE CODE TWICE TO LET HIM WORK
   AFTER SETTING THE CLOCK ONCE.
  //TimeIsSet = 0xffff;
  //RTC.setRAM(54, (uint8_t *)&TimeIsSet, sizeof(uint16_t));*/

  RTC.getRAM(54, (uint8_t *)&TimeIsSet, sizeof(uint16_t));
  if (TimeIsSet != 0xaa55)
  { RTC.stopClock();
        
    RTC.fillByYMD(2017,4,30);
    RTC.fillByHMS(13,0,0);
    
    RTC.setTime();
    TimeIsSet = 0xaa55;
    RTC.setRAM(54, (uint8_t *)&TimeIsSet, sizeof(uint16_t));
    RTC.startClock();  }
  else
  { RTC.getTime(); }
}

No me entendiste.
Tu código dice

if ((RTC.hour==12||RTC.hour==14||RTC.hour==16||RTC.hour==18) && (RTC.minute==0) && (RTC.second<3))
    {ActivaA(9700);delay(3000);
     ActivaA(9700);delay(3000);
     ActivaA(9700);}
  else
    {digitalWrite(AlimentadorA, 0); Serial.println("Alimentador A OFF");}

y pudo decir mas facilmente

int hora = RTC.hour;

if ((hora==12||hora==14||hora==16||hora==18) && (RTC.minute==0) && (RTC.second<3))
    {ActivaA(9700);delay(3000);
     ActivaA(9700);delay(3000);
     ActivaA(9700);}
  else
    {digitalWrite(AlimentadorA, 0); Serial.println("Alimentador A OFF");
}

y me detengo con las horas porque lo invocas 4 veces y ahora solo 1, ganas 3 accesos.
No te das cuenta pero cada RTC.algo lleva tiempo, sera poco pero es tiempo.

Ahora como luego veo delay de 3000 me detuve con lo demás.

Con ánimo de aprender, surbyte, que de eso se trata (lo mismo algún día pueda ayudar a otros):

Si creas una variable "int Hora", a la cual le asignas como valor la función, en este caso "RTC.hour", y luego en lugar de invocar cuatro veces la función a diferentes horas del día, invocas la variable, el procesador del Arduino no tiene igualmente que buscar el contenido de la variable, "enterarse" que es una función y después en cada uno de los horarios obtener la hora utilizando esa función?

Quiero entender porqué ahorra tiempo al procesador, pues por sentido común sería al revés, el procesador tiene que hacer un paso más cada vez que busca cuál es el contenido de la variable.

Un saludo.

Leer la variable involucra useg.

Leer el RTC son varios mseg creo que hay una gran ventaja.
Ahora no habia visto con detalle que hace ActivarA o ActivarB y veo que son grandes consumidores de tiempo usando delay de modo que olvida mi comentario.

Lo que si podrias hacer es sincronizar RTC con la hora del sistema usando Time.h y que en cada momento se lea la hora desde variables y cada cierto tiempo se hace una sincronización con el RTC para asegurarse que esta ajustado.

Pero eso solo para aprender.

A mi los delays no me gustan salvo que tu código sea lo único que vaya a hacer el programa porque en cuanto le agregas un pulsador para cambiar algo, listo... ya te quedas una eternidad esperando a que sea reconocido.

Permanentemente la gente en el foro plantea códigos como este y luego dices.... ahora le quiero agregar un pulsador o fin de carrera que cuando se active comande ese delay en forma automática pero... tarda mucho en reaccionar.

Y claro, si estas usando delay(ciclo) y eso hace que hasta que no termine ese ciclo el microcontrolador no presta atención a nada mas.

Ese es el punto a tener en cuenta.

surbyte:
Leer la variable involucra useg.
Leer el RTC son varios mseg creo que hay una gran ventaja.

Comprendido.

surbyte:
Ahora no habia visto con detalle que hace ActivarA o ActivarB y veo que son grandes consumidores de tiempo usando delay de modo que olvida mi comentario.

Lo que sucede que esos tiempos son los que tarda cada motorcillo de 3,3v DC en darle una vuelta completa (360º) al depósito de comida para que caiga una ración.
Y luego espera 3 seg para repetir el ciclo (dos o tres veces), que es de diferente duración porque son dos alimentadores diferentes.

surbyte:
Lo que si podrias hacer es sincronizar RTC con la hora del sistema usando Time.h y que en cada momento se lea la hora desde variables y cada cierto tiempo se hace una sincronización con el RTC para asegurarse que esta ajustado.
Pero eso solo para aprender.

Seré pesado, pero podrías poner un par de líneas de ejemplo?

surbyte:
A mi los delays no me gustan salvo que tu código sea lo único que vaya a hacer el programa porque en cuanto le agregas un pulsador para cambiar algo, listo... ya te quedas una eternidad esperando a que sea reconocido.

En efecto, pero es que necesito utilizar los pulsadores también para corregir la posición de los depósitos de comida (cada tanto se suelen retrasar o adelantar un pelín) y no sé cómo hacer de otra forma para reconocer cuando el tambor de la comida dió una vuelta exacta y hacer que se detenga, por eso lo hago con delays. Supongo que habrá maneras más ingeniosas, pero no las conozco.
¿Tú si?

surbyte:
A mi los delays no me gustan salvo que tu código sea lo único que vaya a hacer el programa porque en cuanto le agregas un pulsador para cambiar algo, listo... ya te quedas una eternidad esperando a que sea reconocido.

NO imaginé que fuera clarividente y tal como te lo dije ahora resulta que necesitas un pulsador para invocar el programa.

Pues te envío directo a Documentación y lee Qué es y cómo funciona una máquina de estados .
En el post#14 yo digo

Habitualmente uso máquiinas de estados, ya que acabo de resolver un problema de este modo aporte el código en el post#10 de este hilo comportamiento no esperado de delay()

Justamente delay que no se lleva de la mano con casi nada mas que con blink, pierde terreno todos los dias.
Para quienes lean este hilo vean un ejemplo modesto de como usar una máquina de estados.

Bueno, finalmente todo funciona sin fallos, los alimentadores se activan a su hora, todo como debe ser, pero tengo una pregunta relacionada con los pulsadores.

He puesto 2 pulsadores pull down, que sirven para activar manualmente de manera directa los alimentadores, pero observo que tienen como un retardo, no hay ningún delay en el sketch, en teoría una vez presionado el pulsador debería ponerse en HIGH el pin correspondiente pero incluso testándolo con el multimetro se vé que tarda como un segundo en activarse.

¿Es normal un retardo en los pull down?

No lo es.
Ahora para responderte tendras que dibujar un esquema porque es raro lo que planteas.

El circuito lo saqué de este:

El esquema de mi circuito es este: