I'm building an advanced thermostat on an arduino with the following goals:

  • Use a rotary encoder (with pushbutton) as the only input device
  • Use LCD display (standard 16x2)
  • Use a real time clock
  • Ability to schedule temperature changes
  • Ability to 'ramp' between changes (ex: start at 45 degF, end at 50degF 3 days later with a linear increase between start and end date)

I have much of this project finished but where I've stalled out is building a 'scheduler' function and finding a good menu method. Can someone please suggest a function that would work as a scheduler and give some examples of a menu that might work well with this project?

  • \$\begingroup\$ Could you provide more details about what type of menu are you thinking of ? What requirements are you trying to fulfill ? \$\endgroup\$ – asheeshr Apr 10 '13 at 8:12

For the scheduler, use the Time library. Maintain an array that mentions what change must happen when (create your own protocol for this, for example take "2000/40" to mean "change the thermostat to 40 at 20:00").

Now, in your main loop, set up loop() with a wait period of a second or so. (Since you're taking input as well, you cannot afford to have a longer wait period). Now, just compare your array values with the stuff returned by hour() and minute(), and trigger the changes as needed.

Ramping is also easy, just divvy up the temperature change by every hour. So, the ramp from 45 to 50 in 3 days, just set the Arduino to increase the temperature by 1 every 14 hours.


I'm the author of arduino-menusystem, a library for building a menu system on the arduino. Below is an example (there are more in the repository):

#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()

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

void loop()

  // Display the menu

  // Simulate using the menu by walking over the entire structure.

  if (bRanCallback)
    if (bForward)
    bRanCallback = false;

  // Wait for two seconds so the output is viewable

There's more information on the above GitHub page and also in the blog post Arduino menu system library.


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy