20-05-2018, 17:56
Wrzuć tu bibliotekę Timers.h. Zapewne ona miesza się z tą do DHT. Albo inaczej poukładaj sobie zadania w pętli, albo zastosuj czujnik na I2C. W każdym wypadku funkcja akcja.attach(1,2000,czujniki); nie będzie dobrze działać na program. Każdy czujnik osobno powinieneś tak wywoływać i już taka akcja trwa długo w świecie procków (po kilkadziesiąt ms każdy czujnik). Potem sobie zebrać dane w innej i porobić z nimi co tam potrzebujesz.
Posprawdzaj sobie ile trwają bloki kodu w tej funkcji.
Odczyt DS może trwać 25ms, ale pod warunkiem że włączysz mu tryb asynchroniczny - każesz mierzyć i koniec, wracasz za jakiś czas, odczytujesz i każesz mierzyć. Albo każesz mierzyć bo za 1s wynik będzie potrzebny, wracasz za tę 1s i odczytujesz tylko. W międzyczasie procesor ogarnia resztę kodu. W bibliotece od Adafruit DallasTemperature jest do tego specjalna funkcja, sprawdź jak jest w tej. Bez tego odczyt trwa 750ms, dwa czujniki to 1500ms, do tego delay przy odczycie ciśnienia (dlaczego nie robisz tak jak przy DS, odczyt i wezwanie do nowego pomiaru). Jak taka funkcja trwa Ci 5000 ms to albo ta wywoływana co 500 ms się nie wykonuje albo przerywa działanie tej. Zastanów się też jak często potrzebujesz sprawdzać temperaturę/wilgotność. Jak dwa pomiary zajmują Ci 1200ms, to wywoływanie ich co 1s zabiera 120% mocy obliczeniowej procka, czego oczywiście nie masz. Jak to samo wywołasz co 60s to już zabiera 2%, no czasem tylko animacja na ekranie dostanie czkawki (gdybyś taką miał). A jakbyś miał taką funkcję rozbitą dla każdego czujnika i to w trybie asynchronicznym to pykasz sobie po 25ms na każdą sekundę i odczyty możesz mieć nawet co 5s bez istotnego obciążenia procesora.
Posprawdzaj sobie ile trwają bloki kodu w tej funkcji.
Kod:
uint32_t start=micros();
costam();
uint32_t stop=micros();
uint32_t iletrwalo=stop-start;
Serial.println(iletrwalo);
Odczyt DS może trwać 25ms, ale pod warunkiem że włączysz mu tryb asynchroniczny - każesz mierzyć i koniec, wracasz za jakiś czas, odczytujesz i każesz mierzyć. Albo każesz mierzyć bo za 1s wynik będzie potrzebny, wracasz za tę 1s i odczytujesz tylko. W międzyczasie procesor ogarnia resztę kodu. W bibliotece od Adafruit DallasTemperature jest do tego specjalna funkcja, sprawdź jak jest w tej. Bez tego odczyt trwa 750ms, dwa czujniki to 1500ms, do tego delay przy odczycie ciśnienia (dlaczego nie robisz tak jak przy DS, odczyt i wezwanie do nowego pomiaru). Jak taka funkcja trwa Ci 5000 ms to albo ta wywoływana co 500 ms się nie wykonuje albo przerywa działanie tej. Zastanów się też jak często potrzebujesz sprawdzać temperaturę/wilgotność. Jak dwa pomiary zajmują Ci 1200ms, to wywoływanie ich co 1s zabiera 120% mocy obliczeniowej procka, czego oczywiście nie masz. Jak to samo wywołasz co 60s to już zabiera 2%, no czasem tylko animacja na ekranie dostanie czkawki (gdybyś taką miał). A jakbyś miał taką funkcję rozbitą dla każdego czujnika i to w trybie asynchronicznym to pykasz sobie po 25ms na każdą sekundę i odczyty możesz mieć nawet co 5s bez istotnego obciążenia procesora.
Miło być decenianym https://buycoffee.to/kaczakat