// Sample mySetup.cpp file. // // To use this file, copy it to mySetup.cpp and uncomment the directives and/or // edit them to satisfy your requirements. // Note that if the file has a .cpp extension it WILL be compiled into the build // and the mySetup() function WILL be invoked. // // To prevent this, temporarily rename it to mySetup.txt or similar. // // Only the #include directives relating to the devices in use need be included here. #include "IODevice.h" #include "IO_HCSR04.h" #include "IO_VL53L0X.h" #include "DFPlayer.h" #include "IO_Network.h" #include "Net_RF24" #include "Net_ENC28J60" #include "Net_Ethernet" // Examples of statically defined HAL directives (alternative to the create() call). // These have to be outside of the mySetup() function. //======================================================================= // The following directive defines a PCA9685 PWM Servo driver module. //======================================================================= // The parameters are: // First Vpin=100 // Number of VPINs=16 (numbered 100-115) // I2C address of module=0x40 //PCA9685 pwmModule1(100, 16, 0x40); //======================================================================= // The following directive defines an MCP23017 16-port I2C GPIO Extender module. //======================================================================= // The parameters are: // First Vpin=196 // Number of VPINs=16 (numbered 196-211) // I2C address of module=0x22 //MCP23017 gpioModule2(196, 16, 0x22); // Alternative form, which allows the INT pin of the module to request a scan // by pulling Arduino pin 40 to ground. Means that the I2C isn't being polled // all the time, only when a change takes place. Multiple modules' INT pins // may be connected to the same Arduino pin. //MCP23017 gpioModule2(196, 16, 0x22, 40); //======================================================================= // The following directive defines an MCP23008 8-port I2C GPIO Extender module. //======================================================================= // The parameters are: // First Vpin=300 // Number of VPINs=8 (numbered 300-307) // I2C address of module=0x22 //MCP23008 gpioModule3(300, 8, 0x22); //======================================================================= // The following directive defines a PCF8574 8-port I2C GPIO Extender module. //======================================================================= // The parameters are: // First Vpin=200 // Number of VPINs=8 (numbered 200-207) // I2C address of module=0x23 //PCF8574 gpioModule4(200, 8, 0x23); // Alternative form using INT pin (see above) //PCF8574 gpioModule4(200, 8, 0x23, 40); //======================================================================= // The function mySetup() is invoked from CS if it exists within the build. // It is called just before mysetup.h is executed, so things set up within here can be // referenced by commands in mySetup.h. //======================================================================= void mySetup() { // Alternative way of creating a module driver, which has to be within the mySetup() function // The other devices can also be created in this way. The parameter lists for the // create() function are identical to the parameter lists for the declarations. //MCP23017::create(196, 16, 0x22); //======================================================================= // Play mp3 files from a Micro-SD card, using a DFPlayer MP3 Module. //======================================================================= // Parameters: // 10000 = first VPIN allocated. // 10 = number of VPINs allocated. // Serial1 = name of serial port (usually Serial1 or Serial2). // With these parameters, up to 10 files may be played on pins 10000-10009. // Play is started from EX-RAIL with SET(10000) for first mp3 file, SET(10001) // for second file, etc. Play may also be initiated by writing an analogue // value to the first pin, e.g. SERVO(10000,23,0) will play the 23rd mp3 file. // SERVO(10000,23,30) will do the same thing, as well as setting the volume to // 30 (maximum value). // Play is stopped by RESET(10000) (or any other allocated VPIN). // Volume may also be set by writing an analogue value to the second pin for the player, // e.g. SERVO(10001,30,0) sets volume to maximum (30). // The EX-RAIL script may check for completion of play by calling WAITFOR(pin), which will only proceed to the // following line when the player is no longer busy. // E.g. // SEQUENCE(1) // AT(164) // Wait for sensor attached to pin 164 to activate // SET(10003) // Play fourth MP3 file // LCD(4, "Playing") // Display message on LCD/OLED // WAITFOR(10003) // Wait for playing to finish // LCD(4, " ") // Clear LCD/OLED line // FOLLOW(1) // Go back to start // DFPlayer::create(10000, 10, Serial1); //======================================================================= // Remote (networked) VPIN Configuration //======================================================================= // Define remote pins to be used. The range of remote pins is like a common data area shared // between all nodes. // For outputs, a write to a remote VPIN causes a message to be sent to another node, which then performs // the write operation on the device VPIN that is local to that node. // For inputs, the state of remote input VPIN is read on the node where it is connected, and then // sent to other nodes in the system where the state is saved and processed. Updates are sent on change, and // also periodically if no changes. // // Currently, analogue inputs are not enabled for remote access. // // Each definition is a triple of remote node, remote pin, type, indexed by relative pin. // Each pin may be an input whose value is to be read before being transmitted (RPIN_IN), // an output which is to be triggered when written to (RPIN_OUT) or both (RPIN_INPUT), // such as a servo or DFPlayer device pin. Unused pins (e.g. spares to reserve contiguous // pin sequences) should be defined sd VPIN_NONE with 0 as the type. // Where possible, align the input and inout pins on an offset which is a multiple of 8 // from the start of the remote pins, as in the example below. // // There is a limit of 224 in the number of pin states per node that are sent // over the network (to keep the number of sent messages to 1 x 32 bytes). This restriction // may be lifted in future. // // In the example below with two nodes 30 and 31, // a turnout object set to operate pin 4004 will operate the servo connected to // VPIN 100 on node 30; // a sensor object monitoring pin 4024 will trigger if pin D24 on node // 31 activates; // an output object associated with pin 4002 will, when set on, activate // pin 166 (MCP23017 pin 3) on node 30. // // All nodes on the same network should use the same REMOTEPINS setup, and the // node number of each node should be set to a different number. // // REMOTEPINS rpins[] = { // {30,164,RPIN_IN} , //4000 Node 30, first MCP23017 pin, input // {30,165,RPIN_IN}, //4001 Node 30, second MCP23017 pin, input // {30,166,RPIN_OUT}, //4002 Node 30, third MCP23017 pin, output // {30,166,RPIN_OUT}, //4003 Node 30, fourth MCP23017 pin, output // {30,100,RPIN_INOUT}, //4004 Node 30, first PCA9685 servo pin // {30,101,RPIN_INOUT}, //4005 Node 30, second PCA9685 servo pin // {30,102,RPIN_INOUT}, //4006 Node 30, third PCA9685 servo pin // {30,103,RPIN_INOUT}, //4007 Node 30, fourth PCA9685 servo pin // {30,24,RPIN_IN}, //4008 Node 30, Arduino pin D24 // {30,25,RPIN_IN}, //4009 Node 30, Arduino pin D25 // {30,26,RPIN_IN}, //4010 Node 30, Arduino pin D26 // {30,27,RPIN_IN}, //4011 Node 30, Arduino pin D27 // {30,VPIN_NONE,0}, //4012 Node 30, spare // {30,VPIN_NONE,0}, //4013 Node 30, spare // {30,VPIN_NONE,0}, //4014 Node 30, spare // {30,VPIN_NONE,0}, //4015 Node 30, spare // // {31,164,RPIN_IN} , //4016 Node 31, first MCP23017 pin, input // {31,165,RPIN_IN}, //4017 Node 31, second MCP23017 pin, input // {31,166,RPIN_OUT}, //4018 Node 31, third MCP23017 pin, output // {31,166,RPIN_OUT}, //4019 Node 31, fourth MCP23017 pin, output // {31,100,RPIN_INOUT}, //4020 Node 31, first PCA9685 servo pin // {31,101,RPIN_INOUT}, //4021 Node 31, second PCA9685 servo pin // {31,102,RPIN_INOUT}, //4022 Node 31, third PCA9685 servo pin // {31,103,RPIN_INOUT}, //4023 Node 31, fourth PCA9685 servo pin // {31,24,RPIN_IN}, //4024 Node 31, Arduino pin D24 // {31,25,RPIN_IN}, //4025 Node 31, Arduino pin D25 // {31,26,RPIN_IN}, //4026 Node 31, Arduino pin D26 // {31,27,RPIN_IN}, //4027 Node 31, Arduino pin D27 // {31,VPIN_NONE,0}, //4028 Node 31, spare // {31,VPIN_NONE,0}, //4029 Node 31, spare // {31,VPIN_NONE,0}, //4030 Node 31, spare // {31,VPIN_NONE,0} //4031 Node 31, spare // }; // Network using RF24 wireless module, with CE on pin 48 and CS on pin 49 and node=30 // Net_RF24 *rf24Driver = new Net_RF24(48, 49); // Network::create(4000, NUMREMOTEPINS(rpins), 30, rpins, rf24Driver); // Network using ENC28J60 ethernet module, with CS on pin 49 and node=30 // Net_ENC28J60 *encDriver = new Net_ENC28J60(49); // Network::create(4000, NUMREMOTEPINS(rpins), 30, rpins, encDriver); // Network using Arduino Ethernet library, with CS on default pin (10) and node=30 // This would be the option selected if you already use ethernet for DCC++EX // commands. // Net_Ethernet *etherDriver = new Net_Ethernet(); // Network::create(4000, NUMREMOTEPINS(rpins), 30, rpins, etherDriver); }