Biblioteki z Internetu - hmm, mam swoje zdanie na ten temat, nie podzielę się nim, bo moderator by musiał ten post wrzucic do kosza, a i ostrzeżenie zapewne bym dostał
Zacznijmy od hallotronu - podepnij go pod pin, który generuje przerwanie i ustaw przerwanie z pinu na zbocze. W przerwaniu sobie zliczaj impulsy z hallotronu. Dodaj na wejście jakiś prosty filtr RC, żeby śmieci nie zbierał. Można oczywiście zakłócenia wyfiltrować programowo, czyli np. po wykryciu zbocza nie zliczać kolejnych impulsów przez czas równy minimalnemu sensownemu odstępami pomiędzy kolejnymi impulsami z Halla.
Co do 1-wire - masz oparte o manglowanie pinem IO - normalnie sensownie robi się to wykorzystując USART (kolega BlueDraco powiedziałby ci, że timer, też ok). Ale sama komunikacja nie trwa długo, więc to przyśpieszyłoby, ale trzebaby istotnie zmienić podejście do obsługi 1-wire. Po wydaniu polecenia CONVERT do czujnika, czekasz na zakończenie konwersji? Jeśl tak, to to czekanie usuń, nie jest potrzebne, gdyż do czasu zakończenia konwersji czujnik zwraca ostatnią zmierzoną temperaturę. Przy BMP085 już pisałem - masz przerwanie IRQ, któe się aktywuje po zakończeniu konwersji. Znowu - w funkcji obsługi tego przerwania odczytaj wynik. I2C też warto oprzeć o przerwania, z racji powolności tego interfejsu.
Kolega
@tronics słusznie zauważył zmienne o typie zmiennopozycyjnym - przy tych czujnikach nie ma żadnych obliczeń uzasadniających ich użycie. Wszystko można policzyć na int/long przeskalowując współczynniki, a jak chcesz prosto i w miarę efektywnie to masz w gcc fixed-point math. Nie tylko obliczenia przyśpieszą 20-100 razy, ale program się odchudzi o kilka kB.
Nie aktualizuj też LCD na raty, bo to jest wolne - lepiej przygotować w pamięci wszystko co masz do wyświetlenia i wysłać na raz do VRAM, bez tych goto(x,y) itd. Możesz też skorzystać z nieblokującej biblioteki do LCD, którą zamieściłem w przykładach. Ale zacznij od obsługi czujników, bo tam spedzasz najwięcej czasu i tam kryje się duży potencjał do ulepszeń.