PC - ARDUINO ovládání vstupů a výstupů
Re: PC - ARDUINO ovládání vstupů a výstupů
Tak pokud chce jen pro komunikaci s arduinem, tak to uplně stači a pokud ho to chytne, muže zkusit delphi.
Nějake to c++ je určitě lepší, ale než by se v tom naučil
Nějake to c++ je určitě lepší, ale než by se v tom naučil
Re: PC - ARDUINO ovládání vstupů a výstupů
Tak jsem to zvládnul, už si to posílám pro kontrolu zpět z Arduina na sériovou linku a v programu, který jsi vytvořil, se mi objeví načtené hodnoty, které Arduino přijalo. Jen drobný problém. Načítá mi to z TEdit dvoumístné číslo jako dva bajty, takže když v Arduinu :
to takhle načtu, tak ze zadaných hodnot v Lazarus formuláři "1 12 36" mi načte a vytiskne "12". Jednička sedí, to je podmínka ale potřeboval bych, aby načet "12" do jedné proměnné a "36" do druhé. Aby prostě jedno políčko TEdit byla jedna proměnná. A taky bych potřeboval to mít jako číslo. Takže mám tedy načíst druhý a třetí bajt (první je podmínka pro načítání), ty sloučit do řetězce a pak převést String na Int? Problém nastane, když zadám jednomístné číslo. Je na to asi lepší finta, ne?
Lazarus:
Kód: Vybrat vše
while(Serial.available())
{
if (Serial.read() == '1')
{
delay(20);
text1 = Serial.read();
text2 = Serial.read();
text3 = Serial.read();
Serial.write(text1);
Serial.print('\n');
Serial.write(text2);
Serial.print('\n');
Serial.write(text3);
Serial.print('\n');
}
}
Lazarus:
Kód: Vybrat vše
public
var odeslatText : string;
var text1 : string;
var text2 : string;
var text3 : string;
var text4 : string;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
text1 := edit1.Text;
text2 := edit2.Text;
text3 := edit3.Text;
text4 := edit4.Text;
odeslatText := text1 + text2 + text3 + text4;
LazSerial1.WriteData (odeslatText);
end;
Re: PC - ARDUINO ovládání vstupů a výstupů
To bude problem na straně arduina.
Ja si to třeba odesilam takto.
Na straně arduina to přijmu jako jeden řetězec a pak rozporcují.
V arduinu třeba funkce substring.
To same opačně přes lazarus se da použit delimiter .
Ja si to třeba odesilam takto.
Kód: Vybrat vše
LazSerial1.WriteData ( Trim(Edit1.Text) + '|' + Trim(Edit2.Text)+ '|' + Trim(Edit3.Text));
V arduinu třeba funkce substring.
Kód: Vybrat vše
String vstupni_text = "Leo|Pepa|Vasek";
String vystup;
vystup = vstupni_text.substring(0,vstupni_text.indexOf('|',0));
Serial.println(vystup);
Kód: Vybrat vše
procedure TForm1.Button1Click(Sender: TObject);
var
s: string;
sl: TStringList;
begin
sl := TStringList.Create;
s := 'Leo|karel|Pavel|Hanka|Monika';
sl.Delimiter := '|';
sl.DelimitedText := s;
ShowMessage(sl[1]);
sl.Free;
end;
Re: PC - ARDUINO ovládání vstupů a výstupů
Kámo, nenapsal jsi mi to naopak? Tohle mi funguje:
Tohle mi vypisuje prázdný výstup:
Lazarus už jsem upravil, ale já jsem asi úplně blbý, ono to na tvém programu v Lazarusu zase ASCII kódy znaků, takže mi nefunguje podmínka...
Ještě poprosím tedy o radu. Když to načtu, dostanu řadu ASCII znaků. To nelze poslat do Arduina přes sériovou linku jako normální znak? Nebo se to musí nějak naformátovat při načítání ze sériové linky, aby to pracovalo už se znaky? nebo používám špatně uvozovky? " " versus ' '...
Kód: Vybrat vše
String vstupni_text = "Alice";
String vystup;
vystup = vstupni_text.substring(vstupni_text.indexOf('A',0), 1);
Serial.println(vystup);
Serial.println("1");
delay(1000);
Kód: Vybrat vše
String vstupni_text = "Alice";
String vystup;
vystup = vstupni_text.substring(0, vstupni_text.indexOf('A',0));
Serial.println(vystup);
Serial.println("1");
delay(1000);
Ještě poprosím tedy o radu. Když to načtu, dostanu řadu ASCII znaků. To nelze poslat do Arduina přes sériovou linku jako normální znak? Nebo se to musí nějak naformátovat při načítání ze sériové linky, aby to pracovalo už se znaky? nebo používám špatně uvozovky? " " versus ' '...
Re: PC - ARDUINO ovládání vstupů a výstupů
Tak možná dělam někde kic, ale toto
By mělo zkopirovat řetězec do jineho řetězce od začatku po |
Když pošlu přes lazrus nějaký text, tak ten text se musí odchytit a vypsat tak, jak jsi ho odeslal.
To same naopak.
To co jsi tu daval ten kod ma byt takto.
To co ti přijde, odešli
A takto to co pošleš přes lazarus do arduina, to Ti aruino vrati a lazarus vypiše.
Žadne ASCII znaky.
A toto mám odzkoušene.
Kód: Vybrat vše
vystup = vstupni_text.substring(0,vstupni_text.indexOf('|',0));
Když pošlu přes lazrus nějaký text, tak ten text se musí odchytit a vypsat tak, jak jsi ho odeslal.
To same naopak.
Kód: Vybrat vše
LazSerial1.WriteData ( 'Nějaký text' ) ;
To co ti přijde, odešli
Kód: Vybrat vše
char inString[32];
int inCount;
inCount = 0;
while (Serial1.available() > 0)
{
inString[inCount] = Serial1.read();
delay(10);
if (inString[inCount] == '\0') break;
inCount++;
}
inString[inCount] = '\0';
// ------------------------
if (inCount > 0) {
Serial.println(inString);
}
Žadne ASCII znaky.
A toto mám odzkoušene.
Re: PC - ARDUINO ovládání vstupů a výstupů
strtok je "čtivější" a nevynalézá kolo
Kód: Vybrat vše
char str[] ="Jabko|Hruska|Banan";
char* item;
item = strtok(str,"|");
while(item != NULL)
{
Serial.println(item);
item = strtok(NULL, "|");
}
Re: PC - ARDUINO ovládání vstupů a výstupů
Jenže by to chtělo ještě pořešit ukladaní třeba do pole.
Když viš, kolik jich je tak by to šlo.
Pro lazarus - delphi je ten delimiter.
Přes PHP taky
Když viš, kolik jich je tak by to šlo.
Pro lazarus - delphi je ten delimiter.
Přes PHP taky
Kód: Vybrat vše
<?php
$data = file_get_contents('php://input');
$array = explode("|", $data);
file_put_contents('./shm/text.txt', $data);
file_put_contents('./shm/teplota_venku', $array[0]);
file_put_contents('./shm/vlhkost_venku', $array[1]);
file_put_contents('./shm/signal_venku', $array[2]);
?>
Re: PC - ARDUINO ovládání vstupů a výstupů
Kód: Vybrat vše
String data[3];
char str[] ="Jabko|Hruska|Banan";
char* item;
void setup() {
Serial.begin(9600);
int x = 0;
item = strtok(str,"|");
while(item != NULL)
{
data[x] = item;
item = strtok(NULL, "|");
x++;
}
Serial.println(data[0]);
Serial.println(data[1]);
Serial.println(data[2]);
}
Re: PC - ARDUINO ovládání vstupů a výstupů
Možností, co s rozparsovanými daty, je mnoho. Vůbec není zřejmé, zda je nutné to do pole ukládat, může podle toho rovnou měnit stavy na IO. Řešil jsem jen to, že bych vstupní string načítal strtokem, než čaroval substringama.
A ono by to do pole šlo i když nevíš, kolik jich je. Jen se ta velikost pole musí alokovat dynamicky.
Re: PC - ARDUINO ovládání vstupů a výstupů
Díky moc za další tipy, musím si to projít, co jste mi tu napsali a zpracovat to.Le-Ze píše: ↑16 úno 2020, 19:24Tak možná dělam někde kic, ale totoBy mělo zkopirovat řetězec do jineho řetězce od začatku po |Kód: Vybrat vše
vystup = vstupni_text.substring(0,vstupni_text.indexOf('|',0));
Neděláš kiks, já to špatně pochopil. Ty načítáš od začátku po znak, a já od znaku dále...
Jen nastíním, co vlastně chci. Jednoduchý program, který bude mít několik textových políček, kam budu zadávat hodnoty. Bude 5 kanálů, a pro každá se bude zadávat hodina (0 - 23), minuta(0 - 59), fade nebo jump (0 nebo 1) a DIM(0 - 100). Takže potřebuji pro každý kanál z toho programu odeslat zadané hodnoty do Arduina a uložit v něm do EEPROM. Zatím mi je jedno, jestli pole, řetězec... Ty hodnoty tam chci posílat kvůli testování programu, jinak musím v novém okně IDE nahrát do Arduina jiný program, ve kterém mám zápis do EEPROM a zase zpět, což není moc dobré. Navíc časem určitě budu chtít i nějakou apku na ovládání a nastavení z PC, takže to určitě využiju.
Kdo je online
Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 12 hostů