RTC Lib & Output

Dependencies:   LM75B RTC8563 mbed

Revision:
0:b2c29eef3ac4
Child:
1:9d545a2abf32
diff -r 000000000000 -r b2c29eef3ac4 main.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Wed Apr 08 14:01:45 2015 +0000
@@ -0,0 +1,154 @@
+#include "mbed.h"
+#include "LM75B.h"
+
+#define RTC8563_ADR 0xA2
+
+#define CONTROL1 0x00
+#define CONTROL2 0x01
+#define SECONDS 0x02
+#define MINUTES 0x03
+#define HOURS 0x04
+#define DAYS 0x05
+#define WEEKDAYS 0x06
+#define MONTHS 0x07
+#define YEARS 0x08
+#define MINUTE_ALARM 0x09
+#define HOUR_ALARM 0x0A
+#define DAY_ALARM 0x0B
+#define WEEKDAY_ALARM 0x0C
+#define CLOCKOUT_FREQ 0x0D
+#define TIMER_CINTROL 0x0E
+#define TIMER 0x0F
+#define _READ 0x01
+
+char year, month, day, week;
+char hour, minute, sec;
+
+char week_chr[7][4] = {"MON","TUE","WED","THU","FRI","SAT","SUN"};
+
+BusOut myled(P1_13,P1_12,P1_7,P1_6,P1_4,P1_3,P1_1,P1_0,LED4,LED3,LED2,LED1);
+AnalogIn LDR (p16);
+
+InterruptIn sw1(P0_10);
+InterruptIn sw2(P0_15);
+InterruptIn sw3(P0_23);
+InterruptIn sw4(P1_16);
+
+Serial pc(USBTX, USBRX);
+LM75B sensor(p28, p27);
+I2C i2c(p28, p27);
+
+typedef enum state_t {menue, date, ldr, temp} state_t;
+state_t state = menue;
+
+void getNextState();
+void printTime();
+void flashLDR();
+void rtc_init();
+char rtc_read(char address);
+void rtc_write(char address, char value);
+
+int main()
+{
+    sensor.open();
+    rtc_init();
+
+    sw1.rise(&getNextState);
+    sw2.rise(&getNextState);
+    sw3.rise(&getNextState);
+    sw4.rise(&getNextState);
+
+    while(1) {
+        myled = 0x0000;
+        switch(state) {
+            case menue:
+                pc.printf("########### M E N U ###########");
+                pc.printf("1.Taste => Menue anzeigen\n\r");
+                pc.printf("2.Taste => Uhrzeit und Datum\n\r");
+                pc.printf("3.Taste => LDR-Wert und LED-Array\n\r");
+                pc.printf("4.Taste => Temperatur anzeigen\n\r");
+                break;
+            case date:
+                printTime();
+                break;
+            case ldr:
+                pc.printf("LDR: %f\n", LDR.read());
+                flashLDR();
+                break;
+            case temp:
+                pc.printf("Temperatur: %.1f\n\r", (float) sensor);
+                break;
+        }
+        pc.printf("##############################\n\r");
+        wait(0.2);
+    }
+}
+
+void flashLDR()
+{
+    for(float w = 0; w < 0.6; w+=0.05)
+        if(LDR>=w)
+            myled = (myled << 1) + 1;
+}
+
+void getNextState()
+{
+    if(sw1) state = menue;
+    else if(sw2) state = date;
+    else if(sw3) state = ldr;
+    else if (sw4) state = temp;
+}
+
+void printTime()
+{
+    year = rtc_read(YEARS);
+    month = rtc_read(MONTHS);
+    day = rtc_read(DAYS);
+    week = rtc_read(WEEKDAYS);
+    hour = rtc_read(HOURS);
+    minute = rtc_read(MINUTES);
+    sec = rtc_read(SECONDS);
+
+    pc.printf("20%d/%02d/%02d %s\n", year, month, day, week_chr[week]); // Date
+    pc.printf("%02d:%02d:%02d\n", hour, minute, sec); // Time
+}
+
+void rtc_init()
+{
+    pc.printf("RTC-Setup...");
+
+    rtc_write(CONTROL1, 0x20); //stop
+    rtc_write(CONTROL2, 0x00);
+    rtc_write(YEARS, 15);
+    rtc_write(MONTHS,3);
+    rtc_write(DAYS, 13);
+    rtc_write(HOURS, 21);
+    rtc_write(MINUTES, 7);
+    rtc_write(SECONDS, 0);
+    rtc_write(WEEKDAYS, 5);
+    rtc_write(CLOCKOUT_FREQ, 0x00); // 0x83 = TE on & 1Hz
+    rtc_write(TIMER_CINTROL, 0x00);
+    rtc_write(CONTROL1, 0x00); //start
+}
+
+char rtc_read(char address)
+{
+    char value;
+    i2c.start();
+    i2c.write(RTC8563_ADR);
+    i2c.write(address);
+    i2c.start();
+    i2c.write(RTC8563_ADR | _READ);
+    value = i2c.read(0);
+    i2c.stop();
+
+    return value;
+}
+void rtc_write(char address, char value)
+{
+    i2c.start();
+    i2c.write(RTC8563_ADR);
+    i2c.write(address);
+    i2c.write(value);
+    i2c.stop();
+}