Ventilator aansturen met DS18S20

Ik wil graag een programma schrijven waarbij een ventilator bij verschillende temperaturen harder gaat draaien.
Bijv. bij 30 graden 10%, 40 graden 20% enz.

Hierbij wil ik gebruik maken van een DS18S20 en een PIC16f628.
Onderstaand heb ik een voorbeeld om de temperatuur weer te geven op een lcd scherm maar verder geen aansturing..

Wie kan mij een beetje op weg helpen..

DEVICE 16F628A ;We gebruiken een 16F628A type
CONFIG INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF
ALL_DIGITAL TRUE ;Alle ingangen digitaal

;Normale constanten
SYMBOL Convert = $44 ;DS1820 commando, de DS1820 moet de temperatuur gaan meten
SYMBOL Graad = 223 ;223 is de ASCII code voor het 'graad' karakter
SYMBOL RdScratchPad = $BE ;DS1820 commando, temperatuur van de DS1820 uitlezen
SYMBOL SkipROM = $CC ;DS1820 commando, geen gebruik maken van het unieke adres

;Poortnamen
SYMBOL DS1820 = PORTA.0 ;Sluit de DS1820 temperatuur sensor aan op deze poort

;Variabelen declareren
;WORD
DIM Temp AS WORD ;Bevat de temperatuur Celsius
;BYTE
DIM Remain AS BYTE ;De remain waarde voor berekening temperatuur achter de komma
DIM Slope AS BYTE ;Bevat de 'counts per graad Celsius' waarde
DIM BD1 AS BYTE ;Byte Dummy 1

CLEAR ;Wis RAM geheugen

DELAYMS 500 ;LCD stabilisatie

;Hoofdprogramma
CLS ;Wis LCD scherm
WHILE 1 = 1
OWRITE DS1820, 1, [SkipROM, Convert] ;Zend 'Convert' opdracht (temperatuur meten)
OWRITE DS1820, 1, [SkipROM, RdScratchPad] ;Zend 'Read ScratchPad' opdracht
OREAD DS1820, 2, [Temp.LOWBYTE, Temp.HIGHBYTE, BD1, BD1, BD1, BD1, Remain, Slope] ',CRC]

Temp = (((Temp >> 1) * 100) - 25) + (((Slope - Remain) * 100) / Slope)
PRINT AT 1, 1, DEC Temp / 100, ".", DEC1 Temp / 10, Graad, "C "
WEND

"We cannot solve our problems with the same thinking we used when we created them" - Albert Einstein

Het werkt wel maar met dit programma word niks aangestuurd op verschillende temperaturen.
Ik wil gebruik maken van een 12v fan, dus vrij simpel alleen schiet ik te kort in het schrijven van een programma hiervoor.

Je moet dan dus 2 dingen uitzoeken:
- Hoe zet je een fan op verschillende snelheden? (hint: PWM?)
- Hoe zorg je ervoor dat bij bepaalde temperaturen een bepaald percentage hoort? Die lijkt me simpel, toch?

"We cannot solve our problems with the same thinking we used when we created them" - Albert Einstein

Dat PWM gedeelte kom ik wel uit maar hoe je het percentage bij een bepaalde temperatuur krijgt kom ik nog niet uit.

Je hebt geen absolute waardes nodig.

Te warm? -> Harder draaien.
Te koud? -> Langzamer draaien.

Om de seconde of zo controleren, en alles regelt zichzelf wel stabiel.

Damn the torpedoes, full speed ahead!

Ok maar met welk commando geef ik aan dat de fan harder moet draaien?

Weet ik veel, het is jouw programma. Maar ergens bepaal je de duty-cycle, dat zal dan wel de variabele zijn die je moet veranderen.

Damn the torpedoes, full speed ahead!
Arco

Special Member

Dat PWM gedeelte kom ik wel uit maar hoe je het percentage bij een bepaalde temperatuur krijgt kom ik nog niet uit.

Zoiets: (in pseudocode)

pic basic code:


  MinTemp = 30
  MaxTemp = 70
  MinDuty  = 10
  MaxDuty  = 100

  Select case Temp
    Case <= MinTemp
      Duty = 0
    Case >= MaxTemp
      Duty = 100
    Case Else
'      Duty = MinDuty + (MaxDuty - MinDuty) \ (MaxTemp - MinTemp) ' <<<--- foutje...
      Duty = MinDuty + ((MaxDuty - MinDuty) \ (MaxTemp - MinTemp)) * (Temp - MinTemp)
  End Select 
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

... of gewoon met een if-then statement als je (TS) dat makkelijker vindt.
if (temp < x) then duty = 0;
if (temp > y) then duty = 100;
enz ....

"We cannot solve our problems with the same thinking we used when we created them" - Albert Einstein

@Arco,
Else statement is fout.
Moet zijn:

pic basic code:

Duty = 100 x (temp-MinTemp)/(MaxTemp-MinTemp)

MinDuty is een overbodige en foute variabele.
Bij gebruik van MinDuty heb je een discontinuïteit bij MinTemp.
Als temp lager is dan MinTemp dan is Duty = 0
Als temp iets hoger is dan MinTemp dan is Duty = 10

Volgens mij hoort bij een 100% PWM in picbasic een Duty van 255.

De vergelijking wordt dan

pic basic code:

Duty = 255 x (temp-MinTemp)/(MaxTemp-MinTemp)

of het moet zo worden:

pic basic code:


 
  MinTemp = 30
  MaxTemp = 70
  MinDuty  = 10
  MaxDuty  = 100
 
  Select case Temp
    Case <= MinTemp
      Duty = MinDuty
    Case >= MaxTemp
      Duty = MaxDuty
    Case Else
      Duty = MinDuty + (temp-MinTemp)x (MaxDuty-MinDuty)/(MaxTemp-MinTemp)
  End Select
Arco

Special Member

Je hebt gelijk, ik heb het aangepast...
MinDuty heb je wel nodig, dat is de laagst toegestane waarde waarop de fan nog wil draaien (kan goed zijn dat dat iets van 30 moet zijn...)

[Bericht gewijzigd door Arco op zondag 16 december 2018 22:16:46 (64%)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com