Giter VIP home page Giter VIP logo

dro-matic's Introduction

DROMatic OS

The DRO-Matic OS has been built to automate nearly every aspect of hydroponic farming for you! From nutrient dosing to pH / EC drift fixing, feeding types to draining, top-offs and even timers; we have quantified everything you need to automate successful crops.

Users create, configure and share what are called "crops" by interfacing with an LCD screen and external MicroSD card. A single DRO-Matic crop disk size (SD card) can vary, but in very extreme crop configurations (10 channels, 100 weeks of dosing sessions per channel) were found to be just under 5MB. The OS has also been built to scale to nearly any size farm; so, have no fear if you are considering using this for a large-scale farm or a small personal garden.

Why do we need this?

Before diving into the OS configuration, let's ask ourselves why this even exists? It's undoubtedly true across all cultures that agriculture and food growth is not just a necessity, but is also very expensive. Agriculture is not only expensive in amount of land used, but also time spent to get a harvest and even energy burned to obtain consistent quality. While humans can expect another 9 billion people over the next 30 years; we need to seriously address the fact that as of today 90% of all farmable land is currently being used at its max capacity.

The technology to solve feeding 9 billion people is available and also removes the costly impacts of large soil based farms, it’s called vertical hydroponic farming. Vertical farms save vital land usage by summing farms up into much smaller (stackable) areas. Vertical gardens save time/money at food production because it's quicker to achieve a consistent crop quality ALL YEAR LONG.

(this video explains the problem and pros of vertical farming in further detail)

However, the down side to vertical farming (or hydroponics in general) is you do have to learn A LOT about nutrients, dosing regimens, regimen drifting, EC/PPM and PH testing etc etc. Because of the large learning curve, we still don't see a lot of traditional farmers make the jump to this more cost-effective solution. So, to answer the question of "Why DRO-Matic"; it all comes down to farmers need a way to simplify the process of hydroponic farming and what better way to do this than to go fully automated.

The DRO-Matic OS is here to take care of all the heavy lifting our of your hydroponic farming needs. The goal is curve all time spent learning and maintaining hydroponic farms by automating nearly every aspect and ultimately bring a much more efficient way of food production option to the world. Please note that this OS is only the OS part of this solution; without the actual DRO-Matic dosing cabinet (not commercially available, must DIY build), this OS makes no sense for you yet. For detailed instructions on how to DIY build your own DRO-Matic cabinet, please visit our hardware requirements page videos.

OS Overview

Th DRO-Matic OS has the ability to fully automate the follow process for you:

  • Regimen dosing (full feedings and top off feedings with drifting amounts)
  • pH adjusting (both plant and reservoir water sources)
  • EC adjusting (plant water source top-offs)
  • Irrigation (feeding, draining and topping off)
  • Timers (4 120v/10amp power receptacles that can be timed)

Because of the sheer flexibility of the DRO-Matic OS, there is a lot of a screens to configure a single crop. Below is a overview of the available OS features.

  • Displays current date / time, and plant water's current PPM/EC levels and current pH level
  • Date/Time = Allows you to set the date and time of the DROMatic OS
  • EC Calibration = 3 point calibration (Dry, Low, High) for both EC probes.
  • pH Calibration = 3 point calibration (Low, Mid, High) for both pH probes.
  • Pump Calibration = Calibrate how many milliliters per minute your peristaltic can pumps.
  • Pump Delay = Calibrate how long of a delay each dosing pump should take between dosing each solution (allows time to fully mix each solution).
  • New Crop = Start a brand new crop project on your SD card
  • Load Crop = Load an existing crop project on your SD card
  • Delete Crop = Delete the available listed crops on SD card (except for currently loaded crop)
  • Reset Crop = Resets crop back to first configured regimen and timer day/week. Does NOT reset crop back to factory settings!!
  • EC Range = Sets the desired range of EC you would like your DRO-Matic to maintain for this crop for a given regimen.
  • pH Range = Sets the desired range of pH you would like your DRO-Matic to maintain for this crop for a given regimen.
  • Number of Regimens = Sets desired number of regimen doses you expect your plant's life cycle to take.
  • Prime = Primes a pump line to remove any excess air during first setup.
  • Amount = Configure how many milliliters a pump will dose for a given regimen. No need to calculate reservoir volume, OS will do this already.
  • Delay = Configure how long of a delay between each pump to prevent nutrient lockout.
  • Reservoir Volume = Configure the volume of water your reservoir / plants will be using throughout the life of plants.
  • Top-Off Concentrate = Configure the fraction amount of dosing amount top-off water gets.
  • Drain Time = Configure how long of a plant water drain time you will need. You can may want to over estimate this.
  • Flow Calibration = Configure pulse count per second IN and OUT flow meters are manufactured to send. These numbers are different for per size/manufacturers of flow meters.
  • Manual Flush = Utility that allows you to flow either IN and OUT irrigation valvels to do any manual flushing during setup / testing.
  • Start End Times = Configure start and end times over a given day of the week, for an infinite amount of configurable weeks.

dro-matic's People

Contributors

drolsen avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

dro-matic's Issues

Is this dead?

Has development moved somewhere else? Is there a good alternative? I came across this when I was thinking about making something similar myself, but would much rather find something existing

Add Crop Reset Sessions

Add a "reset crop sessions" option under System Settings that will loop over all channels and their session and set their expired prop to false and reset set any repeat values. While resetting each session, it will be important to update each sessions year start time to current year, however we can't shift month, day, hour or min.

Goal of this is to allow users to share a crop configuration online with others. Sharing user or downloading user can open crop and reset it's sessions and finish configuring it as needed.

General Project Cleanup

  • Within the .ino file, relocate all save portion of loop() to individual files such as channels and sessions.
  • Within the .ino file, clean up if/else mess and consider using switch case statements.
  • Make better naming conventions for functions across OS that resembles an actual API.

Progression?

I've been digging into this project big time lately as I look to automate my setup. I have some items...

  1. Do you have a diagram of how your setup is with everything you've listed on this project? Two PH probes, two EC probes, fill and drain valves, and items like that. It'd be helpful to see how you've envisioned and utilized these in order to plan my setup better.
  2. If I want to add ORP or another atlas scientific sensor, how do I go about that?
  3. Any updates to include web management or anything of the like? With your portfolio, that seems well within reach.

Thanks again for everything you've done and I look forward to the responses.
boasist

8 dosing pump for nutrient

Dear Devin

I am a beginner using Arduino
and I was searching for dosing controller for my hydroponic
I have found your project, which I am looking for.
But I have a question,
your project has 10 dosing pumps
8 for nutrient and 2 for PH.

What I do not understand, why 8 dosing pumps for nutrient?

We use A and B nutrient solution, so we need only 2 nutrient dosing pumps
in this case, if I want to use your project,
Is there a way to modify the code? To operate 4 pumps, 2 for PH, and 2 for A & B nutrient ?
If this is possible, is there anyway to edit?

Thanks and Regards

Top-off correction need to be both time and volume based.

Right now, EC correction does two steps:

  • drains plant water by configured amount (gallons) converted into time (seconds) based on out flow meter
  • feeds top-off water from reservoir to plants by (gallons) converted into time (seconds) based on out flow meter

However the problem here is that water pressure / flow rate from reservoir changes as reservoir gets lower in water volume. Because of this, plant water levels can get too low during top-off cycles leaving roots exposed.

Instead of feeding of top-off water based on time, we should use out flow meter and measure exact gallon volume. This will keep water levels for plants more constant over the life of a regimen.

The expected behavior is that the feeding step of EC correction will get longer and longer as water volume gets lower in reservoir, but exact gallon amount will still be fed. First step in EC correction will remain time based and constant no matter the volume of reservoir size as plant water volume should now remain constant.

Build TopOff Amount Screen

After much testing and diagnostics, confirmed that moving into next regimen must happen within topoffs not flow rate checking. In light of this, no longer is it appropriate to make EC correction or rather topping off time based, but instead amount based.

We need to build out a topoff amount screen to allow users to set how many gallons of topoff should be used during EC correction and topping off plants.

Regimens use zero based index

For consistency, move regimen file system to stop using 0 based indexing. It makes it harder when configuring crop from file system and it adds to code by having to increment index number manually.

Repeating Regimens

Issue

Due to plants taking up nutrients / water faster as they get bigger, OS needs to accommodate by
allowing to repeat regimens.

Repeating regimen feature should repeat the entire regimen, and not just the topoff portion of a regimen. The plants do not respond well if only repeating topoffs after about the the third topoff as I've discovered.

Solution

Within the Regimens (ml) Configuration menu, as you get to set your ml amount we should allow users to specify a repeating amount. However screen limitation might make this a problem so a new "Regimen Repeat Configuration" menu might be necessary.

Developer Notes

Do not forget to include the resetting of these repeating regimen numbers when user uses "Crop Reset" feature of OS.

Peristaltic Pump Setup

I'd love to build this setup and document my whole experience on rollitup.org, where you'll get a lot of interested minds in the project - but the syringe pump method is a big barrier for me.. do you plan on releasing a peristaltic pump guide?

Thanks for your hard work on this, can't wait to see it when it's finished.

Won't Compile on newest 1.8.7 Arduino IDE due to StandardCplusplus

Project won't compile if using the newest Adruino IDE 1.8.7 due to some breaking changes made in Arduino 1.8.6 - avr-gcc 4.9.2 to avr-gcc 5.4.0 it causes StandardCplusplus not to work anymore and throw errors regarding (class std::basic_istream) and ostream.

The easiest fix I have found currently without digging into this further is to simply install the 1.8.5 IDE which still uses avr-gcc-4.9.2

No Wire.endTransmission() needed after Wire.requestFrom()

Hi, do you use a special Wire library ? I noticed odd usage of the Wire library.

After a Wire.requestFrom() you use Wire.endTransmission(). That is not needed. The Wire.requestFrom() is a complete I2C transaction on its own. The Wire.endTransmission() is only used when writing data.

I suggest to keep the "Wire.beginTransmission - Wire.write - Wire.endTransmission" close together. You have the Wire.beginTransmission() in a seperate function, which is unusual. In the Arduino Wire library, the I2C bus transaction is fully done with Wire.endTransmission(). The other two functions set variables and write to a buffer.

You request 48 bytes with Wire.requestFrom(), but the Arduino Wire library has a maximum of 32 bytes.

Regimen Dosing Screen Updates

While performing regimen dosing to reservoir water under both full feedings and topoff feedings the screen should be updated as follows:

DOSING REGIMEN
RSVR EC: XXXX
or
DOSING TOPOFF
RSVR EC: XXXX

This gives the end user the ability to visually see what the current EC level is for reservoir water between each nutrient solution being dosed / delayed for mixing.

Help is here

This has been left for dead. After a few hours of working this, I finally got it working. If anyone needs help, email me at [email protected]

Drainage/Top Off System

The goal is to allow DRO-Matic to top off plants with it's dosed reservoir water X times between full water flushing of plants once every 7 - 14 days. This also allows the DRO-Matic to do full flushing/draining of plant water and refill with dosed reservoir for you.

To Do:
Built out optional drainage/top off system that allows you to configure up to 6 Electrical Solenoid Valve (0 PSI requirement and default closed) that can be scheduled to open for X amount of seconds/minutes and can be configured to repeated hourly, daily, weekly, monthly and yearly per valve.

First screen will ask user if they would like to turn on or off drain/top off system (off by default).
If on, next screen will be number of valves (6 max as we are limited)

If on, back out on main menu you will now have:

  • System Settings
  • Channels Settings
  • Drainage Settings

Like channels settings, once under the new Drainage settings you will be presented with a list of available values we configured above. Under a single valve menu we have DateTime Config and Repeat Config that allows you to configure when/interval length and how long a single value will be opened for.

Crop status updates

Description

When setting a crop status to paused, the screen should ask if you would like to pause pH adjustments as well. Currently the entire system becomes paused including pH adjustments and this might not be what the end user wants.

Requirements

This requires a new property in the crop's setting for pHstatus and to flag for it within the .ino.

Goal

The goal behind this is to allow a user to put crops automation into full pause or partial pause. This basically turns the OS into a full manual system or a partial manual system with automated pH adjustments.

Clean up Core.cpp/h

Core was used as a middle man while converting system from being time based to event based and new classes we being build. Now however some functions in core do not belong in core, but instead in said newly created classes.

We need to clean up core and relocate some functions to their now, more logical locations.

General Project Questions/Feedback

First of all let me start by saying a big heartfelt thanks for starting this project. This project is going to help not only hobby cannabis growers, but patients that can't truly can't afford their medication anymore. This could be built out to support the hobby agriculturist, or anyone that simply can't afford a vastly overpriced commercial dosing system.YOU'RE DOING GOD'S WORK, SON.

I hope to see you build a lot of functionality out of this! It would be awesome to see this take off.

Questions:

  1. Do you know of any other detailed guides I can follow for the dosing mechanism, that will interface perfectly with your project? I do not have the time or craftsmanship to do a huge array of syringes. I think this is the most important because it's the largest barrier towards general public adoption to your project.
  2. Could I make a a water solenoid valve work in a gravity fed solution, instead of the peristaltic pump alternative?
  3. Would this cheapo autodosing pump work in your system?
  4. Will you add "real time" nutrient dosing/PH adjustment? From a farmer's perspective, I would argue this is easily the most important feature to implement into this project. You could have the probes constantly polling PH and PPM data and then dosing based on when those levels vary out of range over a set period of time (with a delay after dosing before retesting we can avoid the false positive of having the system dose PH/PPM to adjust and then immediately re-detecting a PH/PPM spike which we just administered).
    Does the project do this or do you intend to add this functionality? I think it's mission critical.

I'll send you a picture of the monsters I grow if you can add this functionality.

Build OS Configure Web Interface

Approaching the finish of being able to configure all OS settings from LCD shield, it is now time to consider building a quick web interface tool that allows you to configure a crop via interfacing with calendar and events as sessions.

Tool can be hosted on jsfiddle and embedded and linked to with revisions available for later on and requiring no hosting. Here are the found resources for this app thus far:

User Experience Outline:

  • No login required
  • Fills out crop name
  • Fills out channel number
  • Gets presented with entire interface
  • Interface is essentially a large month to month calendar with options above it.
  • User can switch what channel and what session they are under and use calendar to configure session times.
  • User can add and remove sessions while under any of the channels they configured in the beginning.
  • User can also alter number of channels at any point by max is 10 min is 1.
  • All repeat, amount, and start time for sessions are set in the events of the calendar.
  • Once done, user can hit generate button and a zip file / download will be given to them with crop fully configured. User can take contents of zip and put on SD card and plug into Arduino/OS and load crop up.

Thank you Devin...

Hi devin, how are you? This project is awesome. I just edited the library folder names and uploaded it. Thank you very much. Now it's time to set up the system. i hope i can install it. If only the wiring diagram was improved. I think if I can do that, I can give a boost from here.Greetings from TURKEY.

Please help this crop error

Hi, i got the code to compile and upload successfully with few warnings, but the lcd sheild is at Crop name and it does not let me input alphabet, only the forward button works and the back button has become the top bottom. other buttons dont work. using dfrobot lcd sheild 2.0

these are the errors would be great help if anyone can help me through this

using arduino ide 1.8.5 and same libraries as drolsen.

warnings as follows -

sketch\Crops.cpp:507:14: warning: character constant too long for its type

if (type == 'low'){

          ^

sketch\Crops.cpp:511:14: warning: character constant too long for its type

if (type == 'mid'){

          ^

sketch\Crops.cpp:515:14: warning: character constant too long for its type

if (type == 'high'){

          ^

sketch\Crops.cpp:524:14: warning: character constant too long for its type

if (type == 'dry'){

          ^

sketch\Crops.cpp:528:14: warning: character constant too long for its type

if (type == 'low'){

          ^

sketch\Crops.cpp:532:14: warning: character constant too long for its type

if (type == 'high'){

          ^

sketch\Crops.cpp: In function 'void setCropData(ArduinoJson::JsonObject&, bool)':

sketch\Crops.cpp:83:55: warning: default argument given for parameter 2 of 'void setCropData(ArduinoJson::JsonObject&, bool)' [-fpermissive]

void setCropData(JsonObject& d, bool returnHome = true){

                                                   ^

sketch\Crops.cpp:24:13: note: previous specification in 'void setCropData(ArduinoJson::JsonObject&, bool)' here

extern void setCropData(JsonObject& d, bool returnHome = true);

         ^

sketch\Crops.cpp: In function 'void cropRename(int)':

sketch\Crops.cpp:147:13: warning: NULL used in arithmetic [-Wpointer-arith]

if (dir != NULL){

         ^

sketch\Crops.cpp: In function 'void printStatus(int)':

sketch\Crops.cpp:540:29: warning: default argument given for parameter 1 of 'void printStatus(int)' [-fpermissive]

void printStatus(int dir = 0){

                         ^

sketch\Crops.cpp:52:13: note: previous specification in 'void printStatus(int)' here

extern void printStatus(int dir = 0);

         ^

sketch\Crops.cpp:552:31: warning: default argument given for parameter 1 of 'void printPHAmount(int)' [-fpermissive]

void printPHAmount(int dir = 0){

                           ^

sketch\Crops.cpp:53:13: note: previous specification in 'void printPHAmount(int)' here

extern void printPHAmount(int dir = 0);

         ^

sketch\Crops.cpp:581:30: warning: default argument given for parameter 1 of 'void printPHDelay(int)' [-fpermissive]

void printPHDelay(int dir = 0){

                          ^

sketch\Crops.cpp:54:13: note: previous specification in 'void printPHDelay(int)' here

extern void printPHDelay(int dir = 0);

         ^

sketch\Crops.cpp:719:27: warning: default argument given for parameter 1 of 'void printOpen(int)' [-fpermissive]

void printOpen(int dir = 0){

                       ^

sketch\Crops.cpp:59:13: note: previous specification in 'void printOpen(int)' here

extern void printOpen(int dir = 0);

         ^

sketch\Crops.cpp:742:50: warning: default argument given for parameter 2 of 'void printECCalibrations(String, int)' [-fpermissive]

void printECCalibrations(String type, int dir = 0){

                                              ^

sketch\Crops.cpp:57:13: note: previous specification in 'void printECCalibrations(String, int)' here

extern void printECCalibrations(String type, int dir = 0);

         ^

sketch\DatesTime.cpp:15:149: warning: narrowing conversion of '(((((((unsigned int)tmpInts[5]) & 3u) == 0u) && ((tmpInts[5] % 100) != 0)) || ((tmpInts[5] % 400) == 0)) ? 28 : 29)' from 'int' to 'byte {aka unsigned char}' inside { } [-Wnarrowing]

byte days[12] = { 31, ((tmpInts[5] % 4 == 0 && tmpInts[5] % 100 != 0) || (tmpInts[5] % 400 == 0)) ? 28 : 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

                                                                                                                                                 ^

sketch\DatesTime.cpp: In function 'void printDateTime(int)':

sketch\DatesTime.cpp:45:31: warning: default argument given for parameter 1 of 'void printDateTime(int)' [-fpermissive]

void printDateTime(int dir = 0){

                           ^

In file included from sketch\DatesTime.cpp:8:0:

sketch\DatesTime.h:20:13: note: previous specification in 'void printDateTime(int)' here

extern void printDateTime(int dir = 0);

         ^

sketch\DatesTime.cpp: In function 'void captureDateTimeDisplays(int, int, int, int)':

sketch\DatesTime.cpp:104:119: warning: default argument given for parameter 1 of 'void captureDateTimeDisplays(int, int, int, int)' [-fpermissive]

void captureDateTimeDisplays(int month = tmpInts[1], int day = tmpInts[2], int hour = tmpInts[4], int min = tmpInts[5]){

                                                                                                                   ^

In file included from sketch\DatesTime.cpp:8:0:

sketch\DatesTime.h:26:13: note: previous specification in 'void captureDateTimeDisplays(int, int, int, int)' here

extern void captureDateTimeDisplays(int month = tmpInts[1], int day = tmpInts[2], int hour = tmpInts[4], int min = tmpInts[5]);

         ^

sketch\DatesTime.cpp:104:119: warning: default argument given for parameter 2 of 'void captureDateTimeDisplays(int, int, int, int)' [-fpermissive]

void captureDateTimeDisplays(int month = tmpInts[1], int day = tmpInts[2], int hour = tmpInts[4], int min = tmpInts[5]){

                                                                                                                   ^

In file included from sketch\DatesTime.cpp:8:0:

sketch\DatesTime.h:26:13: note: previous specification in 'void captureDateTimeDisplays(int, int, int, int)' here

extern void captureDateTimeDisplays(int month = tmpInts[1], int day = tmpInts[2], int hour = tmpInts[4], int min = tmpInts[5]);

         ^

sketch\DatesTime.cpp:104:119: warning: default argument given for parameter 3 of 'void captureDateTimeDisplays(int, int, int, int)' [-fpermissive]

void captureDateTimeDisplays(int month = tmpInts[1], int day = tmpInts[2], int hour = tmpInts[4], int min = tmpInts[5]){

                                                                                                                   ^

In file included from sketch\DatesTime.cpp:8:0:

sketch\DatesTime.h:26:13: note: previous specification in 'void captureDateTimeDisplays(int, int, int, int)' here

extern void captureDateTimeDisplays(int month = tmpInts[1], int day = tmpInts[2], int hour = tmpInts[4], int min = tmpInts[5]);

         ^

sketch\DatesTime.cpp:104:119: warning: default argument given for parameter 4 of 'void captureDateTimeDisplays(int, int, int, int)' [-fpermissive]

void captureDateTimeDisplays(int month = tmpInts[1], int day = tmpInts[2], int hour = tmpInts[4], int min = tmpInts[5]){

                                                                                                                   ^

In file included from sketch\DatesTime.cpp:8:0:

sketch\DatesTime.h:26:13: note: previous specification in 'void captureDateTimeDisplays(int, int, int, int)' here

extern void captureDateTimeDisplays(int month = tmpInts[1], int day = tmpInts[2], int hour = tmpInts[4], int min = tmpInts[5]);

         ^

sketch\Irrigation.cpp: In function 'void printTopOffConcentrate(int)':

sketch\Irrigation.cpp:48:40: warning: default argument given for parameter 1 of 'void printTopOffConcentrate(int)' [-fpermissive]

void printTopOffConcentrate(int dir = 0){

                                    ^

In file included from sketch\Irrigation.cpp:8:0:

sketch\Irrigation.h:17:13: note: previous specification in 'void printTopOffConcentrate(int)' here

extern void printTopOffConcentrate(int dir = 0);

         ^

sketch\Irrigation.cpp: In function 'void printTopOffAmount(int)':

sketch\Irrigation.cpp:79:35: warning: default argument given for parameter 1 of 'void printTopOffAmount(int)' [-fpermissive]

void printTopOffAmount(int dir = 0){

                               ^

In file included from sketch\Irrigation.cpp:8:0:

sketch\Irrigation.h:18:13: note: previous specification in 'void printTopOffAmount(int)' here

extern void printTopOffAmount(int dir = 0);

         ^

sketch\Irrigation.cpp: In function 'void printTopOffDelay(int)':

sketch\Irrigation.cpp:109:34: warning: default argument given for parameter 1 of 'void printTopOffDelay(int)' [-fpermissive]

void printTopOffDelay(int dir = 0){

                              ^

In file included from sketch\Irrigation.cpp:8:0:

sketch\Irrigation.h:19:13: note: previous specification in 'void printTopOffDelay(int)' here

extern void printTopOffDelay(int dir = 0);

         ^

sketch\Irrigation.cpp: In function 'void printDrainTime(int)':

sketch\Irrigation.cpp:120:32: warning: default argument given for parameter 1 of 'void printDrainTime(int)' [-fpermissive]

void printDrainTime(int dir = 0){

                            ^

In file included from sketch\Irrigation.cpp:8:0:

sketch\Irrigation.h:20:13: note: previous specification in 'void printDrainTime(int)' here

extern void printDrainTime(int dir = 0);

         ^

sketch\Irrigation.cpp: In function 'void printFlowCalibration(int)':

sketch\Irrigation.cpp:150:38: warning: default argument given for parameter 1 of 'void printFlowCalibration(int)' [-fpermissive]

void printFlowCalibration(int dir = 0){

                                  ^

In file included from sketch\Irrigation.cpp:8:0:

sketch\Irrigation.h:21:13: note: previous specification in 'void printFlowCalibration(int)' here

extern void printFlowCalibration(int dir = 0);

         ^

sketch\Irrigation.cpp: In function 'void drainPlants(int, int)':

sketch\Irrigation.cpp:270:42: warning: default argument given for parameter 1 of 'void drainPlants(int, int)' [-fpermissive]

void drainPlants(int min = 0, int sec = 0){

                                      ^

In file included from sketch\Irrigation.cpp:8:0:

sketch\Irrigation.h:34:13: note: previous specification in 'void drainPlants(int, int)' here

extern void drainPlants(int min = 0, int sec = 0);

         ^

sketch\Irrigation.cpp:270:42: warning: default argument given for parameter 2 of 'void drainPlants(int, int)' [-fpermissive]

void drainPlants(int min = 0, int sec = 0){

                                      ^

In file included from sketch\Irrigation.cpp:8:0:

sketch\Irrigation.h:34:13: note: previous specification in 'void drainPlants(int, int)' here

extern void drainPlants(int min = 0, int sec = 0);

         ^

sketch\Irrigation.cpp: In function 'void feedPlants(int, int)':

sketch\Irrigation.cpp:289:41: warning: default argument given for parameter 1 of 'void feedPlants(int, int)' [-fpermissive]

void feedPlants(int min = 0, int sec = 0){

                                     ^

In file included from sketch\Irrigation.cpp:8:0:

sketch\Irrigation.h:33:13: note: previous specification in 'void feedPlants(int, int)' here

extern void feedPlants(int min = 0, int sec = 0);

         ^

sketch\Irrigation.cpp:289:41: warning: default argument given for parameter 2 of 'void feedPlants(int, int)' [-fpermissive]

void feedPlants(int min = 0, int sec = 0){

                                     ^

In file included from sketch\Irrigation.cpp:8:0:

sketch\Irrigation.h:33:13: note: previous specification in 'void feedPlants(int, int)' here

extern void feedPlants(int min = 0, int sec = 0);

         ^

sketch\Pumps.cpp: In function 'ArduinoJson::JsonObject& getPumpData(ArduinoJson::JsonBuffer&, byte)':

sketch\Pumps.cpp:30:73: warning: default argument given for parameter 2 of 'ArduinoJson::JsonObject& getPumpData(ArduinoJson::JsonBuffer&, byte)' [-fpermissive]

JsonObject& getPumpData(JsonBuffer& b, byte pumpIndex = currentPumpIndex){

                                                                     ^

In file included from sketch\Pumps.cpp:8:0:

sketch\Pumps.h:17:20: note: previous specification in 'ArduinoJson::JsonObject& getPumpData(ArduinoJson::JsonBuffer&, byte)' here

extern JsonObject& getPumpData(JsonBuffer& b, byte pumpIndex = currentPumpIndex);

                ^

sketch\Pumps.cpp: In function 'void setPumpData(ArduinoJson::JsonObject&, byte, bool)':

sketch\Pumps.cpp:36:90: warning: default argument given for parameter 2 of 'void setPumpData(ArduinoJson::JsonObject&, byte, bool)' [-fpermissive]

void setPumpData(JsonObject& d, byte pumpIndex = currentPumpIndex, bool returnHome = true){

                                                                                      ^

In file included from sketch\Pumps.cpp:8:0:

sketch\Pumps.h:18:13: note: previous specification in 'void setPumpData(ArduinoJson::JsonObject&, byte, bool)' here

extern void setPumpData(JsonObject& d, byte pumpIndex = currentPumpIndex, bool returnHome = true);

         ^

sketch\Pumps.cpp:36:90: warning: default argument given for parameter 3 of 'void setPumpData(ArduinoJson::JsonObject&, byte, bool)' [-fpermissive]

void setPumpData(JsonObject& d, byte pumpIndex = currentPumpIndex, bool returnHome = true){

                                                                                      ^

In file included from sketch\Pumps.cpp:8:0:

sketch\Pumps.h:18:13: note: previous specification in 'void setPumpData(ArduinoJson::JsonObject&, byte, bool)' here

extern void setPumpData(JsonObject& d, byte pumpIndex = currentPumpIndex, bool returnHome = true);

         ^

sketch\Pumps.cpp: In function 'void printPumpCalibration(int)':

sketch\Pumps.cpp:48:38: warning: default argument given for parameter 1 of 'void printPumpCalibration(int)' [-fpermissive]

void printPumpCalibration(int dir = 0){

                                  ^

In file included from sketch\Pumps.cpp:8:0:

sketch\Pumps.h:21:13: note: previous specification in 'void printPumpCalibration(int)' here

extern void printPumpCalibration(int dir = 0);

         ^

sketch\Pumps.cpp: In function 'void printPumpDelay(int)':

sketch\Pumps.cpp:65:32: warning: default argument given for parameter 1 of 'void printPumpDelay(int)' [-fpermissive]

void printPumpDelay(int dir = 0){

                            ^

In file included from sketch\Pumps.cpp:8:0:

sketch\Pumps.h:22:13: note: previous specification in 'void printPumpDelay(int)' here

extern void printPumpDelay(int dir = 0);

         ^

sketch\Regimens.cpp: In function 'ArduinoJson::JsonObject& getRegimenData(ArduinoJson::JsonBuffer&, byte, byte)':

sketch\Regimens.cpp:18:117: warning: default argument given for parameter 2 of 'ArduinoJson::JsonObject& getRegimenData(ArduinoJson::JsonBuffer&, byte, byte)' [-fpermissive]

JsonObject& getRegimenData(JsonBuffer& b, byte pumpIndex = currentPumpIndex, byte regimenIndex = currentRegimenIndex){

                                                                                                                 ^

In file included from sketch\Regimens.cpp:8:0:

sketch\Regimens.h:17:20: note: previous specification in 'ArduinoJson::JsonObject& getRegimenData(ArduinoJson::JsonBuffer&, byte, byte)' here

extern JsonObject& getRegimenData(JsonBuffer& b, byte pumpIndex = currentPumpIndex, byte sessionIndex = currentRegimenIndex);

                ^

sketch\Regimens.cpp:18:117: warning: default argument given for parameter 3 of 'ArduinoJson::JsonObject& getRegimenData(ArduinoJson::JsonBuffer&, byte, byte)' [-fpermissive]

JsonObject& getRegimenData(JsonBuffer& b, byte pumpIndex = currentPumpIndex, byte regimenIndex = currentRegimenIndex){

                                                                                                                 ^

In file included from sketch\Regimens.cpp:8:0:

sketch\Regimens.h:17:20: note: previous specification in 'ArduinoJson::JsonObject& getRegimenData(ArduinoJson::JsonBuffer&, byte, byte)' here

extern JsonObject& getRegimenData(JsonBuffer& b, byte pumpIndex = currentPumpIndex, byte sessionIndex = currentRegimenIndex);

                ^

sketch\Regimens.cpp: In function 'void setRegimenData(ArduinoJson::JsonObject&, byte, byte, bool)':

sketch\Regimens.cpp:25:134: warning: default argument given for parameter 2 of 'void setRegimenData(ArduinoJson::JsonObject&, byte, byte, bool)' [-fpermissive]

void setRegimenData(JsonObject& d, byte pumpIndex = currentPumpIndex, byte regimenIndex = currentRegimenIndex, bool returnHome = true){

                                                                                                                                  ^

In file included from sketch\Regimens.cpp:8:0:

sketch\Regimens.h:18:13: note: previous specification in 'void setRegimenData(ArduinoJson::JsonObject&, byte, byte, bool)' here

extern void setRegimenData(JsonObject& d, byte pumpIndex = currentPumpIndex, byte sessionIndex = currentRegimenIndex, bool returnHome = true);

         ^

sketch\Regimens.cpp:25:134: warning: default argument given for parameter 3 of 'void setRegimenData(ArduinoJson::JsonObject&, byte, byte, bool)' [-fpermissive]

void setRegimenData(JsonObject& d, byte pumpIndex = currentPumpIndex, byte regimenIndex = currentRegimenIndex, bool returnHome = true){

                                                                                                                                  ^

In file included from sketch\Regimens.cpp:8:0:

sketch\Regimens.h:18:13: note: previous specification in 'void setRegimenData(ArduinoJson::JsonObject&, byte, byte, bool)' here

extern void setRegimenData(JsonObject& d, byte pumpIndex = currentPumpIndex, byte sessionIndex = currentRegimenIndex, bool returnHome = true);

         ^

sketch\Regimens.cpp:25:134: warning: default argument given for parameter 4 of 'void setRegimenData(ArduinoJson::JsonObject&, byte, byte, bool)' [-fpermissive]

void setRegimenData(JsonObject& d, byte pumpIndex = currentPumpIndex, byte regimenIndex = currentRegimenIndex, bool returnHome = true){

                                                                                                                                  ^

In file included from sketch\Regimens.cpp:8:0:

sketch\Regimens.h:18:13: note: previous specification in 'void setRegimenData(ArduinoJson::JsonObject&, byte, byte, bool)' here

extern void setRegimenData(JsonObject& d, byte pumpIndex = currentPumpIndex, byte sessionIndex = currentRegimenIndex, bool returnHome = true);

         ^

sketch\Regimens.cpp: In function 'void printRegimenAmount(int)':

sketch\Regimens.cpp:51:36: warning: default argument given for parameter 1 of 'void printRegimenAmount(int)' [-fpermissive]

void printRegimenAmount(int dir = 0){

                                ^

In file included from sketch\Regimens.cpp:8:0:

sketch\Regimens.h:22:13: note: previous specification in 'void printRegimenAmount(int)' here

extern void printRegimenAmount(int dir = 0);

         ^

sketch\Timers.cpp:59:33: warning: character constant too long for its type

 if (digitalRead(RELAY13) == 'LOW'){

                             ^

sketch\Timers.cpp:64:33: warning: character constant too long for its type

 if (digitalRead(RELAY14) == 'LOW'){

                             ^

sketch\Timers.cpp:69:33: warning: character constant too long for its type

 if (digitalRead(RELAY15) == 'LOW'){

                             ^

sketch\Timers.cpp:74:33: warning: character constant too long for its type

 if (digitalRead(RELAY16) == 'LOW'){

                             ^

sketch\Timers.cpp: In function 'ArduinoJson::JsonObject& getTimerSessionData(ArduinoJson::JsonBuffer&, int, int)':

sketch\Timers.cpp:30:124: warning: default argument given for parameter 2 of 'ArduinoJson::JsonObject& getTimerSessionData(ArduinoJson::JsonBuffer&, int, int)' [-fpermissive]

JsonObject& getTimerSessionData(JsonBuffer& b, int timerIndex = currentTimerIndex, int weekIndex = currentTimerSessionIndex){

                                                                                                                        ^

In file included from sketch\Timers.cpp:8:0:

sketch\Timers.h:18:20: note: previous specification in 'ArduinoJson::JsonObject& getTimerSessionData(ArduinoJson::JsonBuffer&, int, int)' here

extern JsonObject& getTimerSessionData(JsonBuffer& b, int timerIndex = currentTimerIndex, int weekIndex = currentTimerSessionIndex);

                ^

sketch\Timers.cpp:30:124: warning: default argument given for parameter 3 of 'ArduinoJson::JsonObject& getTimerSessionData(ArduinoJson::JsonBuffer&, int, int)' [-fpermissive]

JsonObject& getTimerSessionData(JsonBuffer& b, int timerIndex = currentTimerIndex, int weekIndex = currentTimerSessionIndex){

                                                                                                                        ^

In file included from sketch\Timers.cpp:8:0:

sketch\Timers.h:18:20: note: previous specification in 'ArduinoJson::JsonObject& getTimerSessionData(ArduinoJson::JsonBuffer&, int, int)' here

extern JsonObject& getTimerSessionData(JsonBuffer& b, int timerIndex = currentTimerIndex, int weekIndex = currentTimerSessionIndex);

                ^

sketch\Timers.cpp: In function 'void setTimerSessionData(ArduinoJson::JsonObject&, int, int)':

sketch\Timers.cpp:36:117: warning: default argument given for parameter 2 of 'void setTimerSessionData(ArduinoJson::JsonObject&, int, int)' [-fpermissive]

void setTimerSessionData(JsonObject& d, int timerIndex = currentTimerIndex, int weekIndex = currentTimerSessionIndex){

                                                                                                                 ^

In file included from sketch\Timers.cpp:8:0:

sketch\Timers.h:19:13: note: previous specification in 'void setTimerSessionData(ArduinoJson::JsonObject&, int, int)' here

extern void setTimerSessionData(JsonObject& d, int timerIndex = currentTimerIndex, int weekIndex = currentTimerSessionIndex);

         ^

sketch\Timers.cpp:36:117: warning: default argument given for parameter 3 of 'void setTimerSessionData(ArduinoJson::JsonObject&, int, int)' [-fpermissive]

void setTimerSessionData(JsonObject& d, int timerIndex = currentTimerIndex, int weekIndex = currentTimerSessionIndex){

                                                                                                                 ^

In file included from sketch\Timers.cpp:8:0:

sketch\Timers.h:19:13: note: previous specification in 'void setTimerSessionData(ArduinoJson::JsonObject&, int, int)' here

extern void setTimerSessionData(JsonObject& d, int timerIndex = currentTimerIndex, int weekIndex = currentTimerSessionIndex);

         ^

C:\Users\nilus\Documents\Arduino\skectes\master2\master2.ino:815:42: warning: character constant too long for its type

 setPHWaterProbeCalibration(112, 4.0, 'low'); //ph probe 1

                                      ^

C:\Users\nilus\Documents\Arduino\skectes\master2\master2.ino:816:42: warning: character constant too long for its type

 setPHWaterProbeCalibration(114, 4.0, 'low'); //ph probe 2

                                      ^

C:\Users\nilus\Documents\Arduino\skectes\master2\master2.ino:827:42: warning: character constant too long for its type

 setPHWaterProbeCalibration(112, 7.0, 'mid'); //ph probe 1

                                      ^

C:\Users\nilus\Documents\Arduino\skectes\master2\master2.ino:828:42: warning: character constant too long for its type

 setPHWaterProbeCalibration(114, 7.0, 'mid'); //ph probe 2

                                      ^

C:\Users\nilus\Documents\Arduino\skectes\master2\master2.ino:839:43: warning: character constant too long for its type

 setPHWaterProbeCalibration(112, 10.0, 'high'); //ph probe 1

                                       ^

C:\Users\nilus\Documents\Arduino\skectes\master2\master2.ino:840:43: warning: character constant too long for its type

 setPHWaterProbeCalibration(114, 10.0, 'high'); //ph probe 2

                                       ^

C:\Users\nilus\Documents\Arduino\skectes\master2\master2.ino:857:54: warning: character constant too long for its type

 setECWaterProbeCalibration(111, tmpIntsToInt(5), 'dry'); //ec probe 1

                                                  ^

C:\Users\nilus\Documents\Arduino\skectes\master2\master2.ino:858:54: warning: character constant too long for its type

 setECWaterProbeCalibration(113, tmpIntsToInt(5), 'dry'); //ec probe 2

                                                  ^

C:\Users\nilus\Documents\Arduino\skectes\master2\master2.ino:868:54: warning: character constant too long for its type

 setECWaterProbeCalibration(111, tmpIntsToInt(5), 'low'); //ec probe 1

                                                  ^

C:\Users\nilus\Documents\Arduino\skectes\master2\master2.ino:869:54: warning: character constant too long for its type

 setECWaterProbeCalibration(113, tmpIntsToInt(5), 'low'); //ec probe 2

                                                  ^

C:\Users\nilus\Documents\Arduino\skectes\master2\master2.ino:881:54: warning: character constant too long for its type

 setECWaterProbeCalibration(111, tmpIntsToInt(5), 'high'); //ec probe 1

                                                  ^

C:\Users\nilus\Documents\Arduino\skectes\master2\master2.ino:882:54: warning: character constant too long for its type

 setECWaterProbeCalibration(113, tmpIntsToInt(5), 'high'); //ec probe 2

                                                  ^

C:\Users\nilus\Documents\Arduino\skectes\master2\master2.ino: In function 'void loop()':

C:\Users\nilus\Documents\Arduino\skectes\master2\master2.ino:166:20: warning: passing NULL to non-pointer argument 1 of 'void cropRename(int)' [-Wconversion-null]

 cropRename(NULL);

                ^

C:\Users\nilus\Documents\Arduino\skectes\master2\master2.ino:815:47: warning: overflow in implicit constant conversion [-Woverflow]

 setPHWaterProbeCalibration(112, 4.0, 'low'); //ph probe 1

                                           ^

C:\Users\nilus\Documents\Arduino\skectes\master2\master2.ino:816:47: warning: overflow in implicit constant conversion [-Woverflow]

 setPHWaterProbeCalibration(114, 4.0, 'low'); //ph probe 2

                                           ^

C:\Users\nilus\Documents\Arduino\skectes\master2\master2.ino:827:47: warning: overflow in implicit constant conversion [-Woverflow]

 setPHWaterProbeCalibration(112, 7.0, 'mid'); //ph probe 1

                                           ^

C:\Users\nilus\Documents\Arduino\skectes\master2\master2.ino:828:47: warning: overflow in implicit constant conversion [-Woverflow]

 setPHWaterProbeCalibration(114, 7.0, 'mid'); //ph probe 2

                                           ^

C:\Users\nilus\Documents\Arduino\skectes\master2\master2.ino:839:49: warning: overflow in implicit constant conversion [-Woverflow]

 setPHWaterProbeCalibration(112, 10.0, 'high'); //ph probe 1

                                             ^

C:\Users\nilus\Documents\Arduino\skectes\master2\master2.ino:840:49: warning: overflow in implicit constant conversion [-Woverflow]

 setPHWaterProbeCalibration(114, 10.0, 'high'); //ph probe 2

                                             ^

C:\Users\nilus\Documents\Arduino\skectes\master2\master2.ino:857:59: warning: overflow in implicit constant conversion [-Woverflow]

 setECWaterProbeCalibration(111, tmpIntsToInt(5), 'dry'); //ec probe 1

                                                       ^

C:\Users\nilus\Documents\Arduino\skectes\master2\master2.ino:858:59: warning: overflow in implicit constant conversion [-Woverflow]

 setECWaterProbeCalibration(113, tmpIntsToInt(5), 'dry'); //ec probe 2

                                                       ^

C:\Users\nilus\Documents\Arduino\skectes\master2\master2.ino:868:59: warning: overflow in implicit constant conversion [-Woverflow]

 setECWaterProbeCalibration(111, tmpIntsToInt(5), 'low'); //ec probe 1

                                                       ^

C:\Users\nilus\Documents\Arduino\skectes\master2\master2.ino:869:59: warning: overflow in implicit constant conversion [-Woverflow]

 setECWaterProbeCalibration(113, tmpIntsToInt(5), 'low'); //ec probe 2

                                                       ^

C:\Users\nilus\Documents\Arduino\skectes\master2\master2.ino:881:60: warning: overflow in implicit constant conversion [-Woverflow]

 setECWaterProbeCalibration(111, tmpIntsToInt(5), 'high'); //ec probe 1

                                                        ^

C:\Users\nilus\Documents\Arduino\skectes\master2\master2.ino:882:60: warning: overflow in implicit constant conversion [-Woverflow]

 setECWaterProbeCalibration(113, tmpIntsToInt(5), 'high'); //ec probe 2

                                                        ^

C:\Users\nilus\Documents\Arduino\libraries\DS3231\DS3231.cpp: In member function 'char* DS3231::getDOWStr(uint8_t)':

C:\Users\nilus\Documents\Arduino\libraries\DS3231\DS3231.cpp:275:17: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

char *output = "xxxxxxxxxx";

             ^

C:\Users\nilus\Documents\Arduino\libraries\DS3231\DS3231.cpp:276:99: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

char *daysLong[] = {"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"};

                                                                                               ^

C:\Users\nilus\Documents\Arduino\libraries\DS3231\DS3231.cpp:276:99: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

C:\Users\nilus\Documents\Arduino\libraries\DS3231\DS3231.cpp:276:99: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

C:\Users\nilus\Documents\Arduino\libraries\DS3231\DS3231.cpp:276:99: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

C:\Users\nilus\Documents\Arduino\libraries\DS3231\DS3231.cpp:276:99: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

C:\Users\nilus\Documents\Arduino\libraries\DS3231\DS3231.cpp:276:99: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

C:\Users\nilus\Documents\Arduino\libraries\DS3231\DS3231.cpp:276:99: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

C:\Users\nilus\Documents\Arduino\libraries\DS3231\DS3231.cpp:277:70: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

char *daysShort[] = {"Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"};

                                                                  ^

C:\Users\nilus\Documents\Arduino\libraries\DS3231\DS3231.cpp:277:70: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

C:\Users\nilus\Documents\Arduino\libraries\DS3231\DS3231.cpp:277:70: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

C:\Users\nilus\Documents\Arduino\libraries\DS3231\DS3231.cpp:277:70: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

C:\Users\nilus\Documents\Arduino\libraries\DS3231\DS3231.cpp:277:70: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

C:\Users\nilus\Documents\Arduino\libraries\DS3231\DS3231.cpp:277:70: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

C:\Users\nilus\Documents\Arduino\libraries\DS3231\DS3231.cpp:277:70: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

C:\Users\nilus\Documents\Arduino\libraries\DS3231\DS3231.cpp: In member function 'char* DS3231::getMonthStr(uint8_t)':

C:\Users\nilus\Documents\Arduino\libraries\DS3231\DS3231.cpp:289:16: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

char *output= "xxxxxxxxx";

            ^

C:\Users\nilus\Documents\Arduino\libraries\DS3231\DS3231.cpp:290:144: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

char *monthLong[] = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"};

                                                                                                                                            ^

C:\Users\nilus\Documents\Arduino\libraries\DS3231\DS3231.cpp:290:144: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

C:\Users\nilus\Documents\Arduino\libraries\DS3231\DS3231.cpp:290:144: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

C:\Users\nilus\Documents\Arduino\libraries\DS3231\DS3231.cpp:290:144: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

C:\Users\nilus\Documents\Arduino\libraries\DS3231\DS3231.cpp:290:144: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

C:\Users\nilus\Documents\Arduino\libraries\DS3231\DS3231.cpp:290:144: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

C:\Users\nilus\Documents\Arduino\libraries\DS3231\DS3231.cpp:290:144: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

C:\Users\nilus\Documents\Arduino\libraries\DS3231\DS3231.cpp:290:144: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

C:\Users\nilus\Documents\Arduino\libraries\DS3231\DS3231.cpp:290:144: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

C:\Users\nilus\Documents\Arduino\libraries\DS3231\DS3231.cpp:290:144: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

C:\Users\nilus\Documents\Arduino\libraries\DS3231\DS3231.cpp:290:144: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

C:\Users\nilus\Documents\Arduino\libraries\DS3231\DS3231.cpp:290:144: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

C:\Users\nilus\Documents\Arduino\libraries\DS3231\DS3231.cpp:291:106: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

char *monthShort[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};

                                                                                                      ^

C:\Users\nilus\Documents\Arduino\libraries\DS3231\DS3231.cpp:291:106: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

C:\Users\nilus\Documents\Arduino\libraries\DS3231\DS3231.cpp:291:106: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

C:\Users\nilus\Documents\Arduino\libraries\DS3231\DS3231.cpp:291:106: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

C:\Users\nilus\Documents\Arduino\libraries\DS3231\DS3231.cpp:291:106: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

C:\Users\nilus\Documents\Arduino\libraries\DS3231\DS3231.cpp:291:106: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

C:\Users\nilus\Documents\Arduino\libraries\DS3231\DS3231.cpp:291:106: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

C:\Users\nilus\Documents\Arduino\libraries\DS3231\DS3231.cpp:291:106: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

C:\Users\nilus\Documents\Arduino\libraries\DS3231\DS3231.cpp:291:106: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

C:\Users\nilus\Documents\Arduino\libraries\DS3231\DS3231.cpp:291:106: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

C:\Users\nilus\Documents\Arduino\libraries\DS3231\DS3231.cpp:291:106: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

C:\Users\nilus\Documents\Arduino\libraries\DS3231\DS3231.cpp:291:106: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

Sketch uses 85206 bytes (33%) of program storage space. Maximum is 253952 bytes.
Global variables use 2917 bytes (35%) of dynamic memory, leaving 5275 bytes for local variables. Maximum is 8192 bytes.

Failing on Build

I have VMMicro for VS and the build is failing time.h file is missing (not sure if the name should be timers.h. I downloaded the current master branch. Can you please help identify what I am doing wrong.

Compiling debug version of 'DROMatic' for 'Arduino Nano w/ ATmega328'

DROMatic.ino:8: In file included from

ctime:51: fatal error time.h No such file or directory
#include <time.h>
compilation terminated

Crops.cpp:14: In file included from

Screens.h: 14:33: error: '>>' should be '> >' within a nested template argument list
extern vector<vector<vector>> matrix

Crops.cpp: In function void setCropData(ArduinoJson::JsonObject&, bool)

Crops.cpp: 27:55: error: default argument given for parameter 2 of 'void setCropData(ArduinoJson::JsonObject&, bool)' [-fpermissive]
void setCropData(JsonObject& d, bool returnHome = true){

Crops.cpp:8: In file included from

Crops.h: 17:13: error: after previous specification in 'void setCropData(ArduinoJson::JsonObject&, bool)' [-fpermissive]
extern void setCropData(JsonObject& d, bool returnHome = true)

Crops.cpp: In function void printStatus(int)

Crops.cpp: 481:29: error: default argument given for parameter 1 of 'void printStatus(int)' [-fpermissive]
void printStatus(int dir = 0){

Crops.cpp:8: In file included from

Crops.h: 45:13: error: after previous specification in 'void printStatus(int)' [-fpermissive]
extern void printStatus(int dir = 0)

Crops.cpp: In function void printPHAmount(int)

Crops.cpp: 493:31: error: default argument given for parameter 1 of 'void printPHAmount(int)' [-fpermissive]
void printPHAmount(int dir = 0){

Crops.cpp:8: In file included from

Crops.h: 46:13: error: after previous specification in 'void printPHAmount(int)' [-fpermissive]
extern void printPHAmount(int dir = 0)

Crops.cpp: In function void printPHDelay(int)

Crops.cpp: 522:30: error: default argument given for parameter 1 of 'void printPHDelay(int)' [-fpermissive]
void printPHDelay(int dir = 0){

Crops.cpp:8: In file included from

Crops.h: 47:13: error: after previous specification in 'void printPHDelay(int)' [-fpermissive]
extern void printPHDelay(int dir = 0)

Crops.cpp: In function void printOpen(int)

Crops.cpp: 660:27: error: default argument given for parameter 1 of 'void printOpen(int)' [-fpermissive]
void printOpen(int dir = 0){

Error compiling project sources
Crops.cpp:8: In file included from

Crops.h: 52:13: error: after previous specification in 'void printOpen(int)' [-fpermissive]
extern void printOpen(int dir = 0)
Debug build failed for project 'DROMatic'

Crops.cpp: 683:50: error: default argument given for parameter 2 of 'void printECCalibrations(String, int)' [-fpermissive]
void printECCalibrations(String type, int dir = 0){

Crops.cpp:8: In file included from

Crops.h: 50:13: error: after previous specification in 'void printECCalibrations(String, int)' [-fpermissive]
extern void printECCalibrations(String type, int dir = 0)

Building error

hello friends

After a long research, I decided to use this project, because it contains all I need, the only problem is the number of nutrient but it is ok .

Anyway, I've tried to build and upload, but unfortunately I get error
I use VS 2015 see the output error I got
VS2015-output-error.txt

and her the error list from VS2015
VS2015-errorlist.txt

I try with Arduino IDE I've got this error

ArduinoIDE-18.5.txt

I search for solutions, and tried all the solutions I found, But get the same error

also I try with VS2013 same

Any suggestion please

Listen for pin usage

Consider listening for pin usage when navigating through screens to determine if user should see option or not for say drainage or second set of pH/EC sensors for run off testing.

Test crop reset screen

Confirm that all non-destructive properties of crop are correctly being reset from new crop reset screen.

Seperate openHome() from turing()

Currently the home screen's data (Time, PPM, pH) are updated ever 30 seconds because it is tied into the turing() non-breaking wait. However for physical calibration of PPM and pH sensors reasons, it would be better to move this out to the main loop with screen condition still so it updates home display data much quicker.

class DS3231' has no member named 'getTime'

Dear sir,

I am trying to compile in Arduion IDE 1.8.4 , getting error " class DS3231' has no member named 'getTime' ". Please specify which library to be used for DS3231.

Thank u

pH correction screen update

While performing either reservoir or plant water pH correction screen should read:

PH DRIFT FIXING
RSVR PH: X.XX

or

PH DRIFT FIXING
PLANT PH: X.XX

This will tell the end user both what water source is being corrected and what the current pH value is of said water source at the time of starting to fix pH drift.

pH autonomous or scheduled

Add new screen to System Settings -> pH Configuration that allows user to set if pH should be scheduled or automatic. Default will be scheduled meaning both pH up and down solutions will be 100% configured by user and no real-time reading / dosing of pH will take place. Auto will make system to continuously monitor pH levels and perform dosing of pre-configured up/down channels until dosed water reached a configured pH range.

  • If set to be scheduled, both pH range and pH channels / configuration can be ignored in turning function.
  • If set to be auto, proceed to pH range screen and finally pH channels screen.

pH adjustment delay and amount screens

After much deliberation and diagnostic testing, it's found to be in the user's best interest and over all scalability of OS to include both a pH adjustment delay amount screen, and a pH adjustment delay amount screen.

We need to add these screens and test to confirm they are working as intended. This should not be difficult as the amounts are already defined in globals.h and just needs to be moved to file system.

EC/PPM responsive or fixed

Add new screen to System Settings -> EC/PPM Configuration that allows user to set if EC/PPM should be responsive or fixed. Default will be fixed meaning EC/PPM will be 100% configured by user and no real-time reading / responsive adjustments of dosing amounts will take place. Respond allows system to record EC/PPM levels for both dosed water and run-off water and adjusted dosing amounts automatically for you.

  • If set to be fixed, EC/PPM range screen can be ignored.
  • If set to be respond, proceed to EC/PPM range screen.

Also this configure process should ask the user for desired solution hundredths (500 or 700) so users can adjust physical calibration and ultimately EC ranges to recommend formulas for solutions.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    πŸ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. πŸ“ŠπŸ“ˆπŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❀️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.