Proofreading Jebao on ATO.....

Do you have a question on how to do something.
Ask in here.
Post Reply
User avatar
GiraffeCat
Posts: 61
Joined: Sun Jun 08, 2014 12:55 pm
Location: Firestone

Proofreading Jebao on ATO.....

Post by GiraffeCat »

Hello,

I was wondering if someone who speaks code fluently :ugeek: could look this over and tell me why my 2 Jebao pumps just run full throttle? It compiles fine, and uploads fine, but they just run. Ordered the cables and requested they be modified for my ATO ports (You did do that , right Roberto? :?: ) Reef angel plus controller, lightning code, etc. If you could look this all over and let me know I would appreciate it.
Thank You,
GC
Dan

Code: Select all

#include <ReefAngel_Features.h>
#include <Globals.h>
#include <RA_Wifi.h>
#include <Wire.h>
#include <OneWire.h>
#include <Time.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 <Relay.h>
#include <RA_PWM.h>
#include <Timer.h>
#include <Memory.h>
#include <InternalEEPROM.h>
#include <RA_Colors.h>
#include <RA_CustomColors.h>
#include <Salinity.h>
#include <RF.h>
#include <IO.h>
#include <ORP.h>
#include <AI.h>
#include <PH.h>
#include <WaterLevel.h>
#include <Humidity.h>
#include <DCPump.h>
#include <ReefAngel.h>

byte ActinicPWMValue=0;    // For cloud code
byte DaylightPWMValue=0;   // For cloud code

////// Place global variable code below here



////// Place global variable code above here


void setup()
{
    // This must be the first line
    ReefAngel.Init();  //Initialize controller
    ReefAngel.Use2014Screen();  // Let's use 2014 Screen 
    // Ports toggled in Feeding Mode
    ReefAngel.FeedingModePorts = 0;
    // Ports toggled in Water Change Mode
    ReefAngel.WaterChangePorts = 0;
    // Ports toggled when Lights On / Off menu entry selected
    ReefAngel.LightsOnPorts = 0;
    // Ports turned off when Overheat temperature exceeded
    ReefAngel.OverheatShutoffPorts = 0;
    // Use T1 probe as temperature and overheat functions
    ReefAngel.TempProbe = T1_PROBE;
    ReefAngel.OverheatProbe = T1_PROBE;
    // Set the Overheat temperature setting
    InternalMemory.OverheatTemp_write( 810 );

    // Feeeding and Water Change mode speed
    ReefAngel.DCPump.FeedingSpeed=0;
    ReefAngel.DCPump.WaterChangeSpeed=0;


    // Ports that are always on

    ////// Place additional initialization code below here
    

    ////// Place additional initialization code above here
}
// Random Cloud/Thunderstorm effects function

void CheckCloud()
{

  // Change the values below to customize your cloud/storm effect
  
#define Clouds_Every_X_Days 2 // Frequency in days based on the day of the month - number 2 means every 2 days, for example (day 2,4,6 etc)
#define Cloud_Chance_per_Day 65 // Percentage chance of a cloud happening today
#define Min_Cloud_Duration 7 // Minimum number of minutes for cloud duration.  Don't use max duration of less than 6
#define Max_Cloud_Duration 12 // Maximum number of minutes for the cloud duration. Don't use max duration of more than 255
#define Min_Clouds_per_Day 1 // Minimum number of clouds that can happen per day
#define Max_Clouds_per_Day 2 // Maximum number of clouds that can happen per day
#define Start_Cloud_After NumMins(12,00) // Only start the cloud effect after this setting - In this example, start cloud after noon
#define End_Cloud_Before NumMins(17,00) // Always end the cloud effect before this setting - In this example, end cloud before 9:00pm
#define Lightning_Change_per_Cloud 100 // Percentage chance of a lightning happen for every cloud - use 100 and cause the lightning to have 100% chance of happening

  // Note: Make sure to choose correct values that will work within your PWMSLope settings.
  // For example, in our case, we could have a max of 5 clouds per day and they could last for 50 minutes.
  // Which could mean 250 minutes of clouds. We need to make sure the PWMSlope can accomodate 250 minutes of effects or unforseen results could happen.
  // Also, make sure that you can fit double those minutes between Start_Cloud_After and End_Cloud_Before.
  // In our example, we have 510 minutes between Start_Cloud_After and End_Cloud_Before, so double the 250 minutes (or 500 minutes) can fit in that 510 minutes window.

  //#define printdebug // Uncomment this for debug print on Serial Monitor window
#define forcecloudcalculation // Uncomment this to force the cloud calculation to happen in the boot process. 

    // Add Random Lightning modes
#define Calm 0    // No lightning
#define Slow 1    // 5 seconds of slow lightning in the middle of a cloud for ELN style (slow response) drivers
#define Fast 2    // 5 seconds of fast lightning in the middle of a cloud for LDD style (fast response) drivers
#define Mega 3    // Lightning throughout the cloud, higher chance as it gets darker
#define Mega2 4   // Like Mega, but with more lightning
  
  //   
  // 
  byte LightningModes[] = { Fast, Mega, Calm, Calm }; // Set which modes you want to use - Example:{ Slow, Fast, Mega, Mega2 } to randomize all four modes.

  // Change the values above to customize your cloud/storm effect
  // Do not change anything below here

  static byte cloudchance=255;
  static byte cloudduration=0;
  static int cloudstart=0;
  static byte numclouds=0;
  static byte lightningchance=0;
  static byte cloudindex=0;
  static byte lightningstatus=0;
  static int LastNumMins=0;
  static byte lightningMode=0;
  static boolean chooseLightning=true;

  static time_t DelayCounter=millis();    // Variable for lightning timing.  
  static int DelayTime=random(1000);      // Variable for lightning timimg.

  // Every day at midnight, we check for chance of cloud happening today
  if (hour()==0 && minute()==0 && second()==0) cloudchance=255;

#ifdef forcecloudcalculation
  if (cloudchance==255)
#else
    if (hour()==0 && minute()==0 && second()==1 && cloudchance==255) 
#endif
    {
      randomSeed(millis());    // Seed the random number generator
      //Pick a random number between 0 and 99
      cloudchance=random(100); 
      // if picked number is greater than Cloud_Chance_per_Day, we will not have clouds today
      if (cloudchance>Cloud_Chance_per_Day) cloudchance=0;
      // Check if today is day for clouds. 
      if ((day()%Clouds_Every_X_Days)!=0) cloudchance=0; 
      // If we have cloud today
      if (cloudchance)
      {
        // pick a random number for number of clouds between Min_Clouds_per_Day and Max_Clouds_per_Day
        numclouds=random(Min_Clouds_per_Day,Max_Clouds_per_Day);
        // pick the time that the first cloud will start
        // the range is calculated between Start_Cloud_After and the even distribuition of clouds on this day. 
        cloudstart=random(Start_Cloud_After,Start_Cloud_After+((End_Cloud_Before-Start_Cloud_After)/(numclouds*2)));
        // pick a random number for the cloud duration of first cloud.
        cloudduration=random(Min_Cloud_Duration,Max_Cloud_Duration);
        //Pick a random number between 0 and 99
        lightningchance=random(100);
        // if picked number is greater than Lightning_Change_per_Cloud, we will not have lightning today
        if (lightningchance>Lightning_Change_per_Cloud) lightningchance=0; 
      }
    }
  // Now that we have all the parameters for the cloud, let's create the effect


  if (cloudchance)
  {
    //is it time for cloud yet?
    if (NumMins(hour(),minute())>=cloudstart && NumMins(hour(),minute())<(cloudstart+cloudduration))
    {
      DaylightPWMValue=ReversePWMSlope(cloudstart,cloudstart+cloudduration,DaylightPWMValue,0,180);
      if (chooseLightning) 
      { 
        lightningMode=LightningModes[random(100)%sizeof(LightningModes)]; 
        chooseLightning=false; 
      } 
      switch (lightningMode) 
      {
      case Calm:
        break;
      case Mega:
        // Lightning chance from beginning of cloud through the end.  Chance increases with darkness of cloud.
        if (lightningchance && random(ReversePWMSlope(cloudstart,cloudstart+cloudduration,100,0,180))<1 && (millis()-DelayCounter)>DelayTime)
        {
          int a=random(1,5);    // Pick a number of consecutive flashes from 1 to 4.  
          for (int i=0; i<a; i++)
          {
            analogWrite(daylightPWMPin,random(DaylightPWMValue*2.55,255));    // Flash on
            int randy=random(20,80);    // Random number for a delay
            if (randy>71) randy=((randy-70)/2)*100;    // Small chance of a longer delay
            delay(randy);                // Wait from 20 to 69 ms, or 100-400 ms
            analogWrite(daylightPWMPin,DaylightPWMValue*2.55);      // Flash off
            delay(random(30,50));                // Wait from 30 to 49 ms 
            wdt_reset();
          }
          DelayCounter=millis();    // If we just had a round of flashes, then lets put in a longer delay
          DelayTime=random(1000);   // of up to a second for dramatic effect before we do another round. 
        }
        break;
      case Mega2:
        // Higher lightning chance from beginning of cloud through the end.  Chance increases with darkness of cloud.
        if (lightningchance && random(ReversePWMSlope(cloudstart,cloudstart+cloudduration,100,0,180))<2 && (millis()-DelayCounter)>DelayTime)
        {
          int a=random(1,5);    // Pick a number of consecutive flashes from 1 to 4.  
          for (int i=0; i<a; i++)
          {
            analogWrite(daylightPWMPin,random(DaylightPWMValue*2.55,255));    // Flash on
            int randy=random(20,80);    // Random number for a delay
            if (randy>71) randy=((randy-70)/2)*100;    // Small chance of a longer delay
            delay(randy);                // Wait from 20 to 69 ms, or 100-400 ms
            analogWrite(daylightPWMPin,DaylightPWMValue*2.55);      // Flash off
            delay(random(30,50));                // Wait from 30 to 49 ms 
            wdt_reset();
          }
          DelayCounter=millis();    // If we just had a round of flashes, then lets put in a longer delay
          DelayTime=random(1000);   // of up to a second for dramatic effect before we do another round. 
        }
        break;
      case Fast:
        // 5 seconds of lightning in the middle of the cloud
        if (lightningchance && (NumMins(hour(),minute())==(cloudstart+(cloudduration/2))) && second()<5 && (millis()-DelayCounter)>DelayTime)
        {
          int a=random(1,5);    // Pick a number of consecutive flashes from 1 to 4.  
          for (int i=0; i<a; i++)
          {
            analogWrite(daylightPWMPin,random(DaylightPWMValue*2.55,255));    // Flash on
            int randy=random(20,80);    // Random number for a delay
            if (randy>71) randy=((randy-70)/2)*100;    // Small chance of a longer delay
            delay(randy);                // Wait from 20 to 69 ms, or 100-400 ms
            analogWrite(daylightPWMPin,DaylightPWMValue*2.55);      // Flash off
            delay(random(30,50));                // Wait from 30 to 49 ms 
            wdt_reset();
          }
          DelayCounter=millis();    // If we just had a round of flashes, then lets put in a longer delay
          DelayTime=random(1000);   // of up to a second for dramatic effect before we do another round. 
        }
        break;
      case Slow:
        // Slow lightning for 5 seconds in the middle of the cloud.  Suitable for slower ELN style drivers
        if (lightningchance && (NumMins(hour(),minute())==(cloudstart+(cloudduration/2))) && second()<5) 
        {
          if (random(100)<20) lightningstatus=1; 
          else lightningstatus=0;
          if (lightningstatus)
          {
            DaylightPWMValue=100; 
          }
          else 
          {
            DaylightPWMValue=0;
          }
          delay(1);
        }
        break;
      default:
        break;
      }
    } 
    else 
    {
      chooseLightning=true; // Reset the flag to choose a new lightning type
    }

    if (NumMins(hour(),minute())>(cloudstart+cloudduration))
    {
      cloudindex++;
      if (cloudindex < numclouds)
      {
        cloudstart=random(Start_Cloud_After+(((End_Cloud_Before-Start_Cloud_After)/(numclouds*2))*cloudindex*2),(Start_Cloud_After+(((End_Cloud_Before-Start_Cloud_After)/(numclouds*2))*cloudindex*2))+((End_Cloud_Before-Start_Cloud_After)/(numclouds*2)));
        // pick a random number for the cloud duration of first cloud.
        cloudduration=random(Min_Cloud_Duration,Max_Cloud_Duration);
        //Pick a random number between 0 and 99
        lightningchance=random(100);
        // if picked number is greater than Lightning_Change_per_Cloud, we will not have lightning today
        if (lightningchance>Lightning_Change_per_Cloud) lightningchance=0;
      }
    }
  }

  // Write the times of the next cloud, next lightning, and cloud duration to the screen and into some customvars for the Portal.
  if (LastNumMins!=NumMins(hour(),minute()))
  {
    LastNumMins=NumMins(hour(),minute());
    ReefAngel.LCD.Clear(255,0,120,132,132);
    ReefAngel.LCD.DrawText(0,255,5,120,"C");
    ReefAngel.LCD.DrawText(0,255,11,120,"00:00");
    ReefAngel.LCD.DrawText(0,255,45,120,"L");
    ReefAngel.LCD.DrawText(0,255,51,120,"00:00");
    if (cloudchance && (NumMins(hour(),minute())<cloudstart))
    {
      int x=0;
      if ((cloudstart/60)>=10) x=11; 
      else x=17;
      ReefAngel.LCD.DrawText(0,255,x,120,(cloudstart/60));
      ReefAngel.CustomVar[3]=cloudstart/60;    // Write the hour of the next cloud to custom variable for Portal reporting
      if ((cloudstart%60)>=10) x=29; 
      else x=35;
      ReefAngel.LCD.DrawText(0,255,x,120,(cloudstart%60));
      ReefAngel.CustomVar[4]=cloudstart%60;    // Write the minute of the next cloud to custom variable for Portal reporting

    }
    ReefAngel.LCD.DrawText(0,255,90,120,cloudduration);
    ReefAngel.CustomVar[7]=(cloudduration);    // Put the duration of the next cloud in a custom var for the portal
    if (lightningchance) 
    {
      int x=0;
      if (((cloudstart+(cloudduration/2))/60)>=10) x=51; 
      else x=57;
      ReefAngel.LCD.DrawText(0,255,x,120,((cloudstart+(cloudduration/2))/60));
      ReefAngel.CustomVar[5]=(cloudstart+(cloudduration/2))/60;    // Write the hour of the next lightning to a custom variable for the Portal
      if (((cloudstart+(cloudduration/2))%60)>=10) x=69; 
      else x=75;
      ReefAngel.LCD.DrawText(0,255,x,120,((cloudstart+(cloudduration/2))%60));    // Write the minute of the next lightning to a custom variable for the Portal
      ReefAngel.CustomVar[6]=(cloudstart+(cloudduration/2))%60;
    }
  }   
}

byte ReversePWMSlope(long cstart,long cend,byte PWMStart,byte PWMEnd, byte clength)
{
  long n=elapsedSecsToday(now());
  cstart*=60;
  cend*=60;
  if (n<cstart) return PWMStart;
  if (n>=cstart && n<=(cstart+clength)) return map(n,cstart,cstart+clength,PWMStart,PWMEnd);
  if (n>(cstart+clength) && n<(cend-clength)) return PWMEnd;
  if (n>=(cend-clength) && n<=cend) return map(n,cend-clength,cend,PWMEnd,PWMStart);
  if (n>cend) return PWMStart;
}

void loop()
{
    ReefAngel.StandardLights( Port1,17,0,17,2 ); // Top Off Pump
    ReefAngel.StandardLights( Port2,19,0,19,1 ); // Drain Pump
    ReefAngel.StandardLights( Port3,19,2,19,5 ); // Fill Pump
    ReefAngel.StandardHeater( Port4,771,776 ); // Heater, Duh.
    ReefAngel.StandardFan( Port5,781,785 ); // Fan, Duh.
    ReefAngel.StandardLights( Port6,9,0,20,0 ); // Big Lights
    ReefAngel.StandardLights( Port7,8,29,20,31 ); // LED Fans
    ReefAngel.StandardLights( Port8,8,28,20,32 ); // LED Power Supply
    //Lighting Control
    ActinicPWMValue=PWMSlope(8,30,20,30,0,90,60,ActinicPWMValue);
    DaylightPWMValue=PWMSlope(9,0,20,0,0,90,45,DaylightPWMValue);
    CheckCloud();
    ReefAngel.PWM.SetActinic(ActinicPWMValue);
    ReefAngel.PWM.SetDaylight(DaylightPWMValue);
    ReefAngel.DCPump.UseMemory = true;
    ReefAngel.DCPump.DaylightChannel = None;
    ReefAngel.DCPump.ActinicChannel = None;

    ////// Place your custom code below here
    
    
if (hour()>=9 && hour()<17)
{
    pinMode(lowATOPin,OUTPUT);
    analogWrite(lowATOPin,LongPulseMode(31,60,8,true)*2.55);
    pinMode(highATOPin, OUTPUT);
    analogWrite(highATOPin,LongPulseMode(31,60,8,false)*2.55);
}
else if (hour()>=17 && hour()<18)
{
    pinMode(lowATOPin,OUTPUT);
    analogWrite(lowATOPin, NutrientTransportMode(32,75,500,true)*2.55);
    pinMode(highATOPin,OUTPUT);
    analogWrite(highATOPin, NutrientTransportMode(32,75,500,false)*2.55);
}
    else if (hour()>=18 && hour()<9)
{
    pinMode(lowATOPin,OUTPUT);
    analogWrite(lowATOPin,LongPulseMode(32,40,12,true)*2.55);
    pinMode(highATOPin,OUTPUT);
    analogWrite(highATOPin,LongPulseMode(32,40,12,false)*2.55);
}



    ////// Place your custom code above here

    // This should always be the last line
    ReefAngel.Portal( "GiraffeCat" , "passwordgoeshere" );
    ReefAngel.ShowInterface();
}

.....Your forefathers wisely set aside their compassion - Steeled themselves for what needed to be done.......
User avatar
cosmith71
Posts: 1437
Joined: Fri Mar 29, 2013 3:51 pm
Location: Oklahoma City

Re: Proofreading Jebao on ATO.....

Post by cosmith71 »

Not sure, but here's one problem:

Code: Select all

    else if (hour()>=18 && hour()<9)
This can never be true.

Also, you can put these lines in setup() once and be done with them. Not sure if it's a problem or not.

Code: Select all

    pinMode(lowATOPin,OUTPUT);
    pinMode(highATOPin,OUTPUT);
--Colin
User avatar
cosmith71
Posts: 1437
Joined: Fri Mar 29, 2013 3:51 pm
Location: Oklahoma City

Re: Proofreading Jebao on ATO.....

Post by cosmith71 »

OK, now that I'm awake, here's a couple of things.

Either take this line out or change it to FALSE:

Code: Select all

ReefAngel.DCPump.UseMemory = true;
Change this...

Code: Select all

    else if (hour()>=18 && hour()<9)
to this:

Code: Select all

    else if (hour()>=18 || hour()<9)
I think that should do it.

--Colin
User avatar
GiraffeCat
Posts: 61
Joined: Sun Jun 08, 2014 12:55 pm
Location: Firestone

Re: Proofreading Jebao on ATO.....

Post by GiraffeCat »

cosmith71 wrote:OK, now that I'm awake, here's a couple of things.

Either take this line out or change it to FALSE:

Code: Select all

ReefAngel.DCPump.UseMemory = true;
Change this...

Code: Select all

    else if (hour()>=18 && hour()<9)
to this:

Code: Select all

    else if (hour()>=18 || hour()<9)
I think that should do it.

--Colin
Uh, why were you up so early? I am rocking the coffee at 0400 hours, but not a minute before.

Line deleted. I actually had it "false " to start with, then changed it when didn't work right.

Changed the "&&" to "||", and all is well in the realm of dragons. Thank you so much. :D :ugeek: (Roberto is off the hook on the cable mods.)
If you are ever bored and want to explain how to make the pumps go bat ship crazy during the lightning storm and then go back to normal afterwards I am game to try. (I need to get some coding school going on. Maybe next year. :( )
.....Your forefathers wisely set aside their compassion - Steeled themselves for what needed to be done.......
User avatar
cosmith71
Posts: 1437
Joined: Fri Mar 29, 2013 3:51 pm
Location: Oklahoma City

Re: Proofreading Jebao on ATO.....

Post by cosmith71 »

[quote="GiraffeCatIf you are ever bored and want to explain how to make the pumps go bat ship crazy during the lightning storm and then go back to normal afterwards I am game to try. (I need to get some coding school going on. Maybe next year. :( )[/quote]

Had to get up early for work. :D

I've been thinking about the pump mods for the storm mode. I just don't have all the hardware to do it (namely, the dimming expansion) so I haven't put it into practice. It wouldn't be hard. I already have an "else mode" routine that would work great with a little modification.

--Colin
User avatar
lnevo
Posts: 5430
Joined: Fri Jul 20, 2012 9:42 am

Re: Proofreading Jebao on ATO.....

Post by lnevo »

Btw the dev libraries which are working well at this time has both ATO ports supported by the DCPump class.
User avatar
GiraffeCat
Posts: 61
Joined: Sun Jun 08, 2014 12:55 pm
Location: Firestone

Re: Proofreading Jebao on ATO.....

Post by GiraffeCat »

lnevo wrote:Btw the dev libraries which are working well at this time has both ATO ports supported by the DCPump class.

Are you talking about "ReefAngel.DCPump.LowATOChannel=true" type of thing? If so, I kept getting the 'class DCPumpClass' has no member named 'LowATOChannel" issue, even with using the Dev Libraries off of github thrown in place libraries folder.

LMK,
GC
.....Your forefathers wisely set aside their compassion - Steeled themselves for what needed to be done.......
User avatar
lnevo
Posts: 5430
Joined: Fri Jul 20, 2012 9:42 am

Re: Proofreading Jebao on ATO.....

Post by lnevo »

Yes. It is definitely in there...are you sure your putting them in the right place. And the latest has support for HighATOChannel...
User avatar
GiraffeCat
Posts: 61
Joined: Sun Jun 08, 2014 12:55 pm
Location: Firestone

Re: Proofreading Jebao on ATO.....

Post by GiraffeCat »

lnevo wrote:Yes. It is definitely in there...are you sure your putting them in the right place. And the latest has support for HighATOChannel...
I saw that it had it in there in the dev branch and not in 1.1, and was hoping it was going to be easy to get them working on the ATO's. Went to https://github.com/reefangel/Libraries/tree/dev,downloaded, unzipped, and swapped out the libraries folder. Saw this when I looked in DCPump.cpp:

Code: Select all

DCPumpClass::DCPumpClass()
{
	UseMemory=true;
	FeedingSpeed=0;
	WaterChangeSpeed=0;
	DaylightChannel=NON;
	ActinicChannel=NON;
	LowATOChannel=NON;
	HighATOChannel=NON;
I thought it would work. It didn't. I have everything you see in the code posted at the beginning - even the things I don't need - AI,PH, ORP, Etc. Never got it to work.

I would willingly take any assistance in this coding arena. So let me know if you have anything for me to try. I am just happy that the two pumps are working as it is coded now. Two more boxes I don't need thanks to my Reef Angel, and several generous members on this forum.

Thanks,
Dan (GC)
.....Your forefathers wisely set aside their compassion - Steeled themselves for what needed to be done.......
User avatar
lnevo
Posts: 5430
Joined: Fri Jul 20, 2012 9:42 am

Re: Proofreading Jebao on ATO.....

Post by lnevo »

Pretty straight forward like you said.

2 things to verify that you did download the dev tree and also make sure you restart arduino.
User avatar
GiraffeCat
Posts: 61
Joined: Sun Jun 08, 2014 12:55 pm
Location: Firestone

Re: Proofreading Jebao on ATO.....

Post by GiraffeCat »

lnevo wrote:Pretty straight forward like you said.

2 things to verify that you did download the dev tree and also make sure you restart arduino.
Reinstalled Arduino - Reef Angel Controller. Downloaded the dev tree. Replaced the contents of the "libraries" folder with the contents of "libraries-dev"- no change. Closed arduino, restored the original libraries folder, and then overwrote the folders that were different in the libraries - no change.

Is there something I am not adding up top in the code somewhere?

Anyway. It works as it is now. I would like to understand what is going on now to help prevent future issues. LMK. Thank you,

Dan
.....Your forefathers wisely set aside their compassion - Steeled themselves for what needed to be done.......
User avatar
lnevo
Posts: 5430
Joined: Fri Jul 20, 2012 9:42 am

Re: Proofreading Jebao on ATO.....

Post by lnevo »

Can you post the code you attempted to compile?
User avatar
GiraffeCat
Posts: 61
Joined: Sun Jun 08, 2014 12:55 pm
Location: Firestone

Re: Proofreading Jebao on ATO.....

Post by GiraffeCat »

lnevo wrote:Can you post the code you attempted to compile?
Here is the quick throw together code. My current code is in the first post. I feel like it is something stupid I am missing. :?: (I want a bigger monitor, no, make that two bigger monitors.) I do like the fact that my current set up has three different "modes" for different times of day. If you figure out my issue with the libraries, then would you please tell me how to do my different modes your way? The more I learn now the better off I will be.

Code: Select all

#include <ReefAngel_Features.h>
#include <Globals.h>
#include <RA_Wifi.h>
#include <Wire.h>
#include <OneWire.h>
#include <Time.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 <Relay.h>
#include <RA_PWM.h>
#include <Timer.h>
#include <Memory.h>
#include <InternalEEPROM.h>
#include <RA_Colors.h>
#include <RA_CustomColors.h>
#include <Salinity.h>
#include <RF.h>
#include <IO.h>
#include <ORP.h>
#include <AI.h>
#include <PH.h>
#include <WaterLevel.h>
#include <Humidity.h>
#include <DCPump.h>
#include <ReefAngel.h>

////// Place global variable code below here


////// Place global variable code above here


void setup()
{
    // This must be the first line
    ReefAngel.Init();  //Initialize controller
    ReefAngel.Use2014Screen();  // Let's use 2014 Screen 
    // Ports toggled in Feeding Mode
    ReefAngel.FeedingModePorts = 0;
    // Ports toggled in Water Change Mode
    ReefAngel.WaterChangePorts = 0;
    // Ports toggled when Lights On / Off menu entry selected
    ReefAngel.LightsOnPorts = 0;
    // Ports turned off when Overheat temperature exceeded
    ReefAngel.OverheatShutoffPorts = 0;
    // Use T1 probe as temperature and overheat functions
    ReefAngel.TempProbe = T1_PROBE;
    ReefAngel.OverheatProbe = T1_PROBE;
    // Set the Overheat temperature setting
    InternalMemory.OverheatTemp_write( 805 );

    // Feeeding and Water Change mode speed
    ReefAngel.DCPump.FeedingSpeed=0;
    ReefAngel.DCPump.WaterChangeSpeed=0;


    // Ports that are always on

    ////// Place additional initialization code below here
    

    ////// Place additional initialization code above here
}

void loop()
{
    ReefAngel.StandardLights( Port1,17,0,17,2 );
    ReefAngel.StandardLights( Port2,19,0,19,1 );
    ReefAngel.StandardLights( Port3,19,2,19,5 );
    ReefAngel.StandardHeater( Port4,773,776 );
    ReefAngel.StandardFan( Port5,781,785 );
    ReefAngel.StandardLights( Port6,9,0,20,0 );
    ReefAngel.StandardLights( Port7,8,30,20,30 );
    ReefAngel.StandardLights( Port8,8,29,20,31 );
    ReefAngel.PWM.SetDaylight( PWMSlope(9,0,20,0,0,90,60,0) );
    ReefAngel.PWM.SetActinic( PWMSlope(8,30,20,30,0,90,60,0) );
    ReefAngel.DCPump.UseMemory = false;
    ReefAngel.DCPump.SetMode( TidalSwell,65,10 );
    ReefAngel.DCPump.DaylightChannel = None;
    ReefAngel.DCPump.ActinicChannel = None;
    ReefAngel.DCPump.LowATOChannel = Sync;
    ReefAngel.DCPump.HighATOChannel = AntiSync;
    ////// Place your custom code below here
    

    ////// Place your custom code above here

    // This should always be the last line
    ReefAngel.Portal( "GiraffeCat" , "passwordgoeshere");
    ReefAngel.ShowInterface();
}

Thanks,
GC
.....Your forefathers wisely set aside their compassion - Steeled themselves for what needed to be done.......
User avatar
lnevo
Posts: 5430
Joined: Fri Jul 20, 2012 9:42 am

Re: Proofreading Jebao on ATO.....

Post by lnevo »

It compiles fine. Can you please try again and post the error. Make sure you have the right Libraries folder when you're updating... if you look in the file DCPump/DCpump.h within the Libraries folder you should see the Low and High ATO channel defined as bytes.

If you're getting this, you're NOT using the right libraries for sure.

sketch_aug25a.cpp: In function 'void loop()':
sketch_aug25a:85: error: 'class DCPumpClass' has no member named 'LowATOChannel'
sketch_aug25a:86: error: 'class DCPumpClass' has no member named 'HighATOChannel'

It's important the we figure out the issue to make sure there's no issue with the dev libraries... so thanks in advance. Once we get this working we can simplify your code and use the right methodology :) for now, though I'm glad it's working for you.
User avatar
GiraffeCat
Posts: 61
Joined: Sun Jun 08, 2014 12:55 pm
Location: Firestone

Re: Proofreading Jebao on ATO.....

Post by GiraffeCat »

lnevo wrote:It compiles fine. Can you please try again and post the error. Make sure you have the right Libraries folder when you're updating... if you look in the file DCPump/DCpump.h within the Libraries folder you should see the Low and High ATO channel defined as bytes.

If you're getting this, you're NOT using the right libraries for sure.

sketch_aug25a.cpp: In function 'void loop()':
sketch_aug25a:85: error: 'class DCPumpClass' has no member named 'LowATOChannel'
sketch_aug25a:86: error: 'class DCPumpClass' has no member named 'HighATOChannel'

It's important the we figure out the issue to make sure there's no issue with the dev libraries... so thanks in advance. Once we get this working we can simplify your code and use the right methodology :) for now, though I'm glad it's working for you.


That is the error it generates when I hit verify. I went back and downloaded the dev libraries again. It unzips and saves in downloads folder as "Libraries-dev", so I think I am downloading the right files. I deleted the "Libraries" folder from Computer/Local Disk(C)/Program Files(x86)/Reef Angel Controller, and put the "Libraries-dev" folder in its place. No change. Changed the folder name from "Libraries-dev" to just "Libraries", closed Arduino, restarted it, and - wait for it - No change. Dang it.
When I open the DCPump header file I see:
header file.jpg
header file.jpg (145.22 KiB) Viewed 5520 times
Let me know what you want me to try next. Different computer maybe? Is there a supporting library I need to check?Already reinstalled Arduino - Reef Angel Controller twice. Restarted computer multiple times, restarted Arduino between each try.

Thank You,
Dan
GC
.....Your forefathers wisely set aside their compassion - Steeled themselves for what needed to be done.......
rimai
Posts: 12881
Joined: Fri Mar 18, 2011 6:47 pm

Re: Proofreading Jebao on ATO.....

Post by rimai »

Ahhh.
You are placing the files in the wrong spot.
Here is what you will need to do to fix it:
Reinstall Arduino - Reef Angel Controller to place the original libraries folder back.
Move the dev libraries folder into Documents\Arduino\libraries.
Roberto.
User avatar
GiraffeCat
Posts: 61
Joined: Sun Jun 08, 2014 12:55 pm
Location: Firestone

Re: Proofreading Jebao on ATO.....

Post by GiraffeCat »

rimai wrote:Ahhh.
You are placing the files in the wrong spot.
Here is what you will need to do to fix it:
Reinstall Arduino - Reef Angel Controller to place the original libraries folder back.
Move the dev libraries folder into Documents\Arduino\libraries.
lnevo wrote:You want to change the branch to dev and then on the bottom right you can download the zip file.

Unzip it and replace the libraries folder with whats inside
I was just doing what it says! :oops: Glad that was an easy fix. Two folders-same name. Leave it to me to find the monkey trap.

Anyway. Thanks for lurking, Roberto.

Now. This young grasshopper would love to continue his lesson on multiple wave settings the "easy way". lnevo, please continue. I'm going to stare at Colin's else mode for a little while, maybe figure it out. :lol: (Yeah, right.)

Thank you,
Dan
.....Your forefathers wisely set aside their compassion - Steeled themselves for what needed to be done.......
User avatar
lnevo
Posts: 5430
Joined: Fri Jul 20, 2012 9:42 am

Re: Proofreading Jebao on ATO.....

Post by lnevo »

Here you go. only the relevant code is displayed.

Code: Select all

    ReefAngel.DCPump.UseMemory = false;
    ReefAngel.DCPump.LowATOChannel = Sync;
    ReefAngel.DCPump.HighATOChannel = AntiSync;
    ReefAngel.DCPump.Threshold = 32;
    
    ////// Place your custom code below here
    
    
if (hour()>=9 && hour()<17)
{
    ReefAngel.DCPump.SetMode(LongPulse,60,8);
}
else if (hour()>=17 && hour()<18)
{
    ReefAngel.DCPump.SetMode(NutrientTransport,75,50);
}
else if (hour()>=18 && hour()<9)
{
    ReefAngel.DCPump.SetMode(LongPulse,40,12);
}

You no longer need to set the low speed to 32 anymore since the dev libraries now have a threshold you can set on the pumps. You'll see I defined that right after setting the pump channels. After that it was just a matter of setting the speed and duration based on what you had before. One call to SetMode takes care of everything :)
User avatar
GiraffeCat
Posts: 61
Joined: Sun Jun 08, 2014 12:55 pm
Location: Firestone

Re: Proofreading Jebao on ATO.....

Post by GiraffeCat »

Thank you. Not too much different, just getting rid of all the "instruction" in the custom area and let "SetMode" do its thing.

Okay, so what would it take to get the pumps to go nuts during a lightning storm, and then go back when done.

Is it as easy as:

if CheckCloud() // I'm not sure on the terminology, just an example.
{
ReefAngel.DCPump.SetMode (BatShipCrazy,90,5) // I know it's not a real mode (yet), you know what I mean!
}
else if (hour.....blah blah blah and so on.

Just would be nice to make it randomly go nuts with the lightning storms - you know.


Thank you,
GC
.....Your forefathers wisely set aside their compassion - Steeled themselves for what needed to be done.......
Reefology
Posts: 209
Joined: Fri Dec 26, 2014 6:38 pm

Re: Proofreading Jebao on ATO.....

Post by Reefology »

happy new year

Im having a similar problem as the original post except it just the antisync pump running full throttle and doesn't respond to commands such as feeding mode?

Code: Select all

void setup()
{
    // This must be the first line
    ReefAngel.Init();  //Initialize controller
    ReefAngel.Use2014Screen();  // Let's use 2014 Screen 
    // Ports toggled in Feeding Mode
    ReefAngel.FeedingModePorts = Port5Bit;
    // Ports toggled in Water Change Mode
    ReefAngel.WaterChangePorts = Port3Bit | Port4Bit | Port5Bit;
    // Ports toggled when Lights On / Off menu entry selected
    ReefAngel.LightsOnPorts = Port1Bit | Port2Bit;
    // Ports turned off when Overheat temperature exceeded
    ReefAngel.OverheatShutoffPorts = Port1Bit | Port2Bit | Port3Bit | Port4Bit | Port5Bit | Port7Bit;
    // Use T1 probe as temperature and overheat functions
    ReefAngel.TempProbe = T1_PROBE;
    ReefAngel.OverheatProbe = T1_PROBE;

    // Feeeding and Water Change mode speed
    ReefAngel.DCPump.FeedingSpeed=0;
    ReefAngel.DCPump.WaterChangeSpeed=0;
    
  

    // Ports that are always on
    ReefAngel.Relay.On( Port4 );

    ////// Place additional initialization code below here
    

    ////// Place additional initialization code above here
}

void loop()
{
    ReefAngel.ActinicLights( Port1 );
    ReefAngel.DayLights( Port2 );
    ReefAngel.StandardHeater( Port3 );
    //ReefAngel.StandardLights( Port4, 19,0,7,0); //Skimmer, Reactor 7pm-7am
    ReefAngel.StandardLights( Port5 );
    ReefAngel.DosingPumpRepeat1( Port6 );
    ReefAngel.DosingPumpRepeat2( Port7 );
    ReefAngel.DosingPumpRepeat3( Port8 );
    ReefAngel.PWM.DaylightPWMParabola();
    ReefAngel.PWM.ActinicPWMParabola();
    ReefAngel.DCPump.UseMemory = false;
    ReefAngel.DCPump.LowATOChannel = Sync; // WP40 
    ReefAngel.DCPump.HighATOChannel = AntiSync; // SW 8 
    ReefAngel.DCPump.AntiSyncOffset = 110; // % (0-255) of main pump (Sync)

    ////// Place your custom code below here
    
    // koralia 1150
    // if (hour()>=23 || hour()<11) ReefAngel.Relay.Off( Port5 );
    // else ReefAngel.WavemakerRandom( Port5, 120, 1800 );
    
    // DC pumps
    // To run this code must choose Custom in portal
    static int rmode;
    static boolean changeMode=true;

    // These are the modes we can cycle through. You can add more and even repeat...
    byte modes[] = { ReefCrest, Lagoon, TidalSwell, ShortPulse, Sine, LongPulse, Else, Gyre, NutrientTransport };

    if (now()%3600==0 || changeMode==true) { // Change every 60 mins (3600seconds) or controller reboot
    rmode=random(100)%sizeof(modes); // Change the mode by picking from our array
    changeMode=false;
    }

    // Set timer when in feeding mode
    static unsigned long feeding;
    if (ReefAngel.DisplayedMenu==FEEDING_MODE) feeding=now();
    // Continue NutrientTranspot Mode for 30 minutes after feeding
    if (now()-feeding<1800) {
    ReefAngel.DCPump.UseMemory=false;
    ReefAngel.DCPump.Duration=InternalMemory.DCPumpDuration_read();
    ReefAngel.DCPump.Mode=NutrientTransport;
    // Night mode (go to 30%)
    } else if (now()%SECS_PER_DAY<39600 || now()%SECS_PER_DAY>=82800) { // 11pm to 11am
    ReefAngel.DCPump.UseMemory=false;
    ReefAngel.DCPump.Duration=InternalMemory.DCPumpDuration_read();
    ReefAngel.DCPump.Mode=Gyre;
    ReefAngel.DCPump.Speed=30;
    } else if (InternalMemory.DCPumpMode_read()==11) {
    // Custom Mode and nothing else going on
    ReefAngel.DCPump.UseMemory=false;
    ReefAngel.DCPump.Duration=InternalMemory.DCPumpDuration_read();
    ReefAngel.DCPump.Mode=modes[rmode]; // Put the mode to the random mode :)
    ReefAngel.DCPump.Speed=InternalMemory.DCPumpSpeed_read(); // Set speed from portal
    } else {
    ReefAngel.DCPump.UseMemory=true; // Will reset all values from memory
    }
already changed this line based on the info above:

ReefAngel.DCPump.UseMemory = true;

to:

ReefAngel.DCPump.UseMemory = false;

thanks
Image
Reefology
Posts: 209
Joined: Fri Dec 26, 2014 6:38 pm

Re: Proofreading Jebao on ATO.....

Post by Reefology »

fyi, both cables working on the ATO low, tried switching sync with antisync and it appears to be the ATO high pin just sending a constant 5v signal???

any input would be great.

thanks
Image
Reefology
Posts: 209
Joined: Fri Dec 26, 2014 6:38 pm

Re: Proofreading Jebao on ATO.....

Post by Reefology »

bump

thanks
Image
Reefology
Posts: 209
Joined: Fri Dec 26, 2014 6:38 pm

Re: Proofreading Jebao on ATO.....

Post by Reefology »

bump
Image
Post Reply