Hallo,
wie in der Überschrift schon genannt, habe ich mir ein "kleines" Projekt für den Einstieg in die Welt der µC vorgenommen.
Mein Ziel ist ein Wecker, der eine gewisse Zeit vor der Weckzeit einen LED-Strip (o.ä.) einschaltet und in einem Zeitraum von einigen Minuten (geplant bis zu 30 Min.) langsam hochdimmt.
Mein derzeitiger Aufbau besteht aus dem UNO, einem 16x2 Display (HD477* kompatibel) und eben dem RTC. (DCF77 fehlt noch mangels Wissen wie das Signal am besten auszuwerten ist - das gibt glaub ich noch einige Probleme )
Derzeit bin ich noch recht am Anfang und kämpfe gerade mit der Adressierung des RTC-Moduls. Ich habe ein Tiny RTC V1.1 von Amazon (Marketplace). Die Dokumentation von DFRobot (hier klicken) finde ich aber etwas mager - ich komme damit nicht recht weiter - (kennt hier jemand eine bessere Dokumentation?)
Ich habe mir die DS1307 und OneWire Bibliotheken runtergeladen und habe mir hier den Beispiel-Sketch "DS1307.ino" genommen und den Großteil in meinen Sketch übertragen.
Was ich komisch finde: In diesem Sketch wird nirgens eine I²C Adresse des RTC angegeben... Das verwirrt mich etwas.
Das größte Problem habe ich aber zur Zeit mit den folgenden beiden Zeilen:
//DS1307.h
#include <Wire.h>
#include <DS1307.h>
int rtc[7];
byte rr[7];
int ledPin = 13;
void setup()
{
DDRC|=_BV(2) |_BV(3); // POWER:Vcc Gnd //Um diese beiden Zeilen geht es <<<<<<<<<<
PORTC |=_BV(3); // VCC PINC3
...
Für mich ist das eine bitweise Oderverknüpfung in einer logischen Oder-Verknüpfung deren Ergebnis einfach wieder verworfen wird (zumindest wird es nicht zugewiesen). Ich habe schon die .h-Dateien durchsucht nach einer funktion namens BV oder _BV - konnte aber nichts finden... Was ist das??
Später sollte dann noch ein DCF77 Modul und ein Temperatur-Sensor hinzukommen - beim DCF77 habe ich derzeit aber recht dunkle Aussichten :~
Wenn ich das Projekt fertigstellen kann, werde ich es aber auch mal richtig vorstellen um Anderen solche Probleme zu ersparen
Der Vollständigkeit halber ist hier noch mein aktueller Code:
// include the library code:
#include <LiquidCrystal.h>
//#include <Time.h>
#include <Wire.h>
#include <DS1307.h>
int rtc[7]; //RTC-Ausgabe-Feld
byte rr[7]; //RTC-Eingabe-Feld (zum Zeiteinstellen über Serial)
short prev; // Variable für die zeitlichen Aktualisierungsabstände
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 7, 6, 5, 4);
void setup() {
// set up the LCD's number of columns and rows:
lcd.begin(16, 2);
Serial.begin(9600);
// RTC-Einstellungen
DDRC|=_BV(2) |_BV(3); // POWER:Vcc Gnd
PORTC |=_BV(3); // VCC PINC3
RTC.get(rtc,true);
RTC.SetOutput(DS1307_SQW1HZ); //Alternative: SQ4KHZ, SQ8KHZ, SQ32KHZ, LOW, HIGH // 1 Hz Signal geplant für den Interrupt
setPWM(9, 50); // Dummy-Einstellung des ersten PWM-Kanals
setPWM(10, 200); // Dummy-Einstellung des zweiten PWM-Kanals
lcdDrawPWM(50, 200); // PWM-Werte auf dem Display anzeigen/aktualisieren
lcdDrawTemp(22.4); // Dummy-Wert Temperatursensor anzeigen
attachInterrupt(0, lcdDrawTime, HIGH); //Interrupt zur Uhr-Aktualisierung über SQ-Pin des RTC mit 1 Hz
}
void loop() {
delay(100);
}
void lcdDrawTime() {
byte timeH; byte timeM; byte timeS;
RTC.get(rtc, true);
lcd.setCursor(0, 0);
timeH = BCD2DEC(rtc[2]);
timeM = BCD2DEC(rtc[1]);
timeS = BCD2DEC(rtc[0]);
if (timeH < 10) lcd.print(" ");
lcd.print(timeH);
lcd.print(":");
if (timeM < 10) lcd.print("0");
lcd.print(timeM);
lcd.print(":");
if (timeS < 10) lcd.print("0");
lcd.print(timeS);
}
void lcdDrawPWM(int pwm1, int pwm2) {
lcd.setCursor(0,1);
if (pwm1 < 100) lcd.print(" ");
if (pwm1 < 10 ) lcd.print(" ");
lcd.print((byte) (pwm1 / 2.55));
lcd.print("%|");
if (pwm2 < 100) lcd.print(" ");
if (pwm2 < 10 ) lcd.print(" ");
lcd.print((byte) (pwm2 / 2.55));
lcd.print("%");
}
void lcdDrawTemp(float temp) {
byte celsius[8] = {
B01000,
B10100,
B01000,
B00011,
B00100,
B00100,
B00100,
B00011 };
lcd.createChar(0, celsius);
lcd.setCursor(11, 1);
lcd.print(temp);
lcd.setCursor(15,1);
lcd.write(byte(0));
}
void setPWM(int pin, byte tastgrad) {
//Setzt den ausgewählten Pin auf einen PWM-Wert (0...255)
if (pin == 3 || pin == 5 || pin == 6 || pin == 9 || pin == 10 || pin == 11) {
analogWrite(pin, tastgrad);
}
}
// BCD zu Dec Umwandlung, da der RTC die Werte im BCD-Code ausgibt
char BCD2DEC(char var){
if (var>9){
var=(var>>4)*10+(var&0x0f);
}
return var;
}