<root>
<document scada='0' schema='103' license='1,86376536,W8DYB7' title='1  Axis Tracker Code' description='Program Description
   The program uses a real time clock for time keeping. The motion of the array is controlled by 4 time settings, defining when moves occur. The move times are expressed as minutes after midnight.
 For example one is called EightAM, and is set to 8*60= 480.
   The 1st move, at 8AM, is 45 degrees to the east. The second move is defined by a setting, say NineThirtyAM, and it is the first of 24 moves to the west, ending at ThreePM. 
The array movement dwells for 2 hours, before returning to horizontal at FivePM.
   The hardware consists of 4 components. 1.) An Arduino UNO clone. 2.) An LCD display and 5 button keypad from DFRobot. This board plugs directly into the UNO. 3.) A solid state relay board from SainSmart. 
This board gets Vcc and Ground from the UNO. The board has 2 relays, which connect to D2 and D3 on the LCD board. 4.) A Real Time Clock board. 
This board has a button Lithium Cell that keeps the clock running when power is absent. It communicates to the UNO thru an I2C connection. The actuator motor (110 volts AC) is one that rotates 72 RPM, then thru a 9:1 reduction. 
It could be a DC actuator at 12 volts. In this case, the relay is a different style. 

Main and Subroutine description:
1. Main is a while 1 loop with a switch statement. The three elements of the switch statement are Stop, Run, and Set Time. Choose the Up, Down, or Right pushbutton to select Run or Stop or Set Time. 
2. Subroutines -
   Version - Displays software version upon startup.
   Instructions – Displays operating instructions.
   Timer 1 Overflow - The Real Time Clock maintains the time over the long haul. The hour and minute are updated daily. But over a 24 hour period, an interrupt is used to maintain the minute. 
The interrupt is called Timer 1 Overflow. The target chip clock speed is 15,999,552 Hz. This is divided by 8. When a 16 bit register fills 1831 times, a minute variable is incremented. 
But this method is in accurate to the tune of 2 minutes per 24 hours. Hence, the real time clock is used, as its accuracy is better than 1 minute per year. 
   Move1Axis - This switches 110 volts AC to the actuator motor. 2 relays are used. One sets the motor direction; the other applies power to the motor. There are 3 wires to the motor. See the schematic.
   Button Press - an interrupt is called when a button press occurs. The routine sets a variable that determines where to be in the switch statement, or in the case of setting the time, increments the variables.
 Currently this is hours and minutes. In the future, a 2 axis software package will use the day of the year.
   Run - The Run subroutine is divided into 2 sections. Tracking, or stored horizontally when not tracking. 
   MinutesToHour_Minute - converts a global variable Minutes to Hours:Minutes. 
   PowerFromBattery - The real time clock can be set to where it gets its power from the button battery. This does that. 
   GetAndDisplayTime – Obtains the time from the real time clock, at 12:01, each day.  
   SetTime - Does that to the real time clock. This occurs once or twice during the lifetime of the system, when the Lithium button cell needs to be replaced. 

A note about time keeping. In version one of the single axis controller, time was approximated by using a light sensor to count dark minutes during the night time. 
Minutes, as measured from midnight, was simply Dark minutes / 2 plus a correction factor. Version 2 of the controller uses an accurate real time clock (RTC).

The code has been composed with the aid of Flowcode – www.matrixtls.com
' fcversion='655618' target='ARD.ATMEGA.Arduino Uno R3 PDIP' >
	<config data='' clkspd='16000000' simspd='1' usewdt='0' constif='0' commport='9' Use3V3='0' />
	<plugins >
		<dll_models enabled='1' />
	</plugins>
	<supplement use='0' head='' body='' />
	<debug >
		<watch expr='Main.Analog_Value' />
		<watch expr='Main.Float_Voltage' />
	</debug>
	<traces />
	<ghost >
		<FK2 >
			<data name='FK2D0' port='4294967295' pin='4294967295' />
			<data name='FK2D1' port='4294967295' pin='4294967295' />
			<data name='FK2D2' port='4294967295' pin='4294967295' />
			<data name='FK2D3' port='4294967295' pin='4294967295' />
			<data name='FK2D4' port='4294967295' pin='4294967295' />
			<data name='FK2D5' port='4294967295' pin='4294967295' />
			<data name='FK2D6' port='4294967295' pin='4294967295' />
			<data name='FK2D7' port='4294967295' pin='4294967295' />
			<data name='FK2D8' port='4294967295' pin='4294967295' />
			<data name='FK2D9' port='4294967295' pin='4294967295' />
			<data name='FK2D10' port='4294967295' pin='4294967295' />
			<data name='FK2D11' port='4294967295' pin='4294967295' />
			<data name='FK2D12' port='4294967295' pin='4294967295' />
			<data name='FK2D13' port='4294967295' pin='4294967295' />
			<data name='FK2D14' port='4294967295' pin='4294967295' />
			<data name='FK2D15' port='4294967295' pin='4294967295' />
			<data name='FK2A0' port='4294967295' pin='4294967295' />
			<data name='FK2A1' port='4294967295' pin='4294967295' />
			<data name='FK2A2' port='4294967295' pin='4294967295' />
			<data name='FK2A3' port='4294967295' pin='4294967295' />
			<data name='FK2A4' port='4294967295' pin='4294967295' />
			<data name='FK2A5' port='4294967295' pin='4294967295' />
		</FK2>
		<ICD >
			<data name='AnalogPrescaleValue' value='19' />
			<data name='DigitalSampleRate' value='100000' />
			<data name='BreakpointCount' value='8' />
			<data name='CallStackDepthCount' value='8' />
			<data name='ClockPort' value='3' />
			<data name='ClockPin' value='1' />
			<data name='DataPort' value='3' />
			<data name='DataPin' value='0' />
			<data name='UseDefaultPins' value='1' />
			<data name='WrapEnabled' value='1' />
			<data name='CommsDelayOverridden' value='0' />
			<data name='CommsDelay' value='11' />
			<data name='CalculatedCommsDelay' value='11' />
			<data name='AnalogEB2PrescaleValue' value='2' />
			<data name='DigitalEB2SampleRate' value='100000' />
		</ICD>
		<pins >
			<digital A='0' B='0' C='0' D='0' E='0' F='0' G='0' H='0' I='0' J='0' K='0' L='0' M='0' N='0' O='0' P='0' Q='0' R='0' S='0' T='0' U='0' V='0' W='0' X='0' Y='0' Z='0' />
			<analog A='0' B='0' C='0' D='0' E='0' F='0' G='0' H='0' I='0' J='0' K='0' L='0' M='0' N='0' O='0' P='0' Q='0' R='0' S='0' T='0' U='0' V='0' W='0' X='0' Y='0' Z='0' />
		</pins>
	</ghost>
	<components >
		<settings autoimg='1' center='1' unitscale='0' fixedscale='0' fixedx='1' fixedy='1' fixedz='1' headcode='0' />
		<definition guid='e585f071-84d1-4e6d-8602-f1d2dbbd904c' vstate='40' vmin='0' vmaj='1' srcleaf='' visiblename='' description='' category='' category2='' category3='' bIs2dOnly='0' bIs3dOnly='0' catenable='1' author='' manuname='' manucode='' sysinfo='0' keywords='' dynamic='0' scadaCompatible='0' embeddedCompatible='1' showmacros='1' iconpath='' />
		<component class_type='root' codename='panel' panelId='-1' x='0' y='0' z='0' xsz='1' ysz='1' zsz='1' xang='0' yang='0' zang='0' xquat='0' yquat='0' zquat='0' wquat='1' visible='1' scadavisible='1' interactive='1' solid='1' layer='0' poslock='0' comp2dType='0' >
			<resources />
			<properties >
				<property name='Buzzer Frequency' target='Buzzer1::BuzzFreq' typeid='21' hidden='0' locked='0' info='Frequency of the buzzer in Hz to drive the simulation' />
				<property name='Buzzer Frequency' target='Buzzer1::BuzzFreq' typeid='21' hidden='0' locked='0' info='Frequency of the buzzer in Hz to drive the simulation' />
			</properties>
			<values >
				<value target='Buzzer1::BuzzFreq' data='440' />
				<value target='Buzzer1::BuzzFreq' data='440' />
			</values>
			<events />
			<apis />
			<variables >
				<variable public='0' >
					<def class_type='variable' name='TimerScaleCounter' type='s16' description='' isconst='0' isHidden='0' isinit='1' usrinit='0' setinit='0' />
				</variable>
				<variable public='0' >
					<def class_type='variable' name='CLS_On_Delay' type='s16' description='' isconst='0' isHidden='0' isinit='1' usrinit='1' setinit='1' />
				</variable>
				<variable public='0' >
					<def class_type='variable' name='false' type='b1' description='' isconst='1' isHidden='0' isinit='1' usrinit='0' setinit='0' />
				</variable>
				<variable public='0' >
					<def class_type='variable' name='Menu_Position' type='s16' description='' isconst='0' isHidden='0' isinit='1' usrinit='1' setinit='1' />
				</variable>
				<variable public='0' >
					<def class_type='variable' name='true' type='b1' description='' isconst='1' isHidden='0' isinit='1' usrinit='1' setinit='1' />
				</variable>
			</variables>
			<macros >
				<macro >
					<flowline name='Main' description='Prigramming:
