Hormiguero monitoreado por Arduino

Hola, muy buenas a todos, abro este tema con la esperanza de que me puedan ayudar y concretar un proyecto que he soñado durante un tiempo, intente hacerlo solo pero la verdad como estudiante de arquitectura se me complica bastante programar esto y me interesaría bastante ir aprendiendo poco a poco por mi cuenta pero no he encontrado mucha información clara, y creo yo que es algo sencillo, incluso he comprado un arduino uno, unos sensores y demás cosas para ir haciendo el proyecto, verán, les cuento un poco de que va el proyecto, tengo un hormiguero de acrílico, no muy evolucionado, por lo que me va perfecto, lo que busco es que pueda medir la temperatura, la humedad, la iluminosidad de un área en especifico, prender y encender 4 leds con uno o dos botones y que esto sea visible en un lcd de 16x2 y/o por bluetooth a un celular android; adjunto una imagen de los sensores y demás cosas que compré, me haría falta algo mas para llevar acabo el proyecto? alguna sugerencia para agregarle a mi hormiguero? Ayuda por favor :frowning:

WhatsApp-Image-2018-09-23-at-7.20.13-PM-ConvertImage.jpg

Hola

Parece que te falta la fotocelda, creo tienes todo solo te falta el codigo, primero date una idea de como vas a presentar la informacion en pantalla, y empieza a escribir codigo.

saludos

Así es, esa fotocelda me la compro en unos dias, si, el codigo es el problema, solo que tambien necesito saber el como conectar todo y si necesito algunas resistencias o algo mas? saludos y gracias

Matemáticas:
• Estudios básicos de algebra clásica; es más que suficiente (y sobra) con el contenido de esta página Álgebra elemental - Wikipedia, la enciclopedia libre.
• Algebra binaria: Para entender la programación que se describirá es necesario comprender los principios básicos: Lógica binaria - Wikipedia, la enciclopedia libre.

Física (electricidad/electrónica):
• Conceptos básicos de electricidad. Para quien no tenga ningún conocimiento básico:
Electronica - Conceptos basicos de electricidad.

TECNOLOGIA ELECTRICA

Hola, antes que nada, muchas gracias por tomarse el tiempo de contestar, y en efecto, estoy completamente de acuerdo, me parece bastante acertada tu analogía con el blog de arquitectura y aun así buscaría ayudarte lo mas posible.

Ahora... me he tomado el tiempo de investigar un poco mas y de leer cada uno de los links que has puesto, ArduMyth, y me han servido bastante para entender mas el funcionamiento de los sensores, ahora, ante eso, me han surgido algunas dudas en cuanto al código, por ejemplo, me dice como conectar cada uno de los sensores pero por separado, si yo quiero unir en conjunto todos los sensores, los códigos que me aparecen ahí o en las bibliotecas pueden funcionar si los copio y pego? Obviamente con sus respectivas modificaciones; He leído sobre programación de los códigos pero no me termina de quedar bastante claro, puedo subir un código para que lo vean y juzguen según lo que entiendo pero estoy seguro que será un fiasco. Otra duda que me ha surgido, debería conectar todo y después programarlo o viceversa? Estoy seguro que este proyecto no es en lo absoluto complejo como otros que he visto pero aun así me rompo la cabeza con esto de la programación.

Sobre los elementos restantes, como las resistencias y la fotocelda, hoy mismo me hago con ellos, una vez mas muchas gracias por su tiempo y conocimientos.

Hola,
Con tu post original podemos hacernos una idea de lo que quieres hacer, pero deberías explicarlo un poco más: solo ver los valores, encender apagar los leds con ciertos umbrales, etcétera.
Saludos.

Stampfen:
pero aun así me rompo la cabeza con esto de la programación.

Hola. Con otro usuario de esta comunidad hemos hecho una Controladora Para Acuario que puede servirte porque se maneja sin pulsadores, solo con un encoder y tiene el código para ajustar la hora del RTC. Además tiene dos termostatos y el control de tres canales de Led's. Saludos

Perfecto muchas gracias a todos por tomarse el tiempo, tratare de desglosar un poco el proyecto para ver si es un poco mas claro, como lo dice es básicamente un hormiguero en el cual pienso poner un modulo de temperatura y humedad ( dht11 ) un reloj en tiempo real para saber que temperatura y humedad se tuvo en determinada fecha dentro del hormiguero por lo que creo se necesita un modulo de micro sd supongo, aun que esto del reloj es un lujo, básicamente necesito que se vea la temperatura y la humedad en el LCD, la cantidad de luz y que con 2 botones prender 4 leds, por ejemplo con el botón A prender 2 leds de luz blanca y con el botón B prender 2 leds de luz roja, todo esto en un protoboard a lado del hormiguero, no necesito que sea muy ordenado el asunto.

Ahora, estoy trabajando con todo mi ser en el código del LCD y me doy cuenta que definitivamente necesito la interfaz I2C, mañana me hago con ello, ahora en cuanto a esto me aparece que conectara ciertos puertos del LCD a Vcc de arduino, he leído y se refiere al voltaje de 5v o dependiendo, pero cuando me aparece que conecte 2 pines a 2 Vcc diferentes, me confundo, trabajare en el código del LCD para saber bien como se forma y saber bien como voy a presentar la información recolectada del modulo de fotoceldas y el de temperatura y humedad, supongo que teniendo esto ya en el display lo de los leds y botones sera un poco mas sencillo para que después de esto pueda afinar el proyecto y ver si agrego el RTC y demás cosillas poco a poco.

Ahora, me has pedido que consiga las resistencias de 200Ω por led y de 1KΩ, las de 220Ω pueden funcionar o es imperativo las de 200Ω las otras no las he podido encontrar y sobre el modulo para medir la luz, cual me recomiendan? y si necesito algo mas para comprarlo de una vez.

Supongo que tengo que ir armando esto por faces para que al final ya solo sea unirlas, ah e igual me he leído unos escritos sobre código de programación pero no se si sean buenos o bien explicados por igual si saben de algún link, se los agradecería bastante; cuando tenga la interfaz y el codigo para el display, lo subo junto con fotos, trato de contestar a la brevedad posible y una vez mas, gracias por su tiempo y consejos!

Hola, que tal, después de un día de leer, investigar y husmear por ahí, me he hecho por fin con el código y diagrama de la iluminación del hormiguero, el cual consta de dos pulsadores A y B para encender dos pares de led, un par blanco y otro rojo, agradecería bastante si pudieran leerlo y decirme si esta erróneo en algo o si pudiese estar mejor…

 /* Iluminación de hormiguero con 4 leds y dos pulsadores con la técnica de control de interrupciones */

// Pines que atienden interrupciones
int  intbla = 2, // El Pin 2 controla el botón que cambia los led blancos
int  introj = 3, // El Pin 3 controla el botón que cambia los led rojos

// Pines que encienden y apagan leds
int  ledbla = 4;  // enciende/apaga leds blancos
int  ledroj = 5;  // enciende/apaga leds rojos

// variables tipo volatile  que comunica la función de interrupción
// y el bucle principal (loop)
volátile int estbla = HIGH ;
volátile int estroj = HIGH ;

// Funcion Void que define el Hardware que utilizaremos
>void  setup () {

// Los pin de los botones se abren en modo OUPUT
pinMode (intbla, OUPUT) ;
pinMode (introj, OUPUT) ;
// Se activan las resistencias internas pull-up
digitalWrite (intbla, HIGH ) ;
digitalWrite (introj, HIGH ) ;
// definimos como OUPUT los pines que  manejan los led
pinMode (ledbla, OUTPUT ) ;
pinMode (ledroj, OUTPUT ) ;

// La interrupción  0 monitorea los cambios de estado del pin 2
// y lanza la funcion cambla para cambiar leds blancos
attachInterrupt(0, cambla0, CHANGE);
// La interrupción  1 monitorea los cambios de estado del pin 3
// y lanza la funcion camroj para cambiar leds rojos
attachInterrupt(1, camroj0, CHANGE);
} // fin de setup

// Funcion loop, solo crea unos segundfos de retardo<
void  loop () {
// No hacemos nada más que esperar unos segundos…
delay (2000);
} // fin del bucle

// la funcion de interrupcion cambla cambia leds blancos
// de apagado a encendido y viceversa
void  cambla ()   {  // Solo se ejecuta cuando hay un cambio de estado del Pin 2
// ver el estado de estbla y cambiarlo
if (estbla == HIGH) {
estbla = LOW
}
else {
estbla = HIGH
}
digitalWrite (ledbla, estbla)   / / encender o apagar los LED blancos
} / / fin cambla

// la funcion de interrupcion camroj cambia leds rojos
// de apagado a encendido y viceversa
void  camroj ()   {  // Solo se ejecuta cuando hay un cambio de estado del Pin 3
// ver el estado de estbla y cambiarlo
if (estroj == HIGH) {
estroj = LOW
}
else {
estroj = HIGH
}
digitalWrite (ledroj, estroj)   / / encender/apagar los LED rojos
} / / fin camroj

…Por cierto, a la hora de cargarlo a la placa me aparece un error en la linea que dice " digitalWrite (introj, HIGH ) ; " no se a que se deba.

Adjunto el diagrama de como he conectado todo…

Hola, al comienzo ya tienes errores porque las instrucciones se terminan en punto y coma.

Los pines de salida se declaran con OUTPUT, te falta la T del medio.

¿Usar las interrupciones del microcontrolador para encender y apagar dos led's?
Mi consejo es que tires a la papelera este código.

Si para encender y apagar dos luces tienes que ir hasta el pulsador para oprimirlo, pues pon dos llaves interruptoras y listo, no te gastas un arduino para esta pequeñez.

En el foro de proyectos, junto a otro usuario de la comunidad hemos desarrollado una lámpara de acuario muy completo y tal vez puedas aprovechar o aprender algo de ello.

También puede ser un buen comienzo instalar y comprender los ejemplos de la librería OneButton.
Saludos

Usar una interrupción para controlar cuando se pulsa un interruptor siendo que el microcontrolador no tiene nada mas que hacer, es digamos una opción no muy adecuada si nos quedamos solo en esto.
Además si tu loop solo hace que? delay(2000) pues bien en lo personal no me gusta nada!!

Tu código y la operación que pretendes se puede manejar de otro modo, sin necesidad de interrupciones.

Ahora te modifico el código y luego me dices si tu ejemplo o el que te sugiera tienen diferencia en cuanto a la reaccion a los pulsadores.
Tu código no funcionará porque tiene errores.

Un error importante es que defines los pines 2 y 3 que te funcionan si lo hacen porque los has definido como interrupciones pero… que ademas los pones como salida y luego supuestamente habilitas el PULLUP.
Eso lo sacaste de un código muy muy viejo pero además esta mal.

Y si usas interrupciones no tienes que definir nada para esas dos entradas.

Otro error es que tus dos interrupciones llaman a funciones que no existen.
Definiste ambas funciones con un 0 al final pero cambla no tiene 0 al final y camroj tampoco.
O sea que ese código da errores.

Estas dos líneas

int  intbla = 2, // El Pin 2 controla el botón que cambia los led blancos
int  introj = 3, // El Pin 3 controla el botón que cambia los led rojos

debieran ser asi

int  intbla = 2; // El Pin 2 controla el botón que cambia los led blancos
int  introj = 3; // El Pin 3 controla el botón que cambia los led rojos

; no ,

la definición de las interrupciones

attachInterrupt(0, cambla0, CHANGE);
attachInterrupt(1, camroj0, CHANGE);

debería ser asi

attachInterrupt(0, cambla, CHANGE);
attachInterrupt(1, camroj, CHANGE);

Estas lineas tmb dan error

digitalWrite (ledbla, estbla)   / / encender o apagar los LED blancos

deberían ser asi

digitalWrite (ledbla, estbla);   // encender o apagar los LED blancos

Bueno, varios errores que lamento no te hayas tomado el tiempo de verificar antes de presentarlo.
Porque seguramente hubieras resuelto algunos y otros los hubieras consultado.
Ahora mira mi sugerencia sin interrupciones y sin delay()

Mi código

/* Iluminación de hormiguero con 4 leds y dos pulsadores con la técnica de control de interrupciones */

// Pines que atienden interrupciones
const byte intbla = 2; // El Pin 2 controla el botón que cambia los led blancos
const byte introj = 3; // El Pin 3 controla el botón que cambia los led rojos

// Pines que encienden y apagan leds
const byte ledbla = 4;  // enciende/apaga leds blancos
const byte ledroj = 5;  // enciende/apaga leds rojos

bool estbla = true;
bool estroj = true;
bool estado2, estado2Ant = HIGH;
bool estado3, estado3Ant = HIGH;

// Funcion Void que define el Hardware que utilizaremos
void setup () {
    // Se activan las resistencias internas pull-up
 pinMode (intbla, INPUT_PULLUP);
 pinMode (introj, INPUT_PULLUP);
 
 // definimos como OUPUT los pines que  manejan los led
 pinMode (ledbla, OUTPUT );
 pinMode (ledroj, OUTPUT );
}

// Funcion loop, solo crea unos segundfos de retardo<
void  loop () {

 estado2 = digitalRead(intbla);
 estado3 = digitalRead(introj);
 if (estado2 != estado2Ant) {
 estbla = !estbla;
 digitalWrite (ledbla, estbla);   // encender o apagar los LED blancos
 }
 estado2Ant = estado2;

 if (estado3 != estado3Ant) {
 estroj = !estroj;
    digitalWrite (ledroj, estroj);   // encender apagar los LED rojos
 }
 estado3Ant = estado3;
}

No hagas comentarios con lineas separadas / / sino juntas //
Las variables que ven los estados de un pulsador no necesitan ser enteras o int sino boolean o bool
ese codigo es veloz y reacciona perfecto a cualquier interruptor que presiones.

Cada estado es leído por digitalRead(pin)
Su valor es comparado con el valor anterior. Ejemplo: estado2 != estado2Ant siempre que sean distintos responderá con un cambio en el valor de la variable estbla en este caso.
y con ese dato prendemos/apagamos el led.

Todavía puede hacerse mas simple pero no quise hacerlo para que se comprenda.

Las variables que definen los pines no necesitan ser enteras, basta con const byte ya que no se modificarán por eso uso const.

Hola Daniel, muchas gracias por responder, te comento rápido, este proyecto igual y no es grande pero como aparte de esto quiero montar un LCD y unos sensores de humedad y temperatura junto con el encendido y apagado de los leds mas un RTC pero como evidentemente soy principiante, quería armar todo por "partes" para después unirlo todo en un código, la verdad entiendo la aberración que esto puede llegarles a parecer a los que saben de esto pero pues me es bastante complejo y lo hago a modo tortuga.

Agregando las T´s del medio, que fue un error de dedo supongo, podría funcionar el código?

Saludos y disculpen las molestias :o

Surbyte, muchas gracias, de verdad, ahora lo cargo a la placa y lo pruebo, me disculpo por errores que haya tenido, los iré eliminando, ahora, entiendo los errores que me has marcado, esto modifica el ensamble de mis pulsadores, leds y resistencias o el diagrama queda igual? y de verdad gracias.

Stampfen, te recomiendo que revises esta pagina:

https://www.prometec.net/indice-tutoriales

Es una pagina muy buena, sigue cada tutorial paso a paso y aprenderas lo necesario para tu proyecto.

Hola que tal, gracias a todos una vez mas, oigan, he estado viendo videos sobre el display LCD 16x2 y he conseguido la interfaz I2C, la he conectado y todo, pero a la hora del código. que es el siguiente…

 #include <Wire.h>
 #include <LiquidCrystal_I2C.h>


LiquidCrystal_I2C lcd (0x27, 16, 2);

void setup(){
  Wire.begin();
  lcd.begin(16, 2);

  lcd.clear();

  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print("Hola, mundo (:");
  lcd.setCursor(0, 1);
  lcd.print("Arduino");
  //lcd.noBacklight();
}

void loop(){
}
{

…me aparece error en la linea " lcd.begin(16, 2); " no se a que se deba, alguien sabe que podría ser?

Porque ese no puede ser ningún ejemplo de la librería sino que tu lo modificaste a tu necesidad porque mira el error

LiquidCrystal_I2C lcd (0x27, 16, 2);  // <== defines 16,2

void setup(){
  Wire.begin();
  lcd.begin(16, 2);  // <== Vueleves a definir 16,2

Mira tu librería o mejor aún sus ejemplos y asegúrate como es la manera correcta.

Porque te digo esto? Hay de los dos tipos.

Surbyte, hola, buen día, te admiro bastante, de verdad, no solo por saber demasiado, si no también por que he visto que contestas las dudas de todos por todos lados, mis respetos.

...ahora, he visto ejemplos del mismo código o bueno, similar y veo que solo borran los valores que yo he agregado, es decir solo esta el paréntesis solo, lo he intentado así y ya no me marca error, en efecto, pero a la hora de subirlo a la tarjeta (arduino UNO) no me aparece nada en el LCD, ya moví el potenciómetro pero lo único que logro es aparecer la franja de arriba negra y la de abajo clara, que supongo es nada mas que el indicador de contraste, las conexiones también las encuentro correctas, sin embargo te comento como están conectadas:

I2C Arduino

GND = GND
VCC = 5V
SDA = A4
SCL = A5

Fue exactamente lo que te dije, o va en un sitio o en otro pero no en ambos.

Ahora que no tienes el error de compilación veamos que ocurre.
Lo primero es asegurarnos que la dirección que usas sea la correcta asi que prueba el sketch I2CScanner.ino que debe estar en tu IDE.
Búscalo, lo ejecutas y te dirá una dirección que si coincide con la que usaste estaremos en problemas pero si no, entonces esa debes usar y debería funcionar.

Si resulta que la dirección es la misma entonces tal vez tengas una mala soldadura en tu módulo I2C o bien, tu módulo requiera de otros pines para accionar el LCD paralelo.
Dejaré que respondas para no marearte.

Disculpa, como se hace el procedimiento o sea donde lo busco y como lo ejecuto?
Y si, por la mañana tomo foto del diagrama, saludos!

Hola, gracias por el código ArduMyth, esa página ya veo que si es bastante buena, tiene información demasiado valiosa, por otro lado he ejecutado el programa y me sale lo siguiente en el monitor serie

Scanning…
I2C device found at address 0x3F !
done

y así repetidamente…

Adjunto las imágenes de como esta conectado todo