Das Open-Control-Projekt - Die Alternative zur C-Control-I


Das Forum zur C-Control-1
Welche C-Control-Varianten existieren?
Übersicht - Suchen - Neueste 50 Beiträge - Neuer Beitrag - Login - Registrieren
INFO - FAQ - CC2-Forum - CCPro-Forum 

 Re: relais erst aus dann wieder einschalten Kategorie: Programmierung Basic (von Carsten - 19.09.2005 9:45)
 Als Antwort auf relais erst aus dann wieder einschalten von mibr85 - 16.09.2005 16:43
Carsten nutzt:  CC1-M-Unit V1.2/2.0
Hallo,

Du kannst das lösen, indem Du Dir den Zustand der Relais in einer (oder mehreren) Variablen merkst. Die Variablen also nach jedem Schalten entspr. setzen. Im Schalt-Unterprogramm wiederum vergleichst Du vor dem Schalten (durch vergleich mit den Variablen), ob sich an dem Zustand überhaupt was ändern soll - wenn ja -> schalten (altes Relais aus, neues Relais an) und Variable(n) neu speichern, wenn nicht, dann einfach zurückspringen und alles so laufen lassen.

Viel Spaß beim Basteln!
Gruß Carsten

> hi
> brauche wieder einmal eure hilfe:
> mein fertiges programm funktioniert komplett so wie ich es will aber die hardware bei der lüftersteuerung spielt nicht mit.
> also ich habe an meiner ccontrol eine relaisplatine mit der verschiedene geräte gesteuert werden konkret werden mit relais 1-4 verschiedene geräte gesteuert und mit relais 5-8 ein lüfter in verschiedene stuffen temperaturabhängig gedimmt. und da ist mein problem die dimmung funktioniert über einen spartrafo der mir 4 verschiedene spannungen auf 4 ausgängen ausgibt (80V 125V 175V 230V).
> wenn sich jetz der relais schaltzustand von zB 80V auf zB 125V verändert kommt es zu einem kurzschluss weil zwei ausgänge kurzzeitig über den lüfter verbunden werden!!!!!!!!!!!
> nun meine idee die relais müssen sich erst aus und dann wieder einschalten aber nur wenn sich der schalt zustand verändert sonst würde sich der lüfter jede sekunde an und aus schalten das bekommt dem nicht lange.
> hoffe ihr habt mein problem verstanden und könnt mir da weiterhelfen
> vielen dank schon mal
>
> quellcode: (betreffende stelle fett)
> define Clock Port[1] 'Serial clock input für SHT75
> define Data Port[2] 'Serial data für SHT75
>
> define DS Port[3] 'DATA IN für Relaisplatine
> define SH Port[4] 'Shift CLK für Relaisplatine
> define ST Port[5] 'Stotre CLK für Relaisplatine
>
> define Tür port[6] 'Türschalter auf/zu
> define Licht port[7] 'Lichtstatus an/aus
> define key port[8] 'Frei
>
> define lcd_rs port[14] 'LCD-Port
> define lcd_rw port[13] 'LCD-Port
> define lcd_e port[15] 'LCD-Port
> define lcd_port byteport[2] 'LCD-Port
>
>
> 'Variablen Sensor
> 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]
> 'Variablen Relaisplatine
> define rel byte[13] 'Byte-Puffer für rel1 bis rel8
> define rel1 bit[97] 'Relais 1
> define rel2 bit[98] 'Relais 2
> define rel3 bit[99] 'Relais 3
> define rel4 bit[100] 'Relais 4
> define rel5 bit[101] 'Relais 5
> define rel6 bit[102] 'Relais 6
> define rel7 bit[103] 'Relais 7
> define rel8 bit[104] 'Relais 8
> define rn byte[14] 'Relaisnummer
>
>
> define aktzeit Word[9]
>
> define count word[8]
> define value word[12]
>
> define vrel1 bit[185] 'Relais 1
> define vrel2 bit[186] 'Relais 2
> define vrel3 bit[187] 'Relais 3
> define vrel4 bit[188] 'Relais 4
> define vrel5 bit[189] 'Relais 5
> define vrel6 bit[190] 'Relais 6
> define vrel7 bit[191] 'Relais 7
> define vrel8 bit[192] 'Relais 8
>
> 'define relalt byte[22]
>
> define lastmin byte[19]
>
> define lcd_buf byte[20]
> define lcd_param byte[21]
>
> '*** ASCII-Codes ***
> define LEERZ &H20
> define NULL &H30
> define DOPPELPUNKT &H3A
> define KOMMA &H2C
> define GRAD &HDF
> define C &H43
> define PUNKT &H2E
> define PROZENT &H25
>
> '_____________________________________PROGRAMM______________________________________________________________
>
> gosub SHTinit
> gosub LCD_INIT
> count = 0
> open# for write 'Datei ruecksetzen
> close#
> rel=0
> relalt=0
> lastmin = 0
>
> '____________________________________________TEMPERATURSENSOR________________________________________________________
>
> #messen
>  Temperatur = SHTgettemp
>  Feuchte = SHTgethyg
>  'put 12
>  'print "Temperatur:",
>  'print Temperatur/100;",";abs((Temperatur/10))mod 10;abs(Temperatur mod 10);"°C"
>  'print "Feuchte: ",
>  'if Feuchte>=0 then print Feuchte/10;",";Feuchte mod 10;"%rH" else print "Fehler"
>  'print minute; ":"; second
>  'print "count=";
>  'print count
>
>  pause 50
>
>
>
>
> #Lüfter 'OK
>
>  if temperatur >2600 then gosub r8
>  if temperatur >2500 and temperatur <=2600 then gosub r7
>  if temperatur >2400 and temperatur <=2500 then gosub r6
>  if temperatur <=2400 then gosub r5
>
>
> #Heizer 'OK
>  if temperatur >= 2200 then gosub r2aus
>  if temperatur <= 1800 then gosub r2
>
>
>
>
> #Befeuchter 'OK
>  if feuchte >= 700 then gosub r3aus
>  if feuchte <= 600 then gosub r3
>
>
>
> #LichtTimer 'OK
>  rel1=off
>  aktzeit = hour *100 + minute
>  if  aktzeit >=0200 and aktzeit <2000 then gosub r1
>
> #WasserTimer 'OK
>  rel4=off
>  aktzeit = hour *100 + minute
>  if  (aktzeit >=0800 and second > 20) and (aktzeit <0801 and second < 30) then gosub r4
>  if  (aktzeit >=1800 and second > 20) and (aktzeit <1801 and second < 30) then gosub r4
> goto next
>
>
>  #r1
>   rel1=on
>  return
>  #r2
>   rel2=on
>  return
>  #r2aus
>   rel2=off
>  return
>  #r3
>   rel3=on
>  return
>  #r3aus
>   rel3=off
>  return
>  #r4
>   rel4=on
>  return
>  #r5
>   rel5=on
>  return
>  #r6
>   rel6=on
>  return
>  #r7
>   rel7=on
>  return
>  #r8
>   rel8=on
>  return
>
> #next
>  gosub shift
>  pulse ST

