Po těžkých bojích, mnoho slepých uličkám, pročítání manuálů k jednotlivým funkcím ... jsem se prokousal k funkčnímu výsledku. Jako vedlejší produkt tohoto snažení je odpálený USB/TTL programátor
Mimo jiné mi velmi pomohl AstroMiK a jeho ukázkový kód. Jak jsem postupně pochopil, ani ten nebyl bez chyby, hlavně ten na přijímací straně, ale už to byla cesta, která vedla k cíli. Dále mi hodně pomohl popis knihovny Serial
http://docs.uart.cz/docs/serial/
Kód vysílací strany zůstal v podstatě beze změn, pouze jsem původní proměnnou
nahradil hodnotou 99. Hodnota nula (vypnutý stav) se při přepínání vstupů generovala po lince tak trochu náhodně, tak jsem ji nahradil nenulovým číslem, které mě zrovna napadlo.
Takže vypnutý stav = 99
vstup 1 = 100 (99+1)
vstup 2 = 101(99+2)
vstup 3 = 102 (99+3)
vstup 4 = 103 (99+4)
vstup 5 = 104 (99+5)
vstup 6 = 105 (99+6)
Přijímací stranu jsem postupně zcela přepracoval. Je nutné přijímat číslo, pokud to tak potřebuji
Kód: Vybrat vše
while (Serial.available()) { // cteni ser. linky
byte vstup = Serial.parseInt(); // kdyz se na seriovem portu objevi nejaka ciselna data ...
Dále jsem postupně řešil podmínky, výsledný kód se mi jeví jako nevhodnější. Zcela jsem odstranil počítání bytů v bufferu a zaměřil se jen na čísla. připadalo mi to jednodušší a srozumitelnější. Možná jsem objevil Ameriku, ale doposud jsem nevěděl, že do Arduina mohu posílat po ser. lince data přes ser. monitor. Hodně to ulehčuje práci. Tak jsem odladil vysílací i přijímací část samostatně a následně "jen" propojil a ověřil funkčnost. Odstranil jsem oddělené napájení, udělal jedno společné + Rx, Tx.
Vysílací strana:
Kód: Vybrat vše
//prirazeni vstupu k pinu
byte int_1 = 4; //vstup 1
byte int_2 = 3; //vstup 2
byte int_3 = 5; //vstup 3
byte int_4 = 6; //vstup 4
byte int_5 = 7; //vstup 5
byte int_6 = 8; //vstup 6
void setup()
{
Serial.begin(9600);// rychlost ser. linky
//definice pinu - vstup
pinMode(int_1, INPUT_PULLUP); // Pull-Upy jsem tam pridaval jen kvuli testovani
pinMode(int_2, INPUT_PULLUP);
pinMode(int_3, INPUT_PULLUP);
pinMode(int_4, INPUT_PULLUP);
pinMode(int_5, INPUT_PULLUP);
pinMode(int_6, INPUT_PULLUP);
}
void loop(void)
{
byte vysilana_hodnota = 99;
// sepnuty kontakt na GND se odesila jako binarni "1"
if (digitalRead(int_1) == LOW) vysilana_hodnota += 1;
if (digitalRead(int_2) == LOW) vysilana_hodnota += 2;
if (digitalRead(int_3) == LOW) vysilana_hodnota += 3;
if (digitalRead(int_4) == LOW) vysilana_hodnota += 4;
if (digitalRead(int_5) == LOW) vysilana_hodnota += 5;
if (digitalRead(int_6) == LOW) vysilana_hodnota += 6;
// Serial.println(vysilana_hodnota);
// Serial.write(vysilana_hodnota);
delay(1000); // dostatecne dlouha doba, aby prijimaci Arduino melo cas prijata data zpracovat a nezahltil se mu prijimaci buffer
}
Přijímací strana:
Kód: Vybrat vše
//prirazeni vystupu k pinu
int out_1 = 7; //vystup 1-pin 7
int out_2 = 6; //vystup 2-pin 6
int out_3 = 5; //vystup 3-pin 5
int out_4 = 4; //vystup 4-pin 4
int out_5 = 3; //vystup 5-pin 3
int out_6 = 2; //vystup 6-pin 2
void setup() {
//definice vystupu
pinMode(out_1, OUTPUT);
pinMode(out_2, OUTPUT);
pinMode(out_3, OUTPUT);
pinMode(out_4, OUTPUT);
pinMode(out_5, OUTPUT);
pinMode(out_6, OUTPUT);
//reset vystupu
digitalWrite(out_1, HIGH);
digitalWrite(out_2, HIGH);
digitalWrite(out_3, HIGH);
digitalWrite(out_4, HIGH);
digitalWrite(out_5, HIGH);
digitalWrite(out_6, HIGH);
Serial.begin(9600); //seriova linka
}
void loop()
{
while (Serial.available()) { // cteni ser. linky
byte vstup = Serial.parseInt(); // kdyz se na seriovem portu objevi nejaka ciselna data ...
// Serial.println(vstup); //vypis promenne na ser. monitor
if(vstup == 100){ // vystup 1 ON
digitalWrite(out_1, LOW);
}
if(vstup == 101){ // vystup 2 ON
digitalWrite(out_2, LOW);
}
if(vstup == 102){ // vystup 3 ON
digitalWrite(out_3, LOW);
}
if(vstup == 103){ // vystup 4 ON
digitalWrite(out_4, LOW);
}
if(vstup == 104){ // vystup 5 ON
digitalWrite(out_5, LOW);
}
if(vstup == 105){ // vystup 6 ON
digitalWrite(out_6, LOW);
}
if(vstup == 99) { // vystupy 1-6 OFF
digitalWrite(out_1, HIGH);
digitalWrite(out_2, HIGH);
digitalWrite(out_3, HIGH);
digitalWrite(out_4, HIGH);
digitalWrite(out_5, HIGH);
digitalWrite(out_6, HIGH);
}
}
}
Děkuji všem, kdo mě nakopli správným směrem, doufám, že takto podrobný popis někdy někomu také pomůže.