C-Control als Lüftersteuerung + Akku-Wächter

Hallo C-Control Freunde,

ich hatte noch eine uhralte C-Control I 1.1 mit Applikation-Board herum fliegen (hatte ich damals anno 1992 oder so gekauft).
Diese habe ich, damit sie nicht so nutzlos herum liegt, als Steuerung für diverse Aufgaben „angestellt“:

  • Lüftersteuerung (für das „Klima“ im Vorratsschrank)
  • Akku-Wächter (für Notstrom-Versorgung das 12V Netzes im Haus)

Das ganze habe ich dann schön kompakt in ein Gehäuse verbaut:

C-Control

Hier sieht man die einzelnen Module:

  • Relais-Platine (ganz unten links)
  • Lantronix XPort (ganz unten rechts)
  • Applikation-Board (links auf Relais-Platine)
  • Display (rechts über XPort)
  • C-Control (links auf Applikation-Board)
  • Relais zur Strom-Versorgung Umschaltung (Akku)
  • Relais für Akku-Lader Abschaltung (bei Akku-Betrieb)

Hier die Haupt-Stromversorgung bei Netz-Betrieb (12V 5A Schaltnetzteil):

12V Netzteil

Hier der Akku für den Notstrom-Betrieb (12V 6,5 Ah):

Akku

Und hier der Blei-Gel-Akku-Lader + Lüfter für den Vorratsschrank:

Laderegler + Lüfter

Display-Ausgaben:

Temp + Feuchte
Akkuspannung + Lüfterstatus

Die Steuerung selbst ist eigentlich ganz simpel:

Notstromversorgung: Ein 2-poliges Relais schaltet den Akku über einen Schliesser zu, wenn die Netz-Versorgung (die am Relais anliegt) abfällt.

Hier der Schaltplan dazu:

Relais-Schaltung

Lüftersteuerung: Ein SHT71 Sensor misst die Temperatur und Lüftfeuchte im Vorratsschrank und die C-Control schaltet abhängig von Temperatur und Lüftfeuchte einen Lüfter EIN oder AUS.

Akku-Wächter: An einem Analog-Eingang der C-Control wird über einen 5V Spannungswandler die Akku-Spannung gemessen und bei unter 10,5 V der Akku abgeschaltet.

Hier der Quellcode des C-Control Programms:

'********************************************************************
'
' C-Control/BASIC       STEUERUNG.BAS
'
' Steuerung für:
'
' - Lüfter, bei bestimmter Themperatur/Feuchte
'
' - Akku-Überwachung
'
' Autor: Christian Häussler
'
'********************************************************************

' *** Definition Ports ***
define lcd_port byteport[2] ' LCD
define lcd_rs port[14]      ' LCD
define lcd_rw port[13]      ' LCD
define lcd_e port[15]       ' LCD

define Luefter port[1]      ' Lüfter

define Akku ad[1]           ' Akku
define Last port[8]         ' Tiefentladeschutz

define Clock port[6]        ' SHT Clock
define Data port[5]         ' SHT Data

' *** Daten-Definition ***
define lcd_buf byte
define lcd_param byte

define tempW word[1] 'Überlappung mit Byte 1 & 2 !!!!
define temp  byte[1] 'temporäres Datenbyte
define temp2 byte[2] 'temporäres Datenbyte
define i     byte[3]
define ack   byte[4]

define dataW word[3]
define dataWhi byte[5]
define dataWlo byte[6]

define Temperatur word[4]
define Feuchte    word[5]

define tempW2     word[6]

Define Faktor     word[7]
Define UAkkuW     word[8]
Define UAkkuB     byte[7]

'*** ASCII-Codes ***
define A_ &H41
define B_ &H42
define C_ &H43
define D_ &H44
define E_ &H45
define F_ &H46
define G_ &H47
define H_ &H48
define I_ &H49
define J_ &H4A
define K_ &H4B
define L_ &H4C
define M_ &H4D
define N_ &H4E
define O_ &H4F
define P_ &H50
define Q_ &H51
define R_ &H52
define S_ &H53
define T_ &H54
define U_ &H55
define V_ &H56
define W_ &H57
define X_ &H58
define Y_ &H59
define Z_ &H5A
define AE_ &HE1
define OE_ &HEF
define UE_ &HF5

