Skocz do zawartości

Kod do DS18B20 - co jest źle?


bluzman

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.

Link do komentarza
Share on other sites

(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
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

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.

Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

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");
	}
}

 

Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

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

Link do komentarza
Share on other sites

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?

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.