PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Terra-Steuerung mit C-Control I Station 2.0



physicus
29.12.2007, 09:42
ich hoffe ich bin hier im richtigen thread, wenn nicht bitte verschieben ;)

hallo leute,

ich habe vor mir mein terrarium mit einer c-control zu unterhalten, das heist alles relevante soll mit ihr angesteuert werden, um mir die arbeit zu erleichtern.
nun habe ich mir schon gedanken gemacht was ich brauche und habe mir einen feinen einkaufszettel erstellt.
mein erster eindruck war: gar nicht mal so teuer...
mein zweiter eindruck war: wie soll ichs umsetzen ohne kenntnisse von basic++...
soviel zum vorwort ;)

ich habe mir mit autocad eine zeichnung angelegt welche den stromlaufplan darstellt.
desweiteren habe ich mir das program basic++2006 installiert.


folgende bauteile werden zum einsatz kommen:
- C-CONTROL I STATION 2.0
- Netzteil 230V auf 12V dc 3,5A
- 4 RELAIS
- 2 LSS Automat ABB 1B16
- DCF AKTIVANTENNE
- 2 TEMPERATURFÜHLER DS18S20
- 1 Feuchtesensor für relative Luftfeuchte FS-220H
- Analoger Messumformer HM/G-I10 <- falls er gebraucht wird ?
- DIMMER-MODUL <- optional zur simulation tag->nacht->tag...


gesteuert werden soll:
- k1 lüfter - Namiba Terra
- k2 heizung - AccuLux ThermoLux Wärmematte
- k3 tageslicht - Neodymium Basking Spot Daylight
- k4 nachtlicht - Exo-Terra Night Glo
- d1 beregnung - Lucky Reptile Super Rain
- d2 nebler - Europet Mini Nebler
- d3 wasserfall - Eckwasserfall mini inkl. Pumpe
- d4 uv licht - Hobby Infrared Light

nun zu meinem hilfeersuchen,
wäre es für einen lieben programierer viell. möglich mir ein beispiel für eine zeitsteuerung zu erstellen, in welcher zum bsp. licht an/aus zu einer gewissen zeit geschalten wird, über das relais K3 ?
licht ein: 6:00
licht aus: 20:00
das ganze täglich
ich würde dieses bsp. dann nehmen um darauf auf zu bauen und zu üben.

selbstverständlich werde ich mir auch diverse lektüre zulegen, über hinweise würde ich mich freuen.

vielen dank für eure mühe und einen guten rutsch

wünscht euch physicus

Tido
29.12.2007, 10:31
Hi physicus,

dein Projekt ist mit der C-.Control M-Unit2.0 kein Problem. Als Lektüre kann ich dir das e.a.m-Magazin Special Nr.14 (C-Control mit basic++) wärmstens empfehlen, darin wird auf viele Aspekte der C-Control M2.0 eingegangen. Desweiteren findet man dort viele Schaltpläne, Erklärungen und Programmbeispiele zu den zusätzlich erhältlichen Komponenten wie z.B. Porterweiterungen, Relaiskarten, Speichermodulen,...
Der DCF-Empfänger muss z.B. nur an den entsprechenden Port angeschlossen werden, dann kann man die "Funkuhr" schon verwenden.
Zum Einschalten eines Relais genügt schon folgendes Programm:



define Licht-Relais as port[1]

#start
if (hour>5) and (hour<21) then Licht-Relais=on else Licht-Relais=off
goto start


EDIT: Habe jetzt erst gesehen, dass du die Station 2.0 verwenden willst. Dafür gibt es ein anderes Sonderheft von e.a.m. Der Programmcode bleibt aber so einfach (bis auf das port[1]).

physicus
29.12.2007, 11:30
hallo Tido,

danke für die schnelle hilfe und die empfehlung, lege ich mir sicher zu muss nur erstmal suchen wo ichs bekomme aber das sollte kein problem darstellen.

