Differences
This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
efinf:blc2016:bu1:projekt0:projekt [2017/03/16 14:14] tabea_hugo [Idee und Fernziel] |
efinf:blc2016:bu1:projekt0:projekt [2017/03/17 08:48] (current) tabea_hugo [Fotos und Film] |
||
---|---|---|---|
Line 1: | Line 1: | ||
{{backlinks> | {{backlinks> | ||
====Lichtwecker==== | ====Lichtwecker==== | ||
- | ====Margherita Melchiori & Tabea Hugo ==== | + | Margherita Melchiori & Tabea Hugo |
==== Idee und Fernziel ==== | ==== Idee und Fernziel ==== | ||
Bau eines Weckers mit Leuchtanzeige, | Bau eines Weckers mit Leuchtanzeige, | ||
==== Minimalprojekt ==== | ==== Minimalprojekt ==== | ||
+ | Funktionierende Uhr die aktuelle Uhrzeit auf Anzeige ausgibt, registrieren von Knopfdrücken auf RotaryEncoder und umsetzten derer auf Anzeige. | ||
===== Bericht ===== | ===== Bericht ===== | ||
==== Material ==== | ==== Material ==== | ||
+ | * Arduino | ||
+ | * RealTimeClock DS3231 | ||
+ | * SevenSegment TM1637 | ||
+ | * RotaryEncoder | ||
==== Aufbau ==== | ==== Aufbau ==== | ||
+ | * http:// | ||
+ | * https:// | ||
+ | * http:// | ||
+ | * https:// | ||
+ | * http:// | ||
+ | |||
==== Code ==== | ==== Code ==== | ||
- | ==== Fazit ==== | + | <code c++> |
+ | // include the SevenSegmentTM1637 library | ||
+ | #include " | ||
+ | #include " | ||
+ | #include < | ||
+ | #define RTC_I2C_ADDRESS 0x68 // I2C Adresse des RTC DS3231 | ||
+ | #define CLKpin 8 | ||
+ | #define DTpin 9 | ||
+ | #define SWpin 10 | ||
+ | |||
+ | // | ||
+ | int jahr, | ||
+ | int CLK,DT,SW; // | ||
+ | /* initialize global TM1637 Display object | ||
+ | * The constructor takes two arguments, the number of the clock pin and the digital output pin: | ||
+ | * SevenSegmentTM1637(byte pinCLK, byte pinDIO); | ||
+ | */ | ||
+ | const byte PIN_CLK = 4; // define CLK pin (any digital pin) | ||
+ | const byte PIN_DIO = 5; // define DIO pin (any digital pin) | ||
+ | SevenSegmentExtended | ||
+ | |||
+ | |||
+ | //Uhr auslesen | ||
+ | |||
+ | void rtcReadTime(){ | ||
+ | Wire.beginTransmission(RTC_I2C_ADDRESS); | ||
+ | Wire.write(0); | ||
+ | Wire.endTransmission(); | ||
+ | Wire.requestFrom(RTC_I2C_ADDRESS, | ||
+ | sekunde | ||
+ | minute | ||
+ | stunde | ||
+ | //Der Wochentag wird hier nicht ausgelesen da dieses mit | ||
+ | //dem Modul RTC DS3231 nicht über die Wire.h zuverlässig funktioniert. | ||
+ | /* wochentag | ||
+ | tag = bcdToDec(Wire.read()); | ||
+ | monat = bcdToDec(Wire.read()); | ||
+ | jahr = bcdToDec(Wire.read())+2000; | ||
+ | }; | ||
+ | |||
+ | // | ||
+ | byte bcdToDec(byte val){ | ||
+ | return ( (val/16*10) + (val%16) ); | ||
+ | } | ||
+ | |||
+ | // | ||
+ | byte decToBcd(byte val){ | ||
+ | return ( (val/10*16) + (val%10) ); | ||
+ | } | ||
+ | // Uhrzeit ausschreiben | ||
+ | void rtcWriteTime(int jahr, int monat, int tag, int stunde, int minute, int sekunde){ | ||
+ | Wire.beginTransmission(RTC_I2C_ADDRESS); | ||
+ | Wire.write(0); | ||
+ | Wire.write(decToBcd(sekunde)); | ||
+ | Wire.write(decToBcd(minute)); | ||
+ | Wire.write(decToBcd(stunde)); | ||
+ | Wire.write(decToBcd(0)); | ||
+ | Wire.write(decToBcd(tag)); | ||
+ | Wire.write(decToBcd(monat)); | ||
+ | Wire.write(decToBcd(jahr-2000)); | ||
+ | Wire.endTransmission(); | ||
+ | } | ||
+ | |||
+ | |||
+ | int zustand = 0; | ||
+ | |||
+ | int auslesen(){ | ||
+ | int a = digitalRead(CLKpin); | ||
+ | int b = digitalRead(DTpin); | ||
+ | if (a && b == 1) { | ||
+ | zustand = 0; | ||
+ | return zustand; | ||
+ | } | ||
+ | if (zustand==0){ | ||
+ | if (a==0 && b==1) { | ||
+ | zustand = 1; | ||
+ | return zustand; | ||
+ | } | ||
+ | if (a==1 && b==0) { | ||
+ | zustand = -1; | ||
+ | return zustand; | ||
+ | } | ||
+ | } return 0; | ||
+ | } | ||
+ | int h=0; | ||
+ | int m=0; | ||
+ | char anzeige[] = " | ||
+ | void anzeigew (int mode) { | ||
+ | if (mode !=1) { | ||
+ | anzeige[0]=h/ | ||
+ | anzeige[1]=h%10+' | ||
+ | } | ||
+ | else { | ||
+ | anzeige[0]=' | ||
+ | anzeige[1]=' | ||
+ | } | ||
+ | if (mode !=2) { | ||
+ | anzeige[2]=m/ | ||
+ | anzeige[3]=m%10+' | ||
+ | } | ||
+ | else { | ||
+ | anzeige[2]=' | ||
+ | anzeige[3]=' | ||
+ | } | ||
+ | display.print(anzeige); | ||
+ | } | ||
+ | |||
+ | void weckerstellen(){ | ||
+ | | ||
+ | while(digitalRead(SWpin)==0){ | ||
+ | | ||
+ | } | ||
+ | while(digitalRead(SWpin)==1){ | ||
+ | anzeigew(0); | ||
+ | |||
+ | for (int i=0; i<20000; i++) { | ||
+ | if (i==10000){ | ||
+ | anzeigew(1); | ||
+ | } | ||
+ | int change = auslesen(); | ||
+ | if (change!=0) { | ||
+ | if (h+change != -1 && h+change!=24){ | ||
+ | h = h+change; | ||
+ | } | ||
+ | if (h+change == -1) { | ||
+ | h = 23; | ||
+ | } | ||
+ | if (h+change == 24) { | ||
+ | h =0; | ||
+ | } | ||
+ | |||
+ | anzeigew(i< | ||
+ | break; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | while(digitalRead(SWpin)==0){ | ||
+ | | ||
+ | } | ||
+ | while(digitalRead(SWpin)==1){ | ||
+ | anzeigew(0); | ||
+ | |||
+ | for (int i=0; i<20000; i++) { | ||
+ | if (i==10000){ | ||
+ | anzeigew(2); | ||
+ | } | ||
+ | int change = auslesen(); | ||
+ | if (change!=0) { | ||
+ | if (m+change != -1 && m+change!=60){ | ||
+ | m = m+change; | ||
+ | } | ||
+ | if (m+change == -1) { | ||
+ | m = 59; | ||
+ | } | ||
+ | if (m+change == 60) { | ||
+ | m = 0; | ||
+ | } | ||
+ | break; | ||
+ | } | ||
+ | | ||
+ | } | ||
+ | } | ||
+ | |||
+ | |||
+ | // run setup code | ||
+ | void setup() { | ||
+ | Wire.begin(); | ||
+ | Serial.begin(9600); | ||
+ | display.begin(); | ||
+ | display.setBacklight(100); | ||
+ | delay(1000); | ||
+ | rtcWriteTime(2017, | ||
+ | } | ||
+ | |||
+ | |||
+ | |||
+ | // run loop (forever) | ||
+ | void loop() { | ||
+ | if (digitalRead(SWpin)==0){ | ||
+ | weckerstellen(); | ||
+ | } | ||
+ | if (minute == m && stunde == h){ | ||
+ | digitalWrite(3, | ||
+ | } | ||
+ | else { | ||
+ | digitalWrite(3, | ||
+ | } | ||
+ | rtcReadTime(); | ||
+ | Serial.print(stunde); | ||
+ | Serial.print(":" | ||
+ | Serial.print(minute); | ||
+ | Serial.print(":" | ||
+ | Serial.println(sekunde); | ||
+ | display.printTime(stunde, | ||
+ | delay(1000); | ||
+ | }; | ||
+ | </ | ||
+ | ==== Fazit ==== | ||
+ | In einer Woche ist es uns gelungen einen Wecker zu bauen, bei welchen man durch Klicken und Drehen des RotaryEncoders die Weckzeit einstellen kann. Ist die eingestellte Weckzeit erreicht, leuchtet ein kleines LED eine Minute lang. Verbessern könnte man noch das Auslesen des RotaryEncoders oder die Tatsache, dass man zum Einstellen der Weckzeit den Knopf eine Sekunde gedrückt halten muss. Als weiteres Ziel könnte man versuchen mit Hilfe eines Relais anstatt eines LEDs eine Nachttischlampe zum leuchten zu bringen. In dieser Woche haben wir viele Fortschritte im Programmieren gemacht und Durchhaltevermögen gezeigt. | ||
==== Fotos und Film ==== | ==== Fotos und Film ==== | ||
+ | {{: | ||
+ | {{: | ||
+ | {{: | ||
+ | {{: |