1. Arduino UNO R3 PDIP
2. Disconnect  RTC from TxRx' statediag='0' >
						<return name='Return' type='v0' description='' isconst='0' isHidden='0' isinit='0' usrinit='' setinit='' />
						<command class_type='call' title='LCD Start' cmdcolor='4487093' cmdcolor_sec='11066367' cmdcolor_txt='16777215' cmdgradient='4' cmdopacity='0.64' component='LCD1' macro='Start' />
						<command class_type='call' title='Call Version' cmdcolor='4487093' cmdcolor_sec='11066367' cmdcolor_txt='16777215' cmdgradient='4' cmdopacity='0.64' macro='Version' />
						<command class_type='call' title='Component Macro' cmdcolor='4487093' cmdcolor_sec='11066367' cmdcolor_txt='16777215' cmdgradient='4' cmdopacity='0.64' component='' macro='' />
					</flowline>
				</macro>
				<macro >
					<flowline name='Version' description='' statediag='0' >
						<return name='Return' type='v0' description='' isconst='0' isHidden='0' isinit='0' usrinit='' setinit='' />
						<command class_type='call' title='Buzzer' cmdcolor='4487093' cmdcolor_sec='11066367' cmdcolor_txt='16777215' cmdgradient='4' cmdopacity='0.64' component='LCD1' macro='PrintString' >
							<argument exp='&quot;Buzzer&quot;' />
						</command>
						<command class_type='call' title='Cursor 0,1' cmdcolor='4487093' cmdcolor_sec='11066367' cmdcolor_txt='16777215' cmdgradient='4' cmdopacity='0.64' component='LCD1' macro='Cursor' >
							<argument exp='0' />
							<argument exp='1' />
						</command>
						<command class_type='call' title='Key In Version' cmdcolor='4487093' cmdcolor_sec='11066367' cmdcolor_txt='16777215' cmdgradient='4' cmdopacity='0.64' component='LCD1' macro='PrintString' >
							<argument exp='&quot;V1&quot;' />
						</command>
						<command class_type='delay' title='Delay' cmdcolor='4206456' cmdcolor_sec='10785756' cmdcolor_txt='16777215' cmdgradient='4' cmdopacity='0.64' exp='CLS_On_Delay' type='2' />
						<command class_type='call' title='CLS' cmdcolor='4487093' cmdcolor_sec='11066367' cmdcolor_txt='16777215' cmdgradient='4' cmdopacity='0.64' component='LCD1' macro='Clear' />
					</flowline>
				</macro>
			</macros>
			<component class_type='ref' guid='0953aac0-9c23-4c2f-9843-88954a4191ea' vmin='5' vmaj='2' codename='LCD1' panelId='-1' x='0' y='10' z='0.55' xsz='6.06359' ysz='14.6042' zsz='1.1' xang='0' yang='0' zang='0' xquat='0' yquat='0' zquat='0' wquat='1' visible='1' scadavisible='1' interactive='1' solid='1' layer='1' poslock='0' comp2dType='0' >
				<resources />
				<properties />
				<values >
					<value target='LCD_Mode' data='000' />
					<value target='Pin_Data_0' data='$PORTD.4' />
					<value target='Pin_Data_1' data='$PORTD.5' />
					<value target='Pin_Data_2' data='$PORTD.6' />
					<value target='Pin_Data_3' data='$PORTD.7' />
					<value target='Pin_Data_4' data='$PORTA.1' />
					<value target='Pin_Data_5' data='$PORTA.1' />
					<value target='Pin_Data_6' data='$PORTA.1' />
					<value target='Pin_Data_7' data='$PORTA.1' />
					<value target='LCD_Port' data='$PORTA' />
					<value target='Pin_RS' data='$PORTB.0' />
					<value target='Pin_E' data='$PORTB.1' />
					<value target='LCD_Use_Write' data='0' />
					<value target='RemapCharacters' data='0' />
					<value target='Pin_RW' data='$PORTA.0' />
					<value target='Rows' data='002' />
					<value target='Columns' data='016' />
					<value target='ctrl_lcd::Base_GLCD1::ShowBackground' data='1' />
					<value target='ctrl_lcd::Base_GLCD1::ComponentLabel' data='000' />
					<value target='ctrl_lcd::Base_GLCD1::GdiText1::sText' data='panel' />
					<value target='ctrl_lcd::Base_GLCD1::GdiText1::dScale' data='1.400000' />
					<value target='ctrl_lcd::TextColour' data='0' />
					<value target='TextBg' data='14803425' />
					<value target='DispalyBg' data='16777215' />
					<value target='DelayTiming' data='100' />
					<value target='CursorPosX' data='0' />
					<value target='CursorPosY' data='0' />
					<value target='DoubleDelay' data='0' />
				</values>
				<events />
				<apis />
				<variables />
				<macros />
			</component>
			<component class_type='ref' guid='04bbd3b8-ee11-40eb-91e8-1bbbd6f65b8c' vmin='0' vmaj='1' codename='Buzzer1' panelId='-1' x='-80' y='20' z='0' xsz='6.68497' ysz='6.69643' zsz='0.778331' xang='0' yang='0' zang='0' xquat='0' yquat='0' zquat='0' wquat='1' visible='1' scadavisible='1' interactive='1' solid='1' layer='1' poslock='0' comp2dType='0' >
				<resources />
				<properties />
				<values >
					<value target='pin' data='$PORTA.0' />
					<value target='Polarity' data='001' />
					<value target='BuzzFreq' data='1200' />
				</values>
				<events />
				<apis />
				<variables />
				<macros />
			</component>
		</component>
	</components>
	<scadaresourcelookup />
	<keymap />
	<panel2d shadows='0' lighting='2' brightness='0' >
		<background rgb='9737364' img='' style='0' />
		<camera xe='-7.59486' ye='-24.4518' ze='307.701' xt='-7.59486' yt='-24.4518' zt='0' xquat='0' yquat='0' zquat='0' wquat='1' />
		<viewport dx='364' dy='264' zoom='143.139' fix_topleft='0' />
		<page x='1000' y='1000' show='0' rgb='7360576' />
		<winpos ID='7005' RectRecentFloat='1455,518,1847,896' RectRecentDocked='1342,65,1556,1006' RecentFrameAlignment='16384' RecentRowIndex='0' IsFloating='1' MRUWidth='32767' PinState='0' IsMaximized='0' IsVisible='1' />
	</panel2d>
	<panel3d shadows='0' lighting='2' brightness='0' perspective='1' >
		<background rgb='8409120' img='' style='0' />
		<table rgb='7360576' img='' style='0' size='100' />
		<camera xe='0' ye='0' ze='300' xt='0' yt='0' zt='0' xquat='0' yquat='0' zquat='0' wquat='1' />
		<camerakey0 xe='0' ye='0' ze='300' xt='0' yt='0' zt='0' xquat='0' yquat='0' zquat='0' wquat='1' />
		<camerakey1 xe='-3.67394e-14' ye='0' ze='-300' xt='0' yt='0' zt='0' xquat='0' yquat='1' zquat='0' wquat='6.12323e-17' />
		<camerakey2 xe='0' ye='-300' ze='6.66134e-14' xt='0' yt='0' zt='0' xquat='-0.707107' yquat='0' zquat='0' wquat='0.707107' />
		<camerakey3 xe='-3.67394e-14' ye='300' ze='6.66134e-14' xt='0' yt='0' zt='0' xquat='-4.32978e-17' yquat='0.707107' zquat='0.707107' wquat='4.32978e-17' />
		<camerakey4 xe='-300' ye='-6.66134e-14' ze='6.66134e-14' xt='0' yt='0' zt='0' xquat='-0.5' yquat='0.5' zquat='0.5' wquat='0.5' />
		<camerakey5 xe='300' ye='-6.66134e-14' ze='6.66134e-14' xt='0' yt='0' zt='0' xquat='-0.5' yquat='-0.5' zquat='-0.5' wquat='0.5' />
		<camerakey6 xe='-173.205' ye='-173.205' ze='173.205' xt='0' yt='0' zt='0' xquat='-0.424708' yquat='0.17592' zquat='0.339851' wquat='0.820473' />
		<winpos ID='7004' RectRecentFloat='153,370,807,947' RectRecentDocked='0,0,303,558' RecentFrameAlignment='16384' RecentRowIndex='0' IsFloating='0' MRUWidth='32767' PinState='0' IsMaximized='0' IsVisible='0' />
	</panel3d>
	<panels2d count='0' />
	<layout >
		<view type='0' name='Main' mode='0' placement='LAAAAAAAAAABAAAA---------------------wUAAAAkAAAATwQAAKgDAAA' zoom='105' scrollx='0' scrolly='0' flags='0' />
		<view type='0' name='Version' mode='0' placement='LAAAAAAAAAABAAAA---------------------wUAAAAkAAAATwQAAKgDAAA' zoom='125' scrollx='0' scrolly='0' flags='0' />
	</layout>
</document>
</root>
