bluzman Marzec 12, 2020 Autor tematu Udostępnij Marzec 12, 2020 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. Cytuj Link do komentarza Share on other sites More sharing options...
ethanak Marzec 12, 2020 Udostępnij Marzec 12, 2020 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ł 😉 Cytuj Link do komentarza Share on other sites More sharing options...
bluzman Marzec 12, 2020 Autor tematu Udostępnij Marzec 12, 2020 (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 Marzec 12, 2020 przez bluzman Cytuj Link do komentarza Share on other sites More sharing options...
ethanak Marzec 12, 2020 Udostępnij Marzec 12, 2020 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? Cytuj Link do komentarza Share on other sites More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. 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
bluzman Marzec 12, 2020 Autor tematu Udostępnij Marzec 12, 2020 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. Cytuj Link do komentarza Share on other sites More sharing options...
ethanak Marzec 12, 2020 Udostępnij Marzec 12, 2020 int a = 10 * temp; printf("%d,%d", a/10, a%10); Działa dla temperatur od zeracw górę. Cytuj Link do komentarza Share on other sites More sharing options...
bluzman Marzec 12, 2020 Autor tematu Udostępnij Marzec 12, 2020 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. Cytuj Link do komentarza Share on other sites More sharing options...
ethanak Marzec 12, 2020 Udostępnij Marzec 12, 2020 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. Cytuj Link do komentarza Share on other sites More sharing options...
bluzman Marzec 12, 2020 Autor tematu Udostępnij Marzec 12, 2020 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"); } } Cytuj Link do komentarza Share on other sites More sharing options...
Anonim Marzec 12, 2020 Udostępnij Marzec 12, 2020 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. Cytuj Link do komentarza Share on other sites More sharing options...
Belferek Marzec 12, 2020 Udostępnij Marzec 12, 2020 (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 Marzec 12, 2020 przez Belferek Cytuj Link do komentarza Share on other sites More sharing options...
Anonim Marzec 12, 2020 Udostępnij Marzec 12, 2020 a lepiej tak: LCD_WriteText(printf("temp: %u,%.2u",x,y)); wtedy zawsze wyświetli 2 pozycje w części ułamkowej. Cytuj Link do komentarza Share on other sites More sharing options...
bluzman Marzec 12, 2020 Autor tematu Udostępnij Marzec 12, 2020 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 Cytuj Link do komentarza Share on other sites More sharing options...
bluzman Marzec 12, 2020 Autor tematu Udostępnij Marzec 12, 2020 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? Cytuj Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
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!