Arduino nano+Lan shield+one wire Teploměry

Odpovědět
PetrB
Příspěvky: 141
Registrován: 20 čer 2018, 13:39
Reputation: 0

Arduino nano+Lan shield+one wire Teploměry

Příspěvek od PetrB » 14 úno 2021, 02:03

Ahoj,
mám takový malý projekt, kdy jsem k Arduinu nano připojil ethernet shield (HR911105A) a teplotní čidla přes onewire.
Používám knihovny SPI, UIPEthernet, OneWire a DallasTemperature.

Funkce je taková, že z Win aplikace pošlu řídící retězec, Arduino něco udělá a vrátí odpověď. Např. sepne relé na pinu, zjistí stav pinu,...
Jedna funkce by měla být i vrácení teploty z čidla. A zde jsem narazil. Pokud chci např. získat sériové číslo teploměru (přes sensors.getAddress), počet čidel (sensors.getDeviceCount), tak to funguje.
Ve smyčce mám toto:

Kód: Vybrat vše

void loop()
{
    size_t size;
    if (EthernetClient client = server.available())
    {
        serPrintln(ttxServerAvailable);
        if (client)
        {
            serPrintln(ttxJeClient);
            
            while ((size = client.available()) > 0)
            {
                uint8_t* msg = (uint8_t*)malloc(size);
                size = client.read(msg, size);
                Serial.write(msg, size);
                client.print(textace(ttxDoslo));
                client.write(msg, size);

                protocol.zpracuj(&client, msg, size);

                free(msg);
            }
        }
    }
    else {
    }    
}
protocol.zpracuj vykoná příkaz.
Takže třeba udělá (jenom výtah z kódu)

Kód: Vybrat vše

 void protocol.zpracuj(EthernetClient* vClient,....) {
  sensors.getAddress(DevAdr,1);
  vClient->write(DevAdr,8);
 }
A to je v pohodě , do PC mi přijde adresa.

Ovšem když je v těle té rutiny
Sensors.requestTemperatures();
tak to vypadá, jako kdyby se ten vClient nějak ukončil a do PC nepřijde nic. I když teplotu zjistí, protože na konzoli mi to přes Serial.println(senzors.getTempCByIndex(1)) v ten samý okamžik teplotu napíše. Neposlalo to ani nic jiného.
Zkoušel jsem různé věci, ale fungovalo to (odesílalo do PC) pouze, když jsem ten requestTemperature vyhodil (no vlastně to ještě fungovalo, když jsem zapomněl udělat sensors.begin).

Nevíte někdo, co s tím? Mám pocit, jako když ten požadavek na teplotu rozhodí tu komunikaci, která se spraví s novým požadavkem z PC a dalším requestTemperature se zase shodí.
Na netu jsem našel pár podobných dotazů, ale bez odpovědi.

Mám připravené náhradní řešení, kdy bych teplotu načítal průběžně a pak ji při požadavku vracel, ale moc se mi to nelíbí. Nano je celkem malé, a je to škoda paměti.

Díky

Pb

ondraN
Příspěvky: 932
Registrován: 08 srp 2019, 20:01
Reputation: 0

Re: Arduino nano+Lan shield+one wire Teploměry

Příspěvek od ondraN » 14 úno 2021, 07:59

Možná je to proto, že měření teploty zabere daleko víc času, než ostatní požadavky. Pokud je třeba v té funkci pro práci s OW zákaz interruptů, tak krátký zákaz projde, dlouhý zákaz může dostat probíhající komunikaci do nějakého chybového stavu. Asi ti nezbyde nic jiného, než to nejdříve změřit a uložit a pak teprve komunikovat a použít hodnoty z paměti.

Uživatelský avatar
pavel1tu
Příspěvky: 2054
Registrován: 26 říj 2017, 08:28
Reputation: 0
Bydliště: Trutnov
Kontaktovat uživatele:

Re: Arduino nano+Lan shield+one wire Teploměry

Příspěvek od pavel1tu » 14 úno 2021, 09:35

Celkově není jasné jak často vlastně z toho Dalasu měříš a jakou přesnost od něj vyžaduješ.
Koukni do datasheetu - může měřit pěkně dlouho než ti odpoví.

Jen doplním, nevím jak to máš, ale "ono se v tom často chybuje ... "
sensors.begin(); by měl být jen v Setup

je několik způsobů jak vyčítat z Dalasu, pokud využíváš tento, je dobré ze senzoru jendou za požadovaný čas vyčíst a hodnotu si uložit - tu pak ihned po dotazu se sítě odeslat.
Nebo musíš počítat s tím, že naměřená hodnota prostě přijde klidně až za 500ms a déle - podle nastavení sensors.getResolution.
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

PetrB
Příspěvky: 141
Registrován: 20 čer 2018, 13:39
Reputation: 0

Re: Arduino nano+Lan shield+one wire Teploměry

Příspěvek od PetrB » 14 úno 2021, 12:42

Ahoj,
díky oběma za reakce.
Přesnost měření jsem nechal default.
sensors.begin() jsem tam nejprve neměl vůbec :oops: Pak jsem jej dal do inicializační části objektu, který práci s teploměry zastřešuje, je použit nejvýše jednou a při vykonávání Setup.

Když jsem odeslal původní příspěvek, tak jsem si uvědomil, že zádrhel může být v délce odezvy a někde to tiše padá na Time-outy.

Vyzkouším tedy ještě tuto možnost a proměřím si délku odezvy a zkusím ji nasimulovat u jiného dotazu.

Pak asi půjdu asynchronní cestou nebo dvojfázovým dotazování (1. dotaz připrav teploty, 2. dotaz vrať hodnotu), ale to mi přijde už hodně kostrbaté. Periodické načítání např. 1x1 minutu a ukládání do paměti asi bude jednodušší.

Každopádně ještě jednou díky za tipy.

Pb

PetrB
Příspěvky: 141
Registrován: 20 čer 2018, 13:39
Reputation: 0

Re: Arduino nano+Lan shield+one wire Teploměry

Příspěvek od PetrB » 14 úno 2021, 12:54

Ach jo,
jsem hlava dubová :oops: Máte pravdu. Zádrhel byl v tom Win programu, který měl čekal na odezvu max 500 ms a sběr dat z čidel trval 649 ms. Měl jsem to tak původně nastavené, protože ty teploměry nebyly v původním záměru a když jsem dodělal první krok, tak jsem si říkal, že je tam zkusím docpat, jestli se vejdou. Na ty časy jsem mezitím zapomněl ;-(

Každopádně díky za konzultaci. Nastavil jsem to na 1s a už to běhá.

Pb

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 5 hostů