{{backlinks>.}} ====Lichtwecker==== Margherita Melchiori & Tabea Hugo ==== Idee und Fernziel ==== Bau eines Weckers mit Leuchtanzeige, welcher bei eingestellter Weckzeit eine Lampe zum leuchten bringt wodurch die schlafende Person geweckt werden soll. ==== Minimalprojekt ==== Funktionierende Uhr die aktuelle Uhrzeit auf Anzeige ausgibt, registrieren von Knopfdrücken auf RotaryEncoder und umsetzten derer auf Anzeige. ===== Bericht ===== ==== Material ==== * Arduino * RealTimeClock DS3231 * SevenSegment TM1637 * RotaryEncoder ==== Aufbau ==== * http://playground.arduino.cc/Main/RotaryEncoders * https://create.arduino.cc/projecthub/pentiumcadiz/4-digit-rtc-clock-85068b * http://playground.arduino.cc/Code/ElapsedMillis * https://github.com/bremme/arduino-tm1637 * http://www.instructables.com/id/Real-time-clock-using-DS3231-EASY/step4/Done/ ==== Code ==== // include the SevenSegmentTM1637 library #include "SevenSegmentTM1637.h" #include "SevenSegmentExtended.h" #include #define RTC_I2C_ADDRESS 0x68 // I2C Adresse des RTC DS3231 #define CLKpin 8 #define DTpin 9 #define SWpin 10 //Membervariablen int jahr,monat,tag,stunde,minute,sekunde, wochentag; int CLK,DT,SW; //rotaryRecorder Variablen /* 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 display(PIN_CLK, PIN_DIO); //Uhr auslesen void rtcReadTime(){ Wire.beginTransmission(RTC_I2C_ADDRESS); //Aufbau der Verbindung zur Adresse 0x68 Wire.write(0); Wire.endTransmission(); Wire.requestFrom(RTC_I2C_ADDRESS, 7); sekunde = bcdToDec(Wire.read() & 0x7f); minute = bcdToDec(Wire.read()); stunde = bcdToDec(Wire.read() & 0x3f); //Der Wochentag wird hier nicht ausgelesen da dieses mit //dem Modul RTC DS3231 nicht über die Wire.h zuverlässig funktioniert. /* wochentag =*/ bcdToDec(Wire.read()); tag = bcdToDec(Wire.read()); monat = bcdToDec(Wire.read()); jahr = bcdToDec(Wire.read())+2000; }; //Convertiert binäre Zeichen in Dezimal Zeichen. byte bcdToDec(byte val){ return ( (val/16*10) + (val%16) ); } //Convertiert Dezimalzeichen in binäre Zeichen. 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); // Der Wert 0 aktiviert das RTC Modul. Wire.write(decToBcd(sekunde)); Wire.write(decToBcd(minute)); Wire.write(decToBcd(stunde)); Wire.write(decToBcd(0)); // Wochentag unberücksichtigt 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[] = "0000"; void anzeigew (int mode) { if (mode !=1) { anzeige[0]=h/10+'0'; anzeige[1]=h%10+'0'; } else { anzeige[0]=' '; anzeige[1]=' '; } if (mode !=2) { anzeige[2]=m/10+'0'; anzeige[3]=m%10+'0'; } else { anzeige[2]=' '; anzeige[3]=' '; } display.print(anzeige); } void weckerstellen(){ while(digitalRead(SWpin)==0){ delay(1); } 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< 10000 ? 0 : 1); break; } } } while(digitalRead(SWpin)==0){ delay(1); } 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); // initializes the Serial connection @ 9600 baud display.begin(); // initializes the display display.setBacklight(100); // set the brightness to 100 % delay(1000); // wait 1000 ms rtcWriteTime(2017,2,16,14,48,0); // manuell Uhrzeit festlegen } // run loop (forever) void loop() { if (digitalRead(SWpin)==0){ weckerstellen(); } if (minute == m && stunde == h){ digitalWrite(3, HIGH); } else { digitalWrite(3, LOW); } rtcReadTime(); // Funktion um Zeit auszulesen Serial.print(stunde); Serial.print(":"); Serial.print(minute); Serial.print(":"); Serial.println(sekunde); display.printTime(stunde,minute,true); // display time delay(1000); // clock delay ms }; ==== 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 ==== {{:efinf:blc2016:bu1:projekt0:image5.jpeg?400|}} {{:efinf:blc2016:bu1:projekt0:image3.jpeg?400|}} {{:efinf:blc2016:bu1:projekt0:image4.jpeg?400|}} {{:efinf:blc2016:bu1:projekt0:image1.jpeg?400|}}