Mal wieder Zeitsteuerung mit RTC und ein paar Relais

Hallo zusammen

nachdem mich meine Jarduino-Aquariumsteuerung verstorben ist, mal ging er mal gings nicht, RTC 165 Fehler, Bildschirm an aber ohne Text usw…
Bin ich nun dabei die Steuerung für mich selber zurecht zu schreiben.

Ziel ist es:

  1. RTC einbinden
  2. Heizstabregeln (Relais)
  3. LED per PWM und Konstandstromquelle zu steuern
  4. 3 Dosierpumpen zu steuern (Relais)
  5. Temperaturüberwachung LED Leisten (ca. 50Watt pro Leiste)
  6. Relais per Tastendruck für ein paar Minuten abschalten

Zukunft
Später vielleicht noch eine “schöne” Ausgabe auf größeren Display(1,8" oder mehr)
Zeitwerte per Tastendruck ändern (Dosierpumpen, Zeitnachstellen)

das ganze muss nicht in 5 Tagen fertig sein, derzeitig läuft noch vielles mechanisch.

Die Temperatursteuerung für die Wassertemperatur läuft.

Nun aber der nächste Step die Zeitsteuerung.
Die suche bringt mich grade nicht ganz so weiter, ich denke ich brauch nur einen Tipp.

Ich denke die RTC Lib welche ich nutzt kann mir nicht direkt die Stunden und Minuten ausgeben damit ich damit weiter “arbeiten” kann.
bei den anderen Libs (DS1307rtc.h, etc.) komm ich nicht weiter da diese mein RTC nicht erkennen, aber ich auch nicht 100% weis an welchen PIN´s beim MEGA ich die Anschließen muss.
D20 & D21 haben keine Auswirkung.

Ich nutzte die DS18B20 Pins vom RTC Modul dabei gabs anfänglich ein paar Probleme mit dem RTC welches nun ohne GND am RTC gelöst wurde, die DS18B20 sind direkt an GND, alles sehr merkwürdig. aber nun läuft es.

Genutzt wird ein Mega 2560, ein Tiny RTC Ds1307, ein paar DS18B20

der Code

//Library
#include <OneWire.h>
#include <LiquidCrystal.h>
#include <DallasTemperature.h>
#include <DS1307.h>



//////////////////////////// Belegung der PINS ////////////////////

DS1307 rtc(34, 35);                        // Init the DS1307
LiquidCrystal lcd(41, 43, 45, 47, 49, 51);   // Init the LCD
OneWire OneWireBus(51);                  // Temp Sensoren an PIN 51
DallasTemperature sensors(&OneWireBus);  // An PIN 51 sind DS18B20

//////////////////////////// Relais PINBelegung///////////////
const int RPin1 = 30;    // Heizung
const int RPin2 = 13;
const int RPin3 = 32;
const int RPin4 = 33;



// Die Adressen der DS18B20 und ihre Namen im Sketch
// Aus drei Sensoren wird der Mittelwert ermittel und die Heizung gesteuert
// Drei Sensoren sind auf einer LED Leiste
DeviceAddress TBTemp1 = { 0x28, 0x17, 0x72, 0xF8, 0x04, 0x00, 0x00, 0xDD };
DeviceAddress TBTemp2 = { 0x28, 0xFF, 0x91, 0x02, 0x64, 0x04, 0x00, 0x35 };
DeviceAddress TBTemp3 = { 0x28, 0xFF, 0x1F, 0xD8, 0x35, 0x14, 0x00, 0x7A };
DeviceAddress LED1 = { 0x28, 0x5C, 0x56, 0x59, 0x03, 0x00, 0x00, 0xEB };
DeviceAddress LED2 = { 0x28, 0xBE, 0xFA, 0xBC, 0x02, 0x00, 0x00, 0xDD };
DeviceAddress LED3 = { 0x28, 0x72, 0x22, 0x37, 0x03, 0x00, 0x00, 0xB9 };
float WT1 = 0;
float WT2 = 0;
float WT3 = 0;
float WT = 0;
//char Zeit;

//////////////////////////// Heizungssteuerung //////

void checkTempC()
{
  sensors.requestTemperatures();       //alle Sensoren senden Daten
  WT1 = (sensors.getTempC(TBTemp1));    //Temperatur von TBTemp1 ist WT1
  WT2 = (sensors.getTempC(TBTemp2));    //Temperatur von TBTemp1 ist WT2
  WT3 = (sensors.getTempC(TBTemp3));    //Temperatur von TBTemp1 ist WT3
  WT = (WT1 + WT2 + WT3) / 3;

  // Heizung einschalten wenn Temperatur unter 24,5C

  if ((WT < 24.5) && (WT > 20)) {
    digitalWrite (RPin1, HIGH);
    lcd.setCursor(9, 0);              // Cursor an Position 9 Zeile 0
    lcd.print("X");                   // Relaisstatur auf HIGH
  }

  // Heizung ausschalten bei 25,5C
  if (WT > 25.5) {
    digitalWrite (RPin1, LOW);
    lcd.setCursor(9, 0);              // Cursor an Position 9 Zeile 0
    lcd.print("0");                   // Relaisstatur auf LOW
  }
}
////////////////////////////  ENDE von Heizungsstuerung ////////////////

////////////////////////////  Zeitschaltuhr                   ///////
void checkTime ()

{
   
   //Zeit = (rtc.getTimeStr());  
   // if (hour()  < 17) {
   // digitalWrite (RPin2, LOW);
   //lcd.setCursor(10, 0);              // Cursor an Position 10 Zeile 0
   //lcd.print("0"); }
}

////////////////////////////    SETUP   //////////////////////


void setup() {
  // RPins sollen Ausgänge sein
  pinMode(RPin1, OUTPUT);
  pinMode(RPin2, OUTPUT);
  pinMode(RPin3, OUTPUT);
  pinMode(RPin4, OUTPUT);

  sensors.begin();                   //laden der Sensoren Library
  sensors.setResolution(TBTemp1, 10);    // DS18B20 mit 10Bit
  sensors.setResolution(TBTemp2, 10);    // DS18B20 mit 10Bit
  sensors.setResolution(TBTemp3, 10);    // DS18B20 mit 10Bit
  //////////////////////////  RTC Stellen ///////////
  rtc.halt(false);                   //Set the clock to run-mode
  // rtc.setTime(12, 10, 11);            // Uhr auf 12:00:00 gestellt (HH, MM, SS,)
  //rtc.setDate(2, 1, 2016);
  //rtc.setSQWRate(SQW_RATE_1);
  //rtc.enableSQW(true);

  lcd.begin(16, 2);                 // LCD  mit 16Stellen und 2 Zeilen

}



//////////////////////////  LOOP  /////////////////////////
void loop()

{
  checkTempC();               // void checkTempC() Abschnitt wird "gestartet"

  ///// Werte auf das LCD
  lcd.setCursor(0, 0);              // Cursor an Position 1 Zeile 0
  lcd.print(WT);                    // Schreibe Wassertemperatur
  lcd.setCursor(5, 0);              // Cursor an Position 5 Zeile 0
  lcd.print(" C");                    // Schreibe C
  lcd.setCursor(0, 1);                 //Cursor an Position 0 Zeile 1
  lcd.print(rtc.getTimeStr(FORMAT_LONG));      // Die Uhrzeit wird gezeigt
  lcd.setCursor(12, 1);


  // print the number of seconds since reset: zum Testen ob RTC läuft
  lcd.print(millis() / 1000);

}

ups ein Fehler war da noch

OneWire OneWireBus(52); // Temp Sensoren an PIN 52

Gibt es bei der RTC Lib die möglichkeit direkt die PC Systemzeit zu nutzten um den RTC zu stellen? Oder lieber doch gleich auf RTC DS3231 umsteigen? ich hab hier halt nur grade ein paar DS1307 liegen. und viel zu viele MEGA2560.

Grüße der Arne

Hallo

zum stellen meiner RTC nehme ich diesen Sketch er syncronisiert die RTC mit der Systemzeit des PC!s.
Funkt wunderbar.

Grüße Rudi

stellen_der_RTC_mit_der_PC-Zeit_beim_Upload_des_Sketches.ino (1.64 KB)

Wenn du deine RTC alle paar Tage neu stellen willst, dann kannst du bei der DS1307 bleiben. Möchtest du allerdings eine höhere Genauigkeit erreichen und nicht ständig die RTC stellen müssen, steige lieber auf die DS3231 um. Bei der DS1307 habe ich festgestellt, je öfter die abgefragt wurde, um die Zeit anzuzeigen, je schneller ging die falsch.

Die DS3231 ist deutlich genauer und dabei auch noch temperaturkompensiert.

Als Library verwende ich diese:

http://github.com/JChristensen/DS3232RTC

Es sind auch einige Beispiele dabei.

Die RTC musst du am I2C-Bus anschließen, das ist beim MEGA Pin 20 (SDA) und 21 (SCL). Du solltest auch Pullup-Widerstände (je 4,7 k) gegen +5V anschließen. Diese sind bei längeren Leitungen wichtig. Und die Adresse muss angegeben werden. Diese kannst du mittels I2C-Scanner http://playground.arduino.cc/Main/I2cScanner rausfinden.

Ich habe mir deinen Thread nochmals durchgelesen und folgende Anmerkung:

Der_Arne: das ganze muss nicht in 5 Tagen fertig sein, derzeitig läuft noch vielles mechanisch.

Da musst du aber richtig reinhauen, um das zu schaffen. Viel Glück

Ich nutzte die DS18B20 Pins vom RTC Modul dabei gabs anfänglich ein paar Probleme mit dem RTC welches nun ohne GND am RTC gelöst wurde, die DS18B20 sind direkt an GND, alles sehr merkwürdig. aber nun läuft es.

Das verstehe ich nicht. Die Dallas nutzen OneWire und sind nicht kompatibel mit I2C.

Im übrigen kann ich das Menü, welches scorpi08 verlinkt, sehr empfehlen. Es ist aber schon recht anspruchsvoll.

Es gibt aber bei dem RTC Modul 3 Löcher wo man ein DS18B20 einlöten kann. Ob Kompatibel oder nicht, die Löcher sind da.

Ja passen wird der DS18B20 aber nur in der RTC DS1307.

In der DS3231 sind auch drei zusätzliche Löcher vorhanden, nur diese sind zu groß und zu weit auseinander. :wink:

Hallo zusammen

danke für die vielen Antworten....

Okay es wird eine umstellung des RTC aus den DS3232 geben, bestellt sind sie mal schauen wieviele Wochen ich warten kann.

Die Tempsensoren sind auf dem DS1307 auch nur "durchgeschleift" ich fande es sehr praktisch dort gleich nen Widerstand dran zu haben sonst hat der Sensor nichts mit dem DS1307 zu tun.

Ich hatte die DS1307rtc lib schon mal benutzt und dabei auch an die SDA/SCL PIN´s am Mega benutzt nur leider wollte da keiner miteinander sprechen. Ich werde es mal mit dem PullUp Widerstand probieren, derzeitig ist das ganze ja noch auf nen Steckboard gebaut, da sind die Wege noch nicht so lang.

HotSystems Du sagt ich muss die Adresse angeben,???? Ich find im Sketch leider keinen Hinweis drauf. Kann ich mir das sonst so vorstellen:

DS3232RTC rtc(0x58);

skorpi08: Nimm diese LCD Library. Die wird aktualisiert, im vergleich zu den anderen, ist die beste und wird Supportet (soweit Zeit, Lust und Ahnung da ist).

Im Anhang hast du ein Sketch, kannst dir anschauen wie es bei dir aussehen könnte. Da kannst du auch Zeit einstellen.

Wenn ich mir das so durchlese wird dort nen Display mit 16Stellen und zwei Zeilen, sowie ein paar Taster genutzt. Es wird kein RTC genutzt, sondern nur interner Zähler welcher nach nem Reset wieder auf null ist. Die PID Geschichte würde doch bei einem Relais nicht laufen bzw. häufiges Schalten bedeuten oder?

Grundsätzlich werd ich mal versuchen mir da reinzulesen vielleicht bringt es mich weiter mit einer Menüführung.

HotSystems: Ich habe mir deinen Thread nochmals durchgelesen und folgende Anmerkung:

Der_Arne: das ganze muss nicht in 5 Tagen fertig sein, derzeitig läuft noch vielles mechanisch.

Da musst du aber richtig reinhauen, um das zu schaffen. Viel Glück Das verstehe ich nicht. Die Dallas nutzen OneWire und sind nicht kompatibel mit I2C.

Wie gesagt es muss nicht in fünf Tagen fertig sein. Mann hat ja auch noch etwas Arbeit und Familie.

Grüße der Arne

Der_Arne: HotSystems Du sagt ich muss die Adresse angeben,???? Ich find im Sketch leider keinen Hinweis drauf. Kann ich mir das sonst so vorstellen:

DS3232RTC rtc(0x58);

Ich werde mir das gleich noch mal in meinem Sketch anschauen, normalerweise muss die Adresse angegeben werden, anders weiß die Library es ja nicht.

Wie gesagt es muss nicht in fünf Tagen fertig sein. Mann hat ja auch noch etwas Arbeit und Familie.

Da habe ich doch tatsächlich das "nicht" überlesen, sorry. Dann hast du ja keinen Stress. ;)

Edit:

Also die I2C-Adresse der RTC wird in der Library-Datei "DS3232RTC.h" festgelegt.

//DS3232 I2C Address
#define RTC_ADDR 0x68

und erfordert somit keine zusätzliche Änderung im Sketch. Welche Adresse deine RTC tatsächlich hat, kannst du ja über den I2CScanner herausfinden.

Mein Sketch ist für 16x2 Display aber das Menü ist für mehrere Displays zu gebrauchen, lies dir einfach den ersten Beitrag zu dem Menü.
SSR ist für PID geeignet.
RTC wird in diesem Sketch nicht genutzt aber ich hatte es auch mit RTC, nur brauch ich es jetzt hier nicht.