Go Down

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

autuino

tja hallo, ich bins wieder mal  :)

wie im titel zu lesen, möchte ich mich wieder mal an ein neues projekt heranwagen (das mit dem "Universelles Netzgerät mit Arduino & Co" http://arduino.cc/forum/index.php/topic,141676.0.html hab ich inzwischen, aus zeit- kosten- und motivationsgründen ad acta gelegt).

was soll mein neues "teil" können?

wie oben zu lesen möchte ich auf einem 20x4-lcd zwei (2) verschiedene temperaturen, meinetwegen "büro/werkstatt" und "draußen" anzeigen. gemessen wird wahrscheinlich der einfachheit halber mit pt100.
zudem soll die aktuelle zeit in hh:mm:ss sowie das datum in dd.mm.yy angezeigt werden.
die bezeichnung "erinnerungsfunktion" ist vielleicht etwas unpassend, das wort "künstliches gehirn" wird wohl eher passen. ich möchte an verschiedenen tagen, welche ich vorher genau festlege, die eine oder andere nachricht im display anzeigen wie z.b.: "sepp geburtstag", "pi-day" oder "hochzeitstag".

als gag stelle ich mir vor, die aktuelle zeit in das rtc-modul einzulesen und eventuell neue ("künstliche-gehirn")-termine hinzufügen/alte termine löschen.
eine solche android-app sollte ja über processing geschrieben werden können, oder?

nun zu meinen fragen:

0. ich frage nicht, ob so was möglich ist, weil technisch ist theroretisch alles möglich (das wird mir auch der uwe mit seiner kristallkugel bestätigen  :D)

1. funktioiert das auch mit einem arduino-micro? (http://www.physicalcomputing.at/shop/article_A-1134800/Arduino-Micro.html?sessid=y818yJWVKtbJ6NEypqFaiaQezzIZYzMH8LnCcTpZm4rX7J6snerYG0TNiyVmNchY&shop_param=cid%3D3%26aid%3DA-1134800%26)
2. wenn ja, ist es dann überhaupt möglich, daten (für die erinnerung) in den speicher einzulesen, oder brauch ich dafür wieder ein eigenes shield mit einem micro-sd-card-slot? ich jab zwar einen solchen kartenslot, der ist aber an einem ethernetshield angebracht. und arduino+ethernetshield+display+... ist dann doch wieder etwas zu finanzlastig.
2a. wenn nein, ist auch okay
3. hat von euch schon so etwas (ähnliches) gebastelt?

schönen abend noch, autuino

marau

Hallo Autoino,

wenn Du das ganze über ein Android-App (woher auch immer) aktualisieren willst, dann brauchst Du doch (mindestens) Ethernet?

Solltest Du die Erinnerungsdaten allerdings auf einer SD-Card speichern wollen, so kannst Du Dir auch einen SD-Cardadapter mit etwas Geschick selbst bauen (s. Anhang).

Das benötigte IC (Pegelwandler) gibts leider nur in SMD-Ausführung.

Ich habe mir solch einen Adapter gebastelt, funktioniert wunderbar!


Gruß

Martin

dertester

#2
Feb 03, 2013, 09:43 pm Last Edit: Feb 03, 2013, 09:46 pm by dertester Reason: 1
1) Warum nicht? Denke aber das es sogar noch einfacher nen Standalone tun würde oder?
2) Für Einfache Termine kannste sicher auch den Sketch missbrauchen oder in den speicher schreiben.
Letzteres hat den Vorteil, dass es auch über Stromverlust erhalten bleibt. Bin aber grad nicht sicher ob das nur beim hochladen aus der IDE geht oder man auch Termine über Serielle Schnittstelle in den Speicher schreiben kann. Ich denke aber es geht!!
3) Nein hätte aber Ideen:

Temperatursensoren ist ja recht einfach. DCF-77 Für genaue Zeit.
Sd-Karte um Temperatur zu loggen. Gleichzeitig für Termine?
Bluetooth Modul um einfach Werte auszulesen und Termine zu programmieren :)

Bluetooth hat jedes Handy und für android hab ich bis jetzt den Sena Blueterm genutzt und damit könnte man senden/empfangen.
Wie du das dann genau umsetzt ist dir überlassen. Vom Prinzip reicht nen einfacher Syntax der dann in ne Funktion übergeben wird.
[Speicherplatz],[Tag],[Monat],[Jahr],[Text]
und wenn da was sinnvolles aufs Softserial kommt dann wird der Speicherplatz mit den neuen Termindaten bestückt.

Ansonsten läuft dein Temp und "ist ein Termin gerade?" loop weiter.

dischneider

Wenn die Daten statisch genug sind (geburtstage sollen sich nicht so häufig ändern hörte ich) kann man das auch in den EEPROM schreiben -> dort bleiben sie erhalten auch nach Reset / Stromausfall und sind recht einfach auslesbar, je 2 Werte (Datum und Info), dann schauen, ob day() und month() von aktuell mit einem gespeicherten Wert übereinstimmen (evtl auch 1-2 Tage in der Zukunft?) und dann entsprechend anzeigen. Dann könnte man sogar über year()-Vergleich das Alter mit anzeigen lassen, nichts inst peinlicher als eine gute Freundin älter zu machen  :~

Dirk
using arduino leonardo, arduino uno ...
--
tomorrow today will only be yesterday, so live your life today!

vieledinge


wie oben zu lesen möchte ich auf einem 20x4-lcd zwei (2) verschiedene temperaturen, meinetwegen "büro/werkstatt" und "draußen" anzeigen. gemessen wird wahrscheinlich der einfachheit halber mit pt100.


Warum gerade PT100? Wenns einfach sein soll würde ich DS18S20 nehmen. Da gibts fertige Libs zum komfortablen Auslesen und Du kannst mehere Sensoren an einen Bus hängen.


zudem soll die aktuelle zeit in hh:mm:ss sowie das datum in dd.mm.yy angezeigt werden.


Die bekommst Du woher?


0. ich frage nicht, ob so was möglich ist, weil technisch ist theroretisch alles möglich (das wird mir auch der uwe mit seiner kristallkugel bestätigen  :D)


Sollte möglich sein. Man muss es halt tun. Einfach nur zusammenstecken und zusammenklicken dürfte da nicht reichten.


1. funktioiert das auch mit einem arduino-micro?
2. wenn ja, ist es dann überhaupt möglich, daten (für die erinnerung) in den speicher einzulesen, oder brauch ich dafür wieder ein eigenes shield mit einem micro-sd-card-slot? ich jab zwar einen solchen kartenslot, der ist aber an einem ethernetshield angebracht. und arduino+ethernetshield+display+... ist dann doch wieder etwas zu finanzlastig.
2a. wenn nein, ist auch okay
3. hat von euch schon so etwas (ähnliches) gebastelt?


1. Ja, wenn er für den Code und die Schnittstellen ausreicht. Das musst Du als Entwickler abschätzen.
2. Geht. Du kannst halt keine unendliche Menge einlesen. Mir stellt sich da auch eher die Frage: Einlesen woher? SD-Card-Adapter gibts auch standalone für kleines Geld in der Bucht, man braucht da keinen komplexen Shield für.
3. ich nich....

Da Du scheinbar in vielen Bereichen noch neu in der Materie bist würde ich da eher klein anfangen, dann kommst Du auch schneller zu Erfolgen und nicht zu Frust.

- Erst mal die Temperaturmessung samt Anzeige aufbauen und zum Fliegen bringen.
- Dann sich Gedanken zu Datum und Uhrzeit machen und das mit anzeigen. Das Thema ist an sich schon recht komplex, wenn man es relativ final erschlagen will (RTC, DCF77, Sommer-/Winterzeit, etc.).
- Danach würde ich dann das Thema Kalender/Reminder angehen und als Erstes mal den Kram von ner SD-Karte lesen. Die kannst Du am Rechner einfach mit einer passend gefüllten Textfile mit Daten versorgen.

Wenn Du unbedingt mit ner Android-App was machen willst, dann würde ich da auch einen anderen Ansatz wählen: Arduino via Ethernet anbinden, Kommunikation über Webinterface. Dann kannst Du die Zeitproblematik auch anders lösen und gleich nen NTP-Server als Zeitquelle abfragen. Außerdem ist es dann auch ziemlich egal mit welchem externen Device Du auf den Arduino zugreifst. Außerdem könnte man auch das Pollen von Terminen von diversen Kalender-Diensten implementieren.

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

autuino

#10
Feb 14, 2013, 10:29 am Last Edit: Feb 14, 2013, 08:42 pm by autuino Reason: 1
morgähn,

heute sind sie eingetrudelt, meine ds18s20, gleich ein ganzer sack voll  :)

natürlich gleich ausgepackt, zusammengesteckt und...... fehlermeldung!!!

*************************************************************************
[font=Verdana][font=Verdana]In file included from Single.pde:2:
E:\_Software\arduino-1.0.2-windows\arduino-1.0.2\libraries\DallasTemperature_372Beta/DallasTemperature.h:64: error: expected `)' before '*' token
E:\_Software\arduino-1.0.2-windows\arduino-1.0.2\libraries\DallasTemperature_372Beta/DallasTemperature.h:222: error: ISO C++ forbids declaration of 'OneWire' with no type
E:\_Software\arduino-1.0.2-windows\arduino-1.0.2\libraries\DallasTemperature_372Beta/DallasTemperature.h:222: error: expected ';' before '*' token
Single:8: error: 'OneWire' does not name a type
Single:11: error: 'oneWire' was not declared in this scope[/font][/font]

*************************************************************************

hab ich da eine falsche lib? wenn ja: wo finde ich die "richtige"?

@vieledinge: der preis für einen ds... (im to92-häusl) liegt in meiner region bei €2,95, wenn ich ihn selbst abhole. die sensoren, welche ich verbaue, kosten €12,95/stk, haben jedoch eine 2-meter-anschlussleitung und sind zudem komplett in kunststoff vergossen (d.h. wasserdicht), also ideal für den outdoor-bereich.

Kalli

Hallo,

probier doch mal die IDE 0022, da müsste es gehen.

Gruss Kalli

autuino

holla kalli,

hab mir grad die version 0.22 gesaugt, probiert... und da gehts auch nicht. es kommt die gleiche fehlermeldung wie vorher beschrieben. (natürlich, die library hab ich auch eingefügt :) )

was gibt es sonst noch für möglichkeiten?
hier nochmals die fehlermeldungen:



gruß bernd

autuino

ps:

hier der link, wo ich meinen kleinen feinen blog betreibe:

http://projektemitarduino.blogspot.co.at/

da werden in zukunft (hoffentlich) noch mehr projekte aufgelistet werden  :smiley-yell:

autuino

so, problem gelöst!!

wenn man schon 1-wire-trümmer einbaut, dann sollte auch die lib dazu stimmen (die hat nämlich gefehlt).

werd mich heut in der letzten nachtschicht dazu bemühen, die beispielsketches in mein eigentliches programm einzupflegen und dann das ganze "gerät" inbetriebnehmen.

die resultate sollten dann irgendwann auch in meine blog (adresse siehe einen post früher) erscheinen :)

lg bernd

Go Up