>  gosub WRITETIME
>  gosub speichern
>
> goto messen
>
>
>
>
>
>
>
>
>
>
> #shift 'Routine zum seriellen Senden der Daten zur Scheiberegistererweiterung
>  for rn=7 to 0 step -1
>   DS=(rel shr rn) and 1
>   pulse SH
>  next
> return
>
>
>
> #speichern
>  #zeitprüfung
>  if minute mod 10 = 0 and minute <> lastmin then gosub speicher ' wenn Minute voll und in dieser Sekunde nicht schon geschrieben
>  lastmin = minute
> #auslesen
>   if not key then gosub dump  'wenn Taste gedrueckt, dann ausgeben
> goto ende
>
> #speicher
>   open# for append
>   if filefree <= 6 then return
>   #printer
>    print#  day
>    print#  hour
>    print#  minute
>    print#  Temperatur
>    print#  Feuchte
>    print#  rel
>   close#
>   count = count + 1
> return
>
>
>
> #dump' Messwerte ausgeben
>   count = 0
>   print "Uhrzeit", " Temperatur", "Feuchte ";"LHBP5678"
>   open# for read
>
> #dumpnext
>   if eof then goto löschen
>
>   input# value
>   if value>9 then print value;" "; else print "0";value;" ";
>   input# value
>   if value>9 then print value;":"; else print "0";value;":";
>   input# value
>   if value>9 then print value;" "; else print "0";value;" ";
>   input# value
>   print value/100;",";abs((value/10))mod 10;abs(value mod 10);"°C",
>   input# value
>   print value/10;",";value mod 10;"%rH",
>   input# value
>   print ABS(vrel1);ABS(vrel2);ABS(vrel3);ABS(vrel4);ABS(vrel5);ABS(vrel6);ABS(vrel7);ABS(vrel8)
> goto dumpnext
>
> #löschen
>  open# for write 'Datei ruecksetzen
>  close#
>
> #ende
> return
>
> #WRITETIME
>  lcd_param = 1 : gosub LCD_GOTOLINE
>  lcd_param = NULL+Temperatur/1000 : gosub LCD_WRITECHAR
>  lcd_param = NULL+(Temperatur mod 1000)/100 : gosub LCD_WRITECHAR
>  lcd_param = KOMMA : gosub LCD_WRITECHAR
>  lcd_param = NULL+(Temperatur mod 100)/10: gosub LCD_WRITECHAR
>  lcd_param = NULL+Temperatur mod 10 : gosub LCD_WRITECHAR
>  lcd_param = GRAD : gosub LCD_WRITECHAR
>  lcd_param = C : gosub LCD_WRITECHAR
>  lcd_param = LEERZ : gosub LCD_WRITECHAR
>
>  lcd_param = NULL+Feuchte/100 : gosub LCD_WRITECHAR
>  lcd_param = NULL+(Feuchte mod 100)/10 : gosub LCD_WRITECHAR
>  lcd_param = KOMMA : gosub LCD_WRITECHAR
>  lcd_param = NULL+Feuchte mod 10: gosub LCD_WRITECHAR
>  lcd_param = PROZENT : gosub LCD_WRITECHAR
>
>  lcd_param = 2 : gosub LCD_GOTOLINE
>  lcd_param = NULL + hour / 10 : gosub LCD_WRITECHAR
>  lcd_param = NULL + hour mod 10 : gosub LCD_WRITECHAR
>  lcd_param = DOPPELPUNKT : gosub LCD_WRITECHAR
>  lcd_param = NULL + minute / 10 : gosub LCD_WRITECHAR
>  lcd_param = NULL + minute mod 10 : gosub LCD_WRITECHAR
>  lcd_param = LEERZ : gosub LCD_WRITECHAR
>
>  lcd_param = NULL + day / 10 : gosub LCD_WRITECHAR
>  lcd_param = NULL + day mod 10 : gosub LCD_WRITECHAR
>  lcd_param = PUNKT : gosub LCD_WRITECHAR
>  lcd_param = NULL + month / 10 : gosub LCD_WRITECHAR
>  lcd_param = NULL + month mod 10 : gosub LCD_WRITECHAR
>  lcd_param = PUNKT : gosub LCD_WRITECHAR
>  lcd_param = LEERZ : gosub LCD_WRITECHAR
>
>  lcd_param = NULL+count/100 : gosub LCD_WRITECHAR
>  lcd_param = NULL+(count mod 100)/10: gosub LCD_WRITECHAR
>  lcd_param = NULL+count mod 10 : gosub LCD_WRITECHAR
> return
>
>
> #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"
>
> '------------------------------LCD----------------------
>
> #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
>
>

 Antwort schreiben

Bisherige Antworten: