Sari la conținut
ELFORUM - Forumul electronistilor

Termometru doua canale


Mihai Popa

Postări Recomandate

  • 2 săptămâni mai târziu...
  • Răspunsuri 33
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • Mihai Popa

    13

  • homer

    4

  • gabygaby

    2

  • riderinblack

    2

Top autori în acest subiect

  • 2 săptămâni mai târziu...
  • 2 săptămâni mai târziu...
  • 1 lună mai târziu...
Vizitator florinpetreus

Buna. Sunt si eu un amator al acestor PIC-uri.

Vreau sa fac un termostat. Am gasit un cod si am reusit sa-l fac sa functioneze ca un termmometru dar conditiile nu functioneaza.

Daca ma poate ajuta careva cu sugestii... as fi foarte recunoscator. Ca si control  am pus sa-mi afiseze pe a 16-a pozitie de pe randul 1 un caracter. Partea cu IF.

Este pentru PI16F877A cu 8GHz.

Codul este:

 

program LCD_temp
' Declarations section 
dim
LCD_RS as sbit at RB4_bit
LCD_EN as sbit at RB5_bit
LCD_D7 as sbit at RB3_bit
LCD_D6 as sbit at RB2_bit
LCD_D5 as sbit at RB1_bit
LCD_D4 as sbit at RB0_bit
 
dim
LCD_RS_Direction as sbit at TRISB4_bit
LCD_EN_Direction as sbit at TRISB5_bit
LCD_D7_Direction as sbit at TRISB3_bit
LCD_D6_Direction as sbit at TRISB2_bit
LCD_D5_Direction as sbit at TRISB1_bit
LCD_D4_Direction as sbit at TRISB0_bit
'end lcd module connection
 
' Set TEMP_RESOLUTION to the corresponding resolution of the DS18x20 sensor in use:
' 18S20: 9 (default setting can be 9,10,11 or 12); 18B20: 12
const TEMP_RESOLUTION as byte = 12
dim text as char[9]
temp as word
 
sub procedure compara
 
end sub
 
sub procedure Display_Temperature(dim temp2write as word)
    const RES_SHIFT = TEMP_RESOLUTION - 8
    dim temp_whole as byte
    temp_fraction as word
    text = "000.0000"
 
    if (temp2write and 0x8000) then                       ' check the temp if negative
       text[0] = "-"
       temp2write = not temp2write + 1
    end if
 
 
 
    temp_whole = word(temp2write >> RES_SHIFT)            ' extract temp whole
 
    if (temp_whole div 100) then                          ' convert temp_whole to characters
       text[0] = temp_whole div 100 + 48
    else
        text[0] = "0"
    end if
 
    text[1] = (temp_whole div 10) mod 10+48               ' extract tens
    text[2] = temp_whole mod 10 + 48                      ' extract ones
    temp_fraction = word(temp2write << (4-RES_SHIFT))     ' extract temp fraction
    temp_fraction = temp_fraction and 0x000F              ' completata ( nu mai calculeaza zecimalele )
    temp_fraction = temp_fraction * 625                   ' unsigned int
    text[4] = word(temp_fraction div 1000) + 48           ' Extract thousands
    text[5] = word((temp_fraction div 100) mod 10 + 48)   ' Extract hundreds
    text[6] = word((temp_fraction div 10) mod 10 + 48)    ' Extract tens
    text[7] = word(temp_fraction mod 10) + 48             ' Extract ones
    Lcd_Out(2, 5, text)                                   ' Print temperature on Lcd
 
end sub
 
main:             '   Main program
ADCON1 = 6        ' ADC's off
CMCON = 7         '  Comparators off
TRISE = %11111111   ' all PORTE is input
 
text = "000.0000"
Lcd_Init()                          ' Initialize Lcd
Lcd_Cmd(_LCD_CLEAR)                 ' Clear Lcd
Lcd_Cmd(_LCD_CURSOR_OFF)            ' Turn off cursor
Lcd_Out(1, 1, "Temp: ")
Lcd_Chr(2,13,223)                   ' Print degree character, "C" for Centigrades
                                    ' Different LCD displays have different char code for degree
Lcd_Chr(2,14,"C")                   ' If you see greek letter ‘alpha’ type 178 instead of 223
 
while 1                             ' Temperature is read in the main loop
 
Ow_Reset(PORTE, 2)                  ' Onewire reset signal
Ow_Write(PORTE, 2, 0xCC)            ' Issue command SKIP_ROM
Ow_Write(PORTE, 2, 0x44)            ' Issue command CONVERT_T
Delay_us(120)
 
Ow_Reset(PORTE, 2)
Ow_Write(PORTE, 2, 0xCC)            ' Issue command SKIP_ROM
Ow_Write(PORTE, 2, 0xBE)            ' Issue command READ_SCRATCHPAD
temp = Ow_Read(PORTE, 2)
temp = (Ow_Read(PORTE, 2) << 8) + temp
Display_Temperature(temp)           ' Format and display result on Lcd
Delay_ms(520)                       ' 520 mS delay
 
 if temp < $14 then Lcd_Out(1, 16, "<")
       else
       if temp > $14 then Lcd_Out(1, 16, ">")
          else
              if temp = $14 then Lcd_Out(1, 16, "=")
              end if
       end if
 end if
 
 
wend
 
end.
Link spre comentariu

Salut,

 

Problema ta era ca tu compari valoarea raw a temperaturii trimise de senzorul de temperatura in loc sa faci comparatia doar cu partea intreaga a acesteia.

Am atasat si o schema pentru test.

Am atasat proiectul si o schema de test.

Test.rar

Editat de Mihai Popa
Link spre comentariu

 

Buna. Sunt si eu un amator al acestor PIC-uri.

Vreau sa fac un termostat. Am gasit un cod si am reusit sa-l fac sa functioneze ca un termmometru dar conditiile nu functioneaza.

Daca ma poate ajuta careva cu sugestii... as fi foarte recunoscator. Ca si control  am pus sa-mi afiseze pe a 16-a pozitie de pe randul 1 un caracter. Partea cu IF.

Este pentru PI16F877A cu 8GHz.

Codul este:

. . .

 

Scuze, ai vrut sa scrii 8MHz, nu?

Codul pe care l-ai atasat in ce program este?

 
Link spre comentariu

Codul este scria in MikroBasic Pro

Da, ma gandeam eu.

Nu reusesc sa instalez acest program. Eu lucrez (adica ma invat :) ) in mikroC Pro.

Imi aduc aminte cum lucram in Basic pe un calculator CIP 03 prin anii 1993. Chiar am reusit sa fac un program sa calculez nr de spire la un transformator,...

Dar neavand posibilatati materiale nu am avut pe ce sa mai lucrez.

MikroC Pro mi se pare usor de lucrat in el, as incerca si in mikroBasic Pro, ca sunt multe exemple pe net, folosind acest soft.

Poate o sa ma ajute un prieten care este informatician. Dar sa ne lase timpul si pe mine si pe el sa ne intalnim.

Link spre comentariu
  • 1 an mai târziu...

Pt 877a din moment ce 628 stiu ca nu se poate folosi pentru voltmetru.Daca nu i mult de modificat ar fi fain pentru masina de avut cu 2senzori de temperatura si voltmetru pe 2*16

Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări