efinf:blc2016:bu1:projekt0:projekt

Margherita Melchiori & Tabea Hugo

Bau eines Weckers mit Leuchtanzeige, welcher bei eingestellter Weckzeit eine Lampe zum leuchten bringt wodurch die schlafende Person geweckt werden soll.

Funktionierende Uhr die aktuelle Uhrzeit auf Anzeige ausgibt, registrieren von Knopfdrücken auf RotaryEncoder und umsetzten derer auf Anzeige.

  • Arduino
  • RealTimeClock DS3231
  • SevenSegment TM1637
  • RotaryEncoder
// 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
    };

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.

  • efinf/blc2016/bu1/projekt0/projekt.txt
  • Last modified: 2017/03/17 08:48
  • by tabea_hugo