define LEERZ &H20
define MINUS &H2D
define NULL &H30
define GLEICH &H3D
define DOPPELPUNKT &H3A
define PUNKT &H2E
define GRAD &HDF
define PROZENT &H25
define KOMMA &H2C

'*** Programmoperationen  ***
'Initialisierung
gosub SHTinit
gosub LCD_INIT

'Hauptprogramm als Loop
#loop
 'Themperatur und Feuchte vom Sensor abfragen
 Temperatur = SHTgettemp
 Feuchte = SHTgethyg

 'Akku-Spannung ermitteln
 UAkkuW = Akku * 120
 UAkkuW = UAkkuW / 51
 UAkkuW = UAkkuW * 25
 UAkkuW = UAkkuW / 3
 UAkkuW = UAkkuW / 100
 UAkkuW = UAkkuW * 273

 'Schalter betätigen
 'Akku-Last abschalten, wenn unter 10,5V bzw. zuschalten wenn über 12V
 if UAkkuW < 10500 then Last = OFF
 if UAkkuW > 12000 then Last = ON

 'Lüfter zuschalten, wenn über 18°C (mit 0,5 °C Hysterese)
 #Luefter_Schalten
 if Temperatur > 1800 then goto LS_EIN
 if Temperatur > (1800 - 50) then goto LS_ENDE
 Luefter = OFF : goto LS_ENDE
 #LS_EIN
 Luefter = ON
 #LS_ENDE

 'Serielle Ausgabe
 put 12
 print "Temperatur: ",
 print Temperatur/1000;Temperatur/100 mod 10;",";Temperatur/10 mod 10;Temperatur mod 10;" °C"
 print "Feuchte: ",
 print Feuchte/100;Feuchte/10 mod 10;",";Feuchte mod 10;"%rH"
 print "Akku:   ",
 print UAkkuW/10000;UAkkuW/1000 mod 10;",";UAkkuW/100 mod 10;UAkkuW/10 mod 10;UAkkuW mod 10;" V"
 print "Lüfter: ",
 if Luefter = ON then print "Ein" else print "Aus"
 print "Last:   ",
 if Last = ON then print "Ein" else print "Aus"

 'LCD-Ausgabe Seite 1
 'Zeile 1: TEMP = -99,99 °C
 gosub LCD_CLS         'LCD löschen
 lcd_param = 1 : gosub LCD_GOTOLINE
 lcd_param = T_ : gosub LCD_WRITECHAR
 lcd_param = E_ : gosub LCD_WRITECHAR
 lcd_param = M_ : gosub LCD_WRITECHAR
 lcd_param = P_ : gosub LCD_WRITECHAR
 lcd_param = LEERZ : gosub LCD_WRITECHAR
 lcd_param = GLEICH : gosub LCD_WRITECHAR
 lcd_param = LEERZ : gosub LCD_WRITECHAR
 if Temperatur < 0 then lcd_param = MINUS else lcd_param = LEERZ
 gosub LCD_WRITECHAR
 lcd_param = NULL + Temperatur/1000 : gosub LCD_WRITECHAR
 lcd_param = NULL + Temperatur/100 mod 10 : gosub LCD_WRITECHAR
 lcd_param = KOMMA : gosub LCD_WRITECHAR
 lcd_param = NULL + Temperatur/10 mod 10 : gosub LCD_WRITECHAR
 lcd_param = NULL + Temperatur mod 10 : gosub LCD_WRITECHAR
 lcd_param = LEERZ : gosub LCD_WRITECHAR
 lcd_param = GRAD : gosub LCD_WRITECHAR
 lcd_param = C_ : gosub LCD_WRITECHAR
 'Zeile 2: FEUCHTE = 99,9 %
 lcd_param = 2 : gosub LCD_GOTOLINE
 lcd_param = F_ : gosub LCD_WRITECHAR
 lcd_param = E_ : gosub LCD_WRITECHAR
 lcd_param = U_ : gosub LCD_WRITECHAR
 lcd_param = C_ : gosub LCD_WRITECHAR
 lcd_param = H_ : gosub LCD_WRITECHAR
 lcd_param = T_ : gosub LCD_WRITECHAR
 lcd_param = E_ : gosub LCD_WRITECHAR
 lcd_param = LEERZ : gosub LCD_WRITECHAR
 lcd_param = GLEICH : gosub LCD_WRITECHAR
 lcd_param = LEERZ : gosub LCD_WRITECHAR
 lcd_param = NULL + Feuchte/100 : gosub LCD_WRITECHAR
 lcd_param = NULL + Feuchte/10 mod 10 : gosub LCD_WRITECHAR
 lcd_param = KOMMA : gosub LCD_WRITECHAR
 lcd_param = NULL + Feuchte mod 10 : gosub LCD_WRITECHAR
 lcd_param = LEERZ : gosub LCD_WRITECHAR
 lcd_param = PROZENT : gosub LCD_WRITECHAR
 pause 100

 'LCD-Ausgabe Seite 2
 'Zeile 1: AKKU =   99,99 V
 gosub LCD_CLS         'LCD löschen
 lcd_param = 1 : gosub LCD_GOTOLINE
 lcd_param = A_ : gosub LCD_WRITECHAR
 lcd_param = K_ : gosub LCD_WRITECHAR
 lcd_param = K_ : gosub LCD_WRITECHAR
 lcd_param = U_ : gosub LCD_WRITECHAR
 lcd_param = LEERZ : gosub LCD_WRITECHAR
 lcd_param = GLEICH : gosub LCD_WRITECHAR
 lcd_param = LEERZ : gosub LCD_WRITECHAR
 lcd_param = LEERZ : gosub LCD_WRITECHAR
 lcd_param = LEERZ : gosub LCD_WRITECHAR
 lcd_param = NULL + UAkkuW/10000 : gosub LCD_WRITECHAR
 lcd_param = NULL + UAkkuW/1000 mod 10 : gosub LCD_WRITECHAR
 lcd_param = KOMMA : gosub LCD_WRITECHAR
 lcd_param = NULL + UAkkuW/100 mod 10 : gosub LCD_WRITECHAR
 lcd_param = NULL + UAkkuW/10 mod 10 : gosub LCD_WRITECHAR
 lcd_param = LEERZ : gosub LCD_WRITECHAR
 lcd_param = V_ : gosub LCD_WRITECHAR
 'Zeile 2: LüFTER =     Ein
 lcd_param = 2 : gosub LCD_GOTOLINE
 lcd_param = L_ : gosub LCD_WRITECHAR
 lcd_param = UE_ : gosub LCD_WRITECHAR
 lcd_param = F_ : gosub LCD_WRITECHAR
 lcd_param = T_ : gosub LCD_WRITECHAR
 lcd_param = E_ : gosub LCD_WRITECHAR
 lcd_param = R_ : gosub LCD_WRITECHAR
 lcd_param = LEERZ : gosub LCD_WRITECHAR
 lcd_param = GLEICH : gosub LCD_WRITECHAR
 lcd_param = LEERZ : gosub LCD_WRITECHAR
 lcd_param = LEERZ : gosub LCD_WRITECHAR
 lcd_param = LEERZ : gosub LCD_WRITECHAR
 lcd_param = LEERZ : gosub LCD_WRITECHAR
 lcd_param = LEERZ : gosub LCD_WRITECHAR
 if Luefter = ON then gosub EinLCD else gosub AusLCD
 pause 100

