This is an adaption of the ttn-otaa example by Thomas Telkamp and Matthijs Kooijman for Adafruit Feather 32u4 with RFM95 LoRa Radio module.
This was tested with Arduino IDE version 1.8.5.

// Uncomment this to disable all code related to ping
#define DISABLE_PING
// Uncomment this to disable all code related to beacon tracking.
// Requires ping to be disabled too
#define DISABLE_BEACONSRegister a new device in The Things Network Console You will get a
You now have to add these values in the source code:
static const u1_t PROGMEM APPEUI[8]= { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
void os_getArtEui (u1_t* buf) { memcpy_P(buf, APPEUI, 8);}
// This should also be in little endian format, see above.
static const u1_t PROGMEM DEVEUI[8]= { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
void os_getDevEui (u1_t* buf) { memcpy_P(buf, DEVEUI, 8);}
// This key should be in big endian format (or, since it is not really a
// number but a block of memory, endianness does not really apply). In
// practice, a key taken from ttnctl can be copied as-is.
// The key shown here is the semtech default key.
static const u1_t PROGMEM APPKEY[16] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };Please note that APP EUI and Device EUI have to be specified in "little endian format". There are buttons in the TTN console that help you to convert the number sequences into LSB format.

Note: The use of a so-called Single-Channel-Gateway is not recommended, as it only supports one of the three join frequencies. So, you only have 1:3 chance that the join operation actually hits the single one supported frequency. Additionally, it is unclear if these kind of gateways support the communication from TTN back to the device, so probably you will never ever get a feedback that the join operation was successful.