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 {
}
}
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);
}
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