DS18B20 měření teploty

C,C++,C#

Moderátori: psichac, Moderátori

Používateľov profilový obrázok
jirka.jirka.
Ultimate člen
Ultimate člen
Príspevky: 1538
Dátum registrácie: 17 Okt 2008, 00:00
Bydlisko: Uherské Hradiště
Kontaktovať používateľa:

DS18B20 měření teploty

Príspevok od používateľa jirka.jirka. » 27 Sep 2012, 15:41

Ahojte. Chtěl bych si postavit jednoduchý měřič teploty. Dokonce se mi podařilo něco najít i na internetu. Ale snažím se pochopit program. Na stránkách: >>>>>ZDE<<<<<

Zde je kód:

Kód: Vybrať všetko

//  ATMega8 LCD Driver
//
//  (C) 2009 Radu Motisan , radu.motisan@gmail.com
//  www.pocketmagic.net
//  All rights reserved.
//
//  test.c: sample test for the HD44780 LCD functions
//  For more details visit the website.



#include "lcd.h"
#include <avr/pgmspace.h>

#include "therm_ds18b20.h"

char ch = 0;

int main()
{
	int i=0;
	lcd_init();
	
	DDRB |= 1;

	while(1)
	{
		i = (i+1)%10;
		//lcd_clrscr();
		lcd_home();

		
		char x[20] = {0};
		therm_read_temperature(x);
		lcd_string2("pocketmagic.net\nT=%s [%d]",x, i);

		for (int i=0;i<5;i++) //some delay
			_auxDelay(1000000);
		if (i%2)
		{
			PORTB |= 1;
		}
		else
		{
			PORTB &= 0xFE;
		}
	
	}
	return 0;
}
No a pokud to dobře chápu, tak vytvořím si pole x o velikosti 20. A pak zavolám měření teploty.

Kód: Vybrať všetko

char x[20] = {0};
therm_read_temperature(x);
Snad to píšu dobře. A já se chci zeptat, jak to v tom poli 'x' bude vypadat? Mám si to představit tak, že třeba x[1] = stovky, x[2]=desítky ...... stupňů????
0

Používateľov profilový obrázok
luboss17
Stály člen
Stály člen
Príspevky: 429
Dátum registrácie: 05 Máj 2008, 00:00
Vek: 33
Kontaktovať používateľa:

Re: DS18B20 měření teploty

Príspevok od používateľa luboss17 » 27 Sep 2012, 15:47

0
Môj elektro web http://lubosweb.php5.sk/ - zapojenia, konštrukcie, programovanie softver a mcu
a články zaoberajúce sa programovaním MCU od ATMEL s jadrom AVR.

Používateľov profilový obrázok
jirka.jirka.
Ultimate člen
Ultimate člen
Príspevky: 1538
Dátum registrácie: 17 Okt 2008, 00:00
Bydlisko: Uherské Hradiště
Kontaktovať používateľa:

Re: DS18B20 měření teploty

Príspevok od používateľa jirka.jirka. » 27 Sep 2012, 17:58

Tak vycházím ze stránek co mi byly doporučeny: http://svetelektro.com/clanky/praca-s-d ... 0-525.html
A snažím se o to, jak dostat do nějaké proměnné, třeba 'char teplota' hodnotu rovnou celočíselné hodnotě teploty.

Upravuju DS18B20.c

Kód: Vybrať všetko

void ds18b20_get_temp(char* buff)   
{   
    unsigned char low_byte;   
    unsigned char high_byte;   
  
    unsigned char sign;   
    unsigned int decimal;   
    unsigned int integer;   
  
    ds18b20_reset_pulse();   
    ds18b20_write(DS18B20_SKIPROM);   
    ds18b20_write(DS18B20_CONVERTTEMP);   
  
    ds18b20_wait_to_convert();   
  
    ds18b20_reset_pulse();   
    ds18b20_write(DS18B20_SKIPROM);   
    ds18b20_write(DS18B20_RSCRATCHPAD);   
  
    low_byte = ds18b20_read();   
    _delay_us(5);   
    high_byte = ds18b20_read();   
    ds18b20_reset_pulse();   
  
    if (high_byte & (0xF0)) sign = 1;   
    else sign = 0;   
  
    decimal = (low_byte & 0x0F)*625;   
  
    high_byte &= 0x07;   
    high_byte <<= 4;   
    low_byte >>= 4;   
    low_byte &= 0x0F;   
    integer = low_byte | high_byte;   
  
    if(sign == 0) sprintf(buff,"%u.%04u",integer,decimal);   
    else if(sign == 1) sprintf(buff,"-%u.%04u",integer,decimal);   
} 
zde si nejsem tak zcela jist, jestli mi bude stačit tato úprava.

Kód: Vybrať všetko

if(sign == 0) sprintf(buff,"%u",integer);
else if(sign == 1) sprintf(buff,"-%u",integer);

Potom v hlavním programu, zavolám fci, pro měření teploty, pojmenovanou jako ' char text[17]; '..

Kód: Vybrať všetko

{   
    char text[17];   
    char teplota;
  
    lcd_init();   
  
    while(1)   
    {   
        ds18b20_get_temp(text);   
  
        lcd_position(1,1);   
        lcd_puts(text);   
  
        _delay_ms(200);   
    }   
}  
no a zde mi asi chybí nějaký převod, abych v hodnotě 'teplota' dostal číslo rovno např: 26. No a zde jsem se nějak zadrhl.

Snad jsem svůj drobný problém popsal maximálně přehledně a pochopitelně.
Najde se někdo, kdo by mi pomohl?
0

durike
Okoloidúci
Okoloidúci
Príspevky: 32
Dátum registrácie: 05 Feb 2012, 16:48

Re: DS18B20 měření teploty

Príspevok od používateľa durike » 04 Sep 2013, 15:30

Pracujem taktiež podľa článku z tohto webu. Mal by som otázku ako treba upraviť príkaz na vypísanie teploty na displej

Kód: Vybrať všetko

sprintf(buff,"%u.%04u",integer,decimal);
aby sa mi na displeji (znakový 2x16) zobrazila teplota +°C ? Ako stupeň by som chcel použiť znak čo má v znakovej sade hodnotu 0b1101111.
0

anonymousCoward
Stály člen
Stály člen
Príspevky: 150
Dátum registrácie: 12 Máj 2013, 11:09
Bydlisko: KE

Re: DS18B20 měření teploty

Príspevok od používateľa anonymousCoward » 04 Sep 2013, 19:02

Ak hovoris o znakovej sade LCD, tak jednoducho:

Kód: Vybrať všetko

    sprintf(buff, "%u.%04u%cC", integer, decimal, 0b1101111);
Nenapisal si ci to je C, alebo C++, v gcc, alebo v niecom inom, takze ak Ti to nevezme binarny literal tak ho zmen na jeho (hexa)decimalny ekvivalent.

Pokial to 0b1101111 nezodpoveda '°' v (aktualnej) znakovej sade LCD, bude to zlozitejsie o prepnutie LCD do znakovej sady s danym znakom. V danej sade musia byt aj cisla a znak 'C', inak to bude este o cosi zlozitejsie :) Konkretny sposob zavisi od modelu (kontrolera) LCD.
0
War is peace. Freedom is slavery. Ignorance is strength.
There is no such thing as a well-adjusted slave.

Napísať odpoveď
  • Podobné témy
    Odpovedí
    Zobrazení
    Posledný príspevok