Sistema Hidroponico

Hago otra consulta respecto a una duda que me surgio en este momento, tengo para conectar el modulo de 4 reles y el RTC DS3231, y me encuentro que ambos tiene una conexion al pin 3.3V del arduino, y arduino UNO solo tiene 1 pin de 3.3 V. Se puede conectar varios modulos a ese pin usando la protoboard? o se genera un problema de alimentacion?

En este momento estoy por comenzar a unir los codigos e ir viendo si me tira errores.
Saludos!

basicamente el puente que haces entre el cable verde y el negro seria lo mismo que conectar el cable verde a un pin a 0v.

luego si podrias sacar varios cables de los 3.3v del arduino.

pongo en duda que el rele necesite 3.3v, pero aun así como necesitas que la fuente este on para encender los reles podrías coger los 3.3v del cable naranja de la atx

juand91:
basicamente el puente que haces entre el cable verde y el negro seria lo mismo que conectar el cable verde a un pin a 0v.

luego si podrias sacar varios cables de los 3.3v del arduino.

pongo en duda que el rele necesite 3.3v, pero aun así como necesitas que la fuente este on para encender los reles podrías coger los 3.3v del cable naranja de la atx

Los pines que tengo en el modulo de rele son GND, los 4 que corresponden a cada rele, y por ultimo VCC.
Tal vez estoy equivocado y al pin VCC lo tenga que conectar a 5V?
Gracias por las ayudas nuevamente

Buenos dias, hoy me pude sentar un rato tranquilo en la pc y comence a ensamblar los codigos que tenia como prueba para los distintos modulos y sensores.

Hasta ahora tengo funcionando el RTC mostrando fecha y hora, y el sensor DHT22.
Por ahora solo estoy tomando datos de temperatura y en funcion a esos valores, segun en que rango se encuentre la temperatura, se hace funcionar (idealmente) a un caloventor o ventilador, segun la necesidad de subir o bajar la temperatura. Estos aparatos los conectaria en un futuro al modulo de rele.

Bueno, de a poco voy probando, estoy esperando evacuar una duda respecto a la conexion del modulo rele y la fuente atx para alimentar los "perifericos".

Muchas gracias a Surbyte y juand91 que me estan ayudando mucho!

Saludos y seguimos en contacto, les dejo el codigo para recibir criticas.

//--------------- CARGAMOS LIBRERIAS -----------------------------------
#include <Adafruit_Sensor.h>  //Cargamos la librería DHT "Adafruit_Sensor-master"
#include "DHT.h"              //Cargamos la librería DHT
#include <Wire.h>             //Libreria comunicacion I2C 
#include "RTClib.h"           //Libreria RTC "RTClib-master"


//--------------- ASIGNACION DE PINS -----------------------------------
#define DHTPIN 7                //Seleccionamos el pin en el que se conectará el sensor DHT22
#define DHTTYPE DHT22           //Se selecciona el DHT22(hay otros DHT)
#define RelayVentilador 8       //Se define el pin donde se conecta el Relay que acciona el Ventilador
#define RelayCaloventor 9       //Se define el pin donde se conecta el Relay que acciona el Caloventor
//int LedTempBaja = 3;          //Se define el pin donde se conecta el led que indica temperatura baja
//int LedTempAlta = 2;          //Se define el pin donde se conecta el led que indica temperatura alta
//int LedTempOK = 4;            //Se define el pin donde se conecta el led que indica temperatura OK



DHT dht(DHTPIN, DHT22);        //Se inicia una variable que será usada por Arduino para comunicarse con el sensor
RTC_DS3231 RTC;                //Creamos objeto reloj RTC
int histeresis1 = 3;           //Histeresis para control de Temperatura



//----------------------- FUNCION SETUP ----------------------------------------------------------------

void setup() 
{
  Serial.begin(9600);           //Se inicia la comunicación serial 
  Wire.begin();                 //Inicia el puerto I2C
  RTC.begin();                  //Inicia la comunicacionn con el RTC
  //lcd.begin(16, 2);           //Inicia LCD 16X2          (sacar comentario cuando quiera usar el LCD)
  //lcd.clear();                //Limpiamos la pantalla    (sacar comentario cuando quiera usar el LCD)
  //Establece la fecha y hora      (Comentar una vez establecida la hora)
  //RTC.adjust(DateTime(2017,03,11,11,31,00));

  //pinMode(RelayVentilador, OUTPUT);       // Define el pin del Ventilador como Salida
  //pinMode(RelayCaloventor, OUTPUT);       // Define el pin del Caloventor como Salida
  //pinMode(LedTempBaja, OUTPUT);           //
  //pinMode(LedTempAlta, OUTPUT);           // Definen los Pines de Leds como Salida
  //pinMode(LedTempOK, OUTPUT);             //
  
  //digitalWrite(RelayVentilador,HIGH);     // Inicia el programa con el rele apagado
  //digitalWrite(RelayCaloventor,HIGH);     // Inicia el programa con el rele apagado
  //digitalWrite(LedTempBaja,LOW);          //
  //digitalWrite(LedTempAlta,LOW);          // Inicia el programa con los Leds apagado
  //digitalWrite(LedTempOK,LOW);            //  
}


//----------------------- FUNCION LOOP --------------------------------------------------------------
void loop() 
{
  //----------- FECHA Y HORA ------------------------
  DateTime now = RTC.now();        //Obtiene la fecha y hora del RTC
  char myBuffer1[16];              //Creamos myBuffer1 para mostrar bien los dijitos de la Fecha
  char myBuffer2[16];              //Creamos myBuffer2 para mostrar bien los dijitos de la Hora
  
  //lcd.setCursor(0, 0);           //Cursor en fila 1                    sacar comentario cuando quiera usar el LCD
  //lcd.print("Fecha: ");          //Muestra palabra (hora: ) por LCD    sacar comentario cuando quiera usar el LCD
  Serial.print("Fecha: ");         //Muestra palabra Fecha:  por el puerto Serial
  sprintf(myBuffer1, "%02d/%02d/%02d", now.day(), now.month(), now.year());
  //lcd.print(myBuffer1);   sacar comentario cuando quiera usar el LCD
  Serial.print(myBuffer1);
    
  //lcd.print("Hora: ");          //Muestra palabra (hora: ) por LCD  sacar comentario cuando quiera usar el LCD
  Serial.print("   Hora: ");      //Muestra palabra (hora: ) por el puerto Serial
  sprintf(myBuffer2, "%02d:%02d:%02d", now.hour(), now.minute(), now.second());
  //lcd.print(myBuffer2);   sacar comentario cuando quiera usar el LCD
  Serial.print(myBuffer2);
  Serial.println();
 
  delay(500);                    //Retardo un segundo entre lecturas para dar estabilidad  


  //--------- SENSOR DHT22 -------------------------
  float h = dht.readHumidity();     //Se lee la humedad y se asigna ese valor a la variable h
  float t = dht.readTemperature();  //Se lee la temperatura y se asigna ese valor a la variable t

  Serial.print("Humedad: ");        //Se imprimen las variables
  Serial.print(h);
  Serial.print(" %    ");
  Serial.print("Temperatura: ");
  Serial.print(t);
  Serial.print(" C  --->  ");
  delay(500);

if (t < 15 + histeresis1)
   {
      Serial.println("TEMPERATURA BAJA, encender calentador");
      //digitalWrite(LedTempBaja,HIGH);         //Cuando la temperatura es baja se enciende el Led de Temperatura Baja
      //digitalWrite(LedTempAlta,LOW);          //Cuando la temperatura es baja se apaga el Led de Temperatura Alta
      //digitalWrite(LedTempOK,LOW);            //Cuando la temperatura es baja se apaga el Led de Temperatura OK
      digitalWrite(RelayCaloventor,LOW);        //Cuando la temperatura es baja se enciende el Caloventor
      delay(1000);
   }

else if (t > 22 + histeresis1)
        {
          Serial.println("TEMPERATURA ALTA, encender ventilador");
          //digitalWrite(LedTempAlta,HIGH);          //Cuando la temperatura es alta se enciende el Led de temperatura Alta
          //digitalWrite(LedTempOK,LOW);
          //digitalWrite(LedTempBaja,LOW);
          digitalWrite(RelayVentilador,LOW);      //Cuando la temperatura es alta se enciende el Ventilador
          delay(1000);
        }
        else
            {
              Serial.println("TEMPERATURA OK");
              //digitalWrite(LedTempOK,HIGH);         //Cuando la temperatura esta ok se enciende el Led de Temperatura OK
              //digitalWrite(LedTempAlta,LOW);        //Cuando la temperatura esta ok se apaga el Led de Temperatura Alta
              //digitalWrite(LedTempBaja,LOW);
              digitalWrite(RelayVentilador, HIGH);  //Cuando la temperatura esta ok se apaga el Ventilador
              delay(1000);
            }
}

