23-05-2020, 00:41
Nie trzeba rezygnować z rozdzielczości by zejść z blokowaniem loop do 20ms, po prostu trzeba wyłączyć czekanie na zakończenie pomiaru, a odczyt pomiaru wykonać nie wcześniej niż po 750ms od zlecenia. W zaokrągleniu można to zrobić co 1 w odwrotnej kolejności, odczyt i zlecenie następnego pomiaru, powtórzyć za 1s, lub odczytać w parzystych a pytać w nieparzystych:
No ale trzeba jakoś liczyć upływający czas.
Kod:
// Include the libraries we need
#include <OneWire.h>
#include <DallasTemperature.h>
// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 2
// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);
uint32_t czasTeraz,czasPoprzedni,tik=10, czas1,czas2,czas3,czas4,roznica,maximum,srednia;
uint8_t n10,fn10,sekundy,minuty,godziny,dni,nic;
bool fsekundy,fminuty,fgodziny,fdni;
void setup() {
// sysClock(INT_OSC32);
// put your setup code here, to run once:
Serial.begin(115200);
sensors.begin();
sensors.setWaitForConversion(0);
}
void loop() {
czas();
// put your main code here, to run repeatedly:
if(fsekundy)
{
if(sekundy%2==0)
{
sensors.requestTemperatures(); // Send the command to get temperatures
delay(10);
float odczyt=sensors.getTempCByIndex(0);
Serial.print("Odczyt temperatury zaraz po zleceniu konwersji: ");
Serial.println(odczyt);
}
else
{
float odczyt=sensors.getTempCByIndex(0);
Serial.print("Odczyt temperatury w innej sekundzie: ");
Serial.println(odczyt);
}
}
}
void czas()
{
czasTeraz=millis();
fn10=fsekundy=fminuty=fgodziny=fdni=0;
if((uint32_t)(czasTeraz-czasPoprzedni)>=tik)
{
czasPoprzedni=czasTeraz;
fn10=1;
n10++;
if(n10>=100)
{
n10=0;
sekundy++;
fsekundy=1;
if (sekundy>=60)
{
sekundy=0;
minuty++;
fminuty=1;
if (minuty>=60)
{
minuty=0;
godziny++;
fgodziny=1;
if (godziny>=24)
{
godziny=0;
fdni=1;
dni++;
}
}
}
}
}
}
Miło być decenianym https://buycoffee.to/kaczakat