efinf:blc2016:bu1:projekt0:projekt

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

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, welcher bei eingestellter Weckzeit eine Lampe zum leuchten bringt wodurch die schlafende Person geweckt werden soll.  Bau eines Weckers mit Leuchtanzeige, welcher bei eingestellter Weckzeit eine Lampe zum leuchten bringt wodurch die schlafende Person geweckt werden soll. 
 ==== 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://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 ==== ==== Code ====
-==== Fazit ====+<code c++> 
 +// include the SevenSegmentTM1637 library 
 +#include "SevenSegmentTM1637.h" 
 +#include "SevenSegmentExtended.h" 
 +#include <Wire.h> 
 +#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
 +    };
 +</code>
 +==== 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 ====
 +{{: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|}}
  • efinf/blc2016/bu1/projekt0/projekt.1489670060.txt.gz
  • Last modified: 2017/03/16 14:14
  • by tabea_hugo