Go Down

Topic: Kalender mit Erinnerungsfunktion und Temperaturanzeige (Read 2 times) previous topic - next topic

autuino

sodale, wieder einmal da  :)

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 http://combustory.com/wiki/index.php/RTC1307_-_Real_Time_Clock

Code: [Select]

/***************************************
*                                      *
*    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):

Code: [Select]

// 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 ;-)

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  ;)

schönen abend noch

vieledinge


@vieledinge: wenn ich den DS18S20 irgendwo billig hergrieg, dann werd ich des auch damit versuchen,


Pollin, 2,40 das Stück. Ja, hat mich auch überrascht den gerade da billig zu kriegen....

marau

Hallo vieledinge,

DS18S20, bei Reichelt 2,20€/Stck.

Also ich denke, preiswerte Bezugsquellen gibts genug.


Gruß

Martin

vieledinge


DS18S20, bei Reichelt 2,20€/Stck.


Ah, die scheinen die Preise gesenkt zu haben.

autuino

mahlzeit,

habe mir am gestern auf anraten von vieledinge mehrere dieser ds18s20 geordert, darunter 2 stück mit anschlussleitung ;-)

sobald die dinger einfliegen, werde ich sie in's programm implementieren und dann gehts schon  :D

Go Up