Data do řetězce

Ludek
Příspěvky: 289
Registrován: 02 pro 2019, 08:14
Reputation: 0
Bydliště: České Budějovice

Data do řetězce

Příspěvek od Ludek » 20 kvě 2020, 20:34

Zdravím, potřebuji uložit data do dvou skupin - max 2x 10 hodnot. Příklad :
mám číslo 123456 a stisknu tlačítko A a toto se uloží do Skupiny A
a to mohu opakovat víckrát s dalšími čísly. To samé se ale už podruhé neuloží.
A když stisknu tlačítko B, tak se to uloží do skupiny B. To je Akce Zápis.
A při čtení přijde nějaké číslo a já potřebuji napsat, jestli patří do skupiny A nebo B
anebo jestli nepatří nikam...

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

Re: Data do řetězce

Příspěvek od ondraN » 20 kvě 2020, 21:00

Chtělo by to nějak lépe specifikovat. Třeba jaký je rozsah čísel, jak přijdou (sériák, RFID, klávesnice...) a jak se zobrazují (displej, sériák ...), jestli je mezi nimi nějaký separátor, jak indikovat když je paměť zaplněná.

Ludek
Příspěvky: 289
Registrován: 02 pro 2019, 08:14
Reputation: 0
Bydliště: České Budějovice

Re: Data do řetězce

Příspěvek od Ludek » 20 kvě 2020, 21:16

Rozumím, ale přijdou jako proměnná z přečteného dálkového ovládače. Rozsah je Long.
Přijmu číslo - vloží se do proměnné a když ho chci, stisknu A nebo B tlačítko... Separátor není žádný.
Použiju třeba knihovnu RCswitch. Vezmu nějaké dálkové ovládání, (klíčenku), stisknu jeho tlačítko
a rozhodnu se, jestli ten kod uložím do skupiny A nebo B. Pak vezmu další dálkové ovládání
a to samé. Třeba z 5 klíčenek... To bude procedura Ukladání kodu. A pak když vezmu libovolnou
klíčenku a po stisku tlačítka se mi na monitoru napíše A nebo B anebo nic.

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

Re: Data do řetězce

Příspěvek od ondraN » 21 kvě 2020, 07:28

Dobře, a v čem je problém?
Vytvořil bych dvě pole, ke každému z nich index a inicializoval bych v nich nulové hodnoty. Když ti přijde číslo, nejdříve prohledej pole A od nuly do indexu, pak pole B. Když nebude hodnota nalezena, rozsviť LED "nová hodnota" a čekej na zmáčknutí tlačítka A nebo B nebo "Ignoruj". Při stisku A ulož do pole A na pozici kam ukazuje index a ten pak inkrementuj. Podobně při stisku B, ale s polem B. Při stisku "Ignoruj", neukládej, ale opakuj vše znovu. Nezapomeň hlídat indexy, aby nepřetekly přes maximální délku pole.
Program bych ti samozřejmě mohl napsat a dát sem, ale nejlíp se to učí, když se zkouší :)

Ludek
Příspěvky: 289
Registrován: 02 pro 2019, 08:14
Reputation: 0
Bydliště: České Budějovice

Re: Data do řetězce

Příspěvek od Ludek » 21 kvě 2020, 11:09

Ondro, tak to asi nedokážu. Trápím se tu a nevím, jak začít :-(
Hoď mi záchranné lano :-)

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

Re: Data do řetězce

Příspěvek od ondraN » 21 kvě 2020, 11:15

OK :D Večer budu mít chvíli času.

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

Re: Data do řetězce

Příspěvek od ondraN » 21 kvě 2020, 19:50

Tak snad je to, co jsi chtěl.

Kód: Vybrat vše

#define TlA 4 // Tl jsou vstupy na tlacitka
#define TlB 5
#define TlIgnore 6
#define LEDA 7  //LED jsou vystupy na LED
#define LEDB 8
#define LEDNew 9

const byte MaxNum=10; //definice globalnich promennych
long A[MaxNum]={0};
long B[MaxNum]={0};
byte IdxA=0,IdxB=0;

void setup() {
  pinMode(TlA,INPUT_PULLUP);  //tlacitka jsou zapojena proti GND, pri stisknutem je na pinu LOW
  pinMode(TlB,INPUT_PULLUP);
  pinMode(TlIgnore,INPUT_PULLUP);
  pinMode(LEDA,OUTPUT); // LED pres rezistor proti GND, sviti pri HIGH
  pinMode(LEDB,OUTPUT);
  pinMode(LEDNew,OUTPUT);
  Serial.begin(9600); //otevreni ser. kanalu
}

void loop() {
  long RecVal=0;  //ctena hodnota
  bool Found=false; //pomocna detekcni promenna
  randomSeed(analogRead(A0));
  while(true){  // hlavni cyklus programu se bude donekonecna opakovat
    RecVal=random(-999999,999999);  //tady si nactes hodnotu, ja si tam dam nahodne cislo
    Found=false;
    for(byte i=0;i<IdxA;i++){ // zjistime ada neni jiz ulozene v A
      if(A[i]==RecVal){
        Found=true;
        digitalWrite(LEDA,HIGH);
        Serial.println("Cislo je jiz ulozene v A");
        break;
      }
    }
    if(!Found){ // pokud nebylo nalezeno v A, prohlidneme i B
      Found=false;
      for(byte i=0;i<IdxB;i++){
        if(B[i]==RecVal){
          Found=true;
          digitalWrite(LEDB,HIGH);
          Serial.println("Cislo je jiz ulozene v B");
          break;
        }
      }     
    }
    if(!Found){   //neni v A ani v B
      digitalWrite(LEDNew,HIGH);
      Serial.print("Nove cislo: ");
      Serial.println(RecVal);
      Serial.println("Stiskni tlacitko ulozeni nebo Ignorovat.");    
    }
    while(true){  //cyklus se opakuje do stisknuti nejakeho tlacitka
      if(!Found){ // nove cislo, umoznime jeho ulozeni do A nebo B
        if(digitalRead(TlA)==LOW){
          if(IdxA<MaxNum){
            A[IdxA]=RecVal;
            IdxA++;
            Serial.println("Ulozeno do A");
          }else{
            Serial.println("Pamet A zaplnena, neulozeno");
          }
        break; 
        }
        if(digitalRead(TlB)==LOW){
          if(IdxB<MaxNum){
            B[IdxB]=RecVal;
            IdxB++;
            Serial.println("Ulozeno do B");
          }else{
            Serial.println("Pamet B zaplnena, neulozeno");
          }
        break; 
        }        
      }
      if(digitalRead(TlIgnore)==LOW){  //volbu ignorovat muzeme pouzit i na nove cislo
        break;
      }
    }
    delay(100); //debounce interval tlacitek
    while((digitalRead(TlA)==LOW)||(digitalRead(TlB)==LOW)||(digitalRead(TlIgnore)==LOW)){  //pockame na uvolneni stisku tlacitka
      delay(1);
    }
    digitalWrite(LEDA,LOW); //zhasneme LED a jdeme do noveho kola
    digitalWrite(LEDB,LOW);
    digitalWrite(LEDNew,LOW);
  }
}
Po přečtení (já ho náhodně generuji) se zjistí jestli už je evidováno, pak je umožněno jeho uložení nebo ignorování a tak dokola.

Ludek
Příspěvky: 289
Registrován: 02 pro 2019, 08:14
Reputation: 0
Bydliště: České Budějovice

Re: Data do řetězce

Příspěvek od Ludek » 21 kvě 2020, 20:33

Ondro, Ty jsi blázen nebo Genius... :-) Díky, zkusím a dám vědět...

Ludek
Příspěvky: 289
Registrován: 02 pro 2019, 08:14
Reputation: 0
Bydliště: České Budějovice

Re: Data do řetězce

Příspěvek od Ludek » 21 kvě 2020, 21:43

Tak klobouk dolů, šlape to. Nechápu, jak jsi to mohl tak rychle a přehledně stvořit.
Ještě zkusím potrápit svou hlavu, že bych přidal 4. tlačítko a vypsal obsah A a obsah B...
tak díky MOC.

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

Re: Data do řetězce

Příspěvek od ondraN » 22 kvě 2020, 06:37

Díky, ani jsem to neladil, teď alespoň vím, že to bylo funkční :D
Asi nejdůležitější část programování je dekompozice. Velký problém, se rozdělí na více menších a ty zase na menší a tak dále, až je z toho hromádka cyklů a podmínek. Ono by se to dalo napsat ještě lépe a přehledněji se strukturami a funkcemi, ale to by bylo pro začátek spíš matoucí.

Odpovědět

Kdo je online

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