Las sentencias de apagar y prender los leds estan comentados porque no tengo los materiales para realizar la conexion fisica en la protoboard, pero ya estan puestos en el codigo, cuando tenga todo comprado solo tengo que sacar las barras de comentarios, al igual que con la pantalla tft.

Con un UNO no necesitas ninguna conexión a 3.3V y el módulo RELE.

Hago una consulta respecto a las alarmas de la libreria timeAlarms.
Por un lado no pude encontrar cuantas alarmas se pueden programar en un mismo codigo, es un dato para analizar a la hora de mi proyecto, lo que va a determinar si uso 1 o 2 placas para separar las funciones automatizadas.
Por otro lado, se me planteo otra duda respecto a si dentro de la definicion de la funciona que llama la alarma, se pueden usar condicionantes tipo if, else, etc...
Esto que planteo me surgio pensando lo siguiente, yo quiero hacer que el sistema haga circular nutrientes cada 2 horas por ejemplo, pero desde un rango de horario (de 8 am a 8 pm), no durante todo el dia.
Entonces lo que se me ocurrio fue hacer una alarma que se dispare cada 2 horas, pero dentro de la funcion que llama poner una condicion respecto de la hora del dia, si se cumple entonces se va a poner en funcionamiento la bomba, si no se cumple entonces no hace nada, se entiende?
Bueno dejo planteada la duda. Saludos

surbyte:
Con un UNO no necesitas ninguna conexión a 3.3V y el módulo RELE.

Perdon Surbyte, pero no entendi la respuesta.... Lo que me queres decir es que conecte el modulo rele a 5v de la arduino o externo?
Perdon pero todavia tengo las aristas un poco marcadas jejeje

Por un lado no pude encontrar cuantas alarmas se pueden programar en un mismo codigo, es un dato para analizar a la hora de mi proyecto, lo que va a determinar si uso 1 o 2 placas para separar las funciones automatizadas.

255 y se cambian en TimeAlarm.h busca que hay un apartado al respecto que dice

#define dtNBR_ALARMS 20   // max is 255

Como ves yo lo tengo en 20

Por otro lado, se me planteo otra duda respecto a si dentro de la definicion de la funciona que llama la alarma, se pueden usar condicionantes tipo if, else, etc...

Para hacer que?
Es una función que se ejecuta una sola vez cuando se da la alarma y no se repite.
Asi que cambia el modo de pensar al respecto.
Imagina esto. Tienes una alarma el dia Miercoles a las 8:30:00 hs
y tu quieres que active el riego a esa hora y lo detenga a los 5 min
pues... no puedes poner delay, no puedes poner millis() pero si puedes usar OTRA alarma que servirá por ejemplo para apagar
Entonces una arranca a las 8:30:00 y otra apaga alas 8:35:00 hs

Esa es una manera
Otra manera es que tiene timers
Puedes activar un timer que se inicié a las 8:30:00 y luego que se repita... hasta que decidas pararlo

Ya ingresas en algo mas avanzado en su uso.

Esto que planteo me surgio pensando lo siguiente, yo quiero hacer que el sistema haga circular nutrientes cada 2 horas por ejemplo, pero desde un rango de horario (de 8 am a 8 pm), no durante todo el dia.
Entonces lo que se me ocurrio fue hacer una alarma que se dispare cada 2 horas, pero dentro de la funcion que llama poner una condicion respecto de la hora del dia, si se cumple entonces se va a poner en funcionamiento la bomba, si no se cumple entonces no hace nada, se entiende?

Entender se entiende.
PUedes entonces hacer lo que sin saber te expliqué
Arrancas a las 8:00:00 y apagas el timer a las 20:00:00
ya te haré algo de ejemplo que mas o menos lo haga como tu estas pidiendo.

Mas que entendido !!
Mil gracias por las ayudas, ahora me toca a mi meter mano en el asunto jejeje.
Cuando tenga un pequeño tiempo me pongo con el tema de las alarmas o tiemers.
Yo simplemente pensaba de esa forma porque tenia la erronea idea de que solo se podian usar 5 o 6 alarmas, pero viendo esto que me decis me quedo mas tranquilo.
Un abrazo y seguiremos en contacto.

Cuando comience a construir el sistema abro un nuevo post en la seccion "proyectos" ?? me parece lo mas logico no?
Saludos!!

He hecho un código que podria servirte, lo probé con una repetición de 5 seg entre dos horarios y lo hizo bien.

/*
 * TimeAlarmExample.pde
 *
 * This example calls alarm functions at 8:30 am and at 5:45 pm (17:45)
 * and simulates turning lights on at night and off in the morning
 * A weekly timer is set for Saturdays at 8:30:30
 *
 * A timer is called every 15 seconds
 * Another timer is called once only after 10 seconds
 *
 * At startup the time is set to Jan 1 2011  8:29 am
 */
 
#include <TimeLib.h>
#include <TimeAlarms.h>

int ID ;
int ID2 ;

void setup()
{
  Serial.begin(9600);
  setTime(7, 59, 58,1,1,17); // set time to Saturday 8:29:00am Jan 1 2011
  // create the alarms 
  Alarm.alarmRepeat(   8, 0, 0, ArrancoRiego);  //   8:00am every day
  Alarm.alarmRepeat( 20, 0, 0, TerminoRiego);  // 20:00pm every day 
  
}

void  loop(){  

  digitalClockDisplay();
  Alarm.delay(1000); // wait one second between clock display
}

// functions to be called when an alarm triggers:
void ArrancoRiego(){
  Serial.println("Alarm: cada 2 hs"); 
  ID = Alarm.timerRepeat(2*3600, Repeats);            // timer for every 15 seconds  
  Alarm.enable(ID);  
}

void TerminoRiego(){
  Serial.println("Riego terminado.");  
  Alarm.disable(ID);         
}

void Repeats(){
  Serial.println("Riego cada 2 hs");         
}

void digitalClockDisplay()
{  static int secondAnt = 0;

  // digital clock display of the time
  if (second() != secondAnt){
      Serial.print(hour());
      printDigits(minute());
      printDigits(second());
      Serial.println(); 
      secondAnt = second();
  }
}

void printDigits(int digits)
{
  Serial.print(":");
  if(digits < 10)
    Serial.print('0');
  Serial.print(digits);
}

Excelente amigo!! muchas gracias por tus molestias!
Lo voy a tener guardado para meterlo en el codigo.

Todos los dias se me ocurren nuevas cosas para el sistema, para que sea lo mas completo posible.
Estuve viendo un teclado matricial, y se me ocurrio ponerme a leer sobre la entrada de datos y que se puedan modificar variables como los limites de temperatura para que encienda el ventilador o el caloventor por ejemplo. Sera muy rebuscado poder hacerlo? lo pregunto desde el punto de vista que soy un total principiante en el tema.
Bueno seguiremos en contacto, cuando cobre voy a ver de comprar la pantalla y un modulo wifi.
Saludos y gracias nuevamente.

Consulta para los que saben, vi que los rele que vienen en modulos para poder conectar al arduino son de hasta 10A. Leyendo un poco en internet vi la siguiente ecuacion que viene de la Ley de Ohm

Potencia=Voltaje x Intensidad (W=VxA)

Sabiendo que nuestra red es de 220V y que el rele admite hasta 10A, eso me da que puedo conectar un aparato que no tenga mas de 2200W, es correcto esto?

Ya se que es muy basico para la mayoria de aca, pero nadie nacio sabiendo jejeje.
Saludos y gracias nuevamente

Sabiendo que nuestra red es de 220V y que el rele admite hasta 10A, eso me da que puedo conectar un aparato que no tenga mas de 2200W, es correcto esto?

Es correcto si alimentas una resistencia con Z impedancia totalmente Resistiva.
La ley de ohm tiene su simil en CA de este modo

V =I * Z

Donde todos son vectores y no solo magnitudes, es decir un vector tiene magnitud y fase.
Guauu ahora si te rompi la cabeza pero no hay mas remedio es asi.

Hay elementos que actuan de un modo (capacitores), otros de otro (inductores o bobinas) y el tercero las resistencias es el simil a una R en continua.

Asi que volviendo a tu consulta si alimentas una Resistencia calefactora (incluso siempre tendrá algo de inductancia) y digamos que a los fines practicos se cumple lo que dices.
Pero si pones un motor debes leer la chapa de especificaciones y dira que el coseno phi (phi angulo de defasaje entre tensión y corriente) es de tanto, generalmente 0.8
Entonces ese motor tiene una potencia dada por W = V * I * cos(phi)

Bien en reles no se como se hace.. yo simplemente diría de no superar la corriente de 10A pero en contactores el coseno phi define el tipo de contactor
Un contactor AC1 es para cargas con coseno ph > 0.95
Estan

AC1 (cos φ>=0,9). Cargas puramente resistivas para calefacción eléctrica. Son para condiciones de servicio ligeras de cargas no inductivas o débilmente inductivas, hornos de resistencia, lámparas de incandesencia, calefacciones eléctricas. No para motores.
AC2 (cos φ=0,6). Motores síncronos (de anillos rozantes) para mezcladoras centrífugas.
AC3 (cos φ=0,3). Motores asíncronos (rotor jaula de ardilla) en servicio continuo para aparatos de aire acondicionado, compresores, ventiladores.
AC4 (cos φ=0,3). Motores asíncronos (rotor jaula de ardilla) en servicio intermitente para grúas, ascensores.

Pegado de wikipedia.

Si fuera un motor y el coseno phi fuera de 0.8 tomaría como limite 2200*0.8 = 1760 Watts

Incluso sería mas cuidadoso porque un motor puede tomar una corriente de arranque mayor a la nominal y eso significa exponer a los contactos a una corriente mayor. El tema es que eso ocurre supuestamente por breve tiempo y no debería dañar los contactos, pero el uso reiterado si lo hace.
Como ves es un tema delicado.
No sirve poner las cosas al limite.

Si estas con conseno phi >= 0.95 estas tranquilo con esa especificación.
Sino, se conservador.

1 Like

Ah bueeeeeee! Que catedra papa!
Muy buena las aclaraciones. Ya con todo esto me quedo mas que tranquilo para conectar algun artefacto.
Cuando me lleguen las cosas que compre subo los avances.
Gracias nuevamente por toda la data y la ayuda que me estan dando, sobre todo Surbyte.
Un abrazo grande, seguimos en contacto

Hola El_pancho22 pudiste terminar el proyecto para Sistema hidroponico ?