Skocz do zawartości

Kod do DS18B20 - co jest źle?


Pomocna odpowiedź

3 godziny temu, atMegaTona napisał:

Może wytłumacz własnymi słowami jaki cel ma to dodawanie i odejmowanie 0.5 od tego uinta.

Ja sam nie do końca rozumiem tych obliczeń i na jakich zasadach się opierają. Na początku napisałem, że to przepisałem z różnych źródeł źródeł, trochę zmodyfikowałem, przeanalizowałem po swojemu. Prawie w każdym przypadku można osiągnąć ten sam cel pisząc program na różne sposoby. Prościej będzie jeżeli podam linki tych źródeł:

Tutaj te nieszczęsne obliczenia:
https://forbot.pl/forum/topic/3133-problem-z-czujnikiem-temperatury-ds18b20/

Tutaj kod akurat działający bez problemu ale bez możliwości wyświetlania po przecinku
http://gotronik.com/2015/08/11/czujnik-temperatury-ds18b20-i-atmega-male-porownanie-z-dht11/

2 minuty temu, ethanak napisał:

Aha, i nie ma języka Arduino.

Nie chodziło mi o język Arduino tylko składnię języka programowania na Arduino.

Ergo: przepisywanie kodu bez zrozumienia przypomina złożenie w dowolnej kolejności wybranych wersów z Pana Tadeusza, aby napisać 14 księgę...

No bo 13 już ktoś napisał 😉

 

 

(edytowany)
6 minut temu, ethanak napisał:

Ergo: przepisywanie kodu bez zrozumienia przypomina złożenie w dowolnej kolejności wybranych wersów z Pana Tadeusza, aby napisać 14 księgę...

No bo 13 już ktoś napisał 😉

 

 

Tutaj zacytuję sam siebie z pierwszego postu, nie przeczytałeś dokładnie lub zapomniałeś co pisałem chyba:
"Przepisałem z zrozumieniem na tyle ile potrafiłem kod znaleziony w sieci, został trochę zmodyfikowany. Dodałem wyświetlanie temperatury z zmiennej po przecinku na LCD." Nie wiem jak inny się uczą sami takich rzeczy ale jedną z moich metod właśnie jest analiza przykładowego kodu żeby go zrozumieć, wiedzieć na czym polegają działania wykonywane i później wprowadzać modyfikacje lub pisać swój kod.

Edytowano przez bluzman

Nie zgodzę się. Owszem przepisałeś. Z tym zrozumieniem to chyba było gorzej... przecież sam napisałeś że nie rozumiesz tych obliczeń... czyli rozumiesz czy nie?

 

4 minuty temu, ethanak napisał:

Nie zgodzę się. Owszem przepisałeś. Z tym zrozumieniem to chyba było gorzej... przecież sam napisałeś że nie rozumiesz tych obliczeń... czyli rozumiesz czy nie?

 

Obliczeń do końca nie, tzn. wiem jak one liczą, działania arytmetyczne na zmiennych ale dlaczego akurat to zostało zastosowane nie wiem. Gdybym wiedział to bym nie pytał się tutaj o nic. Widzę, że tutaj sensu zastosowania ich nikt nie rozumie, więc zapewne są bzdurą. Schodzimy z tematu powoli. Problemem było wyświetlanie się temperatury na LCD z dziesiętnymi. Staram się wystrugać jakiś bardziej przyjazny i prostszy kod teraz.

A ja napisałem tak

int main(void) {
	LCD_Initalize();
	char bufor[100];
    LCD_Clear();
    uint8_t temp = 0;

    while (1) {
    	temp=ds18b20_gettemp();

    	LCD_GoTo(0,0);
		LCD_WriteText("Temp: ");
		float f = temp;
		sprintf(bufor, "%.2f", f);
		LCD_GoTo(6,0);
        LCD_WriteText(bufor);

        LCD_GoTo(13,0);
        LCD_WriteData(223);
        LCD_GoTo(14,0);
        LCD_WriteText("C");
	}
}

