PC - ARDUINO ovládání vstupů a výstupů

Odpovědět
Le-Ze
Příspěvky: 201
Registrován: 24 črc 2017, 08:15
Reputation: 0

Re: PC - ARDUINO ovládání vstupů a výstupů

Příspěvek od Le-Ze » 16 úno 2020, 10:42

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 :?

tosik
Příspěvky: 90
Registrován: 11 led 2020, 14:48
Reputation: 0

Re: PC - ARDUINO ovládání vstupů a výstupů

Příspěvek od tosik » 16 úno 2020, 13:12

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 :

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


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;  

Le-Ze
Příspěvky: 201
Registrován: 24 črc 2017, 08:15
Reputation: 0

Re: PC - ARDUINO ovládání vstupů a výstupů

Příspěvek od Le-Ze » 16 úno 2020, 15:12

To bude problem na straně arduina.

Ja si to třeba odesilam takto.

Kód: Vybrat vše

LazSerial1.WriteData ( Trim(Edit1.Text) + '|' + Trim(Edit2.Text)+ '|' + Trim(Edit3.Text));
Na straně arduina to přijmu jako jeden řetězec a pak rozporcují.
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);
To same opačně přes lazarus se da použit delimiter .

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;

tosik
Příspěvky: 90
Registrován: 11 led 2020, 14:48
Reputation: 0

Re: PC - ARDUINO ovládání vstupů a výstupů

Příspěvek od tosik » 16 úno 2020, 18:16

Kámo, nenapsal jsi mi to naopak? Tohle mi funguje:

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);
Tohle mi vypisuje prázdný výstup:

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);
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 ' '...

Le-Ze
Příspěvky: 201
Registrován: 24 črc 2017, 08:15
Reputation: 0

Re: PC - ARDUINO ovládání vstupů a výstupů

Příspěvek od Le-Ze » 16 úno 2020, 19:24

Tak možná dělam někde kic, ale toto

Kód: Vybrat vše

vystup = vstupni_text.substring(0,vstupni_text.indexOf('|',0));
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.

Kód: Vybrat vše

LazSerial1.WriteData ( 'Nějaký text' ) ;
To co jsi tu daval ten kod ma byt takto.
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);    
}
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.

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

Re: PC - ARDUINO ovládání vstupů a výstupů

Příspěvek od KamilV » 16 úno 2020, 20:30

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, "|");
}

Le-Ze
Příspěvky: 201
Registrován: 24 črc 2017, 08:15
Reputation: 0

Re: PC - ARDUINO ovládání vstupů a výstupů

Příspěvek od Le-Ze » 16 úno 2020, 21:43

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 :)

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]);
?>

Le-Ze
Příspěvky: 201
Registrován: 24 črc 2017, 08:15
Reputation: 0

Re: PC - ARDUINO ovládání vstupů a výstupů

Příspěvek od Le-Ze » 16 úno 2020, 22:30

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

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

Re: PC - ARDUINO ovládání vstupů a výstupů

Příspěvek od KamilV » 16 úno 2020, 22:37

Le-Ze píše:
16 úno 2020, 21:43
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.
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.

tosik
Příspěvky: 90
Registrován: 11 led 2020, 14:48
Reputation: 0

Re: PC - ARDUINO ovládání vstupů a výstupů

Příspěvek od tosik » 17 úno 2020, 08:30

Le-Ze píše:
16 úno 2020, 19:24
Tak možná dělam někde kic, ale toto

Kód: Vybrat vše

vystup = vstupni_text.substring(0,vstupni_text.indexOf('|',0));
By mělo zkopirovat řetězec do jineho řetězce od začatku po |

Neděláš kiks, já to špatně pochopil. Ty načítáš od začátku po znak, a já od znaku dále... :-D
Díky moc za další tipy, musím si to projít, co jste mi tu napsali a zpracovat to.

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.

Odpovědět

Kdo je online

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