Hallo
ich bemühe mich alles richtig zu machen , aber entschuldigt bitte die Fehler eines Anfängers.
Hallo
ich werde es mal versuchen so darzustellen wie Ihr das gernne hättet:
#define Echtzeituhr 0x68
#define sclk 13
#define mosi 11
#define cs 10
#define dc 9
#define rst 8
//***************** Farbdefinitionen ***************************************
#define schwarz 0x0000
#define weiss 0xffff
#define rot 0xf800
#define gelb 0xffc0
#define gruen 0x07e0
#define blau 0x001f
#define magenta 0x07ff
#define silber 0xdefb
#define grau 0x8410
#define orange 0xfc00
//***************************** Symbole ****************************************
define note 14
#define sonne 15
#include "Adafruit_GFX.h"
#include "Adafruit_ST7735.h"
#include "SPI.h"
#include "Wire.h"
Adafruit_ST7735 tft = Adafruit_ST7735(cs, dc, rst);
int aktSekunde;
int altSekunde=-1;
int aktMinute;
int altMinute=-1;
int aktStunde;
int altStunde=-1;
int aktWochentag;
int aktTag;
int altTag=-10;
int aktMonat;
int aktJahr;
char* tagKlartext[7] = {"Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Sonnabend"}; //Wochentage
char* monatKlartext[] = {"Januar","Februar","Maerz","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"};
float tempCelsius;
int buttonPin=A2;
int piezoPin=3;
int alarmModus; // 0= alle aus, 1=Stundengong,....
int buttonWert;
int i;
void setup()
{
pinMode(buttonPin,INPUT_PULLUP); //Pin für die Buttons
Wire.begin(); // I2C starten
// Serial.begin(9600); // serielle Konsole
tone(piezoPin, 1500);
delay(200);
noTone(piezoPin);
delay(100);
tone(piezoPin,2000);
delay(200);
noTone(piezoPin);
tft.initR(INITR_BLACKTAB); // Display starten
tft.fillScreen(schwarz);// Display löschen
alarmModus=0;
zeichneAnzeigeUhr();
zeichneInfoleiste();
delay(10);
}
void loop(){
leseZeit();
aktualisiereUhr();
aktualisiereTemperatur();
frageTastenAb();
}
void aktualisiereTemperatur()// ****** Temperatur auslesen, umrechnen und anzeigen **********
{
byte tempMSB, tempLSB, temp;
Wire.beginTransmission(Echtzeituhr);
Wire.write(0x11); // Registerzeiger auf erstes Temperaturregister stellen
Wire.endTransmission();
Wire.requestFrom(Echtzeituhr, 2); // Temperatur abfragen
tempMSB = Wire.read();
tempLSB = Wire.read() >> 6;
tempCelsius = tempMSB + (0.25*tempLSB); // und ausrechnen
tft.setCursor(10,90); // Temperatur ausgeben
tft.setTextSize(0);
tft.setTextColor(blau,schwarz);
tft.print("Temperatur:");
if(tempCelsius<17) // wenns zu kalt ist
{tft.setTextColor(magenta,schwarz);}
if(tempCelsius>24) // wenns zu warm ist
{tft.setTextColor(rot,schwarz);}
else
{tft.setTextColor(gruen,schwarz);} // normale Temperatur
tft.setCursor(12,105);
tft.setTextSize(2);
tft.print(tempCelsius,1);
tft.print(char(247));
tft.setCursor(68,112);
tft.setTextColor(blau,schwarz); // Textfarbe wieder zurückstellen
tft.setTextSize(1);
tft.print(" Celsius ");
}
void aktualisiereUhr()// ************** Uhr-und Datumsanzeige aktualisieren *******************************
{
tft.setTextSize(3); // Grosschrift an
tft.setTextColor(blau,schwarz);
if (aktStunde !=altStunde)// wenn Stunden geändert
{
if (alarmModus>0)
{
stundenAlarm();
}
tft.setTextColor(blau,schwarz);
tft.setCursor(8,25);
if(aktStunde<10)
{
tft.print(" "); //Leere Stelle damit die Anzeige nicht verrutscht
}
tft.print(aktStunde);
altStunde=aktStunde;
tft.setCursor(41,25);
tft.print(":");
}
if(aktMinute !=altMinute)// wenn Minute geändert wurde
{
tft.setCursor(55,25);
if(aktMinute<10)
{
tft.print("0");
}
tft.print(aktMinute);
altMinute=aktMinute;
}
if(aktSekunde !=altSekunde)//wenn Sekunden geändert wurden
{
tft.setTextSize(2);
tft.setCursor(88,33);
tft.print(":");
tft.setCursor(99,32);
if(aktSekunde<10)
{
tft.print("0");
}
tft.print(aktSekunde);
altSekunde=aktSekunde;
}
tft.setTextSize(0);
if (aktTag !=altTag) // wenn das Datum sich ändert....
{
tft.setCursor(10,55);
tft.setTextColor(magenta,schwarz);
tft.print(aktTag);
altTag=aktTag;
tft.print(".");
tft.print(monatKlartext[aktMonat-1]);
tft.print(" ");
tft.print(aktJahr);
rechneWochentag();
tft.setCursor(10,68);
tft.setTextSize(1);
if(aktWochentag==0)
{
tft.setTextColor(orange,schwarz);
}
else
{
tft.setTextColor(magenta,schwarz);
}
tft.print(tagKlartext[aktWochentag]);
tft.print(" ");
}
}
void zeichneAnzeigeUhr()// ************* Grundgerüst der Anzeige ****************************
{
tft.setTextColor(weiss,schwarz);
tft.setCursor(50,5);
tft.setTextSize(1);
tft.print("Reiniuhr");
zeichneButtons();
}
void frageTastenAb()// *************** Abfrage der Buttons **********************************+
{
int analogButtonWert=analogRead(buttonPin);
delay(5);
if (analogButtonWert<50)
{
buttonWert=1;
alarmModus++;
delay(100);
if(alarmModus>2)
{
alarmModus=0;
}
zeichneInfoleiste();
}
else if(analogButtonWert>80 && analogButtonWert<130)
{
buttonWert=2;
zeichneInfoleiste();
}
else if(analogButtonWert>150 && analogButtonWert<200)
{
buttonWert=3;
zeichneInfoleiste();
}
else{ buttonWert=0;}
}
void zeichneButtons()// ************* Buttons aktualisieren ***************************************
{
tft.fillRoundRect(10,140,30,14,3,grau);
tft.drawRoundRect(10,140,30,14,3,silber);
tft.setCursor(13,143);
tft.setTextSize(1);
tft.setTextColor(silber,grau);
tft.print("Gong");
tft.fillRoundRect(48,140,34,14,3,grau);
tft.drawRoundRect(48,140,34,14,3,silber);
tft.setCursor(51,143);
tft.setTextSize(1);
tft.print("Modus");
tft.setTextColor(silber,grau);
tft.fillRoundRect(90,140,30,14,3,grau);
tft.drawRoundRect(90,140,30,14,3,silber);
tft.setCursor(94,143);
tft.setTextSize(1);
tft.print("Set.");
}
void zeichneInfoleiste()//********* Infoleiste aktualisieren ******************************
{
switch(alarmModus)
{
case 1: // Stundengong an
tft.setTextColor(gelb,schwarz);
tft.setCursor(16,130);
tft.print(char(14));
tft.setCursor(29,130);
tft.setTextColor(silber,schwarz);
tft.print(char(15));
break;
case 2: // Stundengong und Wecker an
tft.setTextColor(gelb,schwarz);
tft.setCursor(16,130);
tft.print(char(14));
tft.setCursor(29,130);
tft.setTextColor(gelb,schwarz);
tft.print(char(15));
break;
case 0:// keine Alarme aktiv
tft.setTextColor(silber,schwarz);
tft.setCursor(16,130);
tft.print(char(14));
tft.setCursor(29,130);
tft.setTextColor(silber,schwarz);
tft.print(char(15));
break;
}
}
void leseZeit() // ************** Uhrzeit und Datum auslesen *****************************
{
Wire.beginTransmission(Echtzeituhr); //Registerzeiger auf Uhr stellen
Wire.write(0);
Wire.endTransmission();
Wire.requestFrom(Echtzeituhr, 7);
aktSekunde = bcdToDec(Wire.read());
aktMinute = bcdToDec(Wire.read());
aktStunde = bcdToDec(Wire.read() & 0b111111); //24 Stunden
aktWochentag = bcdToDec(Wire.read()); //funktioniert nicht
aktTag = bcdToDec(Wire.read());
aktMonat = bcdToDec(Wire.read());
aktJahr = bcdToDec(Wire.read())+2000;
}
void rechneWochentag() // ********** Wochentag berechnen ************************
{
int nT;
int nM;
int mZ[13]= {0,0,3,3,6,1,4,6,2,5,0,3,5};//Monatsziffern
int nJZ;
int nJH;
int nSJ;
nT= aktTag%7; // Tagesziffer berechnen
nM=mZ[aktMonat]; //Monatsziffr zuweisen
nJZ= aktJahr-2000; // Jahreszahl auf Zehner kürzen
nJZ=(nJZ+(nJZ/4))%7; // JahresZehnerZiffer berechnen
int jH= (aktJahr/100); // Jahreszahl auf Hunderter kürzen
nJH=(3-(jH%4))*2; // Jahrhundertziffer berechnen
if(aktMonat<3) // Schaltjahreskorrektur
{nSJ= 6; }
else {nSJ=0; }
aktWochentag= (nT + nM + nJH + nJZ + nSJ)%7;
}
void stundenAlarm()// ************ stündlicher Piepser ********************************
{
for (i=0;i<2;i++)
{
tone(piezoPin, 700);
delay(50);
noTone(piezoPin);
delay(100);
}
}
byte bcdToDec(byte val) // ************ Hilfsfunktion fürs Umwandeln Binär->Dezimal *****************
{
return ( (val/16*10) + (val%16) );
ist es so richtig?