drolsen / dro-matic Goto Github PK
View Code? Open in Web Editor NEWFully Automated Hydroponic OS for DIY DRO-Matic cabinets - Nutrient dosing, irrigation, topoffs, timers, EC & pH drift fixing.
Fully Automated Hydroponic OS for DIY DRO-Matic cabinets - Nutrient dosing, irrigation, topoffs, timers, EC & pH drift fixing.
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:
I'll send you a picture of the monsters I grow if you can add this functionality.
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]
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.
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.
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.
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.
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
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.
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
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:
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
Determine what is micro stalling reservoir volume configure screen (seems to be off by around 1 gallon when done).
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.
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:
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.
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.
This requires a new property in the crop's setting for pHstatus and to flag for it within the .ino.
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.
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.
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.
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
There is no need for this feature as you can do it in the session date/time configure if you need it.
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.
Right now, EC correction does two steps:
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.
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.
Confirm that all non-destructive properties of crop are correctly being reset from new crop reset screen.
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.
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
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
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.
Finish building & testing out the screens for:
Mr. Olsen this project is fantastic and want to look at building this for my Hydroponics garden outside, but the Atlas probes and boards are pretty expensive. What would it take to have the OS compatible with other EC/PH probes (couple examples below)? Do you have an active forum for this project?
PH Probe:
[EC Probe:] (https://www.dfrobot.com/product-1123.html?gclid=Cj0KCQiA-qDTBRD-ARIsAJ_10yKWDGon203htZ6dMRXqX6cp960XcQ1lZjxinw7uSXDezrHRrVK_bPEaApgbEALw_wcB)
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.
I've been digging into this project big time lately as I look to automate my setup. I have some items...
Thanks again for everything you've done and I look forward to the responses.
boasist
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.
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.
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.
Do not forget to include the resetting of these repeating regimen numbers when user uses "Crop Reset" feature of OS.
Review all json files and remove any un-needed properties.
Confirm that the new pump delay screen is working correctly.
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.
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)
Great work on this! Have you integrated a Temperature Sensor for the pH and EC readings?
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.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.