A digital clock that can display a date and time using a Persistence of Vision Display

Dependencies:   NeoStrip mbed-rtos mbed

Files at this revision

API Documentation at this revision

Comitter:
nbharwani3
Date:
Fri Apr 29 11:59:02 2016 +0000
Child:
1:551caed36fd6
Commit message:
None

Changed in this revision

NeoStrip.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-rtos.lib 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/NeoStrip.lib	Fri Apr 29 11:59:02 2016 +0000
@@ -0,0 +1,1 @@
+http://developer.mbed.org/users/aswild/code/NeoStrip/#0d3d38087543
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Fri Apr 29 11:59:02 2016 +0000
@@ -0,0 +1,415 @@
+#include "mbed.h"
+#include "rtos.h"
+#include "NeoStrip.h"
+
+#define N 24
+#define NUM_WIDTH 5
+#define NUM_HEIGHT 7
+#define CHARACTER_SIZE 7
+#define WAIT_TIME  600
+
+DigitalIn  hall1(p15);
+DigitalIn  hall2(p16);
+
+DigitalOut myled(LED1);
+NeoStrip strip1(p11, N);
+Serial usb(USBTX, USBRX);
+//134125 = move backwards slowly
+//135000 = move backwards slowly
+//140000 = move forwards quickly
+//136000 = move forward slowly
+//135500 = move backwards slowly
+//135750 = move backwards slowly
+volatile int motor_speed_us = 135750;
+volatile int one_degree_time = motor_speed_us/360;
+
+volatile int startSeconds = 0;
+volatile int startMinutes = 0;
+volatile int startHours = 8;
+
+time_t seconds;
+
+int drawCharacter(char* character, int startNum_time, int startPos);
+
+char zero  [5] = {0b0000000, 0b0111110, 0b1000001, 0b1000001, 0b0111110};
+char one   [5] = {0b0000000, 0b0000000, 0b0100001, 0b1111111, 0b0000001};
+char two   [5] = {0b0000000, 0b0100011, 0b1000101, 0b1001001, 0b0110001};
+char three [5] = {0b0000000, 0b1000001, 0b1001001, 0b1001001, 0b0110110};
+char four  [5] = {0b0000000, 0b1111000, 0b0001000, 0b0001000, 0b1111111};
+char five  [5] = {0b0000000, 0b1110010, 0b1001001, 0b1001001, 0b1000110};
+char six   [5] = {0b0000000, 0b0111110, 0b1001001, 0b1001001, 0b0100110};
+char seven [5] = {0b0000000, 0b1000000, 0b1000111, 0b1011000, 0b1100000};
+char eight [5] = {0b0000000, 0b0110110, 0b1001001, 0b1001001, 0b0110110};
+char nine  [5] = {0b0000000, 0b0110000, 0b1001001, 0b1001001, 0b0111110};
+char colon [5] = {0b0000000, 0b0000000, 0b0110110, 0b0110110, 0b0000000};
+
+char A [5] = {0b0111111, 0b1001000, 0b1001000, 0b1001000, 0b0111111};
+char P [5] = {0b1111111, 0b1001000, 0b1001000, 0b1001000, 0b0110000};
+char R [5] = {0b1111111, 0b1001000, 0b1001000, 0b1001100, 0b0110011};
+char space [5] = {0b0000000, 0b0000000, 0b0000000, 0b0000000, 0b0000000};
+
+
+
+Timer t;
+Timer time_tracker;
+
+//Will be issues of random orientation of the clock. Fix the issue with resynchronization using the magnet
+
+void LEDstrip1_thread(void const *args)
+{
+    t.start();
+    time_tracker.start();
+
+    int startNum_time = 50*one_degree_time - NUM_WIDTH/2;
+    int endNum_time =  50*one_degree_time + NUM_WIDTH/2;
+
+    bool wroteThisRotation = false;
+
+    strip1.setPixel(23, (uint8_t) 10,(uint8_t) 50,(uint8_t) 50);
+    strip1.setPixel(22, (uint8_t) 20,(uint8_t) 200,(uint8_t) 50);
+    strip1.setPixel(14,(uint8_t) 20,(uint8_t) 200,(uint8_t) 20);
+    strip1.setPixel(13,(uint8_t) 10,(uint8_t) 50,(uint8_t) 50);
+    strip1.setPixel(12,(uint8_t) 20,(uint8_t) 200,(uint8_t) 20);
+    strip1.setPixel(3, (uint8_t) 10,(uint8_t) 50,(uint8_t) 50);
+    strip1.setPixel(4, (uint8_t) 20,(uint8_t) 200,(uint8_t) 50);
+    while(1) {
+
+        int time = t.read_us();
+
+        if (time > startNum_time && !wroteThisRotation) {
+
+
+            int seconds = ((int)time_tracker.read() + startSeconds)%60;
+            int minutes = ((int)time_tracker.read()/60 + startMinutes)%60;
+            int hours = ((int)time_tracker.read()/3600 + startHours)%24;
+            bool AM = true;
+            if (hours >= 12) {
+                AM = false;
+            }
+            int printHours = hours % 12;
+            if (printHours == 0) {
+                printHours = 12;
+            }
+
+            char buf [10];
+            sprintf(buf, "%02i:%02i:%02i", hours, minutes, seconds);
+
+            for (int i = 8; i > 0; i--) {
+                if (buf[i] == '0') {
+                    endNum_time = drawCharacter(zero, endNum_time,21);
+                } else if (buf[i] == '1') {
+                    endNum_time = drawCharacter(one, endNum_time,21);
+                } else if (buf[i] == '2') {
+                    endNum_time = drawCharacter(two, endNum_time,21);
+                } else if (buf[i] == '3') {
+                    endNum_time = drawCharacter(three, endNum_time,21);
+                } else if (buf[i] == '4') {
+                    endNum_time = drawCharacter(four, endNum_time,21);
+                } else if (buf[i] == '5') {
+                    endNum_time = drawCharacter(five, endNum_time,21);
+                } else if (buf[i] == '6') {
+                    endNum_time = drawCharacter(six, endNum_time,21);
+                } else if (buf[i] == '7') {
+                    endNum_time = drawCharacter(seven, endNum_time,21);
+                } else if (buf[i] == '8') {
+                    endNum_time = drawCharacter(eight, endNum_time,21);
+                } else if (buf[i] == '9') {
+                    endNum_time = drawCharacter(nine, endNum_time,21);
+                } else if (buf[i] == ':') {
+                    endNum_time = drawCharacter(colon, endNum_time,21);
+                }
+            }
+
+            char date[15];
+            sprintf(date,"APR 29 2016");
+
+            for (int i = 12; i >= 0; i--) {
+                if (date[i] == '0') {
+                    endNum_time = drawCharacter(zero, endNum_time,11);
+                } else if (date[i] == '1') {
+                    endNum_time = drawCharacter(one, endNum_time,11);
+                } else if (date[i] == '2') {
+                    endNum_time = drawCharacter(two, endNum_time,11);
+                } else if (date[i] == '3') {
+                    endNum_time = drawCharacter(three, endNum_time,11);
+                } else if (date[i] == '4') {
+                    endNum_time = drawCharacter(four, endNum_time,11);
+                } else if (date[i] == '5') {
+                    endNum_time = drawCharacter(five, endNum_time,11);
+                } else if (date[i] == '6') {
+                    endNum_time = drawCharacter(six, endNum_time,11);
+                } else if (date[i] == '7') {
+                    endNum_time = drawCharacter(seven, endNum_time,11);
+                } else if (date[i] == '8') {
+                    endNum_time = drawCharacter(eight, endNum_time,11);
+                } else if (date[i] == '9') {
+                    endNum_time = drawCharacter(nine, endNum_time,11);
+                } else if (date[i] == ':') {
+                    endNum_time = drawCharacter(colon, endNum_time,11);
+                } else if (date[i] == 'A') {
+                    endNum_time = drawCharacter(A, endNum_time,11);
+                } else if (date[i] == 'P') {
+                    endNum_time = drawCharacter(P, endNum_time,11);
+                } else if (date[i] == 'R') {
+                    endNum_time = drawCharacter(R, endNum_time,11);
+                } else if (date[i] == ' ') {
+                    endNum_time = drawCharacter(space, endNum_time,11);
+                }
+            }
+            wroteThisRotation = true;
+        }
+        if (t.read_us() > motor_speed_us) {
+            t.reset();
+            //usb.printf("wroteThisRotation\n\r");
+            wroteThisRotation = false;
+        }
+    }
+}
+int drawCharacter(char* printable_number, int startNum_time, int startPos)
+{
+
+    int time = t.read_us();
+
+    int number_column_repeats = CHARACTER_SIZE/NUM_WIDTH;
+    int count_num_trans = NUM_WIDTH - 1;
+
+    int transitionNum_time = startNum_time + number_column_repeats*one_degree_time;
+    int endNum_time = startNum_time + number_column_repeats*one_degree_time*NUM_WIDTH;
+
+
+    for (int i = 0; i < NUM_HEIGHT; i++) {
+        int litPixel = (printable_number[count_num_trans] & (1 << i))>>i;
+        strip1.setPixel(startPos-i, (uint8_t)0*litPixel,(uint8_t)0*litPixel,(uint8_t)100*litPixel);
+        //(uint8_t)0,(uint8_t)0,(uint8_t)40
+        //(uint8_t) 10*litPixel,(uint8_t) 50*litPixel,(uint8_t) 50*litPixel)
+    }
+
+
+    strip1.write();
+    //usb.printf("printable_number[%i] = %i", count_num_trans, printable_number[count_num_trans] );
+    count_num_trans = count_num_trans - 1;
+    wait_us(WAIT_TIME);
+    while (count_num_trans >= 0) {
+
+        //usb.printf("Attempting to print column %i bottom: %i\r\n", count_num_trans, printable_number[count_num_trans]);
+
+        for (int i = 0; i < NUM_HEIGHT; i++) {
+            int litPixel = (printable_number[count_num_trans] & (1 << i))>>i;
+            strip1.setPixel(startPos-i, (uint8_t)0*litPixel,(uint8_t)0*litPixel,(uint8_t)100*litPixel);
+        }
+
+
+
+        strip1.write();
+
+        count_num_trans = count_num_trans - 1;
+        transitionNum_time = (transitionNum_time + number_column_repeats*one_degree_time);
+        //wroteMiddle = true;
+    }
+    wait_us(WAIT_TIME);
+
+    //usb.printf("Number is finished printing\r\n");
+
+    for (int i = startPos; i > startPos-NUM_HEIGHT; i--) {
+
+        strip1.setPixel(i, 0,0,0);
+    }
+
+//    strip1.setPixel(22, 0,0,0);
+//    strip1.setPixel(21, 0,0,0);
+//    strip1.setPixel(20, 0,0,0);
+//    strip1.setPixel(19, 0,0,0);
+//    strip1.setPixel(18, 0,0,0);
+//
+    strip1.write();
+    endNum_time = (endNum_time + one_degree_time) % motor_speed_us;
+    transitionNum_time = (startNum_time + one_degree_time*number_column_repeats) % motor_speed_us;
+    count_num_trans = NUM_WIDTH - 1;
+    wait_us(WAIT_TIME);
+
+    return endNum_time;
+}
+
+
+void HallEffect_thread(void const *args)
+{
+    bool sensesMagnet = false;
+
+    hall1.mode(PullUp);
+    hall2.mode(PullUp);
+    Thread::wait(10);
+
+    while(1) {
+        if (!sensesMagnet && (hall1 == 0 || hall2 == 0)) {
+            sensesMagnet = true;
+            t.reset();
+        } else if (sensesMagnet && hall1 == 1 && hall2 == 1) {
+            sensesMagnet = false;
+        }
+    }
+}
+
+
+
+
+int main()
+{
+
+    float brightness = 0.05f;
+    strip1.setBrightness(brightness);
+
+    for (int i = 0; i < N; i++) {
+        strip1.setPixel(i,0,0,0);
+    }
+
+    strip1.setPixel(1,0,(uint8_t)255,0);
+    strip1.write();
+
+    set_time(1461931200);
+    seconds = time(NULL);   // get current time from mbed RTC
+
+    Thread thread2(LEDstrip1_thread);
+    Thread thread3(HallEffect_thread);
+
+    thread2.set_priority(osPriorityRealtime);
+    while(1) {
+        myled = 1;
+        wait(0.2);
+        myled = 0;
+        wait(0.2);
+    }
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+//            if (time < transitionNum_time && time > endNum_time) {
+//
+//
+//                usb.printf("Attempting to print column %i top: %i\r\n", count_num_trans, printable_number[count_num_trans]);
+//
+//                int led22 = printable_number [count_num_trans] & 0x01;
+//                int led21 = (printable_number [count_num_trans] & 0x02)>>1;
+//                int led20 = (printable_number [count_num_trans] & 0x04)>>2;
+//                int led19 = (printable_number [count_num_trans] & 0x08)>>3;
+//                int led18 = (printable_number [count_num_trans] & 0x10)>>4;
+//
+//                strip1.setPixel(22, (uint8_t)(led22*255),0,0);
+//                strip1.setPixel(21, (uint8_t)(led21*255),0,0);
+//                strip1.setPixel(20, (uint8_t)(led20*255),0,0);
+//                strip1.setPixel(19, (uint8_t)(led19*255),0,0);
+//                strip1.setPixel(18, (uint8_t)(led18*255),0,0);
+//
+//                strip1.write();
+//
+//                count_num_trans = (count_num_trans + 1)%NUM_WIDTH;
+//                transitionNum_time = (transitionNum_time + number_column_repeats*one_degree_time);
+//                wroteMiddle = true;
+//            }
+//        } else {
+
+
+
+
+
+
+
+
+
+
+//
+//
+//
+//
+//
+//        int time = t.read_us();
+//
+//    int number_column_repeats = CHARACTER_SIZE/NUM_WIDTH;
+//    int count_num_trans = 0;
+//
+//    int transitionNum_time = startNum_time + number_column_repeats*one_degree_time;
+//    int endNum_time = startNum_time + number_column_repeats*one_degree_time*NUM_WIDTH;
+//
+//    usb.printf("startNum_time: %i\r\n", startNum_time);
+//    usb.printf("transitionNum_time: %i\r\n", transitionNum_time);
+//    usb.printf("endNum_time: %i\r\n", endNum_time);
+//
+//    int led22 = printable_number [count_num_trans] & 0x01;
+//    int led21 = (printable_number [count_num_trans] & 0x02)>>1;
+//    int led20 = (printable_number [count_num_trans] & 0x04)>>2;
+//    int led19 = (printable_number [count_num_trans] & 0x08)>>3;
+//    int led18 = (printable_number [count_num_trans] & 0x10)>>4;
+//
+//    strip1.setPixel(22, (uint8_t)(led22*255),0,0);
+//    strip1.setPixel(21, (uint8_t)(led21*255),0,0);
+//    strip1.setPixel(20, (uint8_t)(led20*255),0,0);
+//    strip1.setPixel(19, (uint8_t)(led19*255),0,0);
+//    strip1.setPixel(18, (uint8_t)(led18*255),0,0);
+//
+//    strip1.write();
+//    usb.printf("printable_number[%i] = %i", count_num_trans, printable_number[count_num_trans] );
+//    count_num_trans = count_num_trans + 1;
+//
+//    while (count_num_trans < NUM_WIDTH) {
+//        int time = t.read_us();
+//        if (time > transitionNum_time) {
+//
+//
+//            usb.printf("Attempting to print column %i bottom: %i\r\n", count_num_trans, printable_number[count_num_trans]);
+//
+//            int led22 = printable_number [count_num_trans] & 0x01;
+//            int led21 = (printable_number [count_num_trans] & 0x02)>>1;
+//            int led20 = (printable_number [count_num_trans] & 0x04)>>2;
+//            int led19 = (printable_number [count_num_trans] & 0x08)>>3;
+//            int led18 = (printable_number [count_num_trans] & 0x10)>>4;
+//
+//            strip1.setPixel(22, (uint8_t)(led22*255),0,0);
+//            strip1.setPixel(21, (uint8_t)(led21*255),0,0);
+//            strip1.setPixel(20, (uint8_t)(led20*255),0,0);
+//            strip1.setPixel(19, (uint8_t)(led19*255),0,0);
+//            strip1.setPixel(18, (uint8_t)(led18*255),0,0);
+//
+//            strip1.write();
+//
+//            count_num_trans = count_num_trans + 1;
+//            transitionNum_time = (transitionNum_time + number_column_repeats*one_degree_time);
+//            //wroteMiddle = true;
+//        }
+//    }
+//    bool wroteEnd = false;
+//
+//    while (!wroteEnd){
+//         //           usb.printf("end time %i, current time: %i \r\n", endNum_time, time);
+//        int time = t.read_us();
+//
+//        if ( time > endNum_time) {
+//            usb.printf("Number is finished printing\r\n");
+//
+//            strip1.setPixel(22, 0,0,0);
+//            strip1.setPixel(21, 0,0,0);
+//            strip1.setPixel(20, 0,0,0);
+//            strip1.setPixel(19, 0,0,0);
+//            strip1.setPixel(18, 0,0,0);
+//
+//            strip1.write();
+//            endNum_time = (endNum_time + one_degree_time) % motor_speed_us;
+//            transitionNum_time = (startNum_time + one_degree_time*number_column_repeats) % motor_speed_us;
+//            count_num_trans = 0;
+//            return endNum_time;
+//
+//        }
+//    }
+//    return endNum_time;
+//}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed-rtos.lib	Fri Apr 29 11:59:02 2016 +0000
@@ -0,0 +1,1 @@
+https://mbed.org/users/mbed_official/code/mbed-rtos/#07314541bd12
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Fri Apr 29 11:59:02 2016 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/aae6fcc7d9bb
\ No newline at end of file