Working with this code and I see it uses [Outlets] byte and try to figure out how to digialWrite pins .
Also would like to figure out how to use the override menu but don,t understand the code instructions givin with code in override menu can any help me with some examples using this code.Here is the first part.
#include <avr/pgmspace.h> // library for keeping variables in Flash RAM
#include <ooPinChangeInt.h>
#include <AdaEncoder.h> // adafruit.com eoncoder routine.
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define menuTimeout 10000 //delay before settings menus time out & return
#define sumpLevelSwitchPin 2
#define EncoderPin1 A0 // Rotary Encoder Pins
#define EncoderPin2 A1 //
#define buttonPin A2 // pin for encoder button
#define ATOlevel 20
#define FanPin 0
#define Heater1Pin 1
#define Heater2Pin 2
#define Light1Pin 3
#define Light2Pin 4
#define Light3Pin 5
#define ATOPin 6
#define SkimmerPin 7
#define Powerhead1Pin 8
#define Powerhead2Pin 9
#define Powerhead3Pin 10
#define ReturnPumpPin 11
#define CircPumpPin 12
#define Doser1Pin 13
#define Doser2Pin 14
#define AuxPin 15
unsigned long lastTime;
unsigned long lastMills = 0;
unsigned long timeout;
byte Outlets[16] = {
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
};
char buffer[18];
const char mainMenu1[] PROGMEM = "1.Feed ";
const char mainMenu2[] PROGMEM = "2.Man Override ";
const char mainMenu3[] PROGMEM = "3.Exit ";
const char *const mainMenu[]PROGMEM = {
mainMenu1, mainMenu2, mainMenu3
};
const char OverrideMenu0[] PROGMEM = "1. Fan ";
const char OverrideMenu1[] PROGMEM = "2. Heater 1 ";
const char OverrideMenu2[] PROGMEM = "3. Heater 2 ";
const char OverrideMenu3[] PROGMEM = "4. Light1 ";
const char OverrideMenu4[] PROGMEM = "5. Light2 ";
const char OverrideMenu5[] PROGMEM = "6. Light3 ";
const char OverrideMenu6[] PROGMEM = "7. ATO ";
const char OverrideMenu7[] PROGMEM = "8. Skimmer ";
const char OverrideMenu8[] PROGMEM = "9. Powerhead 1 ";
const char OverrideMenu9[] PROGMEM = "10.Powerhead 2 ";
const char OverrideMenu10[] PROGMEM = "11.Powerhead 3 ";
const char OverrideMenu11[] PROGMEM = "12.Return Pump ";
const char OverrideMenu12[] PROGMEM = "13.Circ Pump ";
const char OverrideMenu13[] PROGMEM = "14.Dosing Pump1";
const char OverrideMenu14[] PROGMEM = "15.Dosing Pump2";
const char OverrideMenu15[] PROGMEM = "16.Aux Outlet ";
const char OverrideMenu16[] PROGMEM = "17.Exit ";
const char *const OverrideMenu[]PROGMEM = {
OverrideMenu0, OverrideMenu1, OverrideMenu2, OverrideMenu3, OverrideMenu4, OverrideMenu5,
OverrideMenu6, OverrideMenu7, OverrideMenu8, OverrideMenu9, OverrideMenu10, OverrideMenu11,
OverrideMenu12, OverrideMenu13, OverrideMenu14, OverrideMenu15, OverrideMenu16
};
const char OverrideSelect0[] PROGMEM = "1. Auto ";
const char OverrideSelect1[] PROGMEM = "2. Off ";
const char OverrideSelect2[] PROGMEM = "3. On ";
const char*const OverrideSelect[]PROGMEM = {
OverrideSelect0, OverrideSelect1, OverrideSelect2
};
int8_t clicks;
char id = 0;
int total = 0;
LiquidCrystal_I2C lcd(0x3F, 16, 2);
AdaEncoder encoderA = AdaEncoder('a', EncoderPin1, EncoderPin2);
AdaEncoder *knob = NULL;
void setup() {
Serial.begin(9600);
pinMode(buttonPin, INPUT);
digitalWrite(buttonPin, LOW);
lcd.begin();
}
void loop() {
lcd.clear();
lcd.print("push button");
lcd.setCursor(0, 1);
lcd.print("to start...");
while (!digitalRead(buttonPin)) {
}
knob = AdaEncoder::genie(); // check for input from rotary encoder
if (knob != NULL || digitalRead(buttonPin)) {
while (digitalRead(buttonPin));
delay(20);
lcd.clear();
lcd.print("going to menu");
delay(1000);
menu();
}
}
void menu() {
int item;
timeout = millis() + menuTimeout;
do {
item = menuSelect(mainMenu, 3);
switch (item) {
case 0:
feed();
break;
case 1:
overrideMenu(); // man override...
break;
case 2:
return;
break;
}
}
while (item != 3 && timeout > millis());
}
// ****************************************************
void feed() {
// Return pump and skimmer off
i2cWrite(ReturnPumpPin % 8, 0, ReturnPumpPin / 8 + 1);
i2cWrite(SkimmerPin % 8, 0, SkimmerPin / 8 + 1);
lcd.clear();
lcd.print(F("Pump/skimmer off"));
lcd.setCursor(0, 1);
lcd.print(F("press to cont..."));
while (!digitalRead(buttonPin));
delay(30);
while (digitalRead(buttonPin)); // now wait for release
delay(30); // debounce
timeout = millis() - 1; // exit out of menus on return
return; // pup and skimmer will be returned to their normal states in the main loop
}
// ****************************************************
void overrideMenu() {
int item;
do {
item = menuSelect(OverrideMenu, 17);
if (item == 16) return; // 17 = exit;
int mode = menuSelect(OverrideSelect, 3);
Outlets[item] = Outlets[item] % 2 + 2 * mode;
// 'item' indexes the pointer to the proper spot; mode will be
// 0 for auto, 1 for always off, 2 for always on; LSB (=*outlet%2)
// is the default value, so it stays unchangedd. 2nd bit (2^1) override off,
// 3rd bit (2^2) override on, so multiply menuSelect by 2 for bit values
// and add.
lcd.clear();
lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(OverrideMenu[item]))) + 3);
lcd.setCursor(0, 1);
lcd.print(F("Set to "));
lcd.print(strcpy_P(buffer, (char*)pgm_read_word(&(OverrideSelect[mode]))) + 3);
delay(2000);
}
while (item != 16);
}
// ****************************************************