goto loop

'*** LCD-Ausgabe für Ein/Aus ***
#EinLCD
 lcd_param = E_ : gosub LCD_WRITECHAR
 lcd_param = I_ : gosub LCD_WRITECHAR
 lcd_param = N_ : gosub LCD_WRITECHAR
 return
#AusLCD
 lcd_param = A_ : gosub LCD_WRITECHAR
 lcd_param = U_ : gosub LCD_WRITECHAR
 lcd_param = S_ : gosub LCD_WRITECHAR
 return

'*** LCD_Interface ***
#LCD_INIT

' alle ports 0
  lcd_port = OFF

' 8-Bit-Modus aktivieren
  lcd_param=&H38 : gosub LCD_WRITECMD

' mit 8-Bit-Command in 4-Bit-Modus umschalten
  lcd_port=&B00000010
  tog lcd_e
  tog lcd_e

' ab jetzt 4-Bit-Modus
  lcd_param = &H28 : gosub LCD_WRITECMD
  lcd_param = &H0C : gosub LCD_WRITECMD

' Display loeschen
#LCD_CLS
  lcd_param = &H02 : gosub LCD_WRITECMD
  lcd_param = &H01 : gosub LCD_WRITECMD
return

' Zeilenwechsel
#LCD_GOTOLINE
  if lcd_param = 1 then lcd_param = &H80
  if lcd_param = 2 then lcd_param = &HC0
  goto LCD_WRITECMD

' LCD-Kommando
#LCD_WRITECMD
  lcd_buf = OFF
  goto LCD_WRITE

' Zeichenausgabe
#LCD_WRITECHAR
  lcd_buf = &B00100000

' Kommando oder Zeichen an Display senden
#LCD_WRITE
  lcd_port = lcd_buf or (lcd_param shr 4) ' Hi-Nibble
  tog lcd_e
  tog lcd_e
  lcd_port = lcd_buf or (lcd_param and &H0F)  ' Lo-Nibble
  tog lcd_e
  tog lcd_e
return

'*** SHT_Interface ***
#SHTinit
 deact Data
 Clock = 0
 for i=0 to 10 pulse Clock
return

#SHTstart
 Clock =-1
 Data  = 0
 Clock = 0
 Clock =-1
 deact Data
 Clock = 0
return

#SHTwrite
 for i=0 to 7
  if (temp shl i) and &h80 then deact Data else Data = 0
  pulse Clock
 next i
 deact Data
 Clock = -1
 temp=(Data=0)
 Clock =0
return temp

#SHTread
 temp=0
 for i=0 to 7
  Clock =-1
  temp=(temp shl 1) or (Data and 1)
  Clock = 0
 next i
 if ack then Data = 0 else deact Data
 pulse Clock
 deact Data
return temp

#SHTreadint
 tempW = timer
 #SHTwloop
  if timer-tempW>=50 then return &hF000
 if Data then goto SHTwloop
 ack = 1
 dataWhi=SHTread 'High-Byte
 ack = 0
 dataWlo=SHTread 'Low-Byte
return dataW

#SHTgettemp
 gosub SHTstart
 temp = &b00011 : gosub SHTwrite
 dataW = SHTreadint-4000
return dataW

#SHTgethyg
 gosub SHTstart
 temp = &b00101 : gosub SHTwrite
 Feuchte=SHTreadint
 if Feuchte and &h8000 then return -1
 tempW = Feuchte shr 4
 i = Feuchte mod 16
 looktab shtab,tempW,tempW2
 tempW = tempW - 1
 looktab shtab,tempW,tempW
 tempW2 = ((tempW2 - tempW) * i) shr 4
 Feuchte = tempW + tempW2
return Feuchte

table shtab "sht.tab"

Den Lantronix XPort (LAN2RS232) setzte ich zum einen ein, um die C-Control vom Rechner aus zu programmieren und zum anderen, um Daten (Temp, Feuchte und Akku-Spannung) per LAN abzufragen. Die Visualisierung der Daten (inkl. Logging in einer mySQL Datenbank erfolgt über ein NAS DS101j – wie beim EIB und AVR-NET-IO auch).

Weitere Ideen sind bereits vorhanden aber noch nicht umgesetzt, wie z.B. verbleibende Akku-Laufzeit ausgeben (dazu müsste der Strom gemessen werden) oder eine Akku-Erhaltungs Logik (Akku periodisch belasten / laden). Auch eine Solar-Zelle zur Ladung bzw. zum Betrieb bei ausreichendem Solar-Strom wäre denkbar.

Fortsetzung folgt…

Kommentar verfassen