![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
RTC Lib & Output
Dependencies: LM75B RTC8563 mbed
Diff: main.cpp
- 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(); +}