Page 1 of 1

broken feeding mode

Posted: Sun Oct 13, 2013 2:26 pm
by rossbryant1956
Please help me fix my feeding mode. I have three relay boxes. on box 1, ReefAngel.FeedingModePortsE[0], does not turn off. On box 2, ReefAngel.FeedingModePortsE[1], port7bit turns off, but port8bit does not. Thx in advance

Code: Select all

    #include <ReefAngel_Features.h>
    #include <Globals.h>
    #include <RA_Wifi.h>
    #include <Wire.h>
    #include <OneWire.h>
    #include <Time.h>
    #include <ORP.h>
    #include <DS1307RTC.h>
    #include <InternalEEPROM.h>
    #include <RA_NokiaLCD.h>
    #include <RA_ATO.h>
    #include <RA_Joystick.h>
    #include <LED.h>
    #include <RA_TempSensor.h>
    #include <RA_Colors.h>
    #include <RA_CustomColors.h>
    #include <Relay.h>
    #include <RA_PWM.h>
    #include <Timer.h>
    #include <Memory.h>
    #include <IO.h>
    #include <Salinity.h>
    #include <PH.h>
    #include <WiFiAlert.h>
    #include <ReefAngel.h>
    
    // Custom Menu
    #include <avr/pgmspace.h>
    prog_char menu0_label[] PROGMEM = "Turn Lights On";
    prog_char menu1_label[] PROGMEM = "Turn Lights Off";
    prog_char menu2_label[] PROGMEM = "Start Feeding";
    prog_char menu3_label[] PROGMEM = "Start Water Change";
    prog_char menu4_label[] PROGMEM = "Clear Overheat";
    prog_char menu5_label[] PROGMEM = "Calibrate pH";
    prog_char menu6_label[] PROGMEM = "Calibrate Salinity";
    
    // Group the menu entries together
    PROGMEM const char *menu_items[] = {
    menu0_label, menu1_label, menu2_label, menu3_label, menu4_label, menu5_label, menu6_label  };
 
    // Define Custom Memory Locations
    #define Mem_B_SwabbieRepeat   115
    #define Mem_B_SwabbieTime     116
    #define Mem_I_CalDP1Vol       128
    #define Mem_I_CalDP1Time      130
    #define Mem_I_DP1Volume       132
    #define Mem_I_CalDP2Vol       134
    #define Mem_I_CalDP2Time      136
    #define Mem_I_DP2Volume       138
    #define Mem_B_MaintSkimmer    151
    #define Mem_B_PrintDebug      198
    #define Mem_B_ResetMemory     199
    
    void init_memory() {
    // Initialize Custom Memory Locations 
    InternalMemory.write(Mem_B_SwabbieRepeat,6);  
    InternalMemory.write(Mem_B_SwabbieTime,1);  
    InternalMemory.write_int(Mem_I_CalDP1Vol,11);  
    InternalMemory.write_int(Mem_I_CalDP1Time,600);  
    InternalMemory.write_int(Mem_I_DP1Volume,30);  
    InternalMemory.write_int(Mem_I_CalDP2Vol,11);  
    InternalMemory.write_int(Mem_I_CalDP2Time,600);    
    InternalMemory.write_int(Mem_I_DP2Volume,30);    
    InternalMemory.write(Mem_B_ResetMemory,false);
    }
    
    // Define Custom Variables for Portal
    #define Var_DPump1         4
    #define Var_DPump2         5
    #define Var_AcclDay        6
    
     // Define Relay Ports by Name
    #define DT_LightsOne       1
    #define DT_LightsTwo       2
    #define Unused3            3
    #define Unused4            4
    #define DT_LWM             5
    #define GT_LWM             6
    #define DosePumpOne        7
    #define DosePumpTwo        8

    #define Unused11           Box1_Port1
    #define Swabbie            Box1_Port2
    #define GT_LightsOne       Box1_Port3
    #define GT_LightsTwo       Box1_Port4
    #define DT_RWM             Box1_Port5
    #define GT_RWM             Box1_Port6
    #define DT_Heat            Box1_Port7
    #define DT_Pump            Box1_Port8
    
    #define RV_Heat            Box2_Port1
    #define RV_Pump            Box2_Port2
    #define GT_Heat            Box2_Port3
    #define Unused24           Box2_Port4
    #define GT_OverFill        Box2_Port5
    #define GT_Fill            Box2_Port6
    #define Skimmer            Box2_Port7
    #define GT_Pump            Box2_Port8
    
       // Setup on controller startup/reset
    void setup() 
    {
        ReefAngel.Init();  //Initialize controller
        ReefAngel.InitMenu(pgm_read_word(&(menu_items[0])),SIZE(menu_items)); // Initialize the menu
        ReefAngel.FeedingModePorts = 0;
        ReefAngel.FeedingModePortsE[0] = Port8Bit; // Turn off on Box1 when feeding mode is activated is activated
        ReefAngel.FeedingModePortsE[1] = Port7Bit | Port8Bit; // Turn off on Box2 when feeding mode is activated is activated
        ReefAngel.WaterChangePorts = Port5Bit | Port6Bit; // Turn off when water change mode is activated
        ReefAngel.WaterChangePortsE[0] = Port5Bit | Port6Bit | Port7Bit | Port8Bit; // Turn off on Box1 when water change mode is activated
        ReefAngel.WaterChangePortsE[1] = Port3Bit | Port8Bit | Port7Bit | Port6Bit | Port1Bit; // Turn off on Box1 when water change mode is activated
        // ReefAngel.PHExpMin = 1832;
        // ReefAngel.PHExpMax = 2150;
        ReefAngel.TempProbe = T2_PROBE;  // Set the 2nd plug to be DT Main temp
        ReefAngel.OverheatProbe = T2_PROBE;  // to monitor the overheat and temperatures
        ReefAngel.OverheatShutoffPorts = Port1Bit | Port2Bit;  // Items turned off when Overheat temperature exceeded
        ReefAngel.OverheatShutoffPortsE[0] = Port7Bit | Port3Bit | Box1_Port4;  // Items turned off on Box1 when Overheat temperature exceeded
        ReefAngel.OverheatShutoffPortsE[1] = Port3Bit | Port7Bit;  // Items turned off on Box2 when Overheat temperature exceeded
        InternalMemory.OverheatTemp_write( 829 ); // Set the DT Overheat temperature setting
        ReefAngel.LightsOnPorts = Port1Bit | Port2Bit; // Toggle Lights
        ReefAngel.LightsOnPortsE[0] = Port3Bit | Port4Bit; // Toggle Lights  
  
   // Ports that default on
        ReefAngel.Relay.On(DT_Pump); // Turn on DT Pump
        ReefAngel.Relay.On(GT_Pump); // Turn on GT Pump   
        ReefAngel.Relay.On(Skimmer); // Turn on Skimmer
        
   // Ports that default off
        ReefAngel.Relay.Off(Swabbie);
        
    }
    void loop()
    {

        CheckPower();           // Monitor for power outages
        CheckSwitches();        // Monitor for float switches  
        RunSwabbie();           // Skimmer neck cleaner
        // RunDosingPumps();       // Dose by volume or time
        // LogDosingPumps();       // Keep track of dosing
        // CalibrateDPumps();      // Calibrate Dosing pumps
        DelayedOnModes(Skimmer); // DelayedOn after mode change only
        
        ReefAngel.StandardLights( DT_LightsOne,14,00,22,00 ); // DT Lights on at 2:00pm and off at 10:00pm
        ReefAngel.StandardLights( DT_LightsTwo,22,00,01,00 ); // DT-Moon Lights on at 10:00am and off at 1:00am
        ReefAngel.StandardLights( GT_LightsOne,14,00,21,45 );  //GT Lights Main 2:00pm - 9:45pm
        ReefAngel.StandardLights( GT_LightsTwo,15,00,22,30 ); //GT Lights Actinic 3:00pm - 10:30pm
        ReefAngel.WavemakerRandom( DT_LWM,60,100 );
        ReefAngel.Relay.Set( DT_RWM, !ReefAngel.Relay.Status( DT_LWM ) ); //Randomize DT powerheads
        ReefAngel.WavemakerRandom1( GT_LWM,60,100 );
        ReefAngel.Relay.Set( GT_RWM, !ReefAngel.Relay.Status( GT_LWM ) ); //Randomize GT powerheads
        StandardHeater1( DT_Heat,779,791 ); //DT-Heat
        StandardHeater2( GT_Heat,779,791 ); //GT-Heat 
        ReefAngel.DosingPumpRepeat( DosePumpOne,0,720,5 );
            
       // if the hour is 2p or 8p, minute is 55 and seconds is 0, start the feeding mode
        if ( ((hour() == 14) || (hour() == 20)) &&
        (minute() == 55) &&
        (second() == 0) )
        {
         ReefAngel.FeedingModeStart();
        }   
        
       // if the hour is between 1a and 6a, start the Reservoir Pump 
         if (hour()>=1 && hour()<6)   
         ReefAngel.Relay.On(RV_Pump);
         else
         ReefAngel.Relay.Off(RV_Pump); 
  
        // turn on RV_Heat when temp falls below 76.0 and turn off when temp gets above 80.0
         if (ReefAngel.Params.Temp[T3_PROBE] <= 780 && ReefAngel.Params.Temp[T3_PROBE] > 0) ReefAngel.Relay.On(RV_Heat); 
         if (ReefAngel.Params.Temp[T3_PROBE] >= 791) ReefAngel.Relay.Off(RV_Heat);    
        
        //turn on GT Fill when switch is tripped 
         if (hour()>=19 && hour()<20)  // Turn on GT_Fill if water is needed
         ReefAngel.Relay.Set(GT_Fill,ReefAngel.IO.GetChannel(2));
  
        // This should always be the last line
         ReefAngel.Portal("rossbryant1956");
         ReefAngel.ShowInterface();
        // ReefAngel.Params.ORP=ReefAngel.PH.Read();        
    }
        
        void CheckPower() {
        static boolean powerOutage=false;
        static WiFiAlert powerAlert;

       // Power Outage - turn off everything
        if (!ReefAngel.Relay.IsRelayPresent(EXP1_RELAY) && (!ReefAngel.Relay.IsRelayPresent(EXP2_RELAY))) // Expansion Relay NOT present
    {
        powerOutage=true;
        ReefAngel.Relay.Off(DT_LightsOne); 
        ReefAngel.Relay.Off(DT_LightsTwo); 
        ReefAngel.Relay.Off(Port3); 
        ReefAngel.Relay.Off(Port4);
        ReefAngel.Relay.Off(Port7);
        ReefAngel.Relay.Off(Port8);
        powerAlert.Send("Power+Outage!");
     }

      // Power Restored - Turn things back on
        if (powerOutage && ReefAngel.Relay.IsRelayPresent(EXP1_RELAY) && ReefAngel.Relay.IsRelayPresent(EXP2_RELAY)) // Expansion Relay IS present
     {
        LastStart=now(); 
        powerOutage=false;
        ReefAngel.Relay.On(DT_LightsOne);
        ReefAngel.Relay.On(DT_LightsTwo);
        ReefAngel.Relay.On(DosePumpOne);
        ReefAngel.Relay.On(DosePumpTwo);
        powerAlert.Send("Power+restored.",true);  
     }
    }       
     // I_O Expansion & Float Valves
        
        void CheckSwitches() {
        static boolean GT_OverFillOverride=true;
        static WiFiAlert switchAlert, skimmerAlert, atoAlert;
        skimmerAlert.SetDelay(3600); 
        switchAlert.SetDelay(3600);
       
       if (ReefAngel.DisplayedMenu==FEEDING_MODE || ReefAngel.DisplayedMenu==WATERCHANGE_MODE)
       GT_OverFillOverride=true;
       
       // Turn off GT_OverFill if sump overflowing 
       
       if (!ReefAngel.IO.GetChannel(3)) {
         if (!GT_OverFillOverride) {
         switchAlert.Send("GT_Sump+level+alarm!+MixPump+disabled.");
         ReefAngel.Relay.Override(GT_OverFill,0);
         GT_OverFillOverride=true;
     } 
     } else {
        GT_OverFillOverride=false;
     }  
          
       // Turn off DT_Pump if sump overflowing 
       
       static boolean DT_OverFillOverride=true;
       if (!ReefAngel.IO.GetChannel(0)) {
         if (!DT_OverFillOverride) {
         switchAlert.Send("DT_Tank+level+alarm!");
         ReefAngel.Relay.Override(DT_Pump,0);
         DT_OverFillOverride=true;
     } 
     } else {
        DT_OverFillOverride=false;
        ReefAngel.Relay.Override(DT_Pump,2);
     }  
     
        // Turn off GT_Pump if sump overflowing 
       
       static boolean GT_PumpOverFillOverride=true;
       if (!ReefAngel.IO.GetChannel(1)) {
         if (!GT_PumpOverFillOverride) {
         switchAlert.Send("GT_Tank+level+alarm!");
         ReefAngel.Relay.Override(GT_Pump,0);
         GT_PumpOverFillOverride=true;
     } 
     } else {
        GT_PumpOverFillOverride=false;
        ReefAngel.Relay.Override(GT_Pump,2);
     }  
 
       // Turn off Skimmer if waste collector is full.
       if (!ReefAngel.LowATO.IsActive()) { // switch is on by default
       skimmerAlert.Send("Skimmate+container+full!+Skimmer+disabled.");
       ReefAngel.Relay.Override(Skimmer,0);
       //if (InternalMemory.read(Mem_B_MaintSkimmer) > 0) // Reset last Skimmer counter 
       //InternalMemory.write(Mem_B_MaintSkimmer,0);
      }
    
       // Turn off Skimmer if Return pump has been shutoff.   
       if (!ReefAngel.Relay.Status(DT_Pump)) {
       ReefAngel.Relay.Override(Skimmer,0);
      }
  
      // Alert if ATO timeout flag
      if (bitRead(ReefAngel.Flags,ATOTimeOutFlag))
      atoAlert.Send("ATO+timeout!+ATO+disabled.");
      }

      // Swabbie 

      void RunSwabbie() {
      int repeat=InternalMemory.read(Mem_B_SwabbieRepeat)*60;
      int runtime=InternalMemory.read(Mem_B_SwabbieTime)*60;
      static time_t t;
  
      // Manual mode
      if (ReefAngel.Relay.isMaskOn(Swabbie)) {
      ReefAngel.Relay.Override(Swabbie,2);
      t=now();
      }  

      if (now()-t < runtime) {
      ReefAngel.Relay.On(Swabbie);
      } else {
      ReefAngel.DosingPumpRepeat(Swabbie,0,repeat,runtime);    
      }  
     }
      void DelayedOnModes(byte relay) {
      static unsigned long startTime=now();

      if (startTime==LastStart && ReefAngel.HighATO.IsActive()) {
      ReefAngel.Relay.On(relay);
      } else {
      ReefAngel.Relay.DelayedOn(relay);
    }
   }  
      // Definitions for dosing pumps
    //  #define numDPumps 2
   //  byte pump[numDPumps]={ DosePumpOne, DosePumpTwo };
    //  byte varReport[numDPumps]={ Var_DPump1, Var_DPump2 };
     // byte memDPTime[numDPumps]={ Mem_B_DP1Timer, Mem_B_DP2Timer };
     // int memDPVolume[numDPumps]={ Mem_I_DP1Volume, Mem_I_DP2Volume };
     // int memDPRepeat[numDPumps]={ Mem_I_DP1RepeatInterval, Mem_I_DP2RepeatInterval };
     // int memCalTime[numDPumps]={ Mem_I_CalDP1Time, Mem_I_CalDP2Time };
    //  int memCalVol[numDPumps]={ Mem_I_CalDP1Vol, Mem_I_CalDP2Vol };
//{
     // void RunDosingPumps() {
     // float rate;
     // byte dpTime;
     // int dpRepeat, calcTime, totalVolume;

   //   static byte doseTime[numDPumps]={ 
   //   InternalMemory.read(memDPTime[0]), 
   //   InternalMemory.read(memDPTime[1]) 
   //   };
  
   //   for (int i=0;i < numDPumps; i++) {
    //  dpTime=InternalMemory.read(memDPTime[i]);
    //  dpRepeat=InternalMemory.read_int(memDPRepeat[i]);
   //   rate=(float)InternalMemory.read_int(memCalVol[i])/InternalMemory.read_int(memCalTime[i]);
   //  calcTime=(InternalMemory.read_int(memDPVolume[i])/rate)/(1440/dpRepeat);
   //   totalVolume=rate*(dpTime*(1440/dpRepeat)); 

   //   if (dpTime!=doseTime[i]) { // Memory has changed.
   //     InternalMemory.write_int(memDPVolume[i], totalVolume); // Update volume
    //    doseTime[i]=dpTime;
    //  } else if (dpTime!=calcTime) { // Calculated time has changed.
    //    InternalMemory.write(memDPTime[i], calcTime); // Update time
    //    doseTime[i]=calcTime;
    //  }

      // Make sure we're not calibrating
      //if (!ReefAngel.Relay.Status(VO_Calibrate)) 
      //ReefAngel.DosingPumpRepeat(pump[i], i*5, dpRepeat, doseTime[i]);
      //}
    // }
     
    // ReefAngel.CustomVar[7]=1;       

     void StandardHeater1(byte HeaterRelay, int LowTemp, int HighTemp)
        {
        if (ReefAngel.Params.Temp[T2_PROBE] == 0) return; // Don't turn the heater on if the temp is reading 0
        if (ReefAngel.Params.Temp[T2_PROBE] <= LowTemp && ReefAngel.Params.Temp[T2_PROBE] > 0) ReefAngel.Relay.On(HeaterRelay); // If sensor 2 temperature <= LowTemp - turn on heater
        if (ReefAngel.Params.Temp[T2_PROBE] >= HighTemp) ReefAngel.Relay.Off(HeaterRelay); // If sensor 2 temperature >= HighTemp - turn off heater
        }

   void StandardHeater2(byte HeaterRelay, int LowTemp, int HighTemp) //Heater for Grow Tank
    {
        if (ReefAngel.Params.Temp[T1_PROBE] == 0) return;  // Don't turn the heater on if the temp is reading 0
        if (ReefAngel.Params.Temp[T1_PROBE] <= LowTemp && ReefAngel.Params.Temp[T1_PROBE] > 0) ReefAngel.Relay.On(HeaterRelay);  // If sensor temperature <= LowTemp - turn on heater
        if (ReefAngel.Params.Temp[T1_PROBE] >= HighTemp) ReefAngel.Relay.Off(HeaterRelay);  // If sensor temperature >= HighTemp - turn off heater
    }
    
      // Globals for Params on Custom Main
    byte x,y;
    char text[10];  
    
    void MenuEntry1()
    {
    ReefAngel.DisplayMenuEntry("Item 1");ReefAngel.Relay.RelayMaskOn = ReefAngel.LightsOnPorts;
    #ifdef RelayExp
    for ( byte i = 0; i < MAX_RELAY_EXPANSION_MODULES; i++ )
    {
        ReefAngel.Relay.RelayMaskOnE[i] = ReefAngel.LightsOnPortsE[i];
    }
    #endif  // RelayExp
    ReefAngel.Relay.Write();

    }
    void MenuEntry2()
    {
    ReefAngel.DisplayMenuEntry("Item 2");ReefAngel.Relay.RelayMaskOn = 0;
    #ifdef RelayExp
    for ( byte i = 0; i < MAX_RELAY_EXPANSION_MODULES; i++ )
    {
        ReefAngel.Relay.RelayMaskOnE[i] = 0;
    }
    #endif  // RelayExp
    ReefAngel.Relay.Write();

    }
    void MenuEntry3()
    {
    ReefAngel.DisplayMenuEntry("Item 3");ReefAngel.FeedingModeStart();

    }
    void MenuEntry4()
    {
    ReefAngel.DisplayMenuEntry("Item 4");ReefAngel.WaterChangeModeStart();

    }
    void MenuEntry5()
    {
    ReefAngel.DisplayMenuEntry("Item 5");ReefAngel.OverheatClear();

    }
    void MenuEntry6()
    {
    ReefAngel.DisplayMenuEntry("Item 6");ReefAngel.SetupCalibratePH();
    ReefAngel.DisplayedMenu = ALT_SCREEN_MODE;

    }
    void MenuEntry7()
    {
    ReefAngel.DisplayMenuEntry("Item 7");ReefAngel.SetupCalibrateSalinity();
    }
    
    // End Custom Menu Globals
   
    void DrawCustomMain()
    {
      int x,y; 
      char text[7];
      
      // Date and Time
      ReefAngel.LCD.DrawDate( 6, 122 );  //6 pixels left, 122 lines down
      pingSerial();
      
      // I/O Expansion
      byte bkcolor;
      x = 14;
      y = 11;
      for ( int a=0;a<6;a++ )
      {
      ReefAngel.LCD.DrawCircleOutline( x+(a*20),y,4,COLOR_MEDIUMORCHID );
      if ( ReefAngel.IO.GetChannel(a) ) bkcolor=COLOR_WHITE; else bkcolor=COLOR_GRAY;
      ReefAngel.LCD.FillCircle( x+(a*20),y,2,bkcolor );
      }
      pingSerial();

      // Parameters
  
      ReefAngel.LCD.DrawText(0,255,18,26,"GT");  //18 left, 10 down
      ConvertNumToString(text, ReefAngel.Params.Temp[T1_PROBE], 10);
      ReefAngel.LCD.DrawLargeText(COLOR_INDIANRED, 255, 10, 37, text, Num8x8);
      pingSerial();

      ReefAngel.LCD.DrawText(0,255,57,26,"DT"); //57 left, 10 down
      ConvertNumToString(text, ReefAngel.Params.Temp[T2_PROBE], 10);
      ReefAngel.LCD.DrawLargeText(COLOR_INDIANRED, 255, 50, 37, text, Num8x8);
      pingSerial();
      
      ReefAngel.LCD.DrawText(0,255,94,26,"Res"); //94 left, 10 down
      ConvertNumToString(text, ReefAngel.Params.Temp[T3_PROBE], 10);
      ReefAngel.LCD.DrawLargeText(COLOR_INDIANRED, 255, 90, 37, text, Num8x8);
      pingSerial();

      ReefAngel.LCD.DrawText(0,255,16,52,"DT pH"); //18 left, 39 down
      ConvertNumToString(text, ReefAngel.Params.PH, 100);
      ReefAngel.LCD.DrawLargeText(COLOR_INDIANRED, 255, 15, 65, text, Num8x8);
      pingSerial();

      ReefAngel.LCD.DrawText( 0,255,57,52, "GT pH"); //57 left, 39 down
      ConvertNumToString(text, ReefAngel.Params.PHExp, 100);
      ReefAngel.LCD.DrawLargeText(COLOR_INDIANRED, 255, 55, 65, text, Num8x8);
      pingSerial();

      ReefAngel.LCD.DrawText(0,255,100,52,"Sal"); //100 left, 39 down
      ConvertNumToString(text, ReefAngel.Params.Salinity, 10);
      ReefAngel.LCD.DrawLargeText(COLOR_INDIANRED, 255, 98, 65, text, Num8x8);
      pingSerial();

      // Main Relay Box
      byte TempRelay = ReefAngel.Relay.RelayData;
      TempRelay &= ReefAngel.Relay.RelayMaskOff;
      TempRelay |= ReefAngel.Relay.RelayMaskOn;
      ReefAngel.LCD.DrawOutletBox( 12, 80, TempRelay );
      pingSerial();

       // Relay Expansion
      TempRelay = ReefAngel.Relay.RelayDataE[0];
      TempRelay &= ReefAngel.Relay.RelayMaskOffE[0];
      TempRelay |= ReefAngel.Relay.RelayMaskOnE[0];
      ReefAngel.LCD.DrawOutletBox( 12, 93, TempRelay );
      pingSerial();  
      
      // Relay Expansion
      TempRelay = ReefAngel.Relay.RelayDataE[1];
      TempRelay &= ReefAngel.Relay.RelayMaskOffE[1];
      TempRelay |= ReefAngel.Relay.RelayMaskOnE[1];
      ReefAngel.LCD.DrawOutletBox( 12, 107, TempRelay );
      pingSerial();  
    }

    void DrawCustomGraph()
    {
    // ReefAngel.LCD.DrawGraph( 5, 5 );
    }

Re: broken feeding mode

Posted: Sun Oct 13, 2013 2:43 pm
by lnevo
What are you considering box1?

Sounds like you need to set ReefAngel.FeedingModePorts=Port7Bit; and ReefAngel.FeedingModePortsE[0]=Port7Bit|Port8Bit;

Re: broken feeding mode

Posted: Sun Oct 13, 2013 3:15 pm
by rossbryant1956
i have my first relay box, hereafter called box0, with nothing on it that needs switching off. I have what I call box1, addressed as Box1_portX, and Box2_portX. There is one port on box1 that needs switching off, port 8, and two ports on box2, ports 7 & 8

Re: broken feeding mode

Posted: Mon Oct 14, 2013 4:32 am
by rossbryant1956
still no change, plus something I noticed two nites ago and it played out again last night, my swabbie comes on at 1:00 AM and stays on until 4:00 AM. Has to be something with my new code. Please take a look.

Code: Select all

    #include <ReefAngel_Features.h>
    #include <Globals.h>
    #include <RA_Wifi.h>
    #include <Wire.h>
    #include <OneWire.h>
    #include <Time.h>
    #include <ORP.h>
    #include <DS1307RTC.h>
    #include <InternalEEPROM.h>
    #include <RA_NokiaLCD.h>
    #include <RA_ATO.h>
    #include <RA_Joystick.h>
    #include <LED.h>
    #include <RA_TempSensor.h>
    #include <RA_Colors.h>
    #include <RA_CustomColors.h>
    #include <Relay.h>
    #include <RA_PWM.h>
    #include <Timer.h>
    #include <Memory.h>
    #include <IO.h>
    #include <Salinity.h>
    #include <PH.h>
    #include <WiFiAlert.h>
    #include <ReefAngel.h>
    
    // Custom Menu
    #include <avr/pgmspace.h>
    prog_char menu0_label[] PROGMEM = "Turn Lights On";
    prog_char menu1_label[] PROGMEM = "Turn Lights Off";
    prog_char menu2_label[] PROGMEM = "Start Feeding";
    prog_char menu3_label[] PROGMEM = "Start Water Change";
    prog_char menu4_label[] PROGMEM = "Clear Overheat";
    prog_char menu5_label[] PROGMEM = "Calibrate pH";
    prog_char menu6_label[] PROGMEM = "Calibrate Salinity";
    
    // Group the menu entries together
    PROGMEM const char *menu_items[] = {
    menu0_label, menu1_label, menu2_label, menu3_label, menu4_label, menu5_label, menu6_label  };
 
    // Define Custom Memory Locations
    #define Mem_B_SwabbieRepeat   115
    #define Mem_B_SwabbieTime     116
    #define Mem_I_CalDP1Vol       128
    #define Mem_I_CalDP1Time      130
    #define Mem_I_DP1Volume       132
    #define Mem_I_CalDP2Vol       134
    #define Mem_I_CalDP2Time      136
    #define Mem_I_DP2Volume       138
    #define Mem_B_MaintSkimmer    151
    #define Mem_B_PrintDebug      198
    #define Mem_B_ResetMemory     199
    
    void init_memory() {
    // Initialize Custom Memory Locations 
    InternalMemory.write(Mem_B_SwabbieRepeat,6);  
    InternalMemory.write(Mem_B_SwabbieTime,1);  
    InternalMemory.write_int(Mem_I_CalDP1Vol,11);  
    InternalMemory.write_int(Mem_I_CalDP1Time,600);  
    InternalMemory.write_int(Mem_I_DP1Volume,30);  
    InternalMemory.write_int(Mem_I_CalDP2Vol,11);  
    InternalMemory.write_int(Mem_I_CalDP2Time,600);    
    InternalMemory.write_int(Mem_I_DP2Volume,30);    
    InternalMemory.write(Mem_B_ResetMemory,false);
    }
    
    // Define Custom Variables for Portal
    #define Var_DPump1         4
    #define Var_DPump2         5
    #define Var_AcclDay        6
    
     // Define Relay Ports by Name
    #define DT_LightsOne       1
    #define DT_LightsTwo       2
    #define Unused3            3
    #define Unused4            4
    #define DT_LWM             5
    #define GT_LWM             6
    #define DosePumpOne        7
    #define DosePumpTwo        8

    #define Unused11           Box1_Port1
    #define Swabbie            Box1_Port2
    #define GT_LightsOne       Box1_Port3
    #define GT_LightsTwo       Box1_Port4
    #define DT_RWM             Box1_Port5
    #define GT_RWM             Box1_Port6
    #define DT_Heat            Box1_Port7
    #define DT_Pump            Box1_Port8
    
    #define RV_Heat            Box2_Port1
    #define RV_Pump            Box2_Port2
    #define GT_Heat            Box2_Port3
    #define Unused24           Box2_Port4
    #define GT_OverFill        Box2_Port5
    #define GT_Fill            Box2_Port6
    #define Skimmer            Box2_Port7
    #define GT_Pump            Box2_Port8
    
       // Setup on controller startup/reset
    void setup() 
    {
        ReefAngel.Init();  //Initialize controller
        ReefAngel.InitMenu(pgm_read_word(&(menu_items[0])),SIZE(menu_items)); // Initialize the menu
        ReefAngel.FeedingModePorts = 0;
        ReefAngel.FeedingModePortsE[0] = Port8Bit; // Turn off on Box1 when feeding mode is activated is activated
        ReefAngel.FeedingModePortsE[1] = Port7Bit | Port8Bit; // Turn off on Box2 when feeding mode is activated is activated
        ReefAngel.WaterChangePorts = Port5Bit | Port6Bit; // Turn off when water change mode is activated
        ReefAngel.WaterChangePortsE[0] = Port5Bit | Port6Bit | Port7Bit | Port8Bit; // Turn off on Box1 when water change mode is activated
        ReefAngel.WaterChangePortsE[1] = Port1Bit | Port3Bit | Port6Bit | Port7Bit | Port8Bit; // Turn off on Box1 when water change mode is activated
        // ReefAngel.PHExpMin = 1832;
        // ReefAngel.PHExpMax = 2150;
        ReefAngel.TempProbe = T2_PROBE;  // Set the 2nd plug to be DT Main temp
        ReefAngel.OverheatProbe = T2_PROBE;  // to monitor the overheat and temperatures
        ReefAngel.OverheatShutoffPorts = Port1Bit | Port2Bit;  // Items turned off when Overheat temperature exceeded
        ReefAngel.OverheatShutoffPortsE[0] = Port3Bit | Port4Bit | Port7Bit;  // Items turned off on Box1 when Overheat temperature exceeded
        ReefAngel.OverheatShutoffPortsE[1] = Port3Bit | Port7Bit;  // Items turned off on Box2 when Overheat temperature exceeded
        InternalMemory.OverheatTemp_write( 829 ); // Set the DT Overheat temperature setting
        ReefAngel.LightsOnPorts = Port1Bit | Port2Bit; // Toggle Lights
        ReefAngel.LightsOnPortsE[0] = Port3Bit | Port4Bit; // Toggle Lights  
  
   // Ports that default on
        ReefAngel.Relay.On(DT_Pump); // Turn on DT Pump
        ReefAngel.Relay.On(GT_Pump); // Turn on GT Pump   
        ReefAngel.Relay.On(Skimmer); // Turn on Skimmer
        
   // Ports that default off
        ReefAngel.Relay.Off(Swabbie);
        
    }
    void loop()
    {

        CheckPower();           // Monitor for power outages
        CheckSwitches();        // Monitor for float switches  
        RunSwabbie();           // Skimmer neck cleaner
        // RunDosingPumps();       // Dose by volume or time
        // LogDosingPumps();       // Keep track of dosing
        // CalibrateDPumps();      // Calibrate Dosing pumps
        DelayedOnModes(Skimmer); // DelayedOn after mode change only
        
        ReefAngel.StandardLights( DT_LightsOne,14,00,22,00 ); // DT Lights on at 2:00pm and off at 10:00pm
        ReefAngel.StandardLights( DT_LightsTwo,22,00,01,00 ); // DT-Moon Lights on at 10:00am and off at 1:00am
        ReefAngel.StandardLights( GT_LightsOne,14,00,21,45 );  //GT Lights Main 2:00pm - 9:45pm
        ReefAngel.StandardLights( GT_LightsTwo,15,00,22,30 ); //GT Lights Actinic 3:00pm - 10:30pm
        ReefAngel.WavemakerRandom( DT_LWM,60,100 );
        ReefAngel.Relay.Set( DT_RWM, !ReefAngel.Relay.Status( DT_LWM ) ); //Randomize DT powerheads
        ReefAngel.WavemakerRandom1( GT_LWM,60,100 );
        ReefAngel.Relay.Set( GT_RWM, !ReefAngel.Relay.Status( GT_LWM ) ); //Randomize GT powerheads
        StandardHeater1( DT_Heat,779,791 ); //DT-Heat
        StandardHeater2( GT_Heat,779,791 ); //GT-Heat 
        ReefAngel.DosingPumpRepeat( DosePumpOne,0,720,5 );
            
       // if the hour is 2p or 8p, minute is 55 and seconds is 0, start the feeding mode
        if ( ((hour() == 14) || (hour() == 20)) &&
        (minute() == 55) &&
        (second() == 0) )
        {
         ReefAngel.FeedingModeStart();
        }   
        
       // if the hour is between 1a and 6a, start the Reservoir Pump 
         if (hour()>=1 && hour()<6)   
         ReefAngel.Relay.On(RV_Pump);
         else
         ReefAngel.Relay.Off(RV_Pump); 
  
        // turn on RV_Heat when temp falls below 76.0 and turn off when temp gets above 80.0
         if (ReefAngel.Params.Temp[T3_PROBE] <= 780 && ReefAngel.Params.Temp[T3_PROBE] > 0) ReefAngel.Relay.On(RV_Heat); 
         if (ReefAngel.Params.Temp[T3_PROBE] >= 791) ReefAngel.Relay.Off(RV_Heat);    
        
        //turn on GT Fill when switch is tripped 
         if (hour()>=19 && hour()<20)  // Turn on GT_Fill if water is needed
         ReefAngel.Relay.Set(GT_Fill,ReefAngel.IO.GetChannel(2));
  
        // This should always be the last line
         ReefAngel.Portal("rossbryant1956");
         ReefAngel.ShowInterface();
        // ReefAngel.Params.ORP=ReefAngel.PH.Read();        
    }
        
        void CheckPower() {
        static boolean powerOutage=false;
        static WiFiAlert powerAlert;

       // Power Outage - turn off everything
        if (!ReefAngel.Relay.IsRelayPresent(EXP1_RELAY) && (!ReefAngel.Relay.IsRelayPresent(EXP2_RELAY))) // Expansion Relay NOT present
    {
        powerOutage=true;
        ReefAngel.Relay.Off(DT_LightsOne); 
        ReefAngel.Relay.Off(DT_LightsTwo); 
        ReefAngel.Relay.Off(Port3); 
        ReefAngel.Relay.Off(Port4);
        ReefAngel.Relay.Off(Port7);
        ReefAngel.Relay.Off(Port8);
        powerAlert.Send("Power+Outage!");
     }

      // Power Restored - Turn things back on
        if (powerOutage && ReefAngel.Relay.IsRelayPresent(EXP1_RELAY) && ReefAngel.Relay.IsRelayPresent(EXP2_RELAY)) // Expansion Relay IS present
     {
        LastStart=now(); 
        powerOutage=false;
        ReefAngel.Relay.On(DT_LightsOne);
        ReefAngel.Relay.On(DT_LightsTwo);
        ReefAngel.Relay.On(DosePumpOne);
        ReefAngel.Relay.On(DosePumpTwo);
        powerAlert.Send("Power+restored.",true);  
     }
    }       
     // I_O Expansion & Float Valves
        
        void CheckSwitches() {
        static boolean GT_OverFillOverride=true;
        static WiFiAlert switchAlert, skimmerAlert, atoAlert;
        skimmerAlert.SetDelay(3600); 
        switchAlert.SetDelay(3600);
       
       if (ReefAngel.DisplayedMenu==FEEDING_MODE || ReefAngel.DisplayedMenu==WATERCHANGE_MODE)
       GT_OverFillOverride=true;
       
       // Turn off GT_OverFill if sump overflowing 
       
       if (!ReefAngel.IO.GetChannel(3)) {
         if (!GT_OverFillOverride) {
         switchAlert.Send("GT_Sump+level+alarm!+MixPump+disabled.");
         ReefAngel.Relay.Override(GT_OverFill,0);
         GT_OverFillOverride=true;
     } 
     } else {
        GT_OverFillOverride=false;
     }  
          
       // Turn off DT_Pump if sump overflowing 
       
       static boolean DT_OverFillOverride=true;
       if (!ReefAngel.IO.GetChannel(0)) {
         if (!DT_OverFillOverride) {
         switchAlert.Send("DT_Tank+level+alarm!");
         ReefAngel.Relay.Override(DT_Pump,0);
         DT_OverFillOverride=true;
     } 
     } else {
        DT_OverFillOverride=false;
        ReefAngel.Relay.Override(DT_Pump,2);
     }  
     
        // Turn off GT_Pump if sump overflowing 
       
       static boolean GT_PumpOverFillOverride=true;
       if (!ReefAngel.IO.GetChannel(1)) {
         if (!GT_PumpOverFillOverride) {
         switchAlert.Send("GT_Tank+level+alarm!");
         ReefAngel.Relay.Override(GT_Pump,0);
         GT_PumpOverFillOverride=true;
     } 
     } else {
        GT_PumpOverFillOverride=false;
        ReefAngel.Relay.Override(GT_Pump,2);
     }  
 
       // Turn off Skimmer if waste collector is full.
       if (!ReefAngel.LowATO.IsActive()) { // switch is on by default
       skimmerAlert.Send("Skimmate+container+full!+Skimmer+disabled.");
       ReefAngel.Relay.Override(Skimmer,0);
       //if (InternalMemory.read(Mem_B_MaintSkimmer) > 0) // Reset last Skimmer counter 
       //InternalMemory.write(Mem_B_MaintSkimmer,0);
      }
    
       // Turn off Skimmer if Return pump has been shutoff.   
       if (!ReefAngel.Relay.Status(DT_Pump)) {
       ReefAngel.Relay.Override(Skimmer,0);
      }
  
      // Alert if ATO timeout flag
      if (bitRead(ReefAngel.Flags,ATOTimeOutFlag))
      atoAlert.Send("ATO+timeout!+ATO+disabled.");
      }

      // Swabbie 

      void RunSwabbie() {
      int repeat=InternalMemory.read(Mem_B_SwabbieRepeat)*60;
      int runtime=InternalMemory.read(Mem_B_SwabbieTime)*60;
      static time_t t;
  
      // Manual mode
      if (ReefAngel.Relay.isMaskOn(Swabbie)) {
      ReefAngel.Relay.Override(Swabbie,2);
      t=now();
      }  

      if (now()-t < runtime) {
      ReefAngel.Relay.On(Swabbie);
      } else {
      ReefAngel.DosingPumpRepeat(Swabbie,0,repeat,runtime);    
      }  
     }
      void DelayedOnModes(byte relay) {
      static unsigned long startTime=now();

      if (startTime==LastStart && ReefAngel.HighATO.IsActive()) {
      ReefAngel.Relay.On(relay);
      } else {
      ReefAngel.Relay.DelayedOn(relay);
    }
   }  
      // Definitions for dosing pumps
    //  #define numDPumps 2
   //  byte pump[numDPumps]={ DosePumpOne, DosePumpTwo };
    //  byte varReport[numDPumps]={ Var_DPump1, Var_DPump2 };
     // byte memDPTime[numDPumps]={ Mem_B_DP1Timer, Mem_B_DP2Timer };
     // int memDPVolume[numDPumps]={ Mem_I_DP1Volume, Mem_I_DP2Volume };
     // int memDPRepeat[numDPumps]={ Mem_I_DP1RepeatInterval, Mem_I_DP2RepeatInterval };
     // int memCalTime[numDPumps]={ Mem_I_CalDP1Time, Mem_I_CalDP2Time };
    //  int memCalVol[numDPumps]={ Mem_I_CalDP1Vol, Mem_I_CalDP2Vol };
//{
     // void RunDosingPumps() {
     // float rate;
     // byte dpTime;
     // int dpRepeat, calcTime, totalVolume;

   //   static byte doseTime[numDPumps]={ 
   //   InternalMemory.read(memDPTime[0]), 
   //   InternalMemory.read(memDPTime[1]) 
   //   };
  
   //   for (int i=0;i < numDPumps; i++) {
    //  dpTime=InternalMemory.read(memDPTime[i]);
    //  dpRepeat=InternalMemory.read_int(memDPRepeat[i]);
   //   rate=(float)InternalMemory.read_int(memCalVol[i])/InternalMemory.read_int(memCalTime[i]);
   //  calcTime=(InternalMemory.read_int(memDPVolume[i])/rate)/(1440/dpRepeat);
   //   totalVolume=rate*(dpTime*(1440/dpRepeat)); 

   //   if (dpTime!=doseTime[i]) { // Memory has changed.
   //     InternalMemory.write_int(memDPVolume[i], totalVolume); // Update volume
    //    doseTime[i]=dpTime;
    //  } else if (dpTime!=calcTime) { // Calculated time has changed.
    //    InternalMemory.write(memDPTime[i], calcTime); // Update time
    //    doseTime[i]=calcTime;
    //  }

      // Make sure we're not calibrating
      //if (!ReefAngel.Relay.Status(VO_Calibrate)) 
      //ReefAngel.DosingPumpRepeat(pump[i], i*5, dpRepeat, doseTime[i]);
      //}
    // }
     
    // ReefAngel.CustomVar[7]=1;       

     void StandardHeater1(byte HeaterRelay, int LowTemp, int HighTemp)
        {
        if (ReefAngel.Params.Temp[T2_PROBE] == 0) return; // Don't turn the heater on if the temp is reading 0
        if (ReefAngel.Params.Temp[T2_PROBE] <= LowTemp && ReefAngel.Params.Temp[T2_PROBE] > 0) ReefAngel.Relay.On(HeaterRelay); // If sensor 2 temperature <= LowTemp - turn on heater
        if (ReefAngel.Params.Temp[T2_PROBE] >= HighTemp) ReefAngel.Relay.Off(HeaterRelay); // If sensor 2 temperature >= HighTemp - turn off heater
        }

   void StandardHeater2(byte HeaterRelay, int LowTemp, int HighTemp) //Heater for Grow Tank
    {
        if (ReefAngel.Params.Temp[T1_PROBE] == 0) return;  // Don't turn the heater on if the temp is reading 0
        if (ReefAngel.Params.Temp[T1_PROBE] <= LowTemp && ReefAngel.Params.Temp[T1_PROBE] > 0) ReefAngel.Relay.On(HeaterRelay);  // If sensor temperature <= LowTemp - turn on heater
        if (ReefAngel.Params.Temp[T1_PROBE] >= HighTemp) ReefAngel.Relay.Off(HeaterRelay);  // If sensor temperature >= HighTemp - turn off heater
    }
    
      // Globals for Params on Custom Main
    byte x,y;
    char text[10];  
    
    void MenuEntry1()
    {
    ReefAngel.DisplayMenuEntry("Item 1");ReefAngel.Relay.RelayMaskOn = ReefAngel.LightsOnPorts;
    #ifdef RelayExp
    for ( byte i = 0; i < MAX_RELAY_EXPANSION_MODULES; i++ )
    {
        ReefAngel.Relay.RelayMaskOnE[i] = ReefAngel.LightsOnPortsE[i];
    }
    #endif  // RelayExp
    ReefAngel.Relay.Write();

    }
    void MenuEntry2()
    {
    ReefAngel.DisplayMenuEntry("Item 2");ReefAngel.Relay.RelayMaskOn = 0;
    #ifdef RelayExp
    for ( byte i = 0; i < MAX_RELAY_EXPANSION_MODULES; i++ )
    {
        ReefAngel.Relay.RelayMaskOnE[i] = 0;
    }
    #endif  // RelayExp
    ReefAngel.Relay.Write();

    }
    void MenuEntry3()
    {
    ReefAngel.DisplayMenuEntry("Item 3");ReefAngel.FeedingModeStart();

    }
    void MenuEntry4()
    {
    ReefAngel.DisplayMenuEntry("Item 4");ReefAngel.WaterChangeModeStart();

    }
    void MenuEntry5()
    {
    ReefAngel.DisplayMenuEntry("Item 5");ReefAngel.OverheatClear();

    }
    void MenuEntry6()
    {
    ReefAngel.DisplayMenuEntry("Item 6");ReefAngel.SetupCalibratePH();
    ReefAngel.DisplayedMenu = ALT_SCREEN_MODE;

    }
    void MenuEntry7()
    {
    ReefAngel.DisplayMenuEntry("Item 7");ReefAngel.SetupCalibrateSalinity();
    }
    
    // End Custom Menu Globals
   
    void DrawCustomMain()
    {
      int x,y; 
      char text[7];
      
      // Date and Time
      ReefAngel.LCD.DrawDate( 6, 122 );  //6 pixels left, 122 lines down
      pingSerial();
      
      // I/O Expansion
      byte bkcolor;
      x = 14;
      y = 11;
      for ( int a=0;a<6;a++ )
      {
      ReefAngel.LCD.DrawCircleOutline( x+(a*20),y,4,COLOR_MEDIUMORCHID );
      if ( ReefAngel.IO.GetChannel(a) ) bkcolor=COLOR_WHITE; else bkcolor=COLOR_GRAY;
      ReefAngel.LCD.FillCircle( x+(a*20),y,2,bkcolor );
      }
      pingSerial();

      // Parameters
  
      ReefAngel.LCD.DrawText(0,255,18,26,"GT");  //18 left, 10 down
      ConvertNumToString(text, ReefAngel.Params.Temp[T1_PROBE], 10);
      ReefAngel.LCD.DrawLargeText(COLOR_INDIANRED, 255, 10, 37, text, Num8x8);
      pingSerial();

      ReefAngel.LCD.DrawText(0,255,57,26,"DT"); //57 left, 10 down
      ConvertNumToString(text, ReefAngel.Params.Temp[T2_PROBE], 10);
      ReefAngel.LCD.DrawLargeText(COLOR_INDIANRED, 255, 50, 37, text, Num8x8);
      pingSerial();
      
      ReefAngel.LCD.DrawText(0,255,94,26,"Res"); //94 left, 10 down
      ConvertNumToString(text, ReefAngel.Params.Temp[T3_PROBE], 10);
      ReefAngel.LCD.DrawLargeText(COLOR_INDIANRED, 255, 90, 37, text, Num8x8);
      pingSerial();

      ReefAngel.LCD.DrawText(0,255,16,52,"DT pH"); //18 left, 39 down
      ConvertNumToString(text, ReefAngel.Params.PH, 100);
      ReefAngel.LCD.DrawLargeText(COLOR_INDIANRED, 255, 15, 65, text, Num8x8);
      pingSerial();

      ReefAngel.LCD.DrawText( 0,255,57,52, "GT pH"); //57 left, 39 down
      ConvertNumToString(text, ReefAngel.Params.PHExp, 100);
      ReefAngel.LCD.DrawLargeText(COLOR_INDIANRED, 255, 55, 65, text, Num8x8);
      pingSerial();

      ReefAngel.LCD.DrawText(0,255,100,52,"Sal"); //100 left, 39 down
      ConvertNumToString(text, ReefAngel.Params.Salinity, 10);
      ReefAngel.LCD.DrawLargeText(COLOR_INDIANRED, 255, 98, 65, text, Num8x8);
      pingSerial();

      // Main Relay Box
      byte TempRelay = ReefAngel.Relay.RelayData;
      TempRelay &= ReefAngel.Relay.RelayMaskOff;
      TempRelay |= ReefAngel.Relay.RelayMaskOn;
      ReefAngel.LCD.DrawOutletBox( 12, 80, TempRelay );
      pingSerial();

       // Relay Expansion
      TempRelay = ReefAngel.Relay.RelayDataE[0];
      TempRelay &= ReefAngel.Relay.RelayMaskOffE[0];
      TempRelay |= ReefAngel.Relay.RelayMaskOnE[0];
      ReefAngel.LCD.DrawOutletBox( 12, 93, TempRelay );
      pingSerial();  
      
      // Relay Expansion
      TempRelay = ReefAngel.Relay.RelayDataE[1];
      TempRelay &= ReefAngel.Relay.RelayMaskOffE[1];
      TempRelay |= ReefAngel.Relay.RelayMaskOnE[1];
      ReefAngel.LCD.DrawOutletBox( 12, 107, TempRelay );
      pingSerial();  
    }

    void DrawCustomGraph()
    {
    // ReefAngel.LCD.DrawGraph( 5, 5 );
    }

Re: broken feeding mode

Posted: Mon Oct 14, 2013 6:15 am
by lnevo
The code for the swabbie looks good but you have to check what the memory locations hold...as that could change it drastically :)

Re: broken feeding mode

Posted: Mon Oct 14, 2013 7:27 am
by rossbryant1956
how do I do that? Would that be affecting the feeding mode\water change as well? Thx

Re: broken feeding mode

Posted: Mon Oct 14, 2013 7:42 am
by lnevo
Dont think so...

For reading/writing memory

http://reefangelwifi:2000/mbX,Y

Where X is the location and Y is the value. If you want to read leave off the ,Y

Re: broken feeding mode

Posted: Mon Oct 14, 2013 9:03 am
by rossbryant1956
is there a post that tells where everything sits in memory? Thx

Re: broken feeding mode

Posted: Mon Oct 14, 2013 9:27 am
by rossbryant1956
ok, so following your advice I tested memory locations 115 and 116 and both had the value of 255 in them. Going from there, I used the utility to reset 115 to 6 and 116 to 1 as stated in my code.

I would have thought the memory calls in the code should have set them, but obviously no. Should I check all my locations as stated in the code and set them to the proper values?

Re: broken feeding mode

Posted: Mon Oct 14, 2013 9:50 am
by rossbryant1956
lee is this why my mem locations are not being updated:

InternalMemory.write(Mem_B_ResetMemory,false);

Re: broken feeding mode

Posted: Mon Oct 14, 2013 12:04 pm
by lnevo
If you set that location to true then reboot it should initialize the memory with the values in the init_memory() function...

But no usually you have to set them up beforehand. Init memory was a method i used when i changed all my locations around or if something gets corrupted and i need a mass reset

Re: broken feeding mode

Posted: Mon Oct 14, 2013 12:04 pm
by lnevo
rossbryant1956 wrote:lee is this why my mem locations are not being updated:

InternalMemory.write(Mem_B_ResetMemory,false);
That line ensures that init_memory runs only once.

Re: broken feeding mode

Posted: Sun Oct 20, 2013 6:25 pm
by rossbryant1956
I had some time today and finally ripped my code apart to find the culprit that was keeping my feeding mode from working. I checked all the hardware with the example code and that all checked out. I then went back to the wizard, wrote something very simple, and tested that feed and water change worked there. Finally I started putting it back together piece by piece until I found the issue.

Evidently when trying to adapt lee's code I have a mistake in these modules:

Code: Select all

       // Turn off DT_Pump if sump overflowing 
       
       static boolean DT_OverFillOverride=true;
       if (!ReefAngel.IO.GetChannel(0)) {
         if (!DT_OverFillOverride) {
         switchAlert.Send("DT_Tank+level+alarm!");
         ReefAngel.Relay.Override(DT_Pump,0);
         DT_OverFillOverride=true;
     } 
     } else {
        DT_OverFillOverride=false;
        ReefAngel.Relay.Override(DT_Pump,2);
     }  
     
        // Turn off GT_Pump if sump overflowing 
       
       static boolean GT_PumpOverFillOverride=true;
       if (!ReefAngel.IO.GetChannel(1)) {
         if (!GT_PumpOverFillOverride) {
         switchAlert.Send("GT_Tank+level+alarm!");
         ReefAngel.Relay.Override(GT_Pump,0);
         GT_PumpOverFillOverride=true;
     } 
     } else {
        GT_PumpOverFillOverride=false;
        ReefAngel.Relay.Override(GT_Pump,2);
     }  
My suspicion is that the two lines "ReefAngel.Relay.Override(PumpName, Number) are overriding the feed mode and water change mode command. Everything else turns off during the feed mode except those two pumps. It's almost like I need to enclose these routines in an if-then or something because those overrides seem to be firing regardless of the state of those float valves. Please help. Thx

Re: broken feeding mode

Posted: Sun Oct 20, 2013 7:52 pm
by lnevo
It's the second one I think make it an else if and make sure it's not in feeding or cw modes.

Re: broken feeding mode

Posted: Sun Oct 20, 2013 7:53 pm
by lnevo
In both sections..

Re: broken feeding mode

Posted: Sun Oct 20, 2013 8:22 pm
by rossbryant1956
do you mean instead of:

} else {

we do

} else if {

that throws the error:

expected '(' before '{"

Would you be so kind as to write me a line or two so I can see what you mean? And Thx

Re: broken feeding mode

Posted: Mon Oct 21, 2013 9:23 am
by rossbryant1956
please help. thx in advance.

Re: broken feeding mode

Posted: Mon Oct 21, 2013 9:46 am
by lnevo
You need to add the conditional..

If what?

Sorry i cant provide any code at the moment, but can you answer what would you like to ensure happens during the feeding and wc mode?

Lee

Re: broken feeding mode

Posted: Mon Oct 21, 2013 11:51 am
by rossbryant1956
thx very much. I will write some pseudo-code asap. Again Thanx

Re: broken feeding mode

Posted: Thu Oct 24, 2013 7:31 pm
by rossbryant1956
Just wanted everyone to know I found and fixed my bug, and I wanted you to meet him (or her!)

{

in the wrong place...just sitting there. As Lee said, there was no conditional being tested, therefore this routine was overriding everything. Anyway RA, thx to all for your help.