My Neptune Apex web interface compatible DIY reef controller

yes, I will be working on adding additional temp and atlas stamp support.

there seems to be no standard for LCD from ebay. So what you did is correct, simply figure what works for the LCD you got and make the changes in the chauvet code.

regarding sr04, make sure you find a test sketch for your ultrasonic sensor to make sure it works. I don't think you should be hearing anything since the ultrasonic sound should only last 10 microseconds. Once you verify the sr04 is working, then make sure the connection to arduino with chauvet code is correct.

there is a bit of learning curve to understand the interrupt code. but it is not that bad once you understand it. best is to read the atmega2560 full datasheet, like 10x.

feel free to make changes/improvements and share here as others may find it useful. I can integrate it into the main code if feasible.
 
The only place to specify timezone is in config.h #define STDTZOFFSET
do you have lcd display? is it showing the correct local time?
are you sure your timezone is -1 GMT? are you in Iceland?
timezone is offset from GMT. I can't find anything on CGT timezone on google.


Hi d0ughb0y & welcome back :) We miss you !

I don't have LCD display on this controller. Web access means much more than an LCD so I am using only this.
As I check now at home my time is +1 and not -1 and with this setting aslo logging is now working OK. Thank you for "hint" !

CGT -> I was thinking on: Central Greenwich Time what should be the same as GMT
 
yes, I will be working on adding additional temp and atlas stamp support.

there seems to be no standard for LCD from ebay. So what you did is correct, simply figure what works for the LCD you got and make the changes in the chauvet code.

regarding sr04, make sure you find a test sketch for your ultrasonic sensor to make sure it works. I don't think you should be hearing anything since the ultrasonic sound should only last 10 microseconds. Once you verify the sr04 is working, then make sure the connection to arduino with chauvet code is correct.

there is a bit of learning curve to understand the interrupt code. but it is not that bad once you understand it. best is to read the atmega2560 full datasheet, like 10x.

feel free to make changes/improvements and share here as others may find it useful. I can integrate it into the main code if feasible.

I agree there are no standard things at all on ebay! :rollface:
Try this code if you are having problems getting an I2c LCD to work it scans the bus and then trys a few defaults. Code at the end use the new line in serial monitor to advanc \n

The SR04 is working well I can just hear it pulsing it sounds like a mains hum so I was guessing at 50 hz, It reads properly in the test sketch I calibrated it with my verniers and it was close enough I can't hear it there! It also works in your code. It is just the constant buzz!

I'm getting there with the interrupt coding still a lot more to read. I might to try and add a new bit to test that!!

One thing I have just noticed when looking at teslo's issue is accessing the Outlet log locks up the arduino LCD, relays and software. The LED on 13 continues flashing until the web times out. It then recovers and the clock catches back up. I can access the xml file manually and this freezes it all for around 8 seconds whilst initially loading. Sometimes the relays recover and sometimes not. It looks like the request for that xml file is using a blocking bit of code? ?

I will look at what I may be able to add to the party, how far away from finding the time to even open the code are you? maybe a developement branch on Github outside the main to share your ponderings?

I don't mean to come across as picking fault. This is a really good piece of software :)

Code:
char dummyvar; // dummy declaration for STUPID IDE!!!!
/*----------------------------------------------------------------------------
 * vi:ts=4
 *
 * i2cLCDguesser - guess i2c constructor for pcf8574 lcd backpack
 *
 * Created by Bill Perry 2013-04-16
 * Copyright 2013 - Under creative commons license 3.0:
 * Attribution-NonCommercial-ShareAlike 3.0 Unported (CC BY-NC-SA 3.0)
 * license page: http://creativecommons.org/licenses/by-nc-sa/3.0/
 * 
 *  This sketch attempts to locate a pcf8574 based hd44780 backpack
 *  and then tries to figure out the pin configuration for it by guessing....
 *
 *  NOTE/WARNING: Guessing is not really a good thing since 
 *  depending on the hardware design and wiring,
 *  it could actually damage the hardware. Use with caution!!!
 *  and do not leave things with an incorrect guess for too long.
 *  i.e. advance to the next guess as soon as possible.
 * 
 *  It requires using fm's LiquidCrystal library replacement:
 *  https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home
 *
 *  For each guess it will re-initialize the display and
 *  write the constructor to the serial port.
 *  It will then attempt to blink the backlight 3 times.
 *  Finally it will attempt to write the constructor used to the LCD.
 *  When the correct configuration is guessed,
 *  the LCD will display the constructor
 *  and the backlight will be on.
 *
 * Since the guesser uses a limited number of known permutations,
 * it is possible that it will not be able to guess the needed
 * wiring.
 * 
 *  To use:
 *  1. install fm's library (it replaces the stock LiquidCrystal library)
 *  2. hookup the i2c backpack and only the i2c backpack to the Arduino
 *    (make sure to use the needed pullup resistors - 
 *      i2c needs them to work correctly)
 *  3. compile and upload the sketch
 *  4. go to the serial monitor in the IDE and set the baud rate to 9600 baud
 *  5. press the reset button on the arduino to start clean
 *  6. Press the <ENTER> key or [Send] button to advance to next guess
 *     NOTE: Make sure to select a newline as the line ending and
 *           if using the <ENTER> key you must first click on the text box
 *           to give it focus.
 *
 * Also note:
 * With respect to the the jumper on certain baords:
 * On the boards Ive seen so far, it controls the backlight control.
 * Depending on the board, it can
 * - force the backlight on
 * - force the backlight off
 * - allow backlight control by PCF8574
 *
 * So you may have to experiment with the jumper in/out to be able
 * to see anything on the display if you have a display that uses
 * light pixels on a dark background.
 *
 * Known Issue:
 * On chipkit platforms, with MPIDE mpide-0023-linux32-201311118-test
 * and earlier you must modify the twi.c file in
 * {installdir}/pic32/libraries/wire/utility/twic.
 * in the function twi_init()
 * Somthing in the clock stretching initalization causes the i2c module
 * to enter an infinite clock stretch and hang. A work around is to
 * change this:
 *----------------------------------------------------------------------
 *	ptwi->ixCon.reg = (1 << _I2CCON_ON) | (1 << _I2CCON_STREN);
 *----------------------------------------------------------------------
 * to this:
 *----------------------------------------------------------------------
 *	ptwi->ixCon.reg = 0; // disable then renable i2c module
 *	ptwi->ixCon.reg = (1 << _I2CCON_ON) | (1 << _I2CCON_STREN);
 *----------------------------------------------------------------------
 *  Created April 2013
 *  Author: Bill Perry
 * 
 * History
 * 2014-01-09 bperrybap - changed i2c bus scan to avoid reserved space
 * 2013.11.26 bperrybap - added a version number
 * 2013.11.24 bperrybap - added multiple device detection (not allowed)
 * 2013.08.01 bperrybap - added chip type detection
 * 2013.04.16 bperrybap - Original creation
 *
 * @author Bill Perry - bperrybap@opensource.billsworld.billandterrie.com
 *----------------------------------------------------------------------------*/

#define VERSION 141 // major.minor.point 120 is 1.2.0
 
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

// Try to detect if fm's library is being used
// and bomb out with an error if missing known defines
// or if using defines that fm's library is known not to use
#if !defined(BACKLIGHT_OFF) || !defined(BACKLIGHT_ON) || !defined(FOUR_BITS) || defined(En) || defined(Rw) || defined(Rs)
#error i2dLCDguesser requires using fmalpartida LiquidCrystal replacement library
#endif

#define LCD_COLS 16
#define LCD_ROWS 2

// hide STUPID ugly 1.x Wire API change nonsense
#if ARDUINO < 100
#define write(_data) send(_data)
#define read() receive()
#endif

#define 	IICchip_UNKNOWN 0
#define 	IICchip_PCF8574 1
#define 	IICchip_MCP23008 2

#define DEFPROMPT ((const char *) 0)


