Analog clock demo using stepper motor. It\'s a demo of simultaneous 3 stepper motor operation. It gets time information from NTP server.

Dependencies:   mbed NetEthApiLPC1768 NetServicesLPC1768

Files at this revision

API Documentation at this revision

Comitter:
okano
Date:
Thu Nov 25 11:22:43 2010 +0000
Commit message:

Changed in this revision

NetEthApiLPC1768.lib Show annotated file Show diff for this revision Revisions of this file
NetServicesLPC1768.lib Show annotated file Show diff for this revision Revisions of this file
StepperMotor.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
mbed.bld Show annotated file Show diff for this revision Revisions of this file
diff -r 000000000000 -r 9bf213f7b780 NetEthApiLPC1768.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/NetEthApiLPC1768.lib	Thu Nov 25 11:22:43 2010 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/donatien/code/NetEthApiLPC1768/#2929fcb16bbf
diff -r 000000000000 -r 9bf213f7b780 NetServicesLPC1768.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/NetServicesLPC1768.lib	Thu Nov 25 11:22:43 2010 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/donatien/code/NetServicesLPC1768/#acb9b7d53771
diff -r 000000000000 -r 9bf213f7b780 StepperMotor.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/StepperMotor.lib	Thu Nov 25 11:22:43 2010 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/okano/code/StepperMotor/#4beb37ae37ce
diff -r 000000000000 -r 9bf213f7b780 TextLCD.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/TextLCD.lib	Thu Nov 25 11:22:43 2010 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/simon/code/TextLCD/#a53b3e2d6f1e
diff -r 000000000000 -r 9bf213f7b780 main.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Thu Nov 25 11:22:43 2010 +0000
@@ -0,0 +1,187 @@
+/** Clock demo with stepper motor + NTP
+ *
+ *  Simple mbed analog clock demo with stepper motor.
+ *  Time information will be get from NTP
+ *  This code based on
+ *  http://mbed.org/users/nucho/programs/SimpleLCDClock/5zi4y
+ *  http://mbed.org/users/okano/notebook/nxp_pcf2127a-demo-code/
+ *
+ *  2010-Nov-20  @tedd_okano
+ *  Released under the MIT License: http://mbed.org/license/mit
+ */
+
+#include "mbed.h"
+#include "EthernetNetIf.h"
+#include "NtpClient.h"
+#include "TextLCD.h"
+#include "StepperMotor.h"
+
+
+EthernetNetIf   eth;
+NtpClient       ntp;
+TextLCD         lcd( p14, p15, p16, p17, p18, p19 ); // rs, rw, d0, d1, d2, d3
+Ticker          updater;
+StepperMotor    m_s( p21, p22, p23, p30 );
+StepperMotor    m_m( p24, p25, p26, p30 );
+StepperMotor    m_h( p27, p28, p29, p30 );
+AnalogIn        ain( p20 );
+
+int     tz_index            = 4;
+int     update_stop_lcd     = false;
+int     update_stop_hands   = false;
+int     resync              = false;
+
+#define RESYNC_INTERVAL     1  //  minutes
+
+typedef    struct _tz    {
+    char    *name;
+    float   offset;
+}
+tz;
+
+//  http://wwp.greenwichmeantime.com/info/timezone.htm
+
+tz  timezone[ 8 ]  = {
+    { "London",          0 },
+    { "Amsterdam",       1 },
+    { "India",           5.5 },
+    { "Singapore",       8 },
+    { "Tokyo",           9 },
+    { "Hawaii",        -10 },
+    { "San Francisco",  -8 },
+    { "New York",       -5 },
+};
+
+void clock_update( void );
+void show_clock( int h, int m, int s );
+int access_NTP( void );
+
+int main() {
+    m_h.go_angle( 180 );
+    m_m.go_angle( 180 );
+    m_s.go_angle( 180 );
+
+    lcd.cls();
+    lcd.printf( "Ethernet setting" );
+
+    EthernetErr ethErr = eth.setup();
+
+    if (ethErr) {
+        lcd.printf("Error %d in setup.\n", ethErr);
+        return -1;
+    }
+
+    if ( access_NTP() ) {
+        m_h.go_angle( 0 );
+        m_m.go_angle( 0 );
+        m_s.go_angle( 0 );
+
+        return -1;
+    }
+
+    while ( m_h.distance() | m_m.distance() | m_s.distance() )
+        wait( 0.1 );
+
+    m_h.set_home_position();
+    m_m.set_home_position();
+    m_s.set_home_position();
+
+    lcd.cls();
+
+    updater.attach(&clock_update, 1.0);
+
+    int     tz_i    = 0;
+    int     tz_i_p  = -1;
+    int     unstable = 50;
+
+    while (1) {
+
+        if ( resync ) {
+            update_stop_hands   = true;
+
+            m_h.go_angle( 0 );
+            m_m.go_angle( 0 );
+            m_s.go_angle( 0 );
+
+            if ( access_NTP() ) {
+                return -1;
+            }
+
+            update_stop_hands   = false;
+            resync              = false;
+            tz_i_p              = -1;
+        }
+        tz_i    = (int)( ain * 7.99 );
+
+        if ( tz_i != tz_i_p ) {
+            update_stop_lcd = true;
+            lcd.locate( 0, 1 );
+            lcd.printf( "                " );
+            lcd.locate( 0, 1 );
+            lcd.printf( "%s", timezone[ tz_i ].name );
+            update_stop_lcd = false;
+
+            tz_i_p      = tz_i;
+            unstable    = 50;
+        } else {
+            unstable    = unstable ? unstable-- : 0;
+            tz_index    = unstable ? tz_i : tz_index;
+        }
+        wait( 0.1 );
+    }
+}
+
+void clock_update( void ) {
+    struct tm   dt, *dtp;
+    time_t      t;
+    char        s[ 30 ];
+    dtp = &dt;
+
+    t       = time( NULL ) + (int)(timezone[ tz_index ].offset * 3600.0);
+    dtp     = localtime( &t );
+
+    if ( !(dtp->tm_min % RESYNC_INTERVAL) && !(dtp->tm_sec) )
+        resync  = true;
+
+    if ( !update_stop_hands )
+        show_clock( dtp->tm_hour, dtp->tm_min, dtp->tm_sec );
+
+    if ( update_stop_lcd )
+        return;
+
+    strftime( s, 20, "%H:%M:%S", dtp );
+    lcd.locate( 0, 0 );
+    lcd.printf( "%s", s );
+
+#if 0
+    strftime( s, 20, "%Y/%b/%d(%a)", dtp );
+    lcd.locate( 0, 1 );
+    lcd.printf( "%s", s );
+#endif
+}
+
+void show_clock( int h, int m, int s ) {
+    printf( "%02d:%02d:%02d\r\n",h,m,s );
+
+    h   = h % 12;
+    m_s.go_angle( -((float)s * 360.0) / 60.0 );
+    m_m.go_angle( -((float)m * 360.0) / 60.0 );
+    m_h.go_angle( -(((float)h + ((float)m / 60.0)) * 360.0) / 12.0 );
+}
+
+int access_NTP( void ) {
+    lcd.cls();
+    lcd.printf( "accessing NTP.. " );
+
+    lcd.locate( 0, 0 );
+    lcd.printf("Setup OK");
+
+    lcd.printf("Timer setting...\n");
+    Host server(IpAddr(), 123, "ntp.jst.mfeed.ad.jp");
+    ntp.setTime(server);
+
+    lcd.cls();
+
+    return 0;
+}
+
diff -r 000000000000 -r 9bf213f7b780 mbed.bld
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Thu Nov 25 11:22:43 2010 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/9114680c05da