Alternating Main Screen

Do you have a question on how to do something.
Ask in here.
Post Reply
thekameleon
Posts: 137
Joined: Sat Feb 16, 2013 7:44 am

Alternating Main Screen

Post by thekameleon »

I want to alternate my main screen every 5 seconds from the parameter values to a chart... I am not having much luck. What am I doing wrong?

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 <ReefAngel.h>

#include "Moon.h"

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

TimerClass screenTimer;
boolean showChart;

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


void setup()
{
    // This must be the first line
    ReefAngel.Init();  //Initialize controller
    // Ports toggled in Feeding Mode
    ReefAngel.FeedingModePorts = Port3Bit | Port5Bit;
    ReefAngel.FeedingModePortsE[0] = Port1Bit | Port3Bit;
    // Ports toggled in Water Change Mode
    ReefAngel.WaterChangePorts = Port1Bit | Port3Bit | Port5Bit | Port7Bit;
    ReefAngel.WaterChangePortsE[0] = Port1Bit | Port3Bit | Port5Bit | Port6Bit | Port8Bit;
    // Ports toggled when Lights On / Off menu entry selected
    ReefAngel.LightsOnPorts = Port2Bit | Port4Bit | Port6Bit | Port8Bit;
    ReefAngel.LightsOnPortsE[0] = Port2Bit | Port4Bit | Port7Bit;
    // Ports turned off when Overheat temperature exceeded
    ReefAngel.OverheatShutoffPorts = Port2Bit | Port4Bit | Port6Bit | Port8Bit;
    ReefAngel.OverheatShutoffPortsE[0] = Port2Bit | Port4Bit | Port7Bit;
    // Use T1 probe as temperature and overheat functions
    ReefAngel.TempProbe = T1_PROBE;
    ReefAngel.OverheatProbe = T1_PROBE;


    // Ports that are always on
    ReefAngel.Relay.On( Port3 );
    ReefAngel.Relay.On( Port5 );
    ReefAngel.Relay.On( Box1_Port1 );
    ReefAngel.Relay.On( Box1_Port3 );
    ReefAngel.Relay.On( Box1_Port5 );

    ////// Place additional initialization code below here
    
    ReefAngel.AddStandardMenu();
    ReefAngel.Display24h();
    ReefAngel.AddDateTimeMenu();
    screenTimer.SetInterval(5);
    showChart = 0;

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

void loop()
{
    moon_init(47, -122);
  
    ReefAngel.StandardHeater( Port1 );
    ReefAngel.DayLights( Port2 );
    ReefAngel.DayLights( Port4 );
    ReefAngel.ActinicLights( Port6 );
    ReefAngel.MoonLights( Port8 );
    ReefAngel.DayLights( Box1_Port2 );
    ReefAngel.ActinicLights( Box1_Port4 );
    ReefAngel.Relay.DelayedOn( Box1_Port6 );
    ReefAngel.ActinicLights( Box1_Port7 );
    ReefAngel.Relay.DelayedOn( Box1_Port8 );
    
    if(ReefAngel.PWM.LightsOverride)
    {
      ReefAngel.PWM.SetChannel( 0, 100 );
      ReefAngel.PWM.SetChannel( 1, 100 );
      ReefAngel.PWM.SetChannel( 2, 100 );
      ReefAngel.PWM.SetChannel( 3, 100 );
      ReefAngel.PWM.SetChannel( 4, 100 );
      ReefAngel.PWM.SetChannel( 5, 100 );
    }
    else if ((hour() >=10) && (hour() <21)){
      ReefAngel.PWM.DaylightPWMSlope();
      ReefAngel.PWM.ActinicPWMSlope(60);
      ReefAngel.PWM.Channel0PWMSlope();
      ReefAngel.PWM.Channel1PWMSlope();
      ReefAngel.PWM.Channel2PWMSlope();
      ReefAngel.PWM.Channel3PWMSlope(60);
      ReefAngel.PWM.Channel4PWMSlope(60);
      ReefAngel.PWM.Channel5PWMSlope(60);
    }
    else
    {
      //Moonlight Phase 9pm-10am (CH3-CH5)
      //We got to dim my super bright LEDS :)
      byte moon = PWMParabola(Moon.riseH, Moon.riseM, Moon.setH, Moon.setM, 11, ((MoonPhase() / 10) + 10), 0);
      ReefAngel.PWM.SetDaylight(0);
      ReefAngel.PWM.SetActinic(0);
      ReefAngel.PWM.SetChannel( 0, 0 );
      ReefAngel.PWM.SetChannel( 1, 0 );
      ReefAngel.PWM.SetChannel( 2, 0 );
      ReefAngel.PWM.SetChannel( 3, moon );
      ReefAngel.PWM.SetChannel( 4, moon );
      ReefAngel.PWM.SetChannel( 5, moon );
    }

    ////// Place your custom code below here
    
    ReefAngel.WaterLevelATO(Port7, InternalMemory.ATOExtendedTimeout_read(), 15, 60);
    if(!screenTimer.IsTriggered())
    {
      screenTimer.Start();
    }
    else
    {
      if(showChart)
        showChart = false;
      else
        showChart = true;
    }
    
    ////// Place your custom code above here

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

void DrawCustomMain()
{
    int x,y;
    char text[10];
    
    if(!showChart)
    {
      
      // Dimming Expansion
      x = 15;
      y = 2;
      for ( int a=0;a<6;a++ )
      {
        if ( a>2 ) x = 75;
        if ( a==3 ) y = 2;
        ReefAngel.LCD.DrawText( COLOR_DARKGOLDENROD,DefaultBGColor,x,y,"Ch :" );
        ReefAngel.LCD.DrawText( COLOR_DARKGOLDENROD,DefaultBGColor,x+12,y,a );
        ReefAngel.LCD.DrawText( COLOR_DARKGOLDENROD,DefaultBGColor,x+24,y,ReefAngel.PWM.GetChannelValue(a) );
        y += 10;
      }
      pingSerial();

    
      // moon
      x = 15;
      y = 31;
      sprintf(text, "%02d:%02d", Moon.riseH, Moon.riseM);
      ReefAngel.LCD.DrawText(COLOR_BLACK,DefaultBGColor,x,y,"MR:"); x+=21;
      if(Moon.isRise) 
        ReefAngel.LCD.DrawText(COLOR_GREEN,DefaultBGColor,x,y,text);
      else 
        ReefAngel.LCD.DrawText(COLOR_RED,DefaultBGColor,x,y,text);
      sprintf(text, "%02d:%02d", Moon.setH, Moon.setM); 
      x = 75;
      ReefAngel.LCD.DrawText(COLOR_BLACK,DefaultBGColor,x,y,"MS:"); 
      x+=21;
      if(Moon.isRise) 
        ReefAngel.LCD.DrawText(COLOR_GREEN,DefaultBGColor,x,y,text);
      else 
        ReefAngel.LCD.DrawText(COLOR_RED,DefaultBGColor,x,y,text);
      pingSerial();
    
        // Parameters
#if defined DisplayLEDPWM && ! defined RemoveAllLights
      ReefAngel.LCD.DrawMonitor( 15, 40, ReefAngel.Params,
      ReefAngel.PWM.GetDaylightValue(), ReefAngel.PWM.GetActinicValue() );
#else // defined DisplayLEDPWM && ! defined RemoveAllLights
      ReefAngel.LCD.DrawMonitor( 15, 40, ReefAngel.Params );
#endif // defined DisplayLEDPWM && ! defined RemoveAllLights
      pingSerial();
    }

    // Salinity
    ReefAngel.LCD.DrawText( COLOR_DARKKHAKI,DefaultBGColor,15,70, "SAL:" );
    ReefAngel.LCD.DrawText( COLOR_DARKKHAKI,DefaultBGColor,39,69, ReefAngel.Params.Salinity );
    pingSerial();

    // ORP
    ReefAngel.LCD.DrawText( COLOR_PALEVIOLETRED,DefaultBGColor,75,70, "ORP:" );
    ReefAngel.LCD.DrawText( COLOR_PALEVIOLETRED,DefaultBGColor,99,70, ReefAngel.Params.ORP );
    pingSerial();

    // Water Level
    ReefAngel.LCD.DrawText( COLOR_DARKGOLDENROD,DefaultBGColor,75,81, "WL:" );
    ReefAngel.LCD.DrawText( COLOR_DARKGOLDENROD,DefaultBGColor,99,81, ReefAngel.WaterLevel.GetLevel() );
    pingSerial();

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

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

    // Date and Time
    ReefAngel.LCD.DrawDate( 6, 122 );
    pingSerial();
}

void DrawCustomGraph()
{
  int x,y;
  x = 5;
  y = 5;
  if(showChart)
  {
    // Draws the main screen graph
    ReefAngel.LCD.Clear(DefaultBGColor,0,y,131,y+69);
    ReefAngel.LCD.Clear(DefaultFGColor,x,y,x,y+69);
    for (byte i=6; i<=131; i+=3)
    {
        ReefAngel.LCD.PutPixel(GraphDotLineColor, i, y+25);
    }
    ReefAngel.LCD.DrawSingleGraph(T1TempColor,x,y,InternalMemory.T1Pointer_read());
    ReefAngel.LCD.DrawSingleGraph(T2TempColor,x,y,InternalMemory.T1Pointer_read()+120);
    ReefAngel.LCD.DrawSingleGraph(T3TempColor,x,y,InternalMemory.T1Pointer_read()+240);
    ReefAngel.LCD.DrawSingleGraph(PHColor,x,y,InternalMemory.T1Pointer_read()+360);
  }
}

User avatar
lnevo
Posts: 5422
Joined: Fri Jul 20, 2012 9:42 am

Alternating Main Screen

Post by lnevo »

show_chart is only going to be true for a few micro seconds.

I would write it to do something like this.

If (screetimer.isTriggered) {
Screentimer.start()
If (showchart)
Showchart=false
Else
Showchart=true
}

This way it should only switch when the timer triggers.

Sorry the code is pseuo'ish
User avatar
lnevo
Posts: 5422
Joined: Fri Jul 20, 2012 9:42 am

Alternating Main Screen

Post by lnevo »

For the record, glad to see you going this route :) this will be in my next evolution :)
thekameleon
Posts: 137
Joined: Sat Feb 16, 2013 7:44 am

Re: Alternating Main Screen

Post by thekameleon »

Ummm not working :(. Well sorta... So when I was in feed mode and went back I saw the chart then it went back to the params and has not left since....
rimai
Posts: 12857
Joined: Fri Mar 18, 2011 6:47 pm

Re: Alternating Main Screen

Post by rimai »

My suggestion is get rid of the timer and use this:

Code: Select all

    showChart = now()%10<5;
Roberto.
thekameleon
Posts: 137
Joined: Sat Feb 16, 2013 7:44 am

Re: Alternating Main Screen

Post by thekameleon »

No luck there either... What I notice though is for 5 seconds the screen flickers a bit... So I tried moving the chart into the DrawCustomMain method and while it did flip to the chart... the Chart was a hot mess to say the least.... <sigh>
rimai
Posts: 12857
Joined: Fri Mar 18, 2011 6:47 pm

Re: Alternating Main Screen

Post by rimai »

Declare this in global section:

Code: Select all

boolean drawGraph=false;
And this is your custom screen code:

Code: Select all

void DrawCustomMain()
{
  int x,y;
  char text[10];

  showChart = now()%10<5;
  if (millis()%5000<200)
      drawGraph=true;
  if(!showChart)
  {
    if (drawGraph)
    {
      drawGraph=false;
      ReefAngel.LCD.Clear(DefaultBGColor,0,0,131,75); // Clear screen
      // Dimming Expansion
      x = 15;
      y = 2;
      for ( int a=0;a<6;a++ )
      {
        if ( a>2 ) x = 75;
        if ( a==3 ) y = 2;
        ReefAngel.LCD.DrawText( COLOR_DARKGOLDENROD,DefaultBGColor,x,y,"Ch :" );
        ReefAngel.LCD.DrawText( COLOR_DARKGOLDENROD,DefaultBGColor,x+12,y,a );
        ReefAngel.LCD.DrawText( COLOR_DARKGOLDENROD,DefaultBGColor,x+24,y,ReefAngel.PWM.GetChannelValue(a) );
        y += 10;
      }
      pingSerial();
  
  
      // moon
      x = 15;
      y = 31;
      sprintf(text, "%02d:%02d", Moon.riseH, Moon.riseM);
      ReefAngel.LCD.DrawText(COLOR_BLACK,DefaultBGColor,x,y,"MR:"); 
      x+=21;
      if(Moon.isRise) 
        ReefAngel.LCD.DrawText(COLOR_GREEN,DefaultBGColor,x,y,text);
      else 
        ReefAngel.LCD.DrawText(COLOR_RED,DefaultBGColor,x,y,text);
      sprintf(text, "%02d:%02d", Moon.setH, Moon.setM); 
      x = 75;
      ReefAngel.LCD.DrawText(COLOR_BLACK,DefaultBGColor,x,y,"MS:"); 
      x+=21;
      if(Moon.isRise) 
        ReefAngel.LCD.DrawText(COLOR_GREEN,DefaultBGColor,x,y,text);
      else 
        ReefAngel.LCD.DrawText(COLOR_RED,DefaultBGColor,x,y,text);
      pingSerial();
  
      // Parameters
  #if defined DisplayLEDPWM && ! defined RemoveAllLights
      ReefAngel.LCD.DrawMonitor( 15, 40, ReefAngel.Params,
      ReefAngel.PWM.GetDaylightValue(), ReefAngel.PWM.GetActinicValue() );
  #else // defined DisplayLEDPWM && ! defined RemoveAllLights
      ReefAngel.LCD.DrawMonitor( 15, 40, ReefAngel.Params );
  #endif // defined DisplayLEDPWM && ! defined RemoveAllLights
      pingSerial();
    }
  }
  else
  {
    if (drawGraph)
    {
      drawGraph=false;
      ReefAngel.LCD.Clear(DefaultBGColor,0,0,131,75); // Clear screen
      x = 5;
      y = 5;
      // Draws the main screen graph
      for (byte i=6; i<=131; i+=3)
      {
        ReefAngel.LCD.PutPixel(GraphDotLineColor, i, y+25);
      }
      ReefAngel.LCD.DrawSingleGraph(T1TempColor,x,y,InternalMemory.T1Pointer_read());
      ReefAngel.LCD.DrawSingleGraph(T2TempColor,x,y,InternalMemory.T1Pointer_read()+120);
      ReefAngel.LCD.DrawSingleGraph(T3TempColor,x,y,InternalMemory.T1Pointer_read()+240);
      ReefAngel.LCD.DrawSingleGraph(PHColor,x,y,InternalMemory.T1Pointer_read()+360);
    }
  }  

  // Salinity
  ReefAngel.LCD.DrawText( COLOR_DARKKHAKI,DefaultBGColor,15,70, "SAL:" );
  ReefAngel.LCD.DrawText( COLOR_DARKKHAKI,DefaultBGColor,39,69, ReefAngel.Params.Salinity );
  pingSerial();

  // ORP
  ReefAngel.LCD.DrawText( COLOR_PALEVIOLETRED,DefaultBGColor,75,70, "ORP:" );
  ReefAngel.LCD.DrawText( COLOR_PALEVIOLETRED,DefaultBGColor,99,70, ReefAngel.Params.ORP );
  pingSerial();

  // Water Level
  ReefAngel.LCD.DrawText( COLOR_DARKGOLDENROD,DefaultBGColor,75,81, "WL:" );
  ReefAngel.LCD.DrawText( COLOR_DARKGOLDENROD,DefaultBGColor,99,81, ReefAngel.WaterLevel.GetLevel() );
  pingSerial();

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

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

  // Date and Time
  ReefAngel.LCD.DrawDate( 6, 122 );
  pingSerial();
}

void DrawCustomGraph()
{

}
Roberto.
thekameleon
Posts: 137
Joined: Sat Feb 16, 2013 7:44 am

Re: Alternating Main Screen

Post by thekameleon »

I see that you are trying to draw the graph only once in each 5 second interval... right? But I want to understand why.
rimai
Posts: 12857
Joined: Fri Mar 18, 2011 6:47 pm

Re: Alternating Main Screen

Post by rimai »

If you draw more than once, you will get the flickering effect you mentioned.
Roberto.
thekameleon
Posts: 137
Joined: Sat Feb 16, 2013 7:44 am

Re: Alternating Main Screen

Post by thekameleon »

What is the interval that DrawCustomMain and DrawCustomGraph is called?
rimai
Posts: 12857
Joined: Fri Mar 18, 2011 6:47 pm

Re: Alternating Main Screen

Post by rimai »

Main is called every loop, but graph is called every 6 minutes.
Roberto.
Post Reply