Go Down

Topic: Pool-pumpen Steuerung mit TDS und Zeitschaltuhr hilfe beim programmieren (Read 9 times) previous topic - next topic

pidimarx

Hallo,
Habe  bei YouTube von Arduino's erfahren und war über die Einsatzmöglichkeiten erstaunt dasir noch folgendes Projekt eingefallen ist.

Ich will folgendes umsetzen:

Eine Pool pumpen Steuerung mit temperatur differenzschaltung für eine Solartherme.

Habe mir schon folgende Sachen besorgt um das umzusetzen :

Arduino UNO
Prototype shield
2 relay module
lcd keypad shield
2 thermosensoren DS18B20
RTC DS1307

das Programm soll halt so funktionieren:

Die Pool Umwälzpumpe soll 1-2 mal am tag für mehrere stunden angehen  (Also quasi wie eine Zeitschaltuhr) dazu muss ich moch eine RTC besorgen

Die 2. pumpe soll mittels der TDS angesteuert werden, die Temperatursonden sollen jede x min die
Temperatur im Pool und im Solarkollektor messen. ist die Temperatur im Kollektor x höher soll die pumpe solange anlaufen bis die Differenz sich gesenkt hat.

Die TDS Steuerung sollte einstellbar sein um die Temperaturen einzustellen.

das alles wollte ich noch übers Display steuern können , 1. Menüpunkt TDS 2.Zeitschaltuhr 3.Thermometer mit min-max werten vom Pool und Kollektor.

Brauche jetzt bissl Unterstützung beim programmieren...wie gesagt das ist Mein erstes mal (programmieren) : )

Währe schön wenn ich eure Unterstützung bekomme :)

Klaus_ww

Klein anfangen!
1. Ein-/Ausschalten programmieren
2. zeitgesteuertes ein-/Ausschalten
3. Temperatursensoren einlesen und auswerten
4. Abhängig von Temperaturwerten ein-/ausschalten
5. LCD anschließen, "Hello world" Test
6. RTC anschließen, einstellen, auslesen
7. Blöcke zusammenfügen, wirst sehen das geht dann schon wie von selbst
8. Wenn Du hängenbleibst hier gezielt nachfragen

Beispiele, Tutorials etc. gibt's genug, Zeit musst Du investieren.

Grüße
Klaus

jurs


Brauche jetzt bissl Unterstützung beim programmieren...wie gesagt das ist Mein erstes mal (programmieren) : )


Am besten fängst Du dann erstmal an, das Programmieren von Arduino-Boards anhand ganz kleinen Schaltungen und ganz kleiner Programme zu lernen, z.B. "Wie lasse ich eine LED blinken", "wie lese ich eine Uhrzeit aus einem RTC-Modul aus", "wie lasse ich Text auf einem LCD ausgeben", "wie werte ich gedrückte Tasten aus", "wie schalte ich zeitgesteuert", und dann als Steigerung mehrere Dinge davon gleichzeitig.

Und natürlich: C/C++-Programmierung!

Arduino liefert in der Software unter "Beispiele" verschiedene Beispiele für Programme mit, die im Playground näher erläutert werden. Z.B. unter "Datei-Beispiele-02.Digital-BlinkWithoutDelay" ist ein Sketch, der hier im Tutorial näher besprochen wird:
http://arduino.cc/en/Tutorial/BlinkWithoutDelay

Die Tutorial-Homepage ist: http://arduino.cc/en/Tutorial/HomePage

Wenn Du dann ein bisschen was mit einzelnen Komponenten machen kannst, kannst Du Dich an größere Dinge wagen.

Das englischsprachige Internet ist voll mit Infos und Beispielen zu Arduino. Wenn Du speziell Lernmaterial auf Deutsch suchst, wirst Du bei Arduino-Fachbüchern fündig.

Serenifly

Für die Zeit-Sache bietet sich die Time Library an:
http://www.pjrc.com/teensy/td_libs_Time.html

Und damit TimeAlarms um zeitgesteuerte Aktionen auszuführen:
http://www.pjrc.com/teensy/td_libs_TimeAlarms.html

Das kannst du auch erst mal ohne RTC machen, da die Library die Zeit lokal auf dem Arduino zählen kann.

Wegen der RTC:
du findest da oft die billige DS1307. Die ist aber ungenau und muss oft nachgestellt werden. Vor allem wenn sie Temperaturschwankungen ausgesetzt ist. Wenn du das nicht willst musst du die DS3231/32 nehmen. z.B.:
http://www.exp-tech.de/Shields/ChronoDot-Ultra-precise-Real-Time-Clock-v2-1.html
http://www.ebay.de/itm/RTCpro-DS3231-Precision-Clock-Module-With-Temperature-Arduino-For-51-AVR-PIC-ARM-/251208194968?pt=Elektromechanische_Bauelemente&hash=item3a7d2cdb98 (Versand aus China!)

Gibt sicher noch andere Angebote. Aus Spanien z.B. gibt es bei ebay einen Versender, der ganze Shields liefert (für den Preis bekommt man aber den ChronoDot) oder Breakout Boards (die dann aber entweder eine zusätzliche Platine für Batterie etc. erfordern oder der Chip muss noch selbst aufgelötet werden)

Der Chip ist generell kompatibel zu den üblichen 1307 Libraries mit eventuell winzigen Modifikationen bezüglich der Adressen für die internen Register

marau

Hallo zusammen,

um die RTC genauer zu machen, könnte man die Quartzfrequenz auch mittels eines Trimmkondensators 'ziehen'.

Bei der von mir gerne verwendeten PCF8583 (weitestgehend pinkompatibel zur DS1307) schaltet man dazu zwischen Pin 1 und Batterieanschluss einen Trimmkondensator von z.B. 3 - 30 pf.
Mit etwas Geduld beim trimmen kommt man dann auf akzeptable Genauigkeiten.

Es sollte mich wundern, wenn dieses Verfahren bei der DS1307 nicht auch zum Erfolg führen würde.


Grüße

Martin

pidimarx

Hey danke für die zahlreichen antworten,
Ja die Materie ist im Moment noch ziemlich kompliziert.

Bekommt man die bessere RTC auch hier in DE günstig?
Habe keine lust so lange zu warten.... mein Paket aus Singapur was ich heute beim Zoll abgeholt hab war
jetzt 40 tage unterwegs : (

Ich bin jetzt erst mal dran die Pinbelegung zu machen.

Habe noch eine frage zu Temperatursensoren
Kann man da x beliebige nehmen? Ich habe 2 Digital Thermometer wo Ich schon die Sensoren im Wasserkreislauf eingeklebt hab,
kann ich die benutzen ?

MfG

pidimarx

So ich hoffe mal das das so funktioniert:

Display :

Digital 8-13
Aref
GND
Analog 0

Ralais :
5V
GND
Digital 1
Digital 2

RTC
5V
GND
ANALOG 1
ANALOG 2

Einen sketch für die RTC hab ich auch schon gefunden.

Serenifly

Es sei den du verwendest eine SoftI2C Library wird die RTC an A4 (SDA) und A5 (SCL) angeschlossen. Das ist die Hardware I2C Schnittstelle

Wenn du die Time-Library verwendest, nehme am besten das hier:
http://www.pjrc.com/teensy/td_libs_DS1307RTC.html

Da wird gleich das TimeElements struct und time_t unterstützt. Lediglich die RAM-Nutzung ist nicht implementiert, aber wenn man das braucht kann man es auch leicht selbst machen wenn man die Start-Adresse beim Lesen und Schreiben entsprechend setzt. Siehe Datenblatt für die Register.

Die präziseren RTCs funktionieren genauso und haben lediglich mehr Register für mehr Einstellungen. Datum und Uhrzeit werden an der gleichen Stelle gespeichert, daher sind die Libs grundlegend kompatibel. Lediglich das Clock Halt Bit im Sekunden-Register fehlt (statt dessen ist das im Control-Register) und das Month-Register hat an zusätzliches Century-Bit. Das sollte aber keinen Unterschied machen und wenn doch kann man es leicht anpassen.

pidimarx

Hey,
Hab mir das ganze jetzt eine zeit lang angesehen und habe auch mit mehreren Codes Sachen ausprobiert wie Relais schalten Display ansteuern usw.
bekomme aber keinen vernünftigen Code zum Menü aufbau zum laufen womit ich die Relais mal vom Display aus schalten kann.
desweiteren habe ich bis jetzt nichts richtiges gefunden wie ich den arduino zählen lassen kann das ich mal eine Uhr simulieren kann.
So richtig bin ich mir auch nicht sicher mit dem codieren....

eigentlich wollte ich das Projekt diesen sommer am laufen haben aber so schnell lernt man das nicht : (

Serenifly

@pidimarx
Siehe Time Library:
http://www.pjrc.com/teensy/td_libs_Time.html

Da kannst du die Zeit mit dem Arduino-Takt zählen lassen ohne RTC

Code: [Select]

void printTime(uint8_t col, uint8_t row)
{
_lcd.setCursor(col, row);
printDigits(hour());
_lcd.printByte(':');
printDigits(minute());
_lcd.printByte(':');
        printDigits(second());
}

void printDate(uint8_t col, uint8_t row)
{
_lcd.setCursor(col, row);
printDigits(day());
_lcd.printByte('.');
printDigits(month());
_lcd.printByte('.');
        printDigits(year() - 2000);
}

void printDigits(int digits)
{
 // utility function for digital clock display. Prints leading 0
 if(digits < 10)
_lcd.printByte('0');
 _lcd.print(digits, DEC);
}


Ich führe das dann einfach jede Sekunde aus

Ein richtiges Menü zu erstellen ist in der Tat komplizierter. Da muss man sich die z.B. eine Cursor-Position merken und dann je nachdem verschiedene Aktionen ausführen. Bei mir zähle ich da einfach einen Index mit den ich über ein Array aus Koordinaten auf Display-Adressen umsetze. Dann weiß ich über den Index auf welcher Funktion ich bin und kann entsprechend den Display-Inhalt ändern.

Wenn man ein Leerzeichen schreibt wird der Inhalt der Adresse praktisch gelöscht. Dadurch kann man dann z.B. ein Zeichen ein und aus Schalten (das dir deinen Relais-Zustand angibt). So ähnlich:
* Zustand des Relais mit einer bool-Variable merken
* Je nach Zustand des bools bei Tastendruck das Display auf den jeweils anderen Zustand schalten (bei mir habe ich da einen Haken als CustomCharacter)

Versuchs vielleicht mit was fertigem:
http://forum.arduino.cc/index.php/topic,73816.0.html

pidimarx

hey danke erstmal für deine mühe!
Den Thread mit dem menü habe ich auch schon gefunden aber da hat einfaches copy and paste nicht funktioniert um es einfach mal auszuprobieren.
wie gesagt das ist alles neu für mich und die fachausdrücke muss ich auch erst mal googeln..   ; )

pidimarx

so habe mir mal das Menü aufgebaut wie ich es gerne hätte aber bekomme nur Fehlermeldungen und weiss nicht genau was die bedeuten.
hier mal der code :

Code: [Select]
/* ===============================================
* Example: LCDMenuLib (german doku)
* ===============================================
* Autor:     Nils Feldkämper
* Email:     nilsfeld@gmail.com
* License:   all Free
* Last edit: 19.06.2013
*/

/*
* ===============================================
* Includes
* ===============================================
*/
#include <LiquidCrystal.h>
#include <LCDMenuLib.h>

/*
* ===============================================
* Defines
* ===============================================
*/
/* Einstellungen für das verwendete LCD (20x4) */
#define _LCDMenuLib_cols                          20
#define _LCDMenuLib_rows                          4
/* Pin Belegung für das LCD */
#define _LCDMenuLib_PIN_rs                        8
#define _LCDMenuLib_PIN_e                         9
#define _LCDMenuLib_PIN_dat4                      4
#define _LCDMenuLib_PIN_dat5                      5
#define _LCDMenuLib_PIN_dat6                      6
#define _LCDMenuLib_PIN_dat7                      7
/* Scrollbar:
* Die neue Scrollbar belegt ca 1100 Bytes mehr an Speicherplatz wie die alte Scrollbalken.
* Wer den alte Scrollbalken wieder aktivieren will, muss in das Lib Verzeichnis gehen und unter
* ./LCDMenuLib/LCDMenuLib_config.h  
* den Wert _LCDMenuLib_cfg_scrollbar 1 in 2 verändern. Deaktivieren lässt sich die
* Scrollbar mit dem Wert 0
*/

/* Button press time gibt den puffer an nach welcher zeit der nächste
* Tastendruck gültig ist.
*/
#define _BUTTON_press_time                 200 //ms
/* Hier wird der Button Pin belegt, falls der Button Mode auf 1
* steht (Analoger Eingang), ansonsten ist die Variable unwichtig
*/
#define _BUTTON_PIN                        0  
/* Als nächstes werden hier die Bereiche definiert für welchen
* Wert welcher Button gültig ist.
*/
#define _BUTTON_enter_min                  850     // Button Enter
#define _BUTTON_enter_max                  920  
#define _BUTTON_back_min                   950     // Button Back
#define _BUTTON_back_max                   1020  
#define _BUTTON_up_min                     520     // Button Up
#define _BUTTON_up_max                     590  
#define _BUTTON_down_min                   700     // Button Down
#define _BUTTON_down_max                   770      
#define _BUTTON_left_min                   430     // Button Left
#define _BUTTON_left_max                   500  
#define _BUTTON_right_min                  610     // Button Right
#define _BUTTON_right_max                  680    

/*
* ===============================================
* Globale Variables
* ===============================================
*/
 /* Button press Time, wird hiermit überprüft */
 unsigned long g_button_press_time = 0;

/*
* ===============================================
* Initialisierung LCDMenuLib
* ===============================================
*/
/*
* Anzahl der Buttons - 1, da Null der erste Button ist
*/
 #define _LCDMenuLib_cnt    16  
/*
* Initialisierung LCDMenu
*/
 LCDMenuLib_init(_LCDMenuLib_cnt);
/* Nested Set Object
* Hier werden alle Sprachelemente definiert die im Programm vorkommen
* Die Bezeichnung sollte nicht länger sein, als das Display - 2 Zeichen
* Bei 20 Zeichen => 18 Zeichen für die Bezeichnung
* Bei 16 Zeichen => 14 Zeichen für die Bezeichnung
*
* Item 0 ist die oberste Ebene
* in der obersten Ebene wird ein Elemtnt mit dem Namen Item1 angelegt
* danach wird ein weiteres item angelegt (Item2) das sich auch in Ebene 0 befindet
*
* das Item liegt in Ebene 0
* Alle Items die eine Zahl hinterm Namen haben liegen in Ebene 1
* Alle Items die zwei Zahlen hinterm Namen haben liegen in Eben 2  
* usw.
*/
 LCDMenuLib_element(0  , Item         , Item_1          , "Info"                          , FUNC_information); // Pumpe 1 und 2 an aus temp sensor 1 und 2
 LCDMenuLib_element(1  , Item         , Item_2          , "Uhrzeit Datum"                 , FUNC_timer_info); //RTC Lesen
 LCDMenuLib_element(2  , Item         , Item_3          , "Einstellungen"                 , FUNC);
 LCDMenuLib_element(2  , Item         , Item_3_1        , "Pumpen ON/OFF"                 , FUNC);
 LCDMenuLib_element(3  , Item_3       , Item_3_2        , "Pool Pumpe ON/OFF"             , FUNC); //RELAIS 1 AN/AUS
 LCDMenuLib_element(4  , Item_3       , Item_3_2_1      , "Solar Pumpe ON/OFF"            , FUNC); //RELAIS 2 AN/AUS
 LCDMenuLib_element(4  , Item_3       , Item_3_1_1      , "Zeitschaltuhr"                 , FUNC);
 LCDMenuLib_element(5  , Item         , Item_3_1_1_1    , "Pumpe 1 ON "Uhrzeit""          , FUNC); //Zeit Relais an
 LCDMenuLib_element(6  , Item_4       , Item_3_1_1_2    , "Pumpe 1 OFF "Uhrzeit""         , FUNC); //Zeit Relais aus
 LCDMenuLib_element(7  , Item_4_1     , Item_3_1_2      , "Temperatur Schaltung"          , FUNC);
 LCDMenuLib_element(8  , Item_4_1     , Item_3_1_2_1    , "Temperatur Sensor1 Sensor2"    , FUNC); //read sensor1 read sensor2
 LCDMenuLib_element(9  , Item_4_1_2   , Item_3_1_2_2    , "Einstellung TDS"               , FUNC);
 LCDMenuLib_element(10 , Item_4_1_2   , Item_3_1_3_1    , "Pumpe ON @ + 10°C"             , FUNC); //Differenz A1 zu A2 10°C Solar Pumpe ON
 LCDMenuLib_element(11 , Item_4       , Item_3_1_3_2    , "Timer Solar pumpe "Zeit""      , FUNC); //Timer los wenn pumpe an, aus wenn aus
 LCDMenuLib_createMenu(_LCDMenuLib_cnt);


/*
* ===============================================
* SETUP
* ===============================================
*/
 void setup()
 {
   /* Setup for LcdMenuLib */
   LCDMenuLib_setup(_LCDMenuLib_cnt);
 
   //Serial.begin(9600);  
 }

/*
* ===============================================
* LOOP
* ===============================================
*/
 void loop()
 {
   LCDMenuLib_ButtonAnalog();
   //LCDMenuLib_ButtonSerial();    
   LCDMenuLib_loop();  
 }

uwefed

"Fehlermeldungen" ist etwas sehr Abstraktes. Gib uns mal alle Fehlermeldungen. Hast Du die Bibliothek richtig instaliert?
Grüße Uwe

pidimarx

ja die bibliothek ist richtig drin.
habe auch ein problem bei den tasten, ich habe ja effektiv nur 4 pfeiltasten+ enter aber wie gehe ich zurück?
habe an sowas gedacht wie, lange enter halten oder so aber der wert der taste verändert sich ja nicht wenn man die lange hält?

uwefed

oder abspeichern nach x Sekunden nach dem letzten Tastenbetätigung.
Grüße Uwe

Go Up