Control de emisoras de radioaficionado con Arduino [4]: Código y vídeo demostrativo

Actualización: 2016/10/24
He resumido el código de este menú en la siguiente entrada: Menú con submenus para Shield LCD en Arduino

29 thoughts on “Control de emisoras de radioaficionado con Arduino [4]: Código y vídeo demostrativo

  1. Buenas, buen trabajo, me encanta
    Bueno me encantan muchos trabajos y te encontré porque estoy haciendo un termostato y este menú es lo que necesito, pero tengo el problema de que no puedo o no consigo que en vez de que el TYPE_INT sea de 0,1,2 a mi me gustaría que fuera de 00.00 al 99.99 por ejemplo y llevo dos días pegándome con el código, podrías ayudarme un poco por favor que no tengo ni idea de programar en C++ y estaba usando el MenuBackend pero seme queda corto comparado con el tuyo que es … sin palabras lo que necesitaba
    Un saludo Carlos

    1. Hola Carlos,

      Esa función solo permite cambiar números de tipo entero, int o boolean, no funciona con números decimales, float o double, porque los parámetros que le pasas a la función no coinciden con el tipo de dato que le mandas.

      Necesitarías crear una segunda función con parámetros distintos, esto se llama sobrecargar una función, las dos se llaman igual pero dependiendo del número y tipo de parámetros que pongas se ejecutara una u otra, por ejemplo:

      Si te fijas he eliminado el segundo parámetro, que ayudaba a saber cómo representar por pantalla la modificación del valor que se le pasaba, porque antes se podían modificar un rango de relés, números enteros y booleans, ahora como solo es para decimales en principio no hace falta.
      También he añadido el ultimo parámetro de tipo float para indicar el salto que se ha de dar con cada pulsación… como los números decimales son infinitos es conveniente que sume o reste siempre la misma cantidad, por ejemplo 1.0 si quieres pasar de 22 a 23 a 24, etc., ó 0.5 para pasar de 22 a 22.5, 23, 23.5, etc., ó 0.25, ó 0,10, etc. según el salto que quieras dar.

      Así que dentro de la función en vez de hacer:

      Tendrás que hacer:

      Intenta poner como valores mínimo y máximo números a los que se pueda llegar con las sumas/restas de jumpValue, por ejemplo:

      • minValue = 18
      • maxValue = 26
      • jumpValue = 0.5

       
      Con eso ya deberías de poder crear la función para decimales.

      Saludos!

      Edit:
      Ya que estamos te hago una pregunta, que también tengo en mente hacer un termostato pero aun no me he decidido…
      Para activar o desactivar la caldera que has usado, un relé normal? Y como fuente de alimentacion, una pequeña que permita empotrarla en el hueco del termostato u otra?

    2. Luego cuando llegue a casa te cuento todo pero vasicamente es un termostato con arduino pro mini con pantalla de 16×2 y wifi rt a otro pro mini que controla el rele como los que usas tu pero los mios son azules jajaa y todo esto conectado a una raspberry y controlarlo por internet, con la raspberry ya lo hice y un amigo me lio para hacerlo en arduino, pero de programacion mi sabiduria se limita un monton
      bueno que me enrollo luego te cuento

    3. Bueno el rele es como los que montas tu en el del Control Remoto de Alumbrado y la fuente es de móvil desarmado para el del rele y meterlo en una caja lo mas pequeña posible, para el del control usare pilas ya que lo que interesa es poder llevártelo a una habitacion y que coja la temperatura de ella

    4. Has pensado usar relés de estado solido? Al no tener partes móviles no hacen ruido, aunque solo aguantan 2A a 220V, creo que es suficiente para la caldera ya que imagino que los cables que van conectados al termostato serán para activar el circuito de la caldera, no para encenderla y apagarla.
      http://www.ebay.es/itm/271675674782

      Mi idea era montarlo todo en uno de estos, pero es complicado, demasiados componentes: http://www.aliexpress.com/item/BHT-100GA-Simple-Non-programmable-Room-Thermostat-White/32279446637.html

    5. No se, primero me tiene que funcionar bien y luego ya pienso o veo como, para empezar comprare el mes que viene la carcasa transparente que comentas en otros post que por unos 6€… por otro lado comprare unas pantallas del 5110 para que sea mas chulo,

      No me funciona el menu 🙁 te paso el codigo

      #include
      #include //Libreria LiquidCrystal - Pantalla 16x2
      #include
      #include
      LiquidCrystal lcd(2, 3, 4, 5, 6, 7);
      ...

    6. Cuando le das a compilar te sale una lista de errores por los que la compilación no ha podido realizarse. Arregla los errores que te indiquen.

      Aunque ya solo por la cantidad de #includes vacíos que pones al principio, ya es razón suficiente para que no funcione.

    7. Si, pero no es factible ademas el ruido lo hace en la caldera, yo para las pruebas comprare la carcasa transparente esta que usas en otros post que por 6€ me valdrá para otros proyectos, también tengo pensado en ponerle una pantalla del 5110 al final.

      No me funciona el código 🙁
      Estoy intentando ponerlo aquí pero no me deja

    8. El blog no te deja pegar el código, y tampoco lo voy a revisar linea a linea.

      Si el IDE de Arduino no te compila el código es que has cometido algún error al modificarlo, mira que errores te marca el IDE, búscalos y arreglalos.
      Si no lo encuentras vuelve a empezar desde el código original y ves editandolo a tu necesidad poco a poco, y tras cada cambio prueba a compilarlo de nuevo.

  2. Ya lógico, solo estoy con el menú tuyo que me parece alucinante y solo quería copiarte tu menú con los siguientes cambios importantes lógicamente todo sobre los reles lo tengo quitado

    Si me lo compila pero no me pone en 00.00 me pone en 00 y si esta en 20 solo baja y no sube, lo tuve que configurar void openSubMenu( byte nameID, float jumpValue, int *value, int minValue, int maxValue ) porque daba error luego hice los cambios que me comentaste y en vez de if( typeMenu == TYPE_INT ) he puesto if( jumpValue )

    por otro lado en el openMenu, he configurado el case
    case 0: openSubMenu( 0, jumpValue, &memory.d.setTemp/*20.00*/, 00.00, 99.99 ); break;

    y nada he probado todo lo que yo se y no lo consigo jo

  3. Por cierto, no te di las gracias, bueno pues ya lo conseguí después de tirarme desde las 6 de la mañana jajaja lo mio es vicio….
    void openSubMenu( byte nameID, float jumpValue, float value, float minValue, float maxValue )

    y la verdad es que me encanta el menú como queda wow, lo malo es que no me funciona que coja los resultados value de la EEPROM pero cuando tenga mas tiempo lo mirare jejejeje muchas gracias ya te pasare si lo quieres el codigo

    1. Si, disculpa jaja es que no me había fijado bien en la configuración del modulo I2C, pero ya lo revisé.
      Muchas Gracias.

  4. Hola estoy trabajando con tus codigos para hacer un menu de ver parametros y grabar nuevos parametros pero no veo cuando lo hago al pulsador, seguire con eso pero tu menu es genial muchas gracias por publicarlo

    1. Hola,

      Esta terminado, me encargaron que hiciera el programa para el Arduino a partir de ciertas especificaciones y es eso lo que he publicado. La persona que me lo encargo lo tiene que unir al resto de sus circuitos eléctricos.

      Saludos.

    1. Hola Carlos,

      No, no tiene nada que ver eso. El hardware para este proyecto lo hizo quien me encargo la parte de software, me paso esta foto de su placa:

      Saludos.

  5. Hola! Llevaba semanas luchando con Arduino para crear un programa con lcd+encoder+menu y el tuyo me ha resultado fantastco! El único problema que tengo es que estoy utilizando una pantalla de 16×2 y al intentar utilizar tu programa en él no consigo que aparezca nada, simplemente el inicio. ¿Podrías echarme una mano?

    1. Hola Anabel,

      Tienes que indicar en el código el número de columnas y filas del LCD, con eso debería de funcionar para esa pantalla aunque no lo he probado.

      También tendrás acortar los textos al entrar menos caracteres por línea y eliminar el código en el que se escriba explícitamente en la tercera o cuarta línea del LCD.

      Saludos.

    2. Si, es exactamente lo que he hecho, cambiar el numero de filas y columnas:

      const byte rowsLCD = 2; // Numero de filas del LCD
      const byte columnsLCD = 16; // Numero de columnas del LCD

      Y los pines de SDA y SCL también los cambié ya que utilizo Arduino Nano, según la entrada que realizaste de las configuraciones de arduino. También incorporé el encoder, y solo me realiza la pantalla de inicio, es decir, donde aparece el texto:
      // Imprime la informacion del proyecto:
      lcd.setCursor(0,0); lcd.print(“Control emisoras”);
      lcd.setCursor(0,1); lcd.print(“radioaficionado”);
      Y a continuación limpia la pantalla sin aparecer nada :/

    3. Muchísimas gracias por modificar el código, pero sigue sin funcionarme. Es cierto que estoy utilizando un LCD I2C, pero no creo que ese sea el problema, ya que al iniciar el programa si me aparece el mensaje inicial, y además he probado con tu entrada anterior “https://giltesa.com/2014/02/18/pantalla-lcd-por-comunicacion-i2c-para-arduino” para asegurarme que no es problema de mi pantalla y me funciona perfectamente. Quizás sea un problema en la EEPROM de mi Arduino, no se me ocurre nada más. Seguiré investigando a ver si resuelvo el tema y te comento.
      Aún así muchas gracias por tu pronta contestación!

    4. Fíjate que también cambie la lectura de los botones (la prueba la hice con una Shield LCD que usa un pad analógico y no digital como el encoder)

      Saludos.

  6. Era eso… Estaba realizando las pruebas con el encoder y simplemente al cambiarlo por los botones ya funcionaba perfectamente!!
    Muchas gracias por tu ayuda!

Escriba aquí su comentario