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: