I would like to use this code with progmem but can't figure it out .Here is the first part of the code
#include <LiquidCrystal.h>
#include <avr/pgmspace.h> // library for keeping variables in Flash RAM
//#include <LiquidTWI.h> // i2c liquid crystal library
#include <ooPinChangeInt.h>
#include <AdaEncoder.h> // adafruit.com eoncoder routine.
#include <Wire.h>
#define menuTimeout 10000 //delay before settings menus time out & return
#define sumpLevelSwitchPin 2
#define EncoderPin1 6 // Rotary Encoder Pins
#define EncoderPin2 7 //
#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 time[] = {
12, 00, 00, 00}; // hr, min, sec, msec
byte Date[] = {
01, 01, 13}; // month, day, year
byte Light1On[] = {
9, 00}; // hr, min
byte Light1Off[] = {
22, 00}; // hr, min
byte Light2On[] = {
10, 00};
byte Light2Off[] = {
21, 00};
byte Light3On[] = {
21,00};
byte Light3Off[] = {
9,00};
byte ATO[] = {
1, 30}; // full, empty depth of ATO in cm
byte Doser1On[] = {
0,0};
byte Doser1Off[] = {
0,0};
byte Doser2On[] = {
0,0};
byte Doser2Off[] = {
0,0};
byte Outlets[16] = {
1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1};
char buffer[18];
const char mainMenu1[] PROGMEM = "1.Water Change ";
const char mainMenu2[] PROGMEM = "2.Feed ";
const char mainMenu3[] PROGMEM = "3.Man Override ";
const char mainMenu4[] PROGMEM = "4.Settings ";
const char mainMenu5[] PROGMEM = "5.Exit ";
const char * const mainMenu[]PROGMEM = {
mainMenu1, mainMenu2, mainMenu3, mainMenu4, mainMenu5};
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};
const char settingsMenu0[] PROGMEM = "1. Time ";
const char settingsMenu1[] PROGMEM = "2. Date ";
const char settingsMenu2[] PROGMEM = "3. Light Times ";
const char settingsMenu3[] PROGMEM = "4. Temps ";
const char settingsMenu4[] PROGMEM = "5. ATO Level ";
const char settingsMenu5[] PROGMEM = "6. Dosing Pumps";
const char settingsMenu6[] PROGMEM = "7. Return ";
const char*const settingsMenu[]PROGMEM ={
settingsMenu0, settingsMenu1, settingsMenu2, settingsMenu3, settingsMenu4, settingsMenu5, settingsMenu6};
const char lightTimeMenu0[] PROGMEM = "1. Low On ";
const char lightTimeMenu1[] PROGMEM = "2. High On ";
const char lightTimeMenu2[] PROGMEM = "3. High Off ";
const char lightTimeMenu3[] PROGMEM = "4. Low Off ";
const char lightTimeMenu4[] PROGMEM = "5. Return ";
const char*const lightTimeMenu[]PROGMEM ={
lightTimeMenu0, lightTimeMenu1, lightTimeMenu2, lightTimeMenu3, lightTimeMenu4};
const char tempMenu0[] = "1. Heater On ";
const char tempMenu1[] = "2. Fan On ";
const char tempMenu2[] = "3. Lights Off ";
const char tempMenu3[] = "4. Return ";
const char* tempMenu[] ={
tempMenu0, tempMenu1, tempMenu2, tempMenu3};
const char ATOMenu0[] = "1. Set Full ";
const char ATOMenu1[] = "2. Set Empty ";
const char ATOMenu2[] = "3. Add 1 cm ";
const char ATOMenu3[] = "4. Return ";
const char* ATOMenu[]={
ATOMenu0, ATOMenu1, ATOMenu2, ATOMenu3};
byte heatOnTemp = 77; // Temp to turn Heat on
byte fanOnTemp = 79; // Temp to turn fan on
byte lightOffTemp = 82;
char id=0;
int total = 0;
int8_t clicks;
char *LCDline1[4]; // pointer array for pointers to LCD line 1 strings
char Line1Msg0[] = "00:00 Temp 88 F";
char Line1Msg1[] = "***Temp High ***";
char Line1Msg2[] = "*** Temp Low ***";
char Line1Msg3[] = "*** ATO Low ***";
char Line1Msg4[] = "**No Temp Probe*";
char Line1Msg5[] = "**No Echo Probe*";
char LCDline2[] = "Fan: Off Htr: Off ATO: 100% ";
//LiquidTWI lcd(0);
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
AdaEncoder encoderA = AdaEncoder('a', EncoderPin1, EncoderPin2);
AdaEncoder *knob=NULL;
void setup(){
Serial.begin(9600);
pinMode(buttonPin, INPUT);
digitalWrite(buttonPin, LOW);
lcd.begin(16,2);
Serial.print("free ram: ");
Serial.println(freeRam());
}
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();
// for(int currentItem =0;currentItem<6;currentItem ++){
}
//}
}
int freeRam () {
extern int __heap_start, *__brkval;
int v;
return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
}