Internet alarm clock

Dependencies:   EthernetNetIf NTPClient_NetServices mbed

Files at this revision

API Documentation at this revision

Comitter:
TyPatrick
Date:
Thu Oct 07 19:05:22 2010 +0000
Commit message:

Changed in this revision

EthernetNetIf.lib Show annotated file Show diff for this revision Revisions of this file
NTPClient.lib Show annotated file Show diff for this revision Revisions of this file
TextLCD.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
main.h Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/EthernetNetIf.lib	Thu Oct 07 19:05:22 2010 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/donatien/code/EthernetNetIf/#bc7df6da7589
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/NTPClient.lib	Thu Oct 07 19:05:22 2010 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/donatien/code/NTPClient/#7c3f1199256a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/TextLCD.lib	Thu Oct 07 19:05:22 2010 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/simon/code/TextLCD/#a53b3e2d6f1e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Thu Oct 07 19:05:22 2010 +0000
@@ -0,0 +1,268 @@
+#include "main.h"
+
+/*******************************************************************
+ * Print_lcd
+ *
+ * This function clears the LCD, then either prints 1. the alarm time
+ * or 2. the current time and alarm clock menu state.
+ ******************************************************************/
+void print_lcd()
+{
+    lcd.cls();
+    /* Menu options 2 and above deal with the alarm */
+    if (menu > 1)
+        print_time(ahour, amin);
+    else
+        print_time(cTime->tm_hour, cTime->tm_min);
+    print_menu();
+}
+
+/******************************************************************
+ * Print_time
+ *
+ * This function takes an hour(in 24hr time) and a minute and
+ * prints the correct format to the lcd.
+ *****************************************************************/
+void print_time(int hour, int minute)
+{
+    /* Variable tmphr is 24 hour time adjusted for timezone */
+    int tmphr = hour + timezone;
+    while (tmphr < 0)
+        tmphr += 24;
+    tmphr %= 24;
+    
+    /* Variable printhr is 12 hour time for printing */
+    int printhr = tmphr % 12;
+    if (printhr == 0)
+        printhr += 12;
+    lcd.printf("%2d:%02d ", printhr, minute);
+    
+    /* tmphr allows for checking of AM/PM */
+    if ((tmphr > 11) && (tmphr < 24))
+        lcd.printf("PM\n");
+    else
+        lcd.printf("AM\n");
+}    
+
+/*******************************************************************
+ * Print_menu
+ *
+ * This function prints the menu state of the alarm clock to the LCD. 
+ * The menu options are 1. Viewing current time 2.  Setting Timezone
+ * 3. Setting alarm hour 4. Setting alarm minute 5. Toggling alarm
+ ******************************************************************/
+void print_menu()
+{
+    switch (menu){
+        case 0:
+            break;
+        case 1: 
+            lcd.printf("TZ is (UTC) %+d\n", timezone);  
+            break;
+        case 2: 
+            lcd.printf("Set Alarm Hour\n");
+            break;
+        case 3: 
+            lcd.printf("Set Alarm Min\n");
+            break;
+        case 4: 
+            lcd.printf("Alarm is ");
+            if (alarmstate == false)
+                lcd.printf("Off\n");
+            else
+                lcd.printf("On\n");
+            break;
+        default:
+            lcd.printf("Invalid menu %d\n", menu);
+            break;
+    }
+}
+
+/******************************************************************
+ * Change_menu
+ *
+ * This function uses a dedicated pushbutton that changes the menu. 
+ * The state variable, menu, gives the user the ability to cycle 
+ * through the 5 alarm clock menus.
+ *****************************************************************/
+void change_menu()
+{
+    alarm_snooze();
+    menu = (menu + 1) % 5;
+    print_lcd();
+}
+
+/******************************************************************
+ * Push_plus
+ *
+ * This function  uses a dedicated pushbutton to only increment or
+ * "Add" the value of variables of an alarm clock i.e. minute, hour,
+ * time zone
+ *****************************************************************/
+void push_plus()
+{
+    alarm_snooze();
+    button_press(1);
+}
+
+/******************************************************************
+ * Push_minus
+ *
+ * This function  uses a dedicated pushbutton to only decrement 
+ * or "Subtract" the value of variables of an alarm clock
+ * i.e. minute, hour, time zone
+ *****************************************************************/
+void push_minus()
+{
+    alarm_snooze();
+    button_press(-1);
+}
+
+/******************************************************************
+ * Button_press
+ *
+ * This function performs an action based on which menu item is 
+ * currently selected. It is called whenever the "Add" or 
+ * "Subtract" button is pressed.
+ *****************************************************************/
+void button_press(int input)
+{
+    switch (menu)
+    {
+        case 0: 
+            break;
+        case 1:
+            timezone += 12;      
+            timezone += input;
+            while (timezone < 0)
+                timezone += 24;
+            timezone %= 24;
+            timezone -= 12;
+            break;
+        case 2:
+            ahour += input;
+            while (ahour < 0)
+                ahour += 24;
+            ahour %= 24;
+            break;
+        case 3: 
+            amin += input;                  
+            while (amin < 0)
+                amin += 60;
+            amin %= 60;
+            break;
+        case 4: 
+            alarmstate = !alarmstate;       // Turn alarm on/off
+            break;
+        default:
+            lcd.printf("Invalid state %d\n", menu);
+            break;
+    }
+    print_lcd();
+}
+
+/******************************************************************
+ * Alarm_ring
+ *
+ * This function rings the alarm by flashing the leds
+ *****************************************************************/
+ void alarm_ring()
+ {
+    if (led == 0x0F)
+        led = 0;
+    else
+        led = (led << 1) | 1;
+ }
+ 
+/******************************************************************
+ * Alarm_snooze
+ *
+ * This function turns off the alarm
+ *****************************************************************/
+void alarm_snooze()
+{
+    if (ringflag == true) {
+        ringflag = false;
+        snooze = true;
+        ring.detach();
+        led = 0;
+    }
+}
+
+/******************************************************************
+ * Alarm_check
+ *
+ * This function compares the alarm time vs the current time. Once 
+ * alarm time and real time match it begins ringing the alarm. 
+ * Once the times differ then it turns off the alarm.
+ *****************************************************************/
+void alarm_check()
+{
+    if ((cTime->tm_min == amin) && (cTime->tm_hour == ahour)) {
+        if ((alarmstate == true) && (ringflag == false) && (snooze == false)) { 
+            ringflag = true;
+            ring.attach(&alarm_ring, .5); // Set up a Ticker for the alarm,
+                             // calls alarm_ring every .5 seconds until stopped
+        }
+    }
+    else {
+        alarm_snooze();
+        snooze = false;
+    }
+}
+
+int main() {
+
+    /* Set up Ethernet */
+    lcd.cls();
+    lcd.printf("Setting up Eth\n");
+    EthernetErr ethErr = eth.setup();
+    if (ethErr) {
+        lcd.cls();
+        lcd.printf("Error with Eth\nNum: %d", ethErr);
+        return -1;
+    }
+    
+    
+    /* Set up NTP */
+    lcd.printf("Setting up NTP\n");
+    Host server(IpAddr(), 123, "0.uk.pool.ntp.org");
+    ntp.setTime(server);
+    
+    /* Initialize all the interrupts for each of the pushbuttons */
+    statechange.rise(&change_menu);
+    plus.rise(&push_plus);
+    minus.rise(&push_minus);
+    
+    /* Temporary variables for control loop */
+    time_t rtc_time = time(NULL);
+    int minute = -1;
+    
+    /* Initialize alarm time */
+    ahour = 0;
+    amin = 0;
+
+    /* Main control loop */
+    while(1)
+    {
+        /* Update current time */
+        rtc_time = time(NULL);
+        cTime = localtime(&rtc_time);
+        
+        /* Only redraw the lcd display if anything changes */
+        if (cTime->tm_min != minute) {
+            minute = cTime->tm_min;
+            print_lcd();
+            
+            /* Update time from NTP server if it's midnight UTC */
+            if ((cTime->tm_min == 0) && (cTime->tm_hour == 0)) {
+                Host server(IpAddr(), 123, "0.north-america.pool.ntp.org");
+                ntp.setTime(server);
+            }
+        }
+        
+        /* Check to see if the alarm should be started/stopped */
+        alarm_check();
+    }
+    return 0;
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.h	Thu Oct 07 19:05:22 2010 +0000
@@ -0,0 +1,38 @@
+#include "mbed.h"
+#include "EthernetNetIf.h"
+#include "NTPClient.h"
+#include "TextLCD.h"
+
+/****************** Class Global Declartions **********************/
+EthernetNetIf eth; 
+NTPClient ntp;
+TextLCD lcd(p5, p6, p7, p8, p9, p10);
+InterruptIn statechange(p23);
+InterruptIn plus(p22);
+InterruptIn minus(p21);
+Ticker ring;
+BusOut led(LED1, LED2, LED3, LED4);
+/******************************************************************/
+/***************** Standard Global Declartions ********************/
+
+int menu = 0;           // Holds the current menu information 
+int timezone = 0;       // Timezone is configured as UTC + timezone - 12
+bool alarmstate = false;// Determines whether the alarm is set or not
+bool ringflag = false;  // Determines if alarm is ringing
+bool snooze = false;    // True if the alarm has been turned off by a button
+struct tm *cTime;       // Stucture that holds the current time
+int ahour;              // Value that holds alarm hour
+int amin;               // Value that holds alarm minute
+/******************************************************************/
+/*********************** Function Declartions *********************/
+void print_lcd();
+void print_time(int, int);
+void print_menu();
+void change_menu();
+void button_press(int);
+void push_plus();
+void push_minus();
+void alarm_ring();
+void alarm_snooze();
+void alarm_check();
+/******************************************************************/
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Thu Oct 07 19:05:22 2010 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/e2ac27c8e93e