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:
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):
Hier der Akku für den Notstrom-Betrieb (12V 6,5 Ah):
Und hier der Blei-Gel-Akku-Lader + Lüfter für den Vorratsschrank:
Display-Ausgaben:
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:
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…