Arduino bluetooth přenášení víc proměných

Odpovědět
jpokorny12
Příspěvky: 12
Registrován: 04 lis 2017, 20:05
Reputation: 0

Arduino bluetooth přenášení víc proměných

Příspěvek od jpokorny12 » 18 kvě 2019, 21:36

Zdravím
Snažím se zprovoznit komunikaci arduina a mobilní aplikace kterou vytvářím přes mit app editor. Jde mi o to zprovoznit obousměrnou komunikaci s přenášením více proměnných.

Andoird ->Arduino
Zatím to mám tak, že posílám dvě čísla oddělené tečkou. Přijimám je pomocí

Kód: Vybrat vše

 while (Serial.available() > 0)
 { jedna red = Serial.parseInt();
   dve green = Serial.parseInt();
 } 
První číslo je jakýsi identifikátor, který určuje, co za proměnou posílám. Ten pak třídím ifem.

Šlo by to udělat nějak elegantněji, že bych posilal jméno proměné a k té bych pak v arduinu přiřadil posílanou hodnotu?
Jak poslat a správně zobrazit v arduino text?
Jde převést přijmaný text na jméno proměné? Např. Pošlu svetlo.22 a arduino vezmě proměnou svetlo=22.

Arduino -> Andoird
Posílám všechny hodnoty oddělené tečkou. A v aplikaci je rozděluji na jednotlivé proměnné podle pevně daného pořadí.

Díky za postřehy

Uživatelský avatar
gilhad
Příspěvky: 779
Registrován: 07 bře 2018, 11:22
Reputation: 0

Re: Arduino bluetooth přenášení víc proměných

Příspěvek od gilhad » 19 kvě 2019, 09:16

U prekladanych jazyku se v podstate nevyhnes tomu, abys prenasene "jmeno" prekladal nejakym zpusobem (ruzne ty ify a jine switche]. Jeste tak muzes vsechny prenasitelne promenne ulozit do pole a posilat index v tom poli, nebo muzes posilat adresu promenne a u odesilatele mit tabulku co ma prijemce kde v pameti, ale i to ma sva uskali.

Samozrejme muzes vyuzit preprocesoru/make k tomu, aby ti ty ify sam vygeneroval, ale zase to je netrivialni a na embeded platformach to zere hrozne mista (teda, kdekoli, ale u Arduina te par kilobytu navic trapi, narozdil od PC)

Uvedom si, ze kdyz mas v programu

Kód: Vybrat vše

int svetlo;
tak prekladac tomu da adresu v pameti a tu pouziva (a obcas ani to ne a nacpe to do registru, nebo na zasobnik, jak mu to nejlip vyjde), zatimco retezec "svetlo" po prekladu zahodi

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 bluetooth přenášení víc proměných

Příspěvek od pavel1tu » 19 kvě 2019, 15:59

1) tečka je nešťastný znak, to bych tam už dal "=" aby nebyla pak záměna s tečkou.
2) já to dělám že znak po znaku přijímám a zrovna dekoduji.
třeba odesílám "A=0" - stav Alarmu 0, to je vypnutý, přijímám znak po znaku, pokud je první "A", tak nastavím ukládání do proměnné "StavAlarmu", znak "=" zahodím, pak přijmu vše až po odřádkování a to uložím do předem nastavené proměnné.
To dělám ale jen tam, kde potřebuji "šetřit" komunikaci abych ji nezahltil (mám 12 modulů co komunikují s centrálou po 485 a každý může odesílat až 15 proměnných).
3) Tam kde nešetřím, odešlu třeba "0;12,5;0;0;14" - odešlu VŽDY všechny proměnné jako balík, oddělené ";" i když se změnila třeb ajen jedna, pak vím že jsou v pořadí
- stav alarmu
- teplota
- stav požárních čidel
- stav čidel potopa
- napětí baterie
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

jpokorny12
Příspěvky: 12
Registrován: 04 lis 2017, 20:05
Reputation: 0

Re: Arduino bluetooth přenášení víc proměných

Příspěvek od jpokorny12 » 19 kvě 2019, 17:13

Díky za cenné rady ;)
Asi bych radši zůstal u varianty identifikátoru a čísla.
Ještě kdybych chtěl aby byl identifikátor v formátu textu (A4=45). Jakým příkazem bych ho měl vyčítat, abych se zasekl před = a pak už přečetl hodnotu proměné? Existuje podobná funkce jako Serial.parseInt();
Děkuji moc

