Construyendo un menú y un programador para un termostato (codificador rotatorio para entrada, pantalla LCD)

5

Estoy construyendo un termostato avanzado en un arduino con los siguientes objetivos:

  • Use un codificador rotatorio (con botón pulsador) como el único dispositivo de entrada
  • Usar pantalla LCD (estándar 16x2)
  • Usa un reloj en tiempo real
  • Capacidad para programar cambios de temperatura
  • Capacidad de 'rampa' entre cambios (por ejemplo: comenzar a 45 grados F, terminar a 50 grados F 3 días después con un aumento lineal entre la fecha de inicio y finalización)

He finalizado gran parte de este proyecto, pero en el que me he estancado está creando una función de "programador" y encontrando un buen método de menú. ¿Puede alguien sugerir una función que funcione como programador y dar algunos ejemplos de un menú que podría funcionar bien con este proyecto?

    
pregunta

2 respuestas

2

Para el programador, use la biblioteca Time . Mantenga una matriz que mencione qué cambio debe ocurrir cuando (cree su propio protocolo para esto, por ejemplo, tome "2000/40" para que signifique "cambie el termostato a 40 a las 20:00").

Ahora, en tu bucle principal, configura loop() con un período de espera de un segundo. (Ya que también está tomando información, no puede permitirse un período de espera más largo). Ahora, solo compare los valores de matriz con las cosas devueltas por hour() y minute() , y active los cambios según sea necesario.

La rampa también es fácil, simplemente divida el cambio de temperatura cada hora. Entonces, la rampa de 45 a 50 en 3 días, simplemente configura el Arduino para aumentar la temperatura en 1 cada 14 horas.

    
respondido por el Manishearth
0

Soy el autor de arduino-menusystem , una biblioteca para crear un sistema de menús en el arduino. A continuación se muestra un ejemplo (hay más en el repositorio):

#include <MenuSystem.h>

// Menu variables
MenuSystem ms;
Menu mm("");
MenuItem mm_mi1("Level 1 - Item 1 (Item)");
MenuItem mm_mi2("Level 1 - Item 2 (Item)");
Menu mu1("Level 1 - Item 3 (Menu)");
MenuItem mu1_mi1("Level 2 - Item 1 (Item)");

// Example variables
bool bRanCallback = false;
bool bForward = true;

// Menu callback function
// In this example all menu items use the same callback.

void on_item1_selected(MenuItem* p_menu_item)
{
  Serial.println("Item1 Selected");
  bRanCallback = true;
  bForward = true;
}

void on_item2_selected(MenuItem* p_menu_item)
{
  Serial.println("Item2 Selected");
  bRanCallback = true;
}

void on_item3_selected(MenuItem* p_menu_item)
{
  Serial.println("Item3 Selected");
  bRanCallback = true;
  bForward = false;
}

// Standard arduino functions

void setup()
{
  Serial.begin(9600);

  // Menu setup
  mm.add_item(&mm_mi1, &on_item1_selected);
  mm.add_item(&mm_mi2, &on_item2_selected);
  mm.add_menu(&mu1);
  mu1.add_item(&mu1_mi1, &on_item3_selected);
  ms.set_root_menu(&mm);
}

void loop()
{
  Serial.println("");

  // Display the menu
  Serial.println(ms.get_current_menu()->get_selected()->get_name());

  // Simulate using the menu by walking over the entire structure.
  ms.select();

  if (bRanCallback)
  {
    if (bForward)
      ms.next();
    else
      ms.prev();
    bRanCallback = false;
  }

  // Wait for two seconds so the output is viewable
  delay(2000);
}

Hay más información en la página de GitHub anterior y también en la publicación del blog biblioteca del sistema de menú Arduino .

    
respondido por el Jon

Lea otras preguntas en las etiquetas