ich komme sicher nochmal angekrochen wegen anderer steuerungen die eventuell noch nen problem darstellen werden.
viell. bekomme ichs ja auch mit heft selber hin das wäre natürlich besser für mein selbstbewusstsein hehe

vorerst vielen dank nochmals ;)

ps. die seite ist gefunden, wie kann man das heft bestellen oder kann man das im normalen handel beziehen ?
die nummer 14 würde ich mir auf jedenfall kaufen.

ok ich habs danke ^^

physicus
14.01.2008, 16:17
nochmal ich...^^

hallo leute,

ich muss mal wieder euer technisches wissen abfragen und hoffe mir kann jemand helfen.

folgendes problem habe ich, ich will mein terra mit den folgenden geräten betreiben
und zwar hier spezifisch die temperatur und feuchtigkeit steuern.

geräte:
- C-CONTROL I STATION 2.0
- TEMPERATURFÜHLER DS18S20 <- zur temp.messung oben und unten im terra
- Relative Luftfeuchte- und Temperatur-Sensor 1735 STD <- zur feuchtemessung


nun soll dies folgendermaßen ablaufen:

bei einer temp. von 20°C K1 ein
bei einer temp. von 35°C K1 aus
bei einer temp. von 45°C K2 ein
bei einer temp. von 35°C K2 aus

bei einer rel.luftfeuchte von 30% K3 ein
bei einer rel.luftfeuchte von 70% K3 aus

K1=heizung
K2=lüfter
K3=beregnung

kann mir da jemand bei der realisierung helfen, speziell beim programmcode ?

vielen dank im voraus

mfg physicus

Tido
14.01.2008, 18:14
Hi,

das geht genauso wie mit der Uhrzeit:

wenn dein Temp-Sensor für 20,0°C z.B. temp=200 ausgibt könnte man K1 wie folgt programmieren:

if (temp>199) and (temp<351) then K1=on else K1=off

Gleiches gilt für die anderen Relais.

physicus
14.01.2008, 18:30
ah ich dachte das wäre schwerer ;)
aber besser man fragt wenn mans nicht weis als das was kaputt geht oder man ewig keine lösung findet...

vielen dank tido

physicus
14.01.2008, 19:06
nochmal kurz eine frage, beim licht habe ichs nun so gelöst...


'Steuerung für Tageslichtanlage
'Neodymium Basking Spot Daylight
'Einschalten: 06:00 Ausschalten: 20:00

Define K3 as Port[31] 'Port definieren


K3 = ON

'If (second = 0) or (second = 59) then goto Ende '(verhindert Fehler beim Stundenwechsel)

#loop
'if 600 then goto On '06:00 Licht ein
if (hour >= 6) and (hour<20) then K3=ON '06:00 Licht ein

'If 2000 then goto Off '20:00 Licht aus
If (hour>=20) or (hour<6) then K3=OFF '20:00 Licht aus

goto loop

das funzt einwandfrei

bei dem code habe ich nen fehler, bezeichner unbekannt, was mache ich falsch ?



Define K1 as Port[29]

K1 = on

if (temp>199) and (temp<351) then K1=on else K1=off

ist sicher nur wieder nen schusselfehler, aber ich weis nicht wo :)

gruß physicus

ps. ich habe zum testen halt nur kurz deinen code genommen...

physicus
14.01.2008, 19:45
bei näherer betrachtung werde ich wohl ne anonce in die zeitung setzen und mir den kram von nem profi schreiben lassen ^^

bisschen probieren etc. ist ja gut und schön aber das reicht halt nicht hinten und nicht vorne aus um sowas zu schreiben und zum neu erlernen habe ich beruflich einfach null zeit...

mfg physicus

ps. das darf auch als aufruf verstanden werden, wenn sich wer paar kröten verdienen will :)

Tido
14.01.2008, 20:10
Hi,

du hast die Variable temp nicht deklariert:

define temp as word '(word, da du den Zahlenbereich bis 65535 benötigst)

Desweiteren benötigst du noch eine Prozedur, um den Temperaturwert des Sensors auszulesen. Beispiele sind bei der Basic++-Software dabei.
second, minute und hour sind systeminterne Variablen, diese werden nicht deklariert und werden automatisch mit den jeweiligen Werten "gefüllt".
Temperaturen, Luftfeuchtigkeit dagegen nicht, deshalb musst du diese Sensoren mittels Programmcode auslesen (je nach Sensor unterschiedlich).
In angegebenen e.a.m-Magazin steht alles wichtige dazu drin, selbst fertige Auslese- und Ausgaberoutinen und es ist selbst für Anfänger kein Problem.

Tido
14.01.2008, 20:13
Nochmal ich,

so wird z.B. ein Temperatursensor DS1631 ausgelesen und ausgegeben (Ist in Basic++ für die M-Unit2.0x mit LCD geschrieben):



define Temp as word
define temphi as byte
define templo as byte
const adr=158

import "DS1631_Generic.bas"

lcd.init

lcd.off

ds1631reset(adr)
ds1631set_status(adr,1)

#loop
pause 5

ds1631convert(adr)
ds1631wait_ready(adr)
temp=ds1631get_temp(adr)

lcd.init switchonly
lcd.pos 1,1
lcd.print temp shr 7
lcd.pos 2,1
temp=temp shr 7
lcd.print "Temp: " & Temp/2 & "," & (temp and 1)*5 & "C"
lcd.off

goto loop

physicus
14.01.2008, 22:12
danke dir ich versuchs :)

irgendwie muss ich das ja hinbekommen bei der ganzen hilfe...

vielen dank

physicus
14.01.2008, 22:48
da sind sie wieder meine vielen fehler :) und ich sehe nimmer durch hehe
zuerst der code für die steuerung...


'------------Thermometer Modul----------------------

define temp as word 'Messwert (9 bit)
define TEMPHI as byte 'oberer Teil
define TEMPLO as byte 'unterer Teil
const ADR = 158 '(9EH) Adresse=111, LSB=O=W

import "C:\DS1631_GENERIC.bas"

'-----------------------------------------------------

LCD.init 'LCD wird hier bentzt
LCD.print "READ DS1631 Temp"
LCD.Off 'Bus frei machen für IIC

'-----------------------------------------------------

DS1631RESET(ADR) 'aus der Bibliothek
DS1631SET_STATUS(ADR,1) 'auslesen vorbereiten

'-----------------------------------------------------

#LOOP
pause 5 'Einstellzeit abwarten

DS1631CONVERT(ADR) 'DA-Umsetzung starten
DS1631WAIT_READY(ADR) 'auf Bereitmeldung warten
TEMP=DS1631GET_TEMP(ADR) 'Messwert an Variable

LCD.init switchonly 'LCD reaktivieren
LCD pos 2,1 'Cursor auf Zeile 2, Pos. 1
TEMP=TEMP shr 7 'Messwert rechtsbündig
LCD.print "Temp: " & TEMP/2 & "." & (TEMP and 1) +5 & "C"
LCD.off 'Bus wieder frei machen

goto LOOP

und nun die generic.bas


'DS1631_GENERIC.BAS
'--------------------------
IIC.INIT
config.init
'--------------------------
'------ I/O PORTS ---------
'--------------------------
define LIGHT port[16]
'--------------------------
'---- SYSTEM MEMORY -------
'--------------------------
define TEMP as word
define TEMPHI as byte
define TEMPLO as byte
DEFINE SDA AS PORT[9]
DEFINE SCL AS PORT[10]

SDA = ON
SCL = ON
IIC.init
DEFINE pLED1 AS PORT[25]
DEFINE pLED2 AS PORT[26]
DEFINE pLED3 AS PORT[27]
DEFINE pLED4 AS PORT[28]
DEFINE pKuehlung AS PORT[29] 'Kuehlung ein / aus
DEFINE pSchuetz AS PORT[31] 'Hauptschuetz Ein/Aus
DEFINE pKlappenAussen AS PORT[32] 'Aussenklappen Ein/Aus
DEFINE pHeizung AS PORT[73] 'Heizung Ein/Aus
DEFINE pWarmwasserAuf AS PORT[74] 'Heizung Ein/Aus
DEFINE pWarmwasserZu AS PORT[75] 'Heizung Ein/Aus
DEFINE pZuluftEin AS PORT[76] 'Zuluft einschalten 80%
DEFINE pZuluftHigh AS PORT[77] 'Zuluft maximal 100%
DEFINE pAbluftEin AS PORT[78] 'Abluft einschalten 80%
DEFINE pAbluftHigh AS PORT[79] 'Abluft maximal 100%
DEFINE pAbluftLow AS PORT[80] 'Abluft drosseln 70%

pLED1 =OFF
pLED2 =OFF
pLED3 =OFF
pLED4 =OFF
pHeizung =OFF
pWarmwasserAuf =OFF
pWarmwasserZu =OFF
pZuluftEin =OFF
pZuluftHigh =OFF
pAbluftEin =OFF
pAbluftHigh =OFF
pAbluftLow =OFF

und nun die fehler welche ich bei meinem wissen nicht zuordnen kann, ich weis in der sache ist mein wissen nicht weit her ^^


Log File für C:\Programme\basicpp2006\compiler\cc.bas
9 Fehler.

"C:\DS1631_GENERIC.bas" 12: Bezeichner kann nicht verwendet werden oder ist mehrfach deklariert. (1)
"C:\DS1631_GENERIC.bas" 13: Bezeichner kann nicht verwendet werden oder ist mehrfach deklariert. (1)
"C:\DS1631_GENERIC.bas" 14: Bezeichner kann nicht verwendet werden oder ist mehrfach deklariert. (1)
"C:\Programme\basicpp2006\compiler\cc.bas" 18: Befehl oder Bezeichner unbekannt. (9)
"C:\Programme\basicpp2006\compiler\cc.bas" 19: Befehl oder Bezeichner unbekannt. (9)
"C:\Programme\basicpp2006\compiler\cc.bas" 26: Befehl oder Bezeichner unbekannt. (9)
"C:\Programme\basicpp2006\compiler\cc.bas" 27: Befehl oder Bezeichner unbekannt. (9)
"C:\Programme\basicpp2006\compiler\cc.bas" 28: Befehl oder Bezeichner unbekannt. (9)
"C:\Programme\basicpp2006\compiler\cc.bas" 31: Befehl oder Bezeichner unbekannt. (9)

habe dieses bsp. aus der eam ausgabe 14 seite 66

Tido
16.01.2008, 09:28
Hi,

woher hast du die DS1631_Generic.bas? Wie auf Seite 66 steht, liegt diese im Basic++-Unterverzeichnis "lib" und sieht dann so aus:



'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIII
'III BASIC++ DEMO ZUM BASIC-COMPUTER UNIT M 1.2/2.0 IIIII
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIII
'--------------------------------------------------------------------
' Beispiel zum BASIC-COMPUTER mit dem Programmer/Application-Board
'--------------------------------------------------------------------
' LIBRARY: COMMON DS1631 CONTROL ROUTINES
'
'---------------------------------------------------------------------
'DS1631RESET(ADDR as byte) RESET
'DS1631CONVERT(ADDR as byte) START CONVERSION
'DS1631GET_STATUS(ADDR as byte) READ STATUS REGISTER,RETURN BYTE
'DS1631SET_STATUS(ADDR as byte,DATA as byte) WRITE STATUS REGISTER
'DS1631GET_TEMP(ADDR as byte) RETURN WORD WITH TEMP
'-------------------------------------------------------------------

'--------------------------
'--- DS1631 COMMANDS ------
'--------------------------
const CONVERT=51h
const STOP_CONVERT=22h
const READ_TEMP=AAh
const CONF=ACh
const RESET=54h

'-----------------------------------------------------
'------------------ DS1631 RESET ------------------
'-----------------------------------------------------
FUNCTION DS1631RESET(ADDR as byte)
IIC.INIT
IIC.START
IIC.SEND ADDR
IIC.SEND RESET
IIC.STOP
IIC.OFF
END FUNCTION
'-----------------------------------------------------
'------------------ DS1631 CONVERT ----------------
'-----------------------------------------------------
FUNCTION DS1631CONVERT(ADDR as byte)
IIC.INIT
IIC.START
IIC.SEND ADDR
IIC.SEND CONVERT
IIC.STOP
IIC.OFF
END FUNCTION
'-----------------------------------------------------
'----------------- GET DS1631 STATUS -----------------
'-----------------------------------------------------
FUNCTION DS1631GET_STATUS(ADDR as byte)
define DATA as byte
IIC.INIT
IIC.START
IIC.SEND ADDR
IIC.SEND CONF
IIC.STOP

IIC.START
IIC.SEND (ADDR+1)
IIC.GET DATA
IIC.STOP
IIC.OFF
RETURN DATA
END FUNCTION
'-------------------------------------------------------
'----------------- SET DS1631 STATUS -----------------
'-------------------------------------------------------
FUNCTION DS1631SET_STATUS(ADDR as byte,DATA as byte)
IIC.INIT
IIC.START
IIC.SEND ADDR
IIC.SEND CONF
IIC.SEND DATA
IIC.STOP
END FUNCTION
'-------------------------------------------------------
'----------------- WAIT DS1631 READY -----------------
'-------------------------------------------------------
FUNCTION DS1631WAIT_READY(ADDR as byte)
#WT
if (DS1631GET_STATUS(ADDR)) and 80h = 0 then goto WT
END FUNCTION
'-----------------------------------------------------
'----------------- GET DS1631 TEMP -----------------
'-----------------------------------------------------
FUNCTION DS1631GET_TEMP(ADDR as byte)
define TEMP as word
define DATA as byte

IIC.INIT
IIC.START
IIC.SEND ADDR
IIC.SEND READ_TEMP
IIC.STOP

IIC.START
IIC.SEND (ADDR+1)
IIC.GET DATA
TEMP=DATA*256
IIC.GET DATA
TEMP=TEMP+DATA
IIC.STOP
IIC.OFF
RETURN TEMP
END FUNCTION


Desweiteren schreibt man "sein" Programm in der "Hauptdatei" und bindet nur die benötigten Treiber (hier für den DS1631) ein.
Dadurch, dass du eine andere Generic.bas verwendest, in der die Variablen doppelt deklariert werden, bekommst du die ersten Fehlermeldungen.
Die restlichen FM erhälst du, weil die im Hauptprog aufgerufenen Funktionen (z.B. DS1631Reset(ADR)) nicht in der importierten Datei enthalten sind.

Weitere Vorgehensweise:
1. Verwende die richtige DS1631_Generic.bas
2. Verwende das Original-Hauptprogramm von Seite 66
3 Bringe dies durch Upload in die C-Control zum Laufen
4. Ändere/Erweitere nach belieben das Hauptprgramm um weitere Funktionen (z.B. 10s Temp anzeigen, 10s Uhrzeit anzeigen)
5. Wenn du dich damit ein wenig vertraut gemacht hast, schreibe das eigentliche Programm...

physicus
16.01.2008, 12:42
alles gut, danke für deine geduld tido :)

habe nun nur noch einen fehler aber den werde ich wohl von selber raus bekommen, zumindest versuche ichs solange bis er weg ist ^^

mfg physicus

ps. gibt es eigentlich auch für den TEMPERATURFÜHLER DS18S20 eine generic.bas ?
gefunden habe ich nur andere.

Tido
16.01.2008, 15:54
Hi,

nutze mal auf folgenden Seiten die SuFu:

http://ccintern.dharlos.de/
http://www.tappertzhofen.eu/

EDIT: Ok, habe ich selbst mal gemacht und nichts konkretes gefunden... ](*,)

physicus
16.01.2008, 16:28
hm ja ich such weiter, die seite von herrn tappertzhofen kenne ich auch schon ne weile :)
auch schon ohne erfolg dort gesucht, aber ansonsten ist die auch ok

Imrahil
21.01.2008, 22:33
Irgendwie bin ich auch am verzweifeln.
Ich habe noch eine Frage: wie addressiere ich das Thermometer Modul richtig???
Ich hab mir die Lib Datei inzwischen in meine Funktionen eingebaut.
Und ich brauche nur noch die richtige Addresse, nur bei der Auswahl derselben tue ich mich etwas schwer...
Imrahil
*EDIT*
Ich habe mitlerweile folgende Addressen ausprobiert:
145, 147, 149, 151, 153, 155, 157, 159
Keine hat einen brauchbaren Wert zurückgegeben.
Meine Aufrufe:

ADR=159
DS1631RESET(ADR)
DS1631SET_STATUS(ADR,1)

LCD.Off
DS1631CONVERT(ADR) 'DA-Umsetzung starten
DS1631WAIT_READY(ADR) 'auf Bereitmeldung warten
aussentemp=DS1631GET_TEMP(ADR) 'Messwert an Variable
LCD.Init
Letzterer wird mittels Interrupt wiederholt aufgerufen.
Vollständiger Quellcode (zu einer Heizungssteuerung, vorsicht, ist vorwiegend unkommentiert):

Tido
21.01.2008, 23:27
Hi,

ist schon spät, deshalb habe ich mir den vollständigen Code noch nicht angeschaut.
Warum verwendest du nicht mal zum Testen die Beispiele aus dem Heft???
Zwecks Adressierung solltest du dir noch mal Seite 59 antun, da steht alles wichtige darüber, auch dass die Schreibadresse gerade und die Leseadress ungerade ist. Zum Auslesen des Sensors musst du erst schreibend auf ihn zugreifen (Reset usw.)

LCD.INIT wird normalerweise nur einmal am Programmanfang verwendet, soll das LCD nach einem LCD.OFF erneut aktiviert werden, so schreibt man LCD.SWITCHONLY (das nur am Rande).

Evtl. habe ich morgen mal mehr Zeit...

Imrahil
22.01.2008, 01:24
zum Thema Heft: das hab ich nicht ;)
Allerdings bin ich inzwischen auch etwas säuerlich, ich hab immerhin ca 200 euro für eine Station und Sensoren ausgegeben...
Die Dokumentation ist jedenfalls Bullshit. :(
Die Switchonly anweisung funktioniert jedenfalls nicht (er kennt sie einfach nicht).
Für welche Anweisungen muss ich denn die Schreibaddresse und für welche die Leseaddresse verwenden?
Imrahil
*EDIT*
Ich vergass das wichtigste: danke für die Hilfe ;)

Tido
22.01.2008, 09:51
Hi,

habe nicht gesehen, dass du nicht pysikus bist...
Oben in "meiner" Generic.bas stehen alle erforderlichen IIC-Funktionen drin, für ADR ist eine gerade "Schreibadresse" einzugeben. Wird in der Funktion von Chip gelesen, so muss man nichts ändern, da dort (s. Generic.bas) schon z.B.

IIC.SEND (ADDR+1)

programmiert wurde und die Adresse zum Lesen um 1 erhöht wird.

Zum Thema "richtige Adressierung": Im Datenblatt zum 1631 steht, welche Adresse sich abhängig der Pegel an den Ports A0-A2 ergibt.

Bei LCD.SWITCHONLY hat sich der Fehlerteufel eingeschlichen, es fehlt das "INIT":

LCD.INIT switchonly

Imrahil
22.01.2008, 14:41
Ok, mit einem Sensor klappts jetzt schonmal.
Wie sieht das aus, hat wer Tipps wie ich die Ports am besten einstelle?
Draht dran löten und auf Ground ziehen?
Oder was?
Imrahil

*EDIT*
Der liefert noch etwas komische zahlen zurück...
Ist das HEX codiert?