jpokorny12
Příspěvky: 12
Registrován: 04 lis 2017, 20:05
Reputation: 0

Re: Arduino bluetooth přenášení víc proměných

Příspěvek od jpokorny12 » 19 kvě 2019, 18:27

Ještě mě napadá, jak přes to přenést číslo s desetinou čárkou. Přenášet bez desetinné čárky a pak v Arduinu dělit 10 .
Nebo je nějaký ideálnější řešení?
Díky

EDIT: existuje parsefloat

Odesláno z mého Redmi Note 6 Pro pomocí Tapatalk



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 bluetooth přenášení víc proměných

Příspěvek od pavel1tu » 19 kvě 2019, 22:20

Já používám serial.read();

odeslaná zpráva "A=0" // klidně může být i A4=458
Jen nástřel,co si pamatuji:

Kód: Vybrat vše

jednou za čas vyčtu všechny moduly, moduly mi odesílají jednou za 5s až 10s, proměnné A(alarm), P(požár) pak ihned se změnou - není důvod častěji

while(rs485.available()>0) // linka1 má data
	{
		a=rs485.read(); //a je typu char, vyčítám jeden znak po druhém až je konec řádku
		aaa += a;           //postupně je ukládám do aaa typu string
		if (a=='\n')         // konec řádky/zprávy
		{
			
			if (aaa.substring(1) != "=")  return;  // pokud 2 znak není = zahodím, 
			                                                     // normálně i načítám tyto vadné zprávy a pokud jich je nějaký počet za určitý čas, 
			                                                     // dělám z toho alarm
			if(aaa.substring(0) == "A") {            // detekce proměnné A,B,C atd.
			if(aaa.substring(0,1) == "A4") {       // nebo detekce A4 když budeš chtít, pozor to "=" bude pak o znak dále
			     if(aaa.substring(2) == "0")  alarm=0;             // alarm není aktivní
			     if(aaa.substring(2) == "1")  alarm=1;             // alarm - probiha casovani
			     if(aaa.substring(2) == "2")  alarm=2;             // alarm aktivovan
                         }
			if(aaa.substring(0) == "P") {            // detekce proměnné A,B,C atd.
			     if(aaa.substring(2) == "0")  pozar=0;             // požár není aktivní
			     if(aaa.substring(2) == "1")  pozar=1;             //požár
                         }
			     
			
a tak dále :-)		
mám to jako funkci kterou to proběhne a data roztřídí a uloží kam patří	
			
			
střelil jsem to jen tak z hlavy, nejsem doma a tento kod sebou nemám, pokud tam bude chybka, omlouvám se, nemám tu ani IDE

Teplotu:
- pokud detekuji "T" jako teplotu
- zjistím délku přijmutého stringu
- vyříznu celý string za "="
- převedu na INT pomocí "teplotaInt = (teplotaStr.toInt());
- o
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

Uživatelský avatar
gilhad
Příspěvky: 779
Registrován: 07 bře 2018, 11:22
Reputation: 0

Re: Arduino bluetooth přenášení víc proměných

Příspěvek od gilhad » 19 kvě 2019, 22:30

načítej identifikátor po znacích, dokud nenarazíš na rovnítko (nebo mezeru)

KamilV
Příspěvky: 479
Registrován: 03 dub 2018, 15:27
Reputation: 0
Bydliště: Olomouc

Re: Arduino bluetooth přenášení víc proměných

Příspěvek od KamilV » 07 čer 2019, 09:59

Je to dost programátorsky "nečisté".
A hůř se hledá ideální varianta, když neznáme kontext.

Jednou možností může být mít všechny dílčí proměnné ve vlastní struktuře a přenášet celou strukturu. Při načtení se to zase "rozpadne" do těch dílčích proměnných.
Pokud by hodnot bylo hodně a přenášení celé struktury by bylo pomalé, tak bych všechny hodnoty udržoval v poli a přenášel bych jen strukturu "index pole a hodnota".

Přenos des. čísla bych raději nedělal násobením a dělením 10 - co když bude u horního okraje intu a vynásobíš deseti?
Pokud budeš přenášet strukturu, není problém, aby obsahovala float prom.
Pokud bys chtěl zůstat u práce s integery, tak bych přenášel samostatným intem celou část a druhým intem des. část.

Odpovědět

Kdo je online

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