Nextion & Arduino M...
 
Notifications
Clear all

Nextion & Arduino Micro

7 Posts
4 Users
0 Reactions
2,574 Views
(@newyuk)
New Member
Joined: 3 years ago
Posts: 4
Topic starter  

Hi All

This is my first post in the Simhub community but I have been using the software for a while and absolutely love it. I designed and implemented my own dash using a small HDMI screen for my first project and I keep updating it with more and more data. 

But recently I have designed and printed my first sim wheel that incorporates a Nextion 3.5" screen attached to an Arduino Micro board. I have some code that uses Keypad.h for my buttons and rotary encoders that works very well. I can upload the NextionMicroBridge.ino that is provided with Simhub to get the screen to work, but when I put the code together the buttons stop working because of the Joystick.h code that is in the Micro Bridge. I am not a coder so don't fully understand how to strip out what I need. 

What I'm looking for is a bit of code that links the serial of the Micro to Nextion that works with Simhub without all the LED and JOYSTICK code.

Can anyone please help???


   
Quote
(@admin5435)
Prominent Member Admin
Joined: 7 years ago
Posts: 736
 

Hi ! The underlying basis of the sketch is a simple TTL bridge like this one, 
https://petervanhoyweghen.wordpress.com/2012/11/08/using-the-leonardo-as-usb-to-serial-converter/

This minimal code should be enough :

/*
  leo_usb2serial
  Allows to use an Arduino Leonardo as an usb to serial converter.
 */
static long baud = 57600;
static long newBaud = baud;

// this pin will output the DTR signal (as set by the pc)
#define DTR_PIN 13

#define LINESTATE_DTR  1

void lineCodingEvent(long baud, byte databits, byte parity, byte charFormat)
{
  newBaud = baud;
}

void lineStateEvent(unsigned char linestate)
{
  if(linestate & LINESTATE_DTR)
    digitalWrite(DTR_PIN, HIGH);
  else
    digitalWrite(DTR_PIN, LOW);
}

void setup() {
  pinMode(DTR_PIN, OUTPUT);
  digitalWrite(DTR_PIN, LOW);
  Serial.begin(baud);
  Serial1.begin(baud);
}

void loop() {

  // Set the new baud rate
  if(newBaud != baud) {
    baud = newBaud;
    Serial1.end();
    Serial1.begin(baud);
  }

  // copy from virtual serial line to uart and vice versa
  if (Serial.available()) {
    char c = (char)Serial.read();
    Serial1.write(c);
  }
  if (Serial1.available()) {
    char c = (char)Serial1.read();
    Serial.write(c);
  }
}

If you add things in it, take care not to introduce any "delay" functions, it would make the communication hang, and cause disconnects and/or wrong results on the screen.


   
ReplyQuote
(@newyuk)
New Member
Joined: 3 years ago
Posts: 4
Topic starter  

The Man Himself !!!!

I feel honoured. I will give this a go and report back. Thanks so much, for the very prompt response.


   
ReplyQuote
(@newyuk)
New Member
Joined: 3 years ago
Posts: 4
Topic starter  

Hey

So I have the same issue of putting the two bits of code together I can make it work.

Below is the code that works for my buttons, where would I place the code you supplied?

I really do appreciate your help !!!!!

#include <Keypad.h>
#include <Joystick.h>

//DEFINITIONS
#define ENABLE_PULLUPS
#define NUMROTARIES 3 //replace "?" with number of rotary encoders you are using
#define NUMBUTTONS 17 //replace "?"with number of buttong you are using
#define NUMROWS 5 //replace "?" with number of rows you have
#define NUMCOLS 4 //replace "?" with number of columns you have

//BUTTON MATRIX
//first change number of rows and columns to match your button matrix,
//then replace all "?" with numbers (starting from 0)
byte buttons[NUMROWS][NUMCOLS] = {
{0,1},
{2,3,4,5},
{6,7,8,9},
{10,11,12,13},
{14,15,16}
};

struct rotariesdef {
byte pin1;
byte pin2;
int ccwchar;
int cwchar;
volatile unsigned char state;
};

//ROTARY ENCODERS
//each line controls a different rotary encoder
//the first two numbers refer to the pins the encoder is connected to
//the second two are the buttons each click of the encoder wil press
//do NOT exceed 31 for the final button number
rotariesdef rotaries[NUMROTARIES] {
{A0,A1,26,27,0}, //rotary 1
{A2,A3,28,29,0}, //rotary 2
{A4,A5,30,31,0} //rotary 2

 

};

#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

//BUTTON MATRIX PART 2
byte rowPins[NUMROWS] = {2,3,4,5,6}; //change "?" to the pins the rows of your button matrix are connected to
byte colPins[NUMCOLS] = {7,8,9,10}; //change "?" to the pins the rows of your button matrix are connected to

Keypad buttbx = Keypad( makeKeymap(buttons), rowPins, colPins, NUMROWS, NUMCOLS);

//JOYSTICK SETTINGS
Joystick_ Joystick(JOYSTICK_DEFAULT_REPORT_ID,
JOYSTICK_TYPE_JOYSTICK,
32, //number of buttons
0, //number of hat switches
//Set as many axis to "true" as you have potentiometers for
false, // y axis
false, // x axis
false, // z axis
false, // rx axis
false, // ry axis
false, // rz axis
false, // rudder
false, // throttle
false, // accelerator
false, // brake
false); // steering wheel

const int numReadings = 20;

int readings[numReadings]; // the readings from the analog input
int index = 0; // the index of the current reading
int total = 0; // the running total
int currentOutputLevel = 0;

//POTENTIOMETERS PART 1
//add all the axis' which are enabled above
int zAxis_ = 0;
int RxAxis_ = 0;

//POTENTIOMETERS PART 2
//Which pins are your potentiometers connected to?
int potentiometerPin1 = 0; //Change "?" to the pin your potentiometer is connected to
int potentiometerPin2 = 0;
const bool initAutoSendState = true;
void setup() {
Joystick.begin();
rotary_init();
for (int thisReading = 0; thisReading < numReadings; thisReading++) {
readings[thisReading] = 0;
}
}

void loop() {

CheckAllEncoders();
CheckAllButtons();
CheckAllPotentiometers();

}

//POTENTIOMETERS PART 3
//change the details to match teh details above for each potentiometer you are using
void CheckAllPotentiometers(){

//potentiometer 1
currentOutputLevel = getAverageOutput(potentiometerPin1);
zAxis_ = map(currentOutputLevel,0,1023,0,255);
Joystick.setZAxis(zAxis_);

//potentiometer 2
currentOutputLevel = getAverageOutput(potentiometerPin2);
RxAxis_ = map(currentOutputLevel,0,1023,0,255);
Joystick.setRxAxis(RxAxis_);

}

int getAverageOutput(int pinToRead){
index = 0;
total = 0;

while (index < numReadings){
readings[index] = analogRead(pinToRead);
total = total + readings[index];
index = index + 1;
//delay (1);
}
return total / numReadings;
}

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) {
//Serial.print("Processing rotary: ");
//Serial.println(_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) {
Serial.println("Checking rotaries");
for (int i=0;i<NUMROTARIES;i++) {
unsigned char result = rotary_process(i);
if (result == DIR_CCW) {
Serial.print("Rotary ");
Serial.print(i);
Serial.println(" <<< Going CCW");
Joystick.setButton(rotaries[i].ccwchar, 1); delay(50); Joystick.setButton(rotaries[i].ccwchar, 0);
};
if (result == DIR_CW) {
Serial.print("Rotary ");
Serial.print(i);
Serial.println(" >>> Going CW");
Joystick.setButton(rotaries[i].cwchar, 1); delay(50); Joystick.setButton(rotaries[i].cwchar, 0);
};
}
Serial.println("Done checking");
}


   
ReplyQuote
(@newyuk)
New Member
Joined: 3 years ago
Posts: 4
Topic starter  

Hey.

Got it all sorted in the end.

Thanks again for your help.


   
ReplyQuote
(@dave3520)
New Member
Joined: 3 years ago
Posts: 1
 

@newyuk 

I'm struggling to incorporate the Nextion Mirco Bridge code with code to enable buttons and rotary encoders (I have zero coding experience). Would you mind sharing how you got this working? 

Thanks in advance. 


   
ReplyQuote
(@mckosen)
New Member
Joined: 2 years ago
Posts: 1
 

Hey, Im looking for your code that combined button matrix, encoders, leds and nextion, Could you share your codes?


   
ReplyQuote
Share: