Arduino + 433 TX, RX, TEMPERATURE

Odpovědět
byfo
Příspěvky: 25
Registrován: 13 srp 2020, 11:25
Reputation: 0

Arduino + 433 TX, RX, TEMPERATURE

Příspěvek od byfo » 06 zář 2020, 13:04

Ahoj, môžem opäť poprosiť o pomoc nejakého šikovného človeka?

Mám senzor teploty, jeho výstupná hodnota je typu float. Chcem ho odoslať do druhého zariadenia, program odosiela ale const char, a nedokážem to nejak premeniť, vychadzuje mi to chybu.

Kód: Vybrat vše

const char *msg = "text odoslania"; // --> "text odoslania" = teplota zo senzora, napr. 24.50°

    driver.send((uint8_t *)msg, strlen(msg));
    driver.waitPacketSent();
    delay(1000);

a prímač príma:

Kód: Vybrat vše

{
    uint8_t buf[RH_ASK_MAX_MESSAGE_LEN];
    uint8_t buflen = sizeof(buf);

    if (driver.recv(buf, &buflen)) // Non-blocking
    {
	int i;

	// Message with a good checksum received, dump it.
	//driver.printBuffer("Got:", buf, buflen);

String rcv;

for (int i = 0;   i <buflen; i++){
  rcv+= (char)buf[i];

}

  Serial.println (rcv); // text primaca, teda teploty opať v type float

Ako zmením float na const char? Ak teplota je typ float a názov: temperature.. ako teraz temperature prevediem ??? Veľmi by ste mi pomohli. Majte sa krasne, a veľa radosti.

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

Re: Arduino + 433 TX, RX, TEMPERATURE

Příspěvek od ondraN » 06 zář 2020, 18:56

Zkus to takhle

Kód: Vybrat vše

float teplota=24.6975;
    driver.send((uint8_t *)&teplota, sizeof(teplota));
    driver.waitPacketSent();
    delay(1000);
A příjem

Kód: Vybrat vše

{
float teplota;
uint8_t buflen=0;
	do{
		driver.recv((uint8_t*)&teplota, &buflen);
	}while(buflen<sizeof(teplota)); ceka nez se prijmou vsechny byte floatu
 

  Serial.println (teplota); // teploty opať v type float
  }
  
Akorát si nejsem jistý, jak vlastně funguje ten driver.recv. Předpokládám že když je tam pointer na buflen, tak to pri každém průchodu aktualizuje, kolik znaků už se přijalo. Pokud je to jinak, dej sem nějakou dokumentaci.

byfo
Příspěvky: 25
Registrován: 13 srp 2020, 11:25
Reputation: 0

Re: Arduino + 433 TX, RX, TEMPERATURE

Příspěvek od byfo » 07 zář 2020, 08:47

Ahoj, dakujem, áno, trafil si, ďakujem veľmi pekne, v podstate to bolo super, len riadok: uint8_t buflen=0; musí ísť preč, a prvotne riadky musia ostať. Prosím ťa, v prípade, že chcem odosielať údajov viac, sa v podstate hrám s buf, a buflen? že dám napríklad index?buf1, buflen1, a podobne? Alebo to funguje inak??

http://www.airspayce.com/mikem/arduino/ ... index.html - libary

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

Re: Arduino + 433 TX, RX, TEMPERATURE

Příspěvek od ondraN » 07 zář 2020, 09:44

Funuje to tak, že máš libovolnou proměnnou, třeba i pole nebo strukturu. Funkci předáváš pointr na ni a délku v bytech. Proto musíš ten pointr přetypovat na uint8_t, aby se nastavila správná pointrová aritmetika. Pak se vlastně celý obsah té proměnné, byte po byte, přenese do cílového zařízení. Tam ale musíš očekávat proměnnou stejného typu. Tu zase přetypuješ a jednotlivé byte se poskládají dovnitř. Takže pak má proměnná zase stejnou hodnotu, jako ta vyslaná. Ale pozor, funguje to pouze pokud mají proměnné na obou stranách stejnou strukturu v paměti. Pokud je to arduino proti arduinu, je to OK.
Pro více proměnných je ideální použít strukturu.

Kód: Vybrat vše

typedef struct/
char	poleznaku[20];
float	polecisel[15];
int	x;
bool	stav;
}muj_t;

muj_t chciprenest={0};

chciprenest.poleznaku= /*.....
.......		naplnim polozky promenne
.......*/

driver.send((uint8_t *)&chciprenest, sizeof(muj_t)); //nebo muzu pouzit sizeof(jmeno_promenne)

na druhé straně uděláš to samé a všechny hodnoty v té struktuře se přenesou. Je to vhodné udělat ve funkci, kdy se proměnná založí v zásobníku a po skončení funkce zase zanikne, takže neblokuje dále paměť.

byfo
Příspěvky: 25
Registrován: 13 srp 2020, 11:25
Reputation: 0

Re: Arduino + 433 TX, RX, TEMPERATURE

Příspěvek od byfo » 07 zář 2020, 11:19

ahoj, veľmi ti dakujem :mrgreen: , je to fakt zaujímavý spôsob prenášania, myslím, že lepší než som chcel ja.. Ale vieš čo mi nedokaže poslať a prečítať?

"text".. Ako ho definujem ?? const char neberie.. string tiež nie.. :/

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

Re: Arduino + 433 TX, RX, TEMPERATURE

Příspěvek od ondraN » 07 zář 2020, 11:51

Kód: Vybrat vše

#include <string.h>
char text[50]="tohle chci prenest!";
int delkaTextu;
delkaTextu=strlen(text);
driver.send((uint8_t *)text, delkaTextu);
Nebo přímo, ale pak musíš zadat délku textu sám, protože se vytvoří nepojmenovaná dočasná proměnná ke které není přístup.

Kód: Vybrat vše

driver.send((uint8_t *)"text", 5);

Odpovědět

Kdo je online

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