czy ktoś może mi pomóc dlaczego ten kod nie działa poprawnie?
kod nie jest mojego autorstwa i po skopiowaniu coś działa nie tak, kod jest na button box-a 18 przycisków, czy ktoś by mi wytłumaczył o co z tym chodzi?
A few comments:
1: I don't think we have a Polish section yet. Try using Google translate or some other automatic translator to convert your text to English. More people will be able to think along with you.
2: Don't paste screenshots of code - post code, in code tags. Also post the FULL SKETCH, not a snippet.
3: Copy-paste complete error text instead of a screen shot.
Good luck!
//BUTTON BOX
//USE w ProMicro
//Tested in WIN10 + Assetto Corsa
//AMSTUDIO
//20.8.17
#include <Keypad.h>
#include <Joystick.h>
#define ENABLE_PULLUPS
#define NUMROTARIES 3
#define NUMBUTTONS 18
#define NUMROWS 3
#define NUMCOLS 6
#define LIST_MAX 18
byte buttons[NUMROWS][NUMCOLS] = {
{1,2,3,4,5,6},
{7,8,9,10,11,12},
{13,14,15,16,17,18},
};
struct rotariesdef {
byte pin1;
byte pin2;
int ccwchar;
int cwchar;
volatile unsigned char state;
};
rotariesdef rotaries[NUMROTARIES] {
{0,1,19,20,0},
{2,3,21,22,0},
{4,5,23,24,0},
};
#define DIR_CCW 0x10
#define DIR_CW 0x20
#define R_START 0x0
#ifdef HALF_STEP
#define R_CCW_BEGIN 0x1
#define R_CW_BEGIN 0x2
#define R_START_M 0x3
#define R_CW_BEGIN_M 0x4
#define R_CCW_BEGIN_M 0x5
const unsigned char ttable[6][4] = {
// R_START (00)
{R_START_M, R_CW_BEGIN, R_CCW_BEGIN, R_START},
// R_CCW_BEGIN
{R_START_M | DIR_CCW, R_START, R_CCW_BEGIN, R_START},
// R_CW_BEGIN
{R_START_M | DIR_CW, R_CW_BEGIN, R_START, R_START},
// R_START_M (11)
{R_START_M, R_CCW_BEGIN_M, R_CW_BEGIN_M, R_START},
// R_CW_BEGIN_M
{R_START_M, R_START_M, R_CW_BEGIN_M, R_START | DIR_CW},
// R_CCW_BEGIN_M
{R_START_M, R_CCW_BEGIN_M, R_START_M, R_START | DIR_CCW},
};
#else
#define R_CW_FINAL 0x1
#define R_CW_BEGIN 0x2
#define R_CW_NEXT 0x3
#define R_CCW_BEGIN 0x4
#define R_CCW_FINAL 0x5
#define R_CCW_NEXT 0x6
const unsigned char ttable[7][4] = {
// R_START
{R_START, R_CW_BEGIN, R_CCW_BEGIN, R_START},
// R_CW_FINAL
{R_CW_NEXT, R_START, R_CW_FINAL, R_START | DIR_CW},
// R_CW_BEGIN
{R_CW_NEXT, R_CW_BEGIN, R_START, R_START},
// R_CW_NEXT
{R_CW_NEXT, R_CW_BEGIN, R_CW_FINAL, R_START},
// R_CCW_BEGIN
{R_CCW_NEXT, R_START, R_CCW_BEGIN, R_START},
// R_CCW_FINAL
{R_CCW_NEXT, R_CCW_FINAL, R_START, R_START | DIR_CCW},
// R_CCW_NEXT
{R_CCW_NEXT, R_CCW_FINAL, R_CCW_BEGIN, R_START},
};
#endif
byte rowPins[NUMROWS] = {21,20,19};
byte colPins[NUMCOLS] = {14,16,10,9,8,7};
Keypad buttbx = Keypad( makeKeymap(buttons), rowPins, colPins, NUMROWS, NUMCOLS);
Joystick_ Joystick(JOYSTICK_DEFAULT_REPORT_ID,
JOYSTICK_TYPE_JOYSTICK, 25, 0,
false, false, false, false, false, false,
false, false, false, false, false);
void setup() {
Joystick.begin();
rotary_init();}
void loop() {
CheckAllEncoders();
CheckAllButtons();
}
void CheckAllButtons(void) {
if (buttbx.getKeys())
{
for (int i=0; i<LIST_MAX; i++)
{
if ( buttbx.key[i].stateChanged )
{
switch (buttbx.key[i].kstate) {
case PRESSED:
case HOLD:
Joystick.setButton(buttbx.key[i].kchar, 1);
break;
case RELEASED:
case IDLE:
Joystick.setButton(buttbx.key[i].kchar, 0);
break;
}
}
}
}
}
void rotary_init() {
for (int i=0;i<NUMROTARIES;i++) {
pinMode(rotaries[i].pin1, INPUT);
pinMode(rotaries[i].pin2, INPUT);
#ifdef ENABLE_PULLUPS
digitalWrite(rotaries[i].pin1, HIGH);
digitalWrite(rotaries[i].pin2, HIGH);
#endif
}
}
unsigned char rotary_process(int _i) {
unsigned char pinstate = (digitalRead(rotaries[_i].pin2) << 1) | digitalRead(rotaries[_i].pin1);
rotaries[_i].state = ttable[rotaries[_i].state & 0xf][pinstate];
return (rotaries[_i].state & 0x30);
}
void CheckAllEncoders(void) {
for (int i=0;i<NUMROTARIES;i++) {
unsigned char result = rotary_process(i);
if (result == DIR_CCW) {
Joystick.setButton(rotaries[i].ccwchar, 1); delay(50); Joystick.setButton(rotaries[i].ccwchar, 0);
};
if (result == DIR_CW) {
Joystick.setButton(rotaries[i].cwchar, 1); delay(50); Joystick.setButton(rotaries[i].cwchar, 0);
};
}
}
kod błędów
#define LIST_MAX 18
#define LIST_MAX 10 // Max number of keys on the active list.
sketch_sep20c:94:1: error: 'Joystick_' does not name a type; did you mean 'Joystick'?
Joystick_ Joystick(JOYSTICK_DEFAULT_REPORT_ID,
^~~~~~~~~
Joystick
:
sketch_sep20c:100:11: error: expected unqualified-id before '.' token
Joystick.begin();
^
sketch_sep20c:121:39: error: expected unqualified-id before '.' token
Joystick.setButton(buttbx.key[i].kchar, 1);
^
sketch_sep20c:125:39: error: expected unqualified-id before '.' token
Joystick.setButton(buttbx.key[i].kchar, 0);
^
sketch_sep20c:156:15: error: expected unqualified-id before '.' token
Joystick.setButton(rotaries[i].ccwchar, 1); delay(50); Joystick.setButton(rotaries[i].ccwchar, 0);
^
sketch_sep20c:156:70: error: expected unqualified-id before '.' token
Joystick.setButton(rotaries[i].ccwchar, 1); delay(50); Joystick.setButton(rotaries[i].ccwchar, 0);
^
sketch_sep20c:159:15: error: expected unqualified-id before '.' token
Joystick.setButton(rotaries[i].cwchar, 1); delay(50); Joystick.setButton(rotaries[i].cwchar, 0);
^
sketch_sep20c:159:69: error: expected unqualified-id before '.' token
Joystick.setButton(rotaries[i].cwchar, 1); delay(50); Joystick.setButton(rotaries[i].cwchar, 0);
^
exit status 1
'Joystick_' does not name a type; did you mean 'Joystick'?
can anyone help me this code is not working?
the code is not my authorship on copying something works wrong, the code is on the button box-and it is about 18, has someone explained to me what about this?
Have you tried contacting the person who wrote this?
Frankly, it looks like a mess. I wouldn't bother copying this from someone.
Also, I don't have good experience trying to troubleshoot code from a third party with someone who didn't write it. It too quickly boils down to trying to retrace all the steps of the mystery author and that's tedious work.
Let's take one step back - what are you trying to do?
I'm trying to make a button box for the simulator and thought it would be a good option, but I can't write programs myself and I would like to do it in some simple way.
I immediately inform you that I did via simhub but it works as a keyboard and this makes it difficult for me
Ok, well, if you have no experience with coding and you're using an Arduino for this, then you have chosen something that is certainly not a simple way. I see three feasible options:
1: Use the Arduino, but learn to code as you'll be stuck at every corner otherwise.
2: Get someone else to write the code for you. Maybe someone wants to spend their time on this (most people expect payment though).
3: Buy a ready-made solution.
If it's just to get a button box for a simulator and you have no real interest in embedded systems or Arduinos, I would suggest option 3. It's by far the easiest and smartest solution. Option 1 is a lot of fun, but it's going to cost a lot of time. Option 2 is putting yourself at the mercy of others and it's probably going to cost time and effort to persuade people and you may or may not be happy with the end result.
and on which arduino will be the best to build a button box, because I have a choice at home arduino mega 2560, uno, nano, and if I bought a solution for arduino pro micro, would it work for arduino nano? and will this code be used once?
in the end, would you give me advice to write on arduino nano, I wanted to make this button box for my cousin for his birthday and I know that he likes such gadgets
The code you shared requires one of the following boards:
However I would strongly recommend that you don't attempt to use the Yun, Uno, or Mega because these boards will require very advanced skills to work with for this particular project (the Uno and Mega are great boards for projects that don't need to emulate a joystick though). I also recommend against trying to use the Due. It is a nice board with lots of pins and good specs, but it is more advanced.
The Pro Micro, Micro, or Leonardo are your best choices. Any of those boards will be an excellent place to start with Arduino.
@kampixd1234, your topic has been moved to a more suitable location on the forum. Installation and Troubleshooting is not for problems with (nor for advise on) your project See About the Installation & Troubleshooting category.
I've compiled your code in post #3 for a ProMicro without problems; there are a couple of warnings.
Did you install the (correct) Joystick library?
Regarding the '18'
C:\Users\sterretje\AppData\Local\Temp\arduino_modified_sketch_86101\sketch_sep21a.ino:15:0: warning: "LIST_MAX" redefined
#define LIST_MAX 18
In file included from C:\Users\sterretje\AppData\Local\Temp\arduino_modified_sketch_86101\sketch_sep21a.ino:7:0:
C:\Users\sterretje\Documents\Arduino\libraries\Keypad\src/Keypad.h:69:0: note: this is the location of the previous definition
#define LIST_MAX 10 // Max number of keys on the active list.
This warning means that LIST_MAX is used in the Keypad library and you can't use it in your program for something else. In your sketch, replace all occurences of LIST_MAX by something else, e.g. MAX_BUTTONS.
#define MAX_BUTTONS 18
[edit]
Note that there are other warnings that you can't ignore; I don't have the time to study that.
C:\Users\sterretje\AppData\Local\Temp\arduino_modified_sketch_805101\sketch_sep21a.ino: In function 'CheckAllButtons()':
C:\Users\sterretje\AppData\Local\Temp\arduino_modified_sketch_805101\sketch_sep21a.ino:116:26: warning: iteration 10 invokes undefined behavior [-Waggressive-loop-optimizations]
if ( buttbx.key[i].stateChanged )
~~~~~~~~~~~~~~^~~~~~~~~~~~
C:\Users\sterretje\AppData\Local\Temp\arduino_modified_sketch_805101\sketch_sep21a.ino:114:23: note: within this loop
for (int i = 0; i < MAX_BUTTONS; i++)
C:\Users\sterretje\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\cores\arduino\main.cpp: In function 'main':
C:\Users\sterretje\AppData\Local\Temp\arduino_modified_sketch_805101\sketch_sep21a.ino:116:26: warning: iteration 10 invokes undefined behavior [-Waggressive-loop-optimizations]
if ( buttbx.key[i].stateChanged )
^
C:\Users\sterretje\AppData\Local\Temp\arduino_modified_sketch_805101\sketch_sep21a.ino:114:23: note: within this loop
for (int i = 0; i < MAX_BUTTONS; i++)
^
Sketch uses 9004 bytes (31%) of program storage space. Maximum is 28672 bytes.
Global variables use 473 bytes (18%) of dynamic memory, leaving 2087 bytes for local variables. Maximum is 2560 bytes.
[/edit]
Can you please post your code using code tags. The easiest is:
- In the IDE, use tools -> autoformat; this will properly indent your code.
- In the IDE, use edit -> copy for forum; this will place your code (including the code tags) on the clipboard.
- Paste the content of the clipboard in a reply here.
This is your code, properly formatted and with the above fix.
//BUTTON BOX
//USE w ProMicro
//Tested in WIN10 + Assetto Corsa
//AMSTUDIO
//20.8.17
#include <Keypad.h>
#include <Joystick.h>
#define ENABLE_PULLUPS
#define NUMROTARIES 3
#define NUMBUTTONS 18
#define NUMROWS 3
#define NUMCOLS 6
#define MAX_BUTTONS 18
byte buttons[NUMROWS][NUMCOLS] = {
{1, 2, 3, 4, 5, 6},
{7, 8, 9, 10, 11, 12},
{13, 14, 15, 16, 17, 18},
};
struct rotariesdef {
byte pin1;
byte pin2;
int ccwchar;
int cwchar;
volatile unsigned char state;
};
rotariesdef rotaries[NUMROTARIES] {
{0, 1, 19, 20, 0},
{2, 3, 21, 22, 0},
{4, 5, 23, 24, 0},
};
#define DIR_CCW 0x10
#define DIR_CW 0x20
#define R_START 0x0
#ifdef HALF_STEP
#define R_CCW_BEGIN 0x1
#define R_CW_BEGIN 0x2
#define R_START_M 0x3
#define R_CW_BEGIN_M 0x4
#define R_CCW_BEGIN_M 0x5
const unsigned char ttable[6][4] = {
// R_START (00)
{R_START_M, R_CW_BEGIN, R_CCW_BEGIN, R_START},
// R_CCW_BEGIN
{R_START_M | DIR_CCW, R_START, R_CCW_BEGIN, R_START},
// R_CW_BEGIN
{R_START_M | DIR_CW, R_CW_BEGIN, R_START, R_START},
// R_START_M (11)
{R_START_M, R_CCW_BEGIN_M, R_CW_BEGIN_M, R_START},
// R_CW_BEGIN_M
{R_START_M, R_START_M, R_CW_BEGIN_M, R_START | DIR_CW},
// R_CCW_BEGIN_M
{R_START_M, R_CCW_BEGIN_M, R_START_M, R_START | DIR_CCW},
};
#else
#define R_CW_FINAL 0x1
#define R_CW_BEGIN 0x2
#define R_CW_NEXT 0x3
#define R_CCW_BEGIN 0x4
#define R_CCW_FINAL 0x5
#define R_CCW_NEXT 0x6
const unsigned char ttable[7][4] = {
// R_START
{R_START, R_CW_BEGIN, R_CCW_BEGIN, R_START},
// R_CW_FINAL
{R_CW_NEXT, R_START, R_CW_FINAL, R_START | DIR_CW},
// R_CW_BEGIN
{R_CW_NEXT, R_CW_BEGIN, R_START, R_START},
// R_CW_NEXT
{R_CW_NEXT, R_CW_BEGIN, R_CW_FINAL, R_START},
// R_CCW_BEGIN
{R_CCW_NEXT, R_START, R_CCW_BEGIN, R_START},
// R_CCW_FINAL
{R_CCW_NEXT, R_CCW_FINAL, R_START, R_START | DIR_CCW},
// R_CCW_NEXT
{R_CCW_NEXT, R_CCW_FINAL, R_CCW_BEGIN, R_START},
};
#endif
byte rowPins[NUMROWS] = {21, 20, 19};
byte colPins[NUMCOLS] = {14, 16, 10, 9, 8, 7};
Keypad buttbx = Keypad( makeKeymap(buttons), rowPins, colPins, NUMROWS, NUMCOLS);
Joystick_ Joystick(JOYSTICK_DEFAULT_REPORT_ID,
JOYSTICK_TYPE_JOYSTICK, 25, 0,
false, false, false, false, false, false,
false, false, false, false, false);
void setup() {
Joystick.begin();
rotary_init();
}
void loop() {
CheckAllEncoders();
CheckAllButtons();
}
void CheckAllButtons(void) {
if (buttbx.getKeys())
{
for (int i = 0; i < MAX_BUTTONS; i++)
{
if ( buttbx.key[i].stateChanged )
{
switch (buttbx.key[i].kstate) {
case PRESSED:
case HOLD:
Joystick.setButton(buttbx.key[i].kchar, 1);
break;
case RELEASED:
case IDLE:
Joystick.setButton(buttbx.key[i].kchar, 0);
break;
}
}
}
}
}
void rotary_init() {
for (int i = 0; i < NUMROTARIES; i++) {
pinMode(rotaries[i].pin1, INPUT);
pinMode(rotaries[i].pin2, INPUT);
#ifdef ENABLE_PULLUPS
digitalWrite(rotaries[i].pin1, HIGH);
digitalWrite(rotaries[i].pin2, HIGH);
#endif
}
}
unsigned char rotary_process(int _i) {
unsigned char pinstate = (digitalRead(rotaries[_i].pin2) << 1) | digitalRead(rotaries[_i].pin1);
rotaries[_i].state = ttable[rotaries[_i].state & 0xf][pinstate];
return (rotaries[_i].state & 0x30);
}
void CheckAllEncoders(void) {
for (int i = 0; i < NUMROTARIES; i++) {
unsigned char result = rotary_process(i);
if (result == DIR_CCW) {
Joystick.setButton(rotaries[i].ccwchar, 1); delay(50); Joystick.setButton(rotaries[i].ccwchar, 0);
};
if (result == DIR_CW) {
Joystick.setButton(rotaries[i].cwchar, 1); delay(50); Joystick.setButton(rotaries[i].cwchar, 0);
};
}
}
Arduino:1.8.17 Hourly Build 2021/09/06 02:33 (Windows 10), Płytka:"Arduino Nano, ATmega328P"
sketch_sep21a:93:1: error: 'Joystick_' does not name a type; did you mean 'Joystick'?
Joystick_ Joystick(JOYSTICK_DEFAULT_REPORT_ID,
^~~~~~~~~
Joystick
C:\Users\micha\AppData\Local\Temp\arduino_modified_sketch_320543\sketch_sep21a.ino: In function 'void setup()':
sketch_sep21a:99:11: error: expected unqualified-id before '.' token
Joystick.begin();
^
C:\Users\micha\AppData\Local\Temp\arduino_modified_sketch_320543\sketch_sep21a.ino: In function 'void CheckAllButtons()':
sketch_sep21a:121:21: error: expected unqualified-id before '.' token
Joystick.setButton(buttbx.key[i].kchar, 1);
^
sketch_sep21a:125:21: error: expected unqualified-id before '.' token
Joystick.setButton(buttbx.key[i].kchar, 0);
^
C:\Users\micha\AppData\Local\Temp\arduino_modified_sketch_320543\sketch_sep21a.ino: In function 'void CheckAllEncoders()':
sketch_sep21a:154:15: error: expected unqualified-id before '.' token
Joystick.setButton(rotaries[i].ccwchar, 1); delay(50); Joystick.setButton(rotaries[i].ccwchar, 0);
^
sketch_sep21a:154:70: error: expected unqualified-id before '.' token
Joystick.setButton(rotaries[i].ccwchar, 1); delay(50); Joystick.setButton(rotaries[i].ccwchar, 0);
^
sketch_sep21a:157:15: error: expected unqualified-id before '.' token
Joystick.setButton(rotaries[i].cwchar, 1); delay(50); Joystick.setButton(rotaries[i].cwchar, 0);
^
sketch_sep21a:157:69: error: expected unqualified-id before '.' token
Joystick.setButton(rotaries[i].cwchar, 1); delay(50); Joystick.setButton(rotaries[i].cwchar, 0);
^
exit status 1
'Joystick_' does not name a type; did you mean 'Joystick'?
Ten raport powinien zawierać więcej informacji jeśli w
File -> Preferencje zostanie włączona opcja "Pokaż
szczegółowe informacje podczas kompilacji"
do you know what library i miss? I tried to upload but there is the same error all the time, could you explain to me what library I need and where to get it and how to upload it?
and thanks for your advice in advance.
You're using the wrong board; you need a board that supports native USB. E.g. Leonardo, Micro or SparkFun ProMicro.
This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.