Kalender mit Erinnerungsfunktion und Temperaturanzeige

sodale, wieder einmal da :slight_smile:

ich habe o.a. projekt etwas, naja, "umgestaltet", wenn man es so nennen will. die programmierfähigkeit der anzeige über app wird vl. etwas später realisiert, zu den ausgaben von geburtstagen etc. werde ich den sketch nach der idee von dertester missbrauchen (ein dankeschön an dieser stelle). die ausgabe erfolgt zwischenzeitlich auf einem 16x2-lcd

auch die möglichkeit von dischneider habe ich probiert, danke auch hier

@vieledinge: wenn ich den DS18S20 irgendwo billig hergrieg, dann werd ich des auch damit versuchen, pt100 liegt aber schon auf meinem schreibtisch XD

weiters hier der (von mir "simplifizierte" sketch, den ich im netz gefunden habe --> originalsketch RTC1307 - Real Time Clock - Combustory

/***************************************
*                                      *
*    Programm:   Datum-Uhrzeit-        *
*                Temperatur-Anzeige    *
*                                      *
*    Autor:      autuino               *
*                                      *
*    Datum:      2013_02_04            *
*                                      *
*    Version:    1.2                   *
*                Für 16x2-LCD          *
***************************************/

#include <LiquidCrystal.h> 
#include "Wire.h"
#define DS1307_I2C_ADDRESS 0x68  // This is the I2C address
// Arduino version compatibility Pre-Compiler Directives
#if defined(ARDUINO) && ARDUINO >= 100   // Arduino v1.0 and newer
  #define I2C_WRITE Wire.write 
  #define I2C_READ Wire.read
#else                                   // Arduino Prior to v1.0 
  #define I2C_WRITE Wire.send 
  #define I2C_READ Wire.receive
#endif

// Initialisierung des LCD
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

// Globale Variablen
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
int i, j, k = 0;
int flash = 8;
float temp_in, temp_out;
byte zero;
char  *Day[] = {"","So","Mo","Di","Mi","Do","Fr","Sa"};
char  *Mon[] = {"","Jan.","Feb.","Mar.","Apr.","Mai.","Jun.","Jul.","Aug.","Sep.","Okt.","Nov.","Dez."};
 
// Wandelt BCD-Werte in Dezimalwerte um
byte bcdToDec(byte val)
{
  return ( (val/16*10) + (val%16) );
}
 
// Daten von RTC erhalten
void getDateDs1307()
{
  // Reset the register pointer
  Wire.beginTransmission(DS1307_I2C_ADDRESS);
  I2C_WRITE(zero);
  Wire.endTransmission();
  Wire.requestFrom(DS1307_I2C_ADDRESS, 7);
}
 
void setup()
{
// Anzeige der Werbung  
  lcd.begin(16, 2);
  lcd.print("Kalender V 1.2");
  lcd.setCursor(0, 1);
  lcd.print("build by MB");
  lcd.noCursor();
 
// Löschen der Werbung nach der vorgegebenen Zeit
  lcd.cursor();
  delay(2500);
  lcd.clear();
  
// Start des IIC-Modi
  Wire.begin();

// Pin Flash (=8) ist Ausgang
  pinMode(flash, OUTPUT);
};
 
void loop()
{
// Ausgabe von Datum und Uhrzeit inkl. Abfrageroutine der IIC-RTC 
while(i <= 20)
{  
  Wire.beginTransmission(DS1307_I2C_ADDRESS);
  I2C_WRITE(zero);
  Wire.endTransmission();
 
  Wire.requestFrom(DS1307_I2C_ADDRESS, 7);
 
// Maskierung der Bits vom RTC-Modul
  second     = bcdToDec(I2C_READ() & 0x7f);
  minute     = bcdToDec(I2C_READ());
  hour       = bcdToDec(I2C_READ() & 0x3f);  // Need to change this if 12 hour am/pm
  dayOfWeek  = bcdToDec(I2C_READ());
  dayOfMonth = bcdToDec(I2C_READ());
  month      = bcdToDec(I2C_READ());
  year       = bcdToDec(I2C_READ());

// Ausgabe des Datums im Format DD,_dd._mmm._'yy 
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(Day[dayOfWeek]);
  lcd.print(", ");
  if (dayOfMonth < 10)
    lcd.print("0");
  lcd.print(dayOfMonth, DEC);
  lcd.print(".");
  lcd.print(" ");
  lcd.print(Mon[month]);
  lcd.print(" '");
  lcd.println(year, DEC);


// Ausgabe der Uhrzeit im Format hh:mm:ss 
  lcd.setCursor(4, 1);
  if (hour < 10)
     lcd.print("0");
  lcd.print(hour, DEC);
  lcd.print(":");
  if (minute < 10)
    lcd.print("0");
  lcd.print(minute, DEC);
  lcd.print(":");
  if (second < 10)
    lcd.print("0");
  lcd.print(second, DEC);
  lcd.print("  ");
  lcd.noCursor();
  i++;
  delay(500);
  j = 0;
  k = 0;
};

while(j <= 20)
{
// Einlesen der aktuellen Temperaturwerte und Mapping auf ein ordentliches Format
// Parameter für PT100 (Spannungsteiler mit R56 und PT100), errechnet anhand der Formel R = R0*(1+0,00385*??)
// Mapping-Wert für 0°C = 656, 100°C = 728
  while(k <= 1)
  {
  digitalWrite(twinkle, HIGH);  
  temp_in = analogRead(A0);
  temp_in = map(temp_in, 656, 728, 0, 100);
  
  temp_out = analogRead(A1);
  temp_out = map(temp_out, 656, 728, 0, 100);
  delay(25);
  digitalWrite(flash, LOW);
  k++;
  };

// Ausgabe der aktuellen Temperatur für innen und außen 
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Innen:  ");
  lcd.setCursor(8, 0);
  lcd.print(temp_in,1);
  lcd.setCursor(0, 1);
  lcd.print("Aussen: ");
  lcd.setCursor(8, 1);
  lcd.print(temp_out,1);
  lcd.noCursor();
  j++;
  delay(500);
  i = 0;
  };

};

und hier auch die umgesetze idee von dischneider (funktioniert trotz einfachen aufbaus sehr gut):

// Geburtstag von Sepp 23.04.1965  
  if(dayOfMonth == 23 && month == 04){
    int ofyear = (year + 2000) - 1965;
    lcd.setCursor(0, 2);
    lcd.print("Sepp ");
    lcd.print(ofyear);}

sketch ist noch nicht ganz fehlerfrei, könnte noch schöner auskommentiert werden.

zu den sorgen von vieledinge: was bei einer umstellung von mez auf mesz und umgekehrt passiert, weis ich nicht.
weiters: da das ding in einer elektrowerkstätte installiert werden soll (habe ich eingangs leider nicht erwähnt) verkompliziert die sache mit webzugriff, weil ich nicht glaube, dass mir unsere admins "nur für spaß" die sicherheitsrichtlinien unseres firmennetzwerkes entschärfen :wink:

d.h. aufbau so klein wie möglich und so groß wie nötig, gilt auch für den preis

ps: für änderungsvorschläge bzw. code-korrekturen (im kleinen wie im großen) bin ich sehr dankbar :wink:

schönen abend noch