const char *i2cWarning = \
"----------------------------------------------------------------\n"\
"NOTE/WARNING: Guessing the i2c constructor is not really a\n"\
"good thing since it could damage the hardware. Use with caution!\n"\
"Do not leave things with an incorrect guess for too long.\n"\
"i.e. advance to the next guess as soon as possible\n"\
"when the guess in incorrect.\n"\
"If the guess is correct, the constructor will show up\n"\
"on the LCD.\n"\
"----------------------------------------------------------------\n"\
;

int locatedevice(void);
int guessconfig(uint8_t address);
int IdentifyIOexp(uint8_t address);
const char *iicType2Name(int type);

void setup()
{
	Wire.begin();
 
#if ARDUINO >= 100
	while(!Serial); // wait for native USB devices to enumerate/attach
#endif

	Serial.begin(9600);
	Serial.print("i2cLCDguesser v");
	Serial.print(VERSION/100);
	Serial.print('.');
	Serial.print((VERSION%100)/10);
	Serial.print('.');
	Serial.println((VERSION%100)%10);

	Serial.println(" - Guess constructor for i2c LCD backpack");
	Serial.println(i2cWarning);
	waitinput(DEFPROMPT);
}
 
void loop()
{
int address;
int chiptype;

	address = locatedevice(); // go look for a i2c device
	if(address >= 0)
	{
		chiptype = IdentifyIOexp((uint8_t)address);

		Serial.print("Device found: ");
		Serial.println(iicType2Name(chiptype));
		
		/*
		 * Check for PCF8574 chip
		 */
		if(chiptype != IICchip_PCF8574)
		{
			Serial.println("Only supports PCF8574");
		}
		else
		{
			waitinput("<Press <ENTER> or click [Send] to start guessing>");
			/*
 			 * Got i2c address, and PCF8574 so now go start trying configurations
			 */

			if( guessconfig((uint8_t) address))
				while(1); // user found config so halt
		}
	}
	delay(3000); // wait before looking again
}

/*
 * Returns address of first i2c device found, negative value if none found
 */

int locatedevice(void)
{
uint8_t error, address;
int rval = -1;
int devcount = 0;
 
	Serial.println("Scanning i2c bus for devices..");
 
	/*
 	 * Note: 
	 * 	Addresses below 8 are reserved for special use
	 * 	Addresses above 0x77 are reserved for special use
	 */
	for(address = 8; address <= 0x77; address++ )
	{
		Wire.beginTransmission(address);
		error = Wire.endTransmission();
		if (error == 0)
		{
			devcount++;
			Serial.print("i2c device found at address 0x");
			if (address<16)
				Serial.print("0");
			Serial.println(address,HEX);
			rval = address;
		}
		else if (error==4)
		{
			Serial.print("Unknown error at address 0x");
			if (address<16)
				Serial.print("0");
			Serial.println(address,HEX);
		}   
	}
	if (rval < 0)
		Serial.println("No I2C device found");

	if (devcount > 1)
	{
		Serial.println("Warning: More than 1 device found");
		rval = -1; // for now we don't allow multiple devices on the bus
	}

	return(rval);
}

/*
 * Identify I2C device type.
 * Currently PCF8574 or MCP23008
 */

int IdentifyIOexp(uint8_t address)
{
uint8_t data;
int chiptype;

	/*
	 * Identify PCF8574 vs MCP23008
	 * It appears that on a PCF8574 that 1 bits turn on pullups and make the pin an input.
	 * and 0 bits set the output pin to 0.
	 * And a read always reads the port pins.
	 *
	 * Strategy:
	 *	- Try to Write 0xff to MCP23008 IODIR register (location 0)
	 *  - Point MCP23008 to IODIR register (location 0)
	 *	- Read 1 byte
	 *
	 * On a MCP23008 the read will return 0xff because it will read the IODIR we just wrote
	 * On a PCF8574 we should read a 0 since we last wrote zeros to all the PORT bits
	 */

	/*
	 * First try to write 0xff to MCP23008 IODIR
	 * On a PCF8574 this will end up writing 0 and then ff to output port
	 */
	Wire.beginTransmission(address);
	Wire.write((uint8_t) 0);	// try to point to MCP23008 IODR
	Wire.write((uint8_t) 0xff);	// try to write to MCP23008 IODR
	Wire.endTransmission();

	/*
	 * Now try to point MCP23008 to IODIR for read
	 * On a PCF8574 this will end up writing a 0 to the output port
	 */

	Wire.beginTransmission(address);
	Wire.write((uint8_t) 0);	// try to point to MCP23008 IODR
	Wire.endTransmission();

	/*
	 * Now read a byte
	 * On a MCP23008 we should read the 0xff we wrote to IODIR
	 * On a PCF8574 we should read 0 since the output port was set to 0
	 */
	Wire.requestFrom((int)address, 1);
	data = Wire.read();

	if(data == 0xff)
	{
		chiptype = IICchip_MCP23008;
	}
	else if (data == 0x00)
	{
		chiptype = IICchip_PCF8574;
	}
	else
	{
		chiptype = IICchip_UNKNOWN;
	}
	return(chiptype);
}
const char *iicType2Name(int type)
{
const char *name;
	switch(type)
	{
		case IICchip_PCF8574:
			name = "PCF8574";
			break;
		case IICchip_MCP23008:
			name = "MCP23008";
			break;
		default:
			name = "UNKNOWN";
			break;
	}
	return(name);
}

/*
 * Bit positions on i2c expander output port for LCD pins 
 */
typedef struct
{
	uint8_t en;
	uint8_t rw;
	uint8_t rs;
	uint8_t d4;
	uint8_t d5;
	uint8_t d6;
	uint8_t d7;
	uint8_t bl;
	__typeof__(POSITIVE) pol; // use typeof() for backward compability since polarity type name changed
} IICexpdata;



IICexpdata i2cparam[] = {
// EN, RW, RS, D4, D5, D6, D7, BL, POL
  { 2,  1,  0,  4,  5,  6,  7,  3, POSITIVE }, // YwRobot/DFRobot/SainSmart
  { 2,  1,  0,  4,  5,  6,  7,  3, NEGATIVE }, // Robot Arduino LCM1602/2004
  { 4,  5,  6,  0,  1,  2,  3,  7, NEGATIVE }, // MJKDZ board
  { 6,  5,  4,  0,  1,  2,  3,  7, NEGATIVE }, // I2CIO board modded for backlight (pnp transistor)
  { 6,  5,  4,  0,  1,  2,  3,  7, POSITIVE }, // I2CIO board modded for backlight (npn transistor)
  { 4,  5,  6,  0,  1,  2,  3,  7, POSITIVE }, // (extra combination of MJKDZ just in case...)
  {0xff} // end of guess table
};


int guessconfig(uint8_t address)
{
uint8_t guess = 0;
char buf[64];

	while(i2cparam[guess].en != 0xff)
	{

		Serial.print("Trying: ");

		sprintf(buf, "lcd(0x%02x, %d, %d, %d, %d, %d, %d, %d, %d, %s)",
			 address,
			 i2cparam[guess].en,
			 i2cparam[guess].rw,
			 i2cparam[guess].rs,
			 i2cparam[guess].d4,
			 i2cparam[guess].d5,
			 i2cparam[guess].d6,
			 i2cparam[guess].d7,
			 i2cparam[guess].bl, i2cparam[guess].pol == POSITIVE ? "POSITIVE" : "NEGATIVE");
		Serial.println(buf);
			
		/*
		 * initialize constructor with guess
		 */
		LiquidCrystal_I2C lcd = LiquidCrystal_I2C(
					 address,
					 i2cparam[guess].en,
					 i2cparam[guess].rw,
					 i2cparam[guess].rs,
					 i2cparam[guess].d4,
					 i2cparam[guess].d5,
					 i2cparam[guess].d6,
					 i2cparam[guess].d7,
					 i2cparam[guess].bl,
					 i2cparam[guess].pol);

		lcd.begin(LCD_ROWS, LCD_COLS);

		/*
		 * Quick 3 blinks of backlight
		 */
		for(int i = 0; i< 3; i++)
		{
			lcd.backlight();
			delay(250);
			lcd.noBacklight();
			delay(250);
		}
		lcd.backlight();

		lcd.clear();
		sprintf(buf, "0x%02x,%d,%d,%d,%d,",
			 address,
			 i2cparam[guess].en,
			 i2cparam[guess].rw,
			 i2cparam[guess].rs,
			 i2cparam[guess].d4);
		lcd.print(buf);

		sprintf(buf, "%d,%d,%d,%d,%s",
			 i2cparam[guess].d5,
			 i2cparam[guess].d6,
			 i2cparam[guess].d7,
			 i2cparam[guess].bl, i2cparam[guess].pol == POSITIVE ? "POSITIVE" : "NEGATIVE");
		lcd.setCursor(0, 1);
		lcd.print(buf);

		waitinput(DEFPROMPT);
		lcd.clear();
		guess++;
	}
	return(0);
}
#undef read // ugly but removes Wire libary function mapping done above
void waitinput(const char *prompt)
{
	if(prompt)
		Serial.print(prompt);
	else
		Serial.print("<Press <ENTER> or click [Send] to Continue>");

	while(Serial.available())
		Serial.read(); // swallow all input

	while(!Serial.available()){} // wait on serial input

	Serial.println();
}
 
unable to connect

unable to connect

This has been an enlightning process with no Arduino experience, but I have managed to get it up and running on the local display. However the network side I am having issues with. It will not pull time from the internet nor can I connect with a browser or phone. On the browser apter it accepts my login credentuals I get "could not find file: nstatus.sht", on the phone it allows me to enter the login in credentials and opens the display screen with no entries and then a box opens stating "http://192.168.1.16 unable to connect to apex". I am assuming I am connecting to the tiny web server and it is not communicating with the controller . Anyone any thoughts.

Many thanks
Bill
 
ultrasonic freq should be above audible range. the chauvet code gets a reading every 16ms (60hz). I think this is what you are hearing.

the typical cause of main loop hang is due to a network operation. but even if the main loop hangs, the core code which runs on interrupt continues to execute (relays will switch as scheduled, jebao pumps will continue with its programmed wave mode, etc.). The ethernet library will eventually time out and disconnect the hung connection. I can't remember how many seconds this timeout value is, but if you ever try to connect and for some reason cannot connect, simply wait a minute and try again. The Ethernet shield hardware is only capable of handling 4 socket connections, so if all 4 are used (perhaps hung), then you will not be able to connect, and have to wait for the ethernet library code to timeout and disconnect the sockets.

You can fork the github project.
 
Well I did all the obvious things, reloaded all the original files from Github, and made the necessary changes to the config. Formatted SD card and reloaded index and to my surprise it is working now. Clock updated, PH,Temp,and ultrasonic working.
My relay card does not have a separate VCC input however it has a jumper on the ground that when disconnected kills the power to the coils. Can I wire this up to a separate power supply and use the ground the same as you were using the VCC? When I power it from the USB it has enough power to activate the coils but when I power it from the 1amp wall wart it never boots up, when it trys to cycle all the coils it just restarts.

Thanks
Bill
 
It is a Keyes Funduino 8 relay board. The pins are VCC,GND,IN1,IN2.iIN3,IN4,IN5,IN6,IN7,IN8,COM,GND, with a jumper between COM and GND . I was able to power the first VCC from my Arduino 5v and external power supply and leave the first GND open. Then I connected the COM to the Arduino GND and the last GND to the external power supply GND. I confirmed this arangement by checking power draw and functionality. Oddly the relays are powered on when the outlet is turned off, since they have both NO and NC it is functional, it just means if the board looses power the relays will default to NC. Not sure if that was done by design but it would mean in the event of failure your pumps would default to running (a good thing).

Thanks for all you work on this project, my plan is to build it into my power control built into my Red Sea Max130. I have it working on a TP-LINK router in client mode. By the way my ultrasonic module does buzz as well.

Bill
 

Attachments

  • photo.JPG
    photo.JPG
    43.6 KB · Views: 2
ok, google result finds this circuit diagram.
http://electronicapagina.com/index.html

The input side, the more common wiring is the common goes to Vcc, then each digital input is active low.

This funduino board is reversed logic. The common is ground and the digital input is active high.

If you want to continue using this board, just keep the common-gnd short. You can use the same 5v from arduino to power the relay Vcc.

But you will need to modify the chauvet code to reverse the on and off state for outlets 0-7 like this in outlets.ino

Code:
void _outletOn(uint8_t p){
  if (p<8) {
    if (!(PORTA & _BV(p))) {//is off
      PORTA |= _BV(p);  
      _outlogentry(p,true);
    }
  } else if (p==Feeder) {
    feed();
  } else if (p==Pump0) {
    FeedModeOFF();
  }else {
    if (!(PORTC & _BV(p-8))) {
      PORTC |= _BV(p-8);
      _outlogentry(p,true);
    }
  }
}

void _outletOff(uint8_t p) {
  if (p<8) {
    if (PORTA & _BV(p)) {//is on
      PORTA &= ~_BV(p);
      _outlogentry(p,false);
    }
  } else if (p==Feeder) {
  } else if (p==Pump0) {
     FeedModeON(); 
  }else {
    if (PORTC & _BV(p-8)) {
      PORTC &= ~_BV(p-8);
      _outlogentry(p,false);
    }
  }
}

}
The active low is a better design, as explained in the arduino-info link. and I quote
This design is intentional, so that it is possible to guarantee that at power-on of a system, or system reset, that no relays activate except when expected under program control. There may be pumps, lights etc attached and chaos could ensue if this was not controlled definitively for each output port being used.
besides that, it is better for the arduino pin to "sink" the line than to "source" the line to light up the opto LED.
 
BTW, I did try to use a TP link router before, but found that network response is noticeably slower. Maybe I got a bad tp link router, but you can compare the wired and wireless response to see if there is any difference. When I debug the webpage on Firefox browser with firebug debugger, it displays the response time to complete the page, and the difference was quite significant between wired and wireless. I don't think it is the wireless protocol per se, but the way tp link is configured as client to forward traffic adds too much latency.
 
I have found the bit that is causing my Arduino to lock up. I can confirm the main loop does stop the millis stop outputting and everything freezes :(
If i just request
Code:
IP:8000/cgi-bin/outlog.xml
It loads fine and doesn't stop.
If I then request
Code:
IP:8000/cgi-bin/outlog.xml?sdate=1406242018&days=31
Then it freezes up.
*edit: it does eventually display in a browser*

I think I have found the relevant part of code in index.htm
Code:
	$.get("/cgi-bin/outlog.xml?sdate="+sdate+"&days=31",function (data) {
Changing it to
Code:
	$.get("/cgi-bin/outlog.xml",function (data) {
Stops it hanging up.

I have forked the project as Sharemaster so will start to push some of my changes up when I get them tested :)
 
Last edited:
the url parameter means to return value from the sdate (start date) up to 31 days later.
this is a Neptune Apex syntax that I adopted.

the web client will calculate for a 24 hour period, hence sdate will be yesterday at current time. (Hence it will not actually return 31 days worth of data, but just a full day's worth of data) Perhaps you have corrupted outlet log data that is causing it to hang.

if you did not specify a parameter (by removing everything after ?), it will return data for today since midnight.

it seems your data since midnight is fine. so try again tomorrow since you will have 24 hours of good data by then.

read your SD card data on a PC for outlet log to see if you can find any kind of discrepancy or corrupted data. Let me know if you find anything, so I can update the file reader to handle it accordingly. I had a long chat with the sdfat library author and he has successfully convinced me sdfat library is bug free.
 
Last edited:
the url parameter means to return value from the sdate (start date) up to 31 days later.
this is a Neptune Apex syntax that I adopted.

the web client will calculate for a 24 hour period, hence sdate will be yesterday at current time. (Hence it will not actually return 31 days worth of data, but just a full day's worth of data) Perhaps you have corrupted outlet log data that is causing it to hang.

if you did not specify a parameter (by removing everything after ?), it will return data for today since midnight.

it seems your data since midnight is fine. so try again tomorrow since you will have 24 hours of good data by then.

read your SD card data on a PC for outlet log to see if you can find any kind of discrepancy or corrupted data. Let me know if you find anything, so I can update the file reader to handle it accordingly. I had a long chat with the sdfat library author and he has successfully convinced me sdfat library is bug free.

Found the issue, it's a simple case of too many rows in the XML file due to the Kalk going on and off once per loop, must have messed the timer up at that point. No longer doing it on todays logs and they load fine :debi:

Here is a snippet from line 9890 onward, minus the quote marks :p

< "record" >< "date" >06/24/2014 14:44:01< "/date" >< "name" >Kalk< "/name" >< "value" >ON< "/value" >< "/record" >
< "record" >< "date" >06/24/2014 14:44:02< "/date" >< "name" >Kalk< "/name" >< "value" >OFF< "/value" >< "/record" >
< "record" >< "date" >06/24/2014 14:44:03< "/date" >< "name" >Kalk< "/name" >< "value" >ON< "/value" >< "/record" >
< "record" >< "date" >06/24/2014 14:44:04< "/date" >< "name" >Kalk< "/name" >< "value" >ON< "/value" >< "/record" >
< "record" >< "date" >06/24/2014 14:44:05< "/date" >< "name" >Kalk< "/name" >< "value" >OFF< "/value" >< "/record" >
< "record" >< "date" >06/24/2014 14:44:06< "/date" >< "name" >Kalk< "/name" >< "value" >ON< "/value" >< "/record" >
< "record" >< "date" >06/24/2014 14:44:07< "/date" >< "name" >Kalk< "/name" >< "value" >ON< "/value" >< "/record" >
< "record" >< "date" >06/24/2014 14:44:08< "/date" >< "name" >Kalk< "/name" >< "value" >OFF< "/value" >< "/record" >
< "record" >< "date" >06/24/2014 14:44:09< "/date" >< "name" >Kalk< "/name" >< "value" >ON< "/value" >< "/record" >
< "record" >< "date" >06/24/2014 14:44:10< "/date" >< "name" >Kalk< "/name" >< "value" >OFF< "/value" >< "/record" >
< "record" >< "date" >06/24/2014 14:44:11< "/date" >< "name" >Kalk< "/name" >< "value" >ON< "/value" >< "/record" >
 
yeah, that happened to me once. that's why as you said, it eventually completes.
it appears hung while processing, but the core code is still running.
 
After I made the DNS changes in post #579 I'm getting NTP time. I can access the controller from the local network but its no longer accessible from remote locations.
 
Ah , I was seeing time outs , i was hoping it was from cascading my in-house routers. Did not want to take on attempting to implement the wireless shield at this point. My electronic skills are up for the game my programing skills dates back to cobol. Well just introduced some SPS frags to my tank so will be a while before I add this. My big push was on getting the dosing pumps functional but that part of the code is not complete, All things in good time.

Thanks
Bill
 
I am currently working on code for second temp sensor. Then I'll work on adding second ph and salinity. I'm not sure if I am going to work on adding ORP, since there are only 2 more serial ports available.

I have checked in to github the update to refresh RTC once a day from ntp, and to use router ip for dns and gateway in call to Ethernet.begin
 
I was working on a controller with a Raspberry PI when I came across this project. I liked it so much I have abandoned my rPi work. My question - I am going to be using 4 gang outlets you see at HD. I have built this with it housing 4 port relay boards and bringing back the controller using 6pin RJ11 jacks/cables. Me new to Arduino code how hard would it be to mod for groups of 4 "power bars". Second question is I found a cheaper PH on Ebay do you think this would work instead of the Atlas? It is also serial....
http://www.ebay.com/itm/181341515761?ssPageName=STRK:MEWAX:IT&_trksid=p3984.m1423.l2649

Inside%20Powerbar.jpg
 
please hold off getting the RTC sync code. There seems to be a problem.


edit- nevermind. the master branch is fine, the problem was in my local branch only.
 
Last edited:
Back
Top