lecz zmienia się wartość przed przecinkiem a po są 2 zera cały czas xx.00
Prościej nie przychodzi mi do głowy niż zastosowanie float.

No bo przecież pakujesz dane float do zmiennej int... w jaki sposób zmienna typu uint8_t ma przechować dane float?

Twierdzisz że to rozumiesz więc wyjaśnij - bo ja mimo 40 lat doświadczenia w zabawie w te klocki nie jestem w stanie pojąć Twojego toku rozumowania.

Już poprawiłem babola. Podaję kod jaki u mnie zadziałał dla potomności 🙂

#define F_CPU 8000000UL
#include <HD44780.h>
#include <HD44780.c>
#include <ds18b20.c>
#include <ds18b20.h>
#include <stdio.h>

int main(void) {
	LCD_Initalize();
	char bufor[100];
    LCD_Clear();

    while (1) {
    	//odczyt do zmiennej temp, typ float
    	float temp=ds18b20_gettemp();
    	//wyswietlenie Temp: na LCD
    	LCD_GoTo(0,0);
		LCD_WriteText("Temp: ");
		//wyswietlenie temperatury z dokładnocią 4 miejsc po przecinku
		sprintf(bufor, "%.4f", temp);
		LCD_GoTo(6,0);
        LCD_WriteText(bufor);
        //wyswietlenie symbolu stopnia
        LCD_GoTo(14,0);
        LCD_WriteData(223);
        //wyswietlenie C
        LCD_GoTo(15,0);
        LCD_WriteText("C");
	}
}

 

więc ta funkcja zwraca float?? xD

zrób tak

unsigned int x, y;
float temp=ds18b20_gettemp();

x = temp; // niejawne rzutowanie float na uint. powinno być x = (unsigned int)temp;
temp = (temp - x) *100; // odejmij część całkowitą i przesń ułamkową o 2 miejsca
y = temp; // zapisz część ułamkową

LCD_GoTo(0,0);
LCD_WriteText(printf("temp: %u,%u",x,y)); 
		

i nie trzeba będzie ciągnąć biblioteki do floatów w printfie.

(edytowany)
char bufor[100];

No to jeszcze powiedz po co aż 100 bajtów pamięci rezerwujesz na rzecz bufora? Masz jej w nadmiarze?

Edytowano przez Belferek

a lepiej tak:

LCD_WriteText(printf("temp: %u,%.2u",x,y)); 
		

wtedy zawsze wyświetli 2 pozycje w części ułamkowej.

9 minut temu, atMegaTona napisał:

więc ta funkcja zwraca float?? xD

zrób tak


unsigned int x, y;
float temp=ds18b20_gettemp();

x = temp; // niejawne rzutowanie float na uint. powinno być x = (unsigned int)temp;
temp = (temp - x) *100; // odejmij część całkowitą i przesń ułamkową o 2 miejsca
y = temp; // zapisz część ułamkową

LCD_GoTo(0,0);
LCD_WriteText(printf("temp: %u,%u",x,y)); 
		

i nie trzeba będzie ciągnąć biblioteki do floatów w printfie.

To tyz piknie. Ciekawe rozwiązanie.

9 minut temu, Belferek napisał:

char bufor[100];

No to jeszcze powiedz po co aż 100 bajtów rezerwujesz na rzecz bufora? Masz jej w nadmiarze?

Przyznam, że akurat tak wpisałem na samym początku pisania nie zastanawiając się zbytnio nad wielkością i tak zostało. Zmieniłem też jak właśnie sprawdzałem kod.
Moim celem dla zastosowania tego uC (Atmega8) jest termometr + czujnik wilgotności np. DHT11

Jeszcze mam jedno pytanie. Przełączyłem czujnik na zasilanie w trybie pasożytniczym, wyświetla 85.0000 stopni i nie zmienia się. W nocie jest napisane, że powinno się dodać tranzystor, ja nie dodałem. Ludzie piszą, że nie dodają tranzystorów nawet przy przewodach do 100m mój ma 3m, czy to może być spowodowane brakiem tranzystora?

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...