Concurso de fotografía AM

Temática: «Una panorámica de tu acuario».
Ya esta abierto el plazo para presentar fotografías.

Más info
image01

¿Aún no conoces AMA?

Hazte socio de Acuariofilia Madrid Asociación.
CERRADO EL PLAZO DE INSCRIPCIÓN

Más info
image01

Atlas de peces de AM

¡Hemos alcanzado las 800 fichas! Visita nuestro atlas de peces actualizado.

Más info
image01

Cardúmenes y sociabilidad

Nueva actualización de la tabla con una extensa relación de peces, donde podrás conocer qué entorno necesita cada especie, su sociabilidad y si convive o no en cardumen. ¡Pasa a descubrirla!

Mas info
image01
Rellenador de acuario basado en Arduino
Respuestas: 20    Visitas: 6634
#16
(14-09-2018, 01:00 AM)Davidmadrid escribió:
Código:
Serial.begin(115200);

Esto se usa para comunicar el arduino con un pc y mandarle datos y, por qué no, recibirlos. En tu código no haces esto, así que no haría falta inicializar el puerto de serie.

El resto lo veo muy bien, sólamente diría que la boya debe ser una normalmente abierta (que cierra el circuito al activarse), aunque valdría la contraria cambiando la en el código los low y los high.

¿No te has planteado hacer un sistema con dos boyas, que arranquen y paren la bomba?
#17
ME encanta! Tengo todo el material de arduino, y me faltaría las boyas..... bueno y tiempo apra montarlo, esto está entre mis favoritos del foro, muuuuuuuuuuuchas gracias!
#18
(21-09-2018, 01:03 PM)Dudo escribió:
(14-09-2018, 01:00 AM)Davidmadrid escribió:
Código:
Serial.begin(115200);

Esto se usa para comunicar el arduino con un pc y mandarle datos y, por qué no, recibirlos. En tu código no haces esto, así que no haría falta inicializar el puerto de serie.

El resto lo veo muy bien, sólamente diría que la boya debe ser una normalmente abierta (que cierra el circuito al activarse), aunque valdría la contraria cambiando la en el código los low y los high.

¿No te has planteado hacer un sistema con dos boyas, que arranquen y paren la bomba?

Sí, en mi código original sí me comunico con el pc, cuando hice el código necesitaba ver que interferencias se producían, aunque luego cuando subo el código a Arduino anulo esas lineas, pero en este caso y para subir el sketch al foro quise prescindir de todas las lineas de código que me permiten tener una comunicación con Arduino y sobre todo para que fuese todo más claro y la gente que esté empezando lo entienda mejor, aparte que ya estaba todo probado, es un código que funciona.

Si es cierto que para el funcionamiento del brico una vez cargado el sketch en Arduino se hace innecesaria, pero tampoco molesta, ponte en el caso que mañana quiero agregar algun módulo nuevo o que veo que hay errores de funcionamiento y quiero comprobarlos en el pc, pues estaríamos todo el día quita y pon con linea de código -nosweat.gif. A mi modo de ver no soluciona nada el tenerla, pero tampoco molesta el que esté.





Referente a las boyas si son NO (normalmente abiertas) o NC (normalmente cerradas), creo que te quivocas. El estado NO o NC se determina siempre cuando no estamos actuando sobre él. Ejemplo; en éste caso yo saco la boya de la bolsa, su estado normal es que la boya esté abajo, no estoy ejerciendo ninguna actuación en él, y al ser NC en ese momento el circuito estará cerrado, es decir y para quién lea ésto y no lo entienda, si comprobamos con un polímetro sus dos conexiones, éstas darán continuidad.

Más tarde cuando coloquemos nuestra boya en nuestra acuario y el nivel de agua haga que esta suba, llegará el momento en el que el circuito quede abierto, pero en ese momento sí estaremos actuando sobre él.



Quizás deberíamos plantear este caso en el sentido de por qué he elgido una boya NC y no una NO. En mí lógica al plantearme el esquema de montaje, ví mejor que Arduino sólo recibiese los 5v en el momento que la boya mande la señal de que el nivel está bajo, estando el resto del tiempo conectado este pin a masa con su resistencia pull-down para evitar interferencias residuales. Por el contrario, si hubiese elegido una boya NO, se invertiría el proceso, Arduino estaría recibiendo continuamente los 5v por el pin en el que está conectada la boya la gran mayoria del tiempo.

A lo mejor es una lógica incorrecta, pero preferí que Arduino sólo recibiese esos 5v los pocos segundos que dure el rellenado del acuario a su nivel preestablecido a que estuviese durante horas recibiendo 5v de manera continua.





Más... A por qué no me he planteado el hacer el sistema con dos boyas tiene fácil explicación. Lo veo inncesario, con una funciona bien y sin fallos. Por otro lado, y el que más me importa... Si ya el ver una boya fea me da rabia en mi intento siempre de simplificar y esconder elementos pues, como para ver dos boyas -laughbounce2.gif-laughbounce2.gif.






(21-09-2018, 01:17 PM)Gelu escribió: ME encanta! Tengo todo el material de arduino, y me faltaría las boyas..... bueno y tiempo apra montarlo, esto está entre mis favoritos del foro, muuuuuuuuuuuchas gracias!

Me alegro Gelu... me sorprende que algo tan sencillo esté gustando a tanta gente -happy.gif-happy.gif





Saludos -hi.gif.
#19
Buenas noches,
Muy buena iniciativa y muy bien explicado todo. Aporto mi granito de arena sugiriendo un cambio que me parece muy importante:
¿Que pasa si la sonda se queda atascada por un fallo interno o alguna hoja en la parte baja? se nos podría desbordar el acuario. Para ello añadiría lo siguiente:

Código:
const int boya          = 2;
int rele_bomba          = 5;
int tiempo_actual_1     = 0;
int tiempo_actual_2     = 0;
int tiempo_resultante   = 0;
int estado_boya         = 0;
boolean estadoerror     = 0; //1=error, 0=correcto
int tiempomaximollenado = 30000; //tiempo maximo que puede estar llenando el acuario

void setup() {
  Serial.begin(115200);
  pinMode(boya, INPUT);
  pinMode(rele_bomba, OUTPUT);
}

void loop() {
  estado_boya = digitalRead(boya);

  if (estado_boya == LOW) {
    tiempo_actual_1 = millis();
    digitalWrite(rele_bomba, LOW);
  }

  else {
    tiempo_actual_2 = millis();
    tiempo_resultante = tiempo_actual_2 - tiempo_actual_1;

      if ((tiempo_resultante >= 1000)&&(estadoerror==0)) {
        digitalWrite(rele_bomba, HIGH);
        delay(10000);   // Unico parametro a modificar segun necesidades
      }

      if (tiempo_resultante >= tiempomaximollenado) {
        digitalWrite(rele_bomba, LOW);
        estadoerror=1; //paramos el sistema de llenado
      }
  }
}

Se podría poder un buzzer para alertar de que ha fallado (o un LED) y un pulsador para quitar el error pero ya es complicarlo
Un saludo!
#20
(15-09-2018, 12:14 AM)RoFran escribió: Acabo de leerlo en diagonal... por si ayuda te comento lo que veo ya que, aunque de Arduino no sé nada, de C (aunque oxidado) y programación si sé algo.

"LOW" y "HIGH" parecen constantes booleanas... ¿donde están definidas? Igualmente aunque desconozco los parámetros necesarios para el procedimiento "digitalWrite" (tampoco veo donde está definido) veo que niegas estas constantes al introducirlas. ¿Por qué haces esto? ¿Le envías un mensaje FALSO al relé para que se encienda? Parece contradictorio.

Por otro lado, y relacionado, "estado_boya" tiene que ser una variable booleana por lo que solo puede almacenar dos estados: VERDADERO o FALSO

¿Por qué digo esto último? Pues dado que "estado_boya" solo puede tener dos valores la estructura de control "if" se puede mejorar usando un "if-else". Incluso si pudiera tener más valores, que no lo creo, me plantearía usar "switch-case". Cualquiera de estas dos opciones sería más eficiente.

Te pongo como lo dejaría yo ese trozo (lo he escrito al vuelo, espero que compile):

Código:
void loop() {
  estado_boya = digitalRead(boya);

  if (estado_boya == LOW) {
    tiempo_actual_1 = millis();
    digitalWrite(rele_bomba, !LOW);
  }

  else {
    tiempo_actual_2 = millis();
    tiempo_resultante = tiempo_actual_2 - tiempo_actual_1;

      if (tiempo_resultante >= 1000) {
        digitalWrite(rele_bomba, !HIGH);
        delay(10000);   // Unico parametro a modificar segun necesidades
      }
  }
}

También he quitado la primera condición en el "if" anidado porque siempre se cumpliría (estado_boya == HIGH ya se evaluó en el "if" superior que ahora es el "else").

El IDE de Arduino introduce unas cabeceras en tu código que definen las constantes HIGH y LOW (y muchas otras como la definición de los pines, etc), así como las funciones básicas de gestión de hardware del Arduino como digitalWrite().

Un libro gratuito que trata el tema de la programación arduino podría ser éste:
https://www.e-ika.com/manual-de-programacion-arduino

En cuanto a que para activar el relé haya que poner el pin de control en false (LOW) es bastante habitual que los relés se activen a nivel bajo y se desactiven a nivel alto.
#21
Hola.

Compre las boyas y las medí. Desmonte la boya y la monte al revés, y volví a medir. El resultado es que se invierte, es decir, si normalmente se cierra el circuito cuando sube la boya, al darle la vuelta la flotador, se abre cuando sube. No se si lo habían comentado ya, pero abre muchas posibilidades.

Usuarios navegando en este tema: 1 invitado(s)


Salto de foro: