Klávesnice z Leonarda

Nedaří se vám s projektem a nenašli jste vhodné místo, kde se zeptat? Napište sem.
Pravidla fóra
Tohle subfórum je určeno pro konzultaci ucelených nápadů, popřípadě řešení komplexnějších projektů, které opravdu není možné rozdělit na menší části.
Většinu problémů jde rozdělit na menší a ptát se na ně v konkrétních subfórech.
Odpovědět
Mikey
Příspěvky: 5
Registrován: 10 srp 2019, 13:53
Reputation: 0

Klávesnice z Leonarda

Příspěvek od Mikey » 10 srp 2019, 14:04

Zdravím mám tu problém. Úplně programovat neumím protože mě to nikdo nenaučil ale tak co už.

Můj problém je to takový že: Mám NANO to mi podle potenciometru rozsvítí LEDky 0-5 0-1020. Když jsem na levelu 5 svítí jich všech 5 když na 2 svítí dvě atd... easy že? ne....

Protože pak potřebuju aby mi Leonardo podle každý tý urovně zmáčklo klávesu na PC. Když bude první ledka LOW( v mém případě protože relátka se zapínají LOW signálem) zmáčkne to "A" když bude první a druhá zmáčkne to "S" když 1,2,3 zmáčkne "D" když 1,2,3,4 zmáčkne "F" a když 1,2,3,4,5 zmáčne "G"

Potřebuju aby to nedělalo "ASDFG" na levelu 5 chci jen "G" to je první problém.Jako druhý mi to nechce psát jen jedno písmeno. Použil jsem millis a počítám pulzy moc tomu sám nerozumím. Prý tam mám přidat debounce ale to asi sám už nezvládnu dostat to do tohodle stavu bylo peklo dál už nevím.

Dolu přihodím kód můžete ho editovat jak chcete. Nano je ve stavu klidu teda HIGH a když zapíná relé a ledky tak LOW. Takže to musí reagovat na low. Díky za snahu.

Kód: Vybrat vše

#include "Keyboard.h"

// constants won't change. Used here to set a pin number:
const int  buttonPin = 12;
const int ledPin1 =  13;// the number of the LED pin

// Variables will change:
int ledState1 = LOW;             // ledState1 used to set the LED

// Generally, you should use "unsigned long" for variables that hold time
// The value will quickly become too large for an int to store
unsigned long previousMillis1 = 0;        // will store last time LED was updated

// constants won't change:
const long interval1 = 5;           // interval1 at which to blink (milliseconds)

// Variables will change:
int buttonPushCounter1 = 0;   // counter for the number of button presses
int buttonState1 = 0;         // current state of the button
int lastbuttonState1 = 0;     // previous state of the button

void setup() {
  // set the digital pin as output:
  pinMode(ledPin1, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(2, INPUT);
  pinMode(0, INPUT);
  Serial.begin(9600);
  Keyboard.begin();

}


void loop() {
  A();
}

void A() {


  buttonState1 = digitalRead(13);

  if (digitalRead(2) == LOW) {

    // compare the buttonState1 to its previous state
    if (buttonState1 != lastbuttonState1) {
      // if the state has changed, increment the counter
      if (buttonState1 == HIGH) {
        // if the current state is HIGH then the button went from off to on:
        buttonPushCounter1++;
        Serial.println("on");
        Serial.print("number of button pushes: ");
        Serial.println(buttonPushCounter1);
      } else {
        // if the current state is LOW then the button went from on to off:
        Serial.println("off");
      }
      // Delay a little bit to avoid bouncing
      delay(50);


    }
    // save the current state as the last state, for next time through the loop
    lastbuttonState1 = buttonState1;


    // turns on the LED every four button pushes by checking the modulo of the
    // button push counter. the modulo function gives you the remainder of the

    if (buttonPushCounter1 % 50 == 3) {

      Keyboard.write('A');
    } else {
      digitalWrite(9, LOW);
    }




    // here is where you'd put code that needs to be running all the time.

    // check to see if it's time to blink the LED; that is, if the difference
    // between the current time and last time you blinked the LED is bigger than
    // the interval1 at which you want to blink the LED.
    unsigned long currentMillis1 = millis();

    if (currentMillis1 - previousMillis1 >= interval1) {
      // save the last time you blinked the LED
      previousMillis1 = currentMillis1;

      // if the LED is off turn it on and vice-versa:
      if (ledState1 == LOW) {
        ledState1 = HIGH;
      } else {
        ledState1 = LOW;
      }

      // set the LED with the ledState1 of the variable:
      digitalWrite(ledPin1, ledState1);
    }
  }
}

gilhad
Příspěvky: 301
Registrován: 07 bře 2018, 11:22
Reputation: 0

Re: Klávesnice z Leonarda

Příspěvek od gilhad » 10 srp 2019, 20:15

Nejak nechapu, jak to vlastne mas zapojene a co vlastne chces dosahnout (a jak to souvisi s danym kodem).

Mas teda dve Arduina - NANO a Leonardo?

A to NANO dela nejakou magii (asi ten potenciometr?) a vysledkem je, ze se rozsveci LEDky? (A je zaruceno, ze je rozsveci a zhasina tak, ze vzdy sviti nejak dlouhy zacatek rady a pak uz nic?)

A to Leonardo nejak meri napeti na tech LEDkach a na jeho zaklade ma psat na klavesnici PC? (A jak casto, nejak pravidelne, nebo jen pri zmene? )

---

Nebylo by jednodussi, aby tu magii misto NANO delalo to Leonardo, a rovnou jednak rozsvecelo ty LEDky a jednak posilalo pismena na klavesnici?

---

Jinak s tou klavesnici bych to asi resil to teto ose:

Kód: Vybrat vše

// pro citelnost porovnani if (digitalRead(led1)==ACTIVE) {};
#define ACTIVE LOW
// napriklad tady budeme cist ty LEDky na pinech od 7 do 11 (nebo si sem dej cokoli, co mas ty)
#define led1 7
#define led2 8
#define led3 9
#define led4 10
#define led5 11

// ....
void setup () {
  // tady nastavime vstupy
  pinMode(led1,INPUT);
  pinMode(led2,INPUT);
  pinMode(led3,INPUT);
  pinMode(led4,INPUT);
  pinMode(led5,INPUT);
  Keyboard.begin();
  //......
}

char AktualniZnak() { 
  // Tato funkce vrati aktualni znak podle ledek
  if (digitalRead(led5)==ACTIVE) return 'G'; // a "predchozi led" uz netestuju
  if (digitalRead(led4)==ACTIVE) return 'F'; // a "predchozi led" uz netestuju
  if (digitalRead(led3)==ACTIVE) return 'D'; // a "predchozi led" uz netestuju
  if (digitalRead(led2)==ACTIVE) return 'S'; // a "predchozi led" uz netestuju
  if (digitalRead(led1)==ACTIVE) return 'A'; // a toto je ta prvni
  return ' '; // a kdyz nesviti ani prvni, tak vratim mezeru (napriklad)
}

// tady si pamatujeme, co jsme naposled poslali
char PosledniZnak = 'x'; // neco neznameho, aby jak to spustime, tak to aktualni stav vyhodnotilo jako zmenu a poslalo stav novy=aktualni

void loop(){
  char Znak=AktualniZnak(); // copak asi sviti a co mame teda mit stisknuto
  if (Znak != PosledniZnak) {
    // tak se nam to zmenilo, tak posleme zmenu
    Keyboard.write(Znak);
    PosledniZnak=Znak;
  };
  // a tady delame cokoli jineho v loop chceme delat
}


Mikey
Příspěvky: 5
Registrován: 10 srp 2019, 13:53
Reputation: 0

Re: Klávesnice z Leonarda

Příspěvek od Mikey » 11 srp 2019, 12:53

Skvělý. Mnohem jednodušší než co jsem dělal já. A funkční. Jedinej problém je že mi to píše "ADFG " Přiložím pár fotek aby bylo jasné co je můj problém.


A Foto 1 https://i.imgur.com/4cr9tko.jpg

AS Foto 2 https://i.imgur.com/4cr9tko.jpg

ASD Foto 3 https://i.imgur.com/APwijBc.jpg

ASDF Foto 4 https://i.imgur.com/GwGq1iS.jpg

ASDFG Foto 5 https://i.imgur.com/WvVs0pr.jpg


Takhle to vypadá. Já potřebuju aby to dělalo při těch stejnejch fotkách tohle


A Foto 1 https://i.imgur.com/4cr9tko.jpg

S Foto 2 https://i.imgur.com/4cr9tko.jpg

D Foto 3 https://i.imgur.com/APwijBc.jpg

F Foto 4 https://i.imgur.com/GwGq1iS.jpg

G Foto 5 https://i.imgur.com/WvVs0pr.jpg

Trošku jsem si hrál s delayem mezi if v rozpoznávání těch kláves a trošku to pomohlo ale nakonec jsem to smazal přidává to velkou prodlevu a nemyslím si že je to správná cesta. Nějaký nápady? Asi bych tam přidělal nějakej buffer kterej by měl třeba vteřinu na to rozhodnout se a až pak mi mačkal klávesu. Pokud něco takovýho jde.

Díky M.

Mikey
Příspěvky: 5
Registrován: 10 srp 2019, 13:53
Reputation: 0

Re: Klávesnice z Leonarda

Příspěvek od Mikey » 11 srp 2019, 13:00

gilhad píše:
10 srp 2019, 20:15
Nejak nechapu, jak to vlastne mas zapojene a co vlastne chces dosahnout (a jak to souvisi s danym kodem).

Mas teda dve Arduina - NANO a Leonardo?
Ano 2 jedno NANO a druhý Leonardo
gilhad píše:
10 srp 2019, 20:15
A to NANO dela nejakou magii (asi ten potenciometr?) a vysledkem je, ze se rozsveci LEDky? (A je zaruceno, ze je rozsveci a zhasina tak, ze vzdy sviti nejak dlouhy zacatek rady a pak uz nic?)
Přesně tak Nano dělá tu svítící magii a po 5 sec vypne svícení. Výsledek je podle fotek.
gilhad píše:
10 srp 2019, 20:15
A to Leonardo nejak meri napeti na tech LEDkach a na jeho zaklade ma psat na klavesnici PC? (A jak casto, nejak pravidelne, nebo jen pri zmene? )
Ano přesně tak. Jen pokud se rozsvítí. Jedno písmenko
gilhad píše:
10 srp 2019, 20:15
Nebylo by jednodussi, aby tu magii misto NANO delalo to Leonardo, a rovnou jednak rozsvecelo ty LEDky a jednak posilalo pismena na klavesnici?
To úplně nezvládám a už to mám napájený takže bych tam to nano nechal. Ale bylo.

Kód je dokonalej ale potřeboval bych maličkou úpravu viz. post nahoře

Díky


Jen jsem tam dodal správné piny a knihovnu klávesnice

Kód: Vybrat vše

#include "Keyboard.h"
// pro citelnost porovnani if (digitalRead(led1)==ACTIVE) {};
#define ACTIVE LOW
// napriklad tady budeme cist ty LEDky na pinech od 7 do 11 (nebo si sem dej cokoli, co mas ty)
#define led1 2
#define led2 3
#define led3 4
#define led4 5
#define led5 6

// ....
void setup () {
  // tady nastavime vstupy
  pinMode(led1,INPUT);
  pinMode(led2,INPUT);
  pinMode(led3,INPUT);
  pinMode(led4,INPUT);
  pinMode(led5,INPUT);
  Keyboard.begin();
  //......
}

char AktualniZnak() { 
  // Tato funkce vrati aktualni znak podle ledek
  if (digitalRead(led5)==ACTIVE) return 'G'; // a "predchozi led" uz netestuju
  if (digitalRead(led4)==ACTIVE) return 'F'; // a "predchozi led" uz netestuju
  if (digitalRead(led3)==ACTIVE) return 'D'; // a "predchozi led" uz netestuju
  if (digitalRead(led2)==ACTIVE) return 'S'; // a "predchozi led" uz netestuju
  if (digitalRead(led1)==ACTIVE) return 'A'; // a toto je ta prvni
  return ' '; // a kdyz nesviti ani prvni, tak vratim mezeru (napriklad)
}

// tady si pamatujeme, co jsme naposled poslali
char PosledniZnak = 'x'; // neco neznameho, aby jak to spustime, tak to aktualni stav vyhodnotilo jako zmenu a poslalo stav novy=aktualni

void loop(){
  char Znak=AktualniZnak(); // copak asi sviti a co mame teda mit stisknuto
  if (Znak != PosledniZnak) {
    // tak se nam to zmenilo, tak posleme zmenu
    Keyboard.write(Znak);
    PosledniZnak=Znak;
  };
  // a tady delame cokoli jineho v loop chceme delat
}

gilhad
Příspěvky: 301
Registrován: 07 bře 2018, 11:22
Reputation: 0

Re: Klávesnice z Leonarda

Příspěvek od gilhad » 11 srp 2019, 16:00

Mikey píše:
11 srp 2019, 12:53
Skvělý. Mnohem jednodušší než co jsem dělal já. A funkční. Jedinej problém je že mi to píše "ADFG " Přiložím pár fotek aby bylo jasné co je můj problém.
Jak rozsvecis ty LEDky na tom NANO? "ADFG" je ten program schopny vypsat pouze pokud bys ty ledky rozsvecel postupne (nebo s nima blikal).

Ta funkce AktualniZnak muze vratit 'A' POUZE pokud nesviti ZADNA z led2..led5 - protoze pokud by nejaka z nich svitila, tak ta funkce KONCI (return '...' ) driv, nez se vubec dostane k testu led1, ktery jediny vraci 'A'

Na druhou stranu ta funkce AktualniZnak je "pekelne rychla", takze je to schopne se celou loop() prohnat treba nekolik tisickrat za sekundu.

Takze pokud neco tim potenciometrem rychle pohne do polohy G, tak nejspis stihne vsechny mezipolohy zachytit. Stejne tak, pokud mas rozsvecenei ve stylu

Kód: Vybrat vše

if (analogRead(potak)>0) digitalWrite(led1,HIGH);
if (analogRead(potak)>100) digitalWrite(led2,HIGH);
if (analogRead(potak)>200) digitalWrite(led3,HIGH);
if (analogRead(potak)>300) digitalWrite(led4,HIGH);
tak je docela sance, ze analogRead() je natolik pomaly, ze to postupne rozsveceni zleva v podstate stiham - nerkuli pokud tam mas neco jeste neco slozitejsiho. (cemuz by nasvedcovalo i to preskocene S, protoze A se vyhodnocuje nejdele)


Zkus sem hodit ten kod pro NANO

Zkus upravit muj kod tak, ze za Keyboard.write(Znak); pridas

Kód: Vybrat vše

Serial.print(Znak);
Serial.print(" - ");
Serial.print(millis(),DEC)
Serial.print(" - ");
Serial.println(micros(),DEC)
a uvidis, kdy se ty jednotlive LED detekovaly (a pokud se ti tam misto ASDFG objevi AG, tak je jasne ze to rozsvecis postupne ale ja to stiham sledovat)

nebo za Keyboard.write(Znak); pridej delay(1); a uvidis taky, jestli ti nabehne cely retezec, nebo jen zacatek/konec

nebo pridej delay(1); na zacatek loop a omez pocet mereni na jedno za milisekundu (pripadne tam pridej i vic, kdyz das delay(10), tak mas porad 100 za sec a tak rychle nikdo nepise)

---

Pokud je problem v rychlosti mereni, tak uprav NANO, at to rozsveci od te nejvyssi a muzes merit plnou rychlosti

Kód: Vybrat vše

if (analogRead(potak)>300) digitalWrite(led4,HIGH);
if (analogRead(potak)>200) digitalWrite(led3,HIGH);
if (analogRead(potak)>100) digitalWrite(led2,HIGH);
if (analogRead(potak)>0) digitalWrite(led1,HIGH);

Mikey
Příspěvky: 5
Registrován: 10 srp 2019, 13:53
Reputation: 0

Re: Klávesnice z Leonarda

Příspěvek od Mikey » 12 srp 2019, 11:10

Tady je kód z NANA já budu zatím experimentovat s tímhle.

Kód: Vybrat vše

int potPin = A1;          //Senzor
int LEDPin = 9;           //Výstup
const int resetPin = 12; //Reset
int LEDButtR = A3;         //Červená
int readValue, lastRead;  //Paměť a změna

int levelzero = A5;  // Tohle jde mimo Leonardo 
int level1 = 2;
int level2 = 3;
int level3 = 4;
int level4 = 5;
int level5 = 6;
/*
int level6 = 7;
int level7 = 8;
int level8 = 9;
int level9 = 10;
int level10 = 11;
*/


int buttonState = 0;

unsigned long writeValue;  // to get the calculation done better, without using floats

void setup()  {

  pinMode(potPin, INPUT);
  pinMode(LEDPin, OUTPUT);
  pinMode(resetPin, INPUT);
  pinMode(LEDButtR, OUTPUT);
  Serial.begin(57600);

  pinMode(levelzero, OUTPUT);
  pinMode(level1, OUTPUT);
  pinMode(level2, OUTPUT);
  pinMode(level3, OUTPUT);
  pinMode(level4, OUTPUT);
  pinMode(level5, OUTPUT);
 /*
  pinMode(level6, OUTPUT);     //původně to mělo být na 10 levelů ale nakonec jen 5
  pinMode(level7, OUTPUT);
  pinMode(level8, OUTPUT);
  pinMode(level9, OUTPUT);
  pinMode(level10,OUTPUT);
*/

}

void loop()  {

   one();
  reset();



  zero();
  levelone();
  leveltwo();
  levelthree();
  levelfour();
  levelfive();
 /* 
  levelsix();
  levelseven();
  leveleight();
  levelnine();
  levelten();
*/



}


void one()  {




  readValue = analogRead(potPin);
  if ( lastRead > readValue )

  {
    readValue = lastRead;
  }

  else

  {
    lastRead = readValue;
  }


  Serial.println("Snímač");
  Serial.println(readValue);
            }











void reset()    {


  buttonState = digitalRead(resetPin);
  Serial.println("Reset Modul");
  Serial.println(buttonState);


  if (buttonState == HIGH)


  {

    lastRead = 0;
    delay(10);
  }
                 }



void ledka() {

  if (readValue < 681) {
    digitalWrite(LEDButtR, HIGH);
  }

  else {

    digitalWrite(LEDButtR, LOW);
  }
}




void levelone() {

  if (readValue > 700)

  {

    digitalWrite(level1, LOW);
  }

  else

  {
    digitalWrite(level1, HIGH);
  }
}




void leveltwo() {

  if (readValue > 725)

  {
    digitalWrite(level2, LOW);
  }

  else

  {
    digitalWrite(level2, HIGH);
  }
}



void levelthree() {

  if (readValue > 750)

  {
    digitalWrite(level3, LOW);
  }

  else

  {
    digitalWrite(level3, HIGH);
  }
}

void levelfour() {

  if (readValue > 800)

  {
    digitalWrite(level4, LOW);
  }

  else

  {
    digitalWrite(level4, HIGH);
  }


}

void levelfive() {

  if (readValue > 850)

  {
    digitalWrite(level5, LOW);
  }

  else

  {
    digitalWrite(level5, HIGH);
  }
}
/*
 void levelsix() {

  if (readValue > 700) { 
    digitalWrite(level6, LOW); }

 else  { digitalWrite(level6, HIGH); }

 }

 void levelseven() {

  if (readValue > 725) { 
    digitalWrite(level6,  HIGH);
    digitalWrite(level7, LOW); }

  else { digitalWrite(level7, HIGH); }

 }
 void leveleight() {

  if (readValue > 750) { 
    digitalWrite(level7,  HIGH);
    digitalWrite(level8, LOW); }

  else { digitalWrite(level8, HIGH); }

 }
 void levelnine() {

  if (readValue > 800) { 
    digitalWrite(level8,  HIGH);
    digitalWrite(level9, LOW); }

  else { digitalWrite(level9, HIGH); }
 }

 void levelten() {

  if (readValue > 850) { 
    digitalWrite(level9,  HIGH);
    digitalWrite(level10, LOW); }
  else { digitalWrite(level10, HIGH); }
 }

*/

void zero() {

  if (readValue > 700)

  {

    digitalWrite(levelzero, LOW);
  }

  else

  {
    digitalWrite(levelzero, HIGH);
  }
}

gilhad
Příspěvky: 301
Registrován: 07 bře 2018, 11:22
Reputation: 0

Re: Klávesnice z Leonarda

Příspěvek od gilhad » 12 srp 2019, 11:20

Takze v podstate variace na ten muj posledni priklad. Zkus otocit poradi volani levelone .. levelfive a melo by to chodi tak, jak chces :)

Mikey
Příspěvky: 5
Registrován: 10 srp 2019, 13:53
Reputation: 0

Re: Klávesnice z Leonarda

Příspěvek od Mikey » 12 srp 2019, 13:01

Hotovo pár úprav přepsal jsem to NANO a good... Díky za pomoc

Kód: Vybrat vše

#include "Keyboard.h"
// pro citelnost porovnani if (digitalRead(led1)==ACTIVE) {};
#define ACTIVE LOW
// napriklad tady budeme cist ty LEDky na pinech od 7 do 11 (nebo si sem dej cokoli, co mas ty)
#define led1 2
#define led2 3
#define led3 4
#define led4 5
#define led5 6

// ....
void setup () {
  // tady nastavime vstupy
  pinMode(led1,INPUT);
  pinMode(led2,INPUT);
  pinMode(led3,INPUT);
  pinMode(led4,INPUT);
  pinMode(led5,INPUT);
  Keyboard.begin();
  //......
}

char AktualniZnak() { 
  // Tato funkce vrati aktualni znak podle ledek
  delay(750);
  if (digitalRead(led5)==ACTIVE) return 'G'; // a "predchozi led" uz netestuju
  if (digitalRead(led4)==ACTIVE) return 'F'; // a "predchozi led" uz netestuju
  if (digitalRead(led3)==ACTIVE) return 'D'; // a "predchozi led" uz netestuju
  if (digitalRead(led2)==ACTIVE) return 'S'; // a "predchozi led" uz netestuju
  if (digitalRead(led1)==ACTIVE) return 'A'; // a toto je ta prvni
  return ' '; // a kdyz nesviti ani prvni, tak vratim mezeru (napriklad)
}

// tady si pamatujeme, co jsme naposled poslali
char PosledniZnak = 'x'; // neco neznameho, aby jak to spustime, tak to aktualni stav vyhodnotilo jako zmenu a poslalo stav novy=aktualni

void loop(){
  char Znak=AktualniZnak(); // copak asi sviti a co mame teda mit stisknuto
  if (Znak != PosledniZnak) {
    // tak se nam to zmenilo, tak posleme zmenu
    Keyboard.write(Znak);
Serial.print(" - ");
Serial.print(millis(),DEC);
Serial.print(" - ");
Serial.println(micros(),DEC);
delay(500);

    
    PosledniZnak=Znak;
  };
  // a tady delame cokoli jineho v loop chceme delat
}

gilhad
Příspěvky: 301
Registrován: 07 bře 2018, 11:22
Reputation: 0

Re: Klávesnice z Leonarda

Příspěvek od gilhad » 13 srp 2019, 00:06

Rado se stalo :)

Odpovědět

Kdo je online

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