Closed dmacias72 closed 3 years ago
Did you modify defines.h to add freePins for ESP8266?
Sorry it was 8 months ago and i barely remember what I did. But here is my Defines.h I believe I used if that helps. ` /* OpenSprinkler Unified (AVR/RPI/BBB/LINUX) Firmware
/* Firmware version, hardware version, and maximal values /
// if this number is different from the one stored in non-volatile memory
// a device reset will be automatically triggered
/* Hardware version base numbers /
/* Hardware type macro defines /
/* File names /
/* Station type macro defines /
/* Sensor type macro defines /
/* Hardware defines /
/* Non-volatile memory (NVM) defines /
/** 2KB NVM (ATmega644) data structure:
* | | | ---STRING PARAMETERS--- | | ----STATION ATTRIBUTES----- | |
* | PROGRAM | CON | PWD | LOC | JURL | WURL | KEY | STN_NAMES | MAS | IGR | MAS2 | DIS | SEQ | SPE | OPTIONS |
* | (996) |(12) |(36) |(48) | (40) | (40) |(24) | (768) | (6) | (6) | (6) | (6) | (6) | (6) | (48) |
* | | | | | | | | | | | | | | | |
* 0 996 1008 1044 1092 1132 1172 1196 1964 1970 1976 1982 1988 1994 2000 2048
*/
/** 4KB NVM (ATmega1284) data structure:
* | | | ---STRING PARAMETERS--- | | ----STATION ATTRIBUTES----- | |
* | PROGRAM | CON | PWD | LOC | JURL | WURL | KEY | STN_NAMES | MAS | IGR | MAS2 | DIS | SEQ | SPE | OPTIONS |
* | (2438) |(12) |(36) |(48) | (48) | (48) |(24) | (1344) | (7) | (7) | (7) | (7) | (7) | (7) | (56) |
* | | | | | | | | | | | | | | | |
* 0 2438 2450 2486 2534 2582 2630 2654 3998 4005 4012 4019 4026 4033 4040 4096
*/
#if defined(__AVR_ATmega1284P__) || defined(__AVR_ATmega1284__)//|| defined(BATTERY) // for 4KB NVM
#define MAX_EXT_BOARDS 6 // maximum number of exp. boards (each expands 8 stations)
#define MAX_NUM_STATIONS ((1+MAX_EXT_BOARDS)*8) // maximum number of stations
#define NVM_SIZE 4096 // For AVR, nvm data is stored in EEPROM, ATmega1284 has 4K EEPROM
#define STATION_NAME_SIZE 24 // maximum number of characters in each station name
#define MAX_PROGRAMDATA 2438 // program data
#define MAX_NVCONDATA 12 // non-volatile controller data
#define MAX_USER_PASSWORD 36 // user password
#define MAX_LOCATION 48 // location string
#define MAX_JAVASCRIPTURL 48 // javascript url
#define MAX_WEATHERURL 48 // weather script url
#define MAX_WEATHER_KEY 24 // weather api key
#else
#define MAX_EXT_BOARDS 5 // maximum number of exp. boards (each expands 8 stations)
#define MAX_NUM_STATIONS ((1+MAX_EXT_BOARDS)*8) // maximum number of stations
#define NVM_SIZE 3072
#define NVM_SIZE 2048 // For AVR, nvm data is stored in EEPROM, ATmega644 has 2K EEPROM
#define STATION_NAME_SIZE 16 // maximum number of characters in each station name
#define MAX_PROGRAMDATA 996 // program data
#define MAX_NVCONDATA 12 // non-volatile controller data
#define MAX_USER_PASSWORD 36 // user password
#define MAX_LOCATION 48 // location string
#define MAX_JAVASCRIPTURL 40 // javascript url
#define MAX_WEATHERURL 40 // weather script url
#define MAX_WEATHER_KEY 24 // weather api key,
#endif
// These are kept the same as AVR for compatibility reasons
// But they can be increased if needed
#define NVM_FILENAME "nvm.dat" // for RPI/BBB, nvm data is stored in a file
#define MAX_EXT_BOARDS 6 // maximum number of exp. boards (each expands 8 stations)
#define MAX_NUM_STATIONS ((1+MAX_EXT_BOARDS)*8) // maximum number of stations
#define NVM_SIZE 4096
#define STATION_NAME_SIZE 24 // maximum number of characters in each station name
#define MAX_PROGRAMDATA 2438 // program data
#define MAX_NVCONDATA 12 // non-volatile controller data
#define MAX_USER_PASSWORD 36 // user password
#define MAX_LOCATION 48 // location string
#define MAX_JAVASCRIPTURL 48 // javascript url
#define MAX_WEATHERURL 48 // weather script url
#define MAX_WEATHER_KEY 24 // weather api key
/* NVM data addresses /
/* Default password, location string, weather key, script urls /
/** Macro define of each option
typedef enum { OPTION_FW_VERSION = 0, OPTION_TIMEZONE, OPTION_USE_NTP, OPTION_USE_DHCP, OPTION_STATIC_IP1, OPTION_STATIC_IP2, OPTION_STATIC_IP3, OPTION_STATIC_IP4, OPTION_GATEWAY_IP1, OPTION_GATEWAY_IP2, OPTION_GATEWAY_IP3, OPTION_GATEWAY_IP4, OPTION_HTTPPORT_0, OPTION_HTTPPORT_1, OPTION_HW_VERSION, OPTION_EXT_BOARDS, OPTION_SEQUENTIAL_RETIRED, OPTION_STATION_DELAY_TIME, OPTION_MASTER_STATION, OPTION_MASTER_ON_ADJ, OPTION_MASTER_OFF_ADJ, OPTION_SENSOR_TYPE, OPTION_RAINSENSOR_TYPE, OPTION_WATER_PERCENTAGE, OPTION_DEVICE_ENABLE, OPTION_IGNORE_PASSWORD, OPTION_DEVICE_ID, OPTION_LCD_CONTRAST, OPTION_LCD_BACKLIGHT, OPTION_LCD_DIMMING, OPTION_BOOST_TIME, OPTION_USE_WEATHER, OPTION_NTP_IP1, OPTION_NTP_IP2, OPTION_NTP_IP3, OPTION_NTP_IP4, OPTION_ENABLE_LOGGING, OPTION_MASTER_STATION_2, OPTION_MASTER_ON_ADJ_2, OPTION_MASTER_OFF_ADJ_2, OPTION_FW_MINOR, OPTION_PULSE_RATE_0, OPTION_PULSE_RATE_1, OPTION_REMOTE_EXT_MODE, OPTION_RESET,
D_SLEEP_DURATION,
D_SLEEP_START_TIME,
D_SLEEP_INTERVAL,
MIN_VOLTS_D_SLEEP,
MIN_VOLTS_L_SLEEP,
L_SLEEP_DURATION,
BATTERY_mAH,
NUM_OPTIONS // total number of options
} OS_OPTION_t;
/* Log Data Type /
/* READ ME - PIN_EXT_BOARDS defines the total number of discrete digital IO pins
used to control watering stations. There are 8 stations per extender board, that
MUST have PIN_EXT_BOARDS x 8 pins defined below (otherwise you'll get out of range
issues with the array of pins defined in OpenSprinklerGen2.cpp) */
#define PIN_EXT_BOARDS 2
/* Use these pins when the control signal to switch watering solenoids on and off
is driven directly from the arduino digital output pins (i.e. not using a shift register
like the regular opensprinkler hardware) */
#define PIN_STN_S01 46
#define PIN_STN_S02 44
#define PIN_STN_S03 42
#define PIN_STN_S04 40
#define PIN_STN_S05 47
#define PIN_STN_S06 45
#define PIN_STN_S07 43
#define PIN_STN_S08 41
#define PIN_STN_S09 32
#define PIN_STN_S10 34
#define PIN_STN_S11 36
#define PIN_STN_S12 38
#define PIN_STN_S13 33
#define PIN_STN_S14 35
#define PIN_STN_S15 37
#define PIN_STN_S16 39
#define PIN_RF_DATA 30 // RF data pin - efault is 38
#define PORT_RF PORTA
#define PINX_RF PINA3
// hardware pins
#define PIN_BUTTON_1 31 // button 1
#define PIN_BUTTON_2 30 // button 2
#define PIN_BUTTON_3 29 // button 3
#define PIN_RF_DATA 28 // RF data pin
#define PORT_RF PORTA
#define PINX_RF PINA3
#define PIN_SR_LATCH 3 // shift register latch pin
#define PIN_SR_DATA 21 // shift register data pin
#define PIN_SR_CLOCK 22 // shift register clock pin
#define PIN_SR_OE 1 // shift register output enable pin
/*#define PIN_BUTTON_1 31 // button 1
*/
//#define PIN_SR_OE // shift register output enable pin
/* Note - D4 on the Freetronics LCD shield clashes with the
chipselect pin for the SD card that is also D4 on some W5100 shields.
You may need to jumper it to D2 as described at:
http://forum.freetronics.com/viewtopic.php?t=770 */
// Freetronics LCD with pin D4 bridged to pin D2
#define PIN_LCD_RS 8 // LCD rs pin
#define PIN_LCD_EN 9 // LCD enable pin
#define PIN_LCD_D4 2 // LCD D4 pin
#define PIN_LCD_D5 5 // LCD D5 pin
#define PIN_LCD_D6 6 // LCD D6 pin
#define PIN_LCD_D7 7 // LCD D7 pin
#define PIN_LCD_BACKLIGHT 3 // LCD backlight pin
#define PIN_LCD_CONTRAST A1 // LCD contrast pin - NOT USED FOR FREETRONICS LCD (just set this to an unused pin)
/* // Freetronics LCD
#define PIN_LCD_EN 9 // LCD enable pin - default = 18
#define PIN_LCD_D4 4 // LCD d4 pin - default = 20
#define PIN_LCD_D5 5 // LCD d5 pin - default = 21
#define PIN_LCD_D6 6 // LCD d6 pin - default = 22
#define PIN_LCD_D7 7 // LCD d7 pin - default = 23
#define PIN_LCD_BACKLIGHT 3 // LCD backlight pin - default = 12
#define PIN_LCD_CONTRAST A1 // LCD contrast pin - NOT USED FOR FREETRONICS LCD (just set this to an unused pin)
*/ // some example macros with friendly labels for LCD backlight / pin control
#define LCD_BACKLIGHT_ON() digitalWrite( PIN_LCD_BACKLIGHT, HIGH )
#define LCD_BACKLIGHT(state) {if( state ){digitalWrite( PIN_LCD_BACKLIGHT, HIGH );}else{digitalWrite( PIN_LCD_BACKLIGHT, LOW );} }
#define BUTTON_ADC_PIN A0 // A0 is the button ADC input
// regular 16x2 LCD pin defines
#define PIN_LCD_RS 19 // LCD rs pin
#define PIN_LCD_EN 18 // LCD enable pin
#define PIN_LCD_D4 20 // LCD d4 pin
#define PIN_LCD_D5 21 // LCD d5 pin
#define PIN_LCD_D6 22 // LCD d6 pin
#define PIN_LCD_D7 23 // LCD d7 pin
#define PIN_LCD_BACKLIGHT 12 // LCD backlight pin
#define PIN_LCD_CONTRAST 13 // LCD contrast pin
// ADC readings expected for the 5 buttons on the ADC input
// DC controller pin defines
#define PIN_BOOST 20 // booster pin
#define PIN_BOOST_EN 23 // boost voltage enable pin
#define PIN_HEARTBEAT 13 // Pin to show a heartbeat LED
#define PIN_ETHER_CS 10 // Ethernet controller chip select pin - default is 10
#define PIN_SD_CS 4 // SD card chip select pin - default is 4
// Define the chipselect pins for all SPI devices attached to the arduino
// Unused pins needs to be pulled high otherwise SPI doesn't work properly
#define SPI_DEVICES 0 // number of SPI devices
const uint8_t spi_ss_pin[] = // SS pin for each device
{
53, // SD card chipselect on standard Arduino W5100 Ethernet board
34 // Ethernet chipselect on standard Arduino W5100 Ethernet board
};
#define PIN_ETHER_CS 53 // Ethernet controller chip select pin
#define PIN_SD_CS 34 // SD card chip select pin
// You'll need to use different pins for these items if you have them connected
// Ethernet buffer size
extern byte DB; // db_mask opensprinklerserver 32 // utils 8 // opensprinklermain 2 // ethercardW5100 4 // weather 16
//#define DEBUG_BEGIN(x) {}
typedef unsigned char uint8_t;
typedef unsigned int uint16_t;
typedef int int16_t;
typedef const char prog_char;
typedef const char prog_uchar;
/* OSPi pin defines /
/* BBB pin defines /
// these are gpio pin numbers, refer to // https://github.com/mkaczanowski/BeagleBoneBlack-GPIO/blob/master/GPIO/GPIOConst.cpp
// For Linux or other software simulators // use fake hardware pins
inline void DEBUG_PRINT ( int x ) { printf ( "%d", x ); } inline void DEBUG_PRINT ( const char*s ) { printf ( "%s", s ); }
inline void itoa ( int v,char s,int b ) { sprintf ( s,"%d",v ); } inline void ultoa ( unsigned long v,char s,int b ) { sprintf ( s,"%lu",v ); }
/* Re-define avr-specific (e.g. PGM) types to use standard types /
typedef const char prog_char; typedef const char prog_uchar; typedef const char* PGM_P; typedef unsigned char uint8_t; typedef short int16_t; typedef unsigned short uint16_t; typedef bool boolean;
/* Other defines / // button values
// button status values
// button timing values
// button mode values
typedef unsigned char byte; typedef unsigned long ulong;
`
Ok I think I remember now. The freePins is a fixed variable in the app in main.js. Since I don't meet the criteria below the value is null. So what I was asking was if it could be defined in firmware and picked up by the web app or just be allowed to manually configure it in the app. Everything works right now. I just have to define the GPIO for each station through the API. I just can't click on GPIO and be presented with a pin to select.
if ( getHWVersion() === "OSPi" ) { freePins = [ 5, 6, 7, 8, 9, 10, 11, 12, 13, 16, 18, 19, 20, 21, 23, 24, 25, 26 ]; } else if ( getHWVersion() === "2.3" ) { freePins = [ 2, 10, 12, 13, 14, 15, 18, 19 ]; }
I don't recommend making this change for OS 3.x, because OS 3.x has pretty much no spare pin. You can certainly create a freePin list, but the issue is that the firmware will still use these pins for things like sensors, etc, even if you don't actually need any sensor. To allow free pins would require commenting out large chunks of the firmware code that operates those pins. I would recommend staying with OSPi and OS2.3 if you want GPIO stations.
Yes the list of configurable pins could be passed from the firmware to the UI, instead of separately defining them in both the firmware and UI. This can be considered for future firmware changes.
I only need a few stations triggered by relays. I compiled 2.1.8 OS 3.0 unified firmware on my own esp8266 with a PCF8574. I had edited the defines.h, added the address of the PCF8574 and moved the pin definitions to it. Also created an array of my free pins for the usable free pins on the esp8266. The problem is the app gives me a js error when i click on GPIO. I believe because I'm not running ospi or 2.3. So the freePins var is not defined. So right now I set them through api calls and everything works great. I don't know if the pins could be pulled from the firmware or just allow manual entry.