init
This commit is contained in:
commit
080a0f2718
|
@ -0,0 +1,27 @@
|
||||||
|
This source code is released under the DWTW license.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify it under the terms of the Do What Thou Wilt License.
|
||||||
|
|
||||||
|
Boundless Public License
|
||||||
|
DO WHAT THOU WILT
|
||||||
|
TO PUBLIC LICENSE
|
||||||
|
|
||||||
|
Version 2.55
|
||||||
|
|
||||||
|
Everyone is permitted to copy and distribute verbatim or modified copies of this license document, and changing it in full or in part is allowed without any restrictions.
|
||||||
|
|
||||||
|
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||||
|
|
||||||
|
0. Do what thou wilt shall be the whole of the Law.
|
||||||
|
|
||||||
|
DWTWL – a license with a single requirement: DO WHAT THOU WILT
|
||||||
|
|
||||||
|
The license provides more freedom than any other one (such as GPL or BSD) and does not require saving the license text on copying.
|
||||||
|
|
||||||
|
DWTWL – an accomplished and eligible license for free text, code and any other symbols (including the software, documentation and artwork).
|
||||||
|
|
||||||
|
The license does not contain a "no warranty" clause. DWTWL can be used in countries that do not legally acknowledge the transition to public domain.
|
||||||
|
|
||||||
|
Summary:
|
||||||
|
|
||||||
|
An author-creator gives their source code to the world for free, without becoming distracted by worldly thinking regarding how and why the others will use it.
|
|
@ -0,0 +1,5 @@
|
||||||
|
# Simple melioration system with 5 water channels (4 automatic and 1 manual)
|
||||||
|
|
||||||
|
![melioration](https://gitlab.com/simplemicrocontrollers/melioration/raw/master/melioration.jpg)
|
||||||
|
|
||||||
|
![melioration-scheme](https://gitlab.com/simplemicrocontrollers/melioration/raw/master/melioration_bb.png)
|
Binary file not shown.
|
@ -0,0 +1,246 @@
|
||||||
|
// melioration 0.1
|
||||||
|
#include <Arduino.h>
|
||||||
|
#include <Thread.h>
|
||||||
|
#include <DS1307RTC.h>
|
||||||
|
const byte channel1 = 2;
|
||||||
|
const byte channel2 = 3;
|
||||||
|
const byte channel3 = 4;
|
||||||
|
const byte channel4 = 5;
|
||||||
|
const byte channel5 = 6;
|
||||||
|
const byte led = 13;
|
||||||
|
const byte button = 14; // A0
|
||||||
|
|
||||||
|
long previousButtonMillis = 0;
|
||||||
|
int buttonState = 0;
|
||||||
|
long buttonPressed = 0;
|
||||||
|
byte ledState = 0;
|
||||||
|
byte activeChannel = 0;
|
||||||
|
long channel5workingtime = 0;
|
||||||
|
Thread pressButtonThread = Thread();
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
Serial.begin(9600);
|
||||||
|
while (!Serial);
|
||||||
|
setSyncProvider(RTC.get);
|
||||||
|
if(timeStatus()!= timeSet)
|
||||||
|
Serial.println("tt");
|
||||||
|
pinMode(channel1, OUTPUT);
|
||||||
|
digitalWrite(channel1, HIGH);
|
||||||
|
pinMode(channel2, OUTPUT);
|
||||||
|
digitalWrite(channel2, HIGH);
|
||||||
|
pinMode(channel3, OUTPUT);
|
||||||
|
digitalWrite(channel3, HIGH);
|
||||||
|
pinMode(channel4, OUTPUT);
|
||||||
|
digitalWrite(channel4, HIGH);
|
||||||
|
pinMode(channel5, OUTPUT);
|
||||||
|
digitalWrite(channel5, HIGH);
|
||||||
|
pinMode(button, INPUT);
|
||||||
|
pinMode(led, OUTPUT);
|
||||||
|
pressButtonThread.onRun(pressButton);
|
||||||
|
pressButtonThread.setInterval(200); // Interval for checking button pressing - 200ms
|
||||||
|
digitalWrite(led, HIGH);
|
||||||
|
signalblinking();
|
||||||
|
serStr("strt");
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
// Thread init:
|
||||||
|
if (pressButtonThread.shouldRun())
|
||||||
|
pressButtonThread.run();
|
||||||
|
// Check RTC.
|
||||||
|
if (timeStatus() == timeSet) {
|
||||||
|
checkTime();
|
||||||
|
} else {
|
||||||
|
serStr("settime");
|
||||||
|
delay (10000);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check button pressing thread
|
||||||
|
void pressButton() {
|
||||||
|
unsigned long currentMillis = millis();
|
||||||
|
if (channel5workingtime > 0) {
|
||||||
|
if ((currentMillis - channel5workingtime) > 900000) { // 15 min channel5
|
||||||
|
channelOff();
|
||||||
|
delay(5000);
|
||||||
|
channel5workingtime = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Button on/off channel 5
|
||||||
|
if (digitalRead(button) == LOW) buttonState = 1;
|
||||||
|
else buttonState = 0;
|
||||||
|
if (buttonState == 1) {
|
||||||
|
buttonPressed=buttonPressed+200;
|
||||||
|
if (buttonPressed > 5678) {
|
||||||
|
serStr("long press");
|
||||||
|
// nothing
|
||||||
|
buttonPressed = 0;
|
||||||
|
}
|
||||||
|
previousButtonMillis = currentMillis;
|
||||||
|
if (activeChannel == 5) {
|
||||||
|
channelOff();
|
||||||
|
channel5workingtime = 0;
|
||||||
|
} else {
|
||||||
|
channel5on();
|
||||||
|
channel5workingtime = currentMillis;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Led indication
|
||||||
|
ledState = ledState + 1;
|
||||||
|
if (ledState < 6) {
|
||||||
|
digitalWrite(led, LOW);
|
||||||
|
} else if (ledState > 5) {
|
||||||
|
digitalWrite(led, HIGH);
|
||||||
|
}
|
||||||
|
if (ledState > 9) ledState = 0;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Send string to serial monitor with millis() counter and date/time
|
||||||
|
void serStr(String serString) {
|
||||||
|
long millisTime = millis();
|
||||||
|
String delimiter = "|";
|
||||||
|
String currentTime = "";
|
||||||
|
currentTime = currentTime + year() + "-" + month() + "-" + day() + "-" + hour() + "-" + minute() + "-" + second();
|
||||||
|
String stringToPrint = millisTime + delimiter + currentTime + delimiter + serString;
|
||||||
|
Serial.println(stringToPrint);
|
||||||
|
}
|
||||||
|
|
||||||
|
void signalblinking() {
|
||||||
|
int signalblink;
|
||||||
|
for (signalblink = 1; signalblink <= 5; signalblink++) {
|
||||||
|
digitalWrite(led, HIGH);
|
||||||
|
delay(50);
|
||||||
|
digitalWrite(led, LOW);
|
||||||
|
delay(50);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void channel1on() {
|
||||||
|
if (activeChannel != 1) {
|
||||||
|
signalblinking();
|
||||||
|
digitalWrite(channel1, LOW);
|
||||||
|
delay(1000);
|
||||||
|
digitalWrite(channel2, HIGH);
|
||||||
|
digitalWrite(channel3, HIGH);
|
||||||
|
digitalWrite(channel4, HIGH);
|
||||||
|
digitalWrite(channel5, HIGH);
|
||||||
|
activeChannel = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void channel2on() {
|
||||||
|
if (activeChannel != 2) {
|
||||||
|
signalblinking();
|
||||||
|
digitalWrite(channel2, LOW);
|
||||||
|
delay(1000);
|
||||||
|
digitalWrite(channel1, HIGH);
|
||||||
|
digitalWrite(channel3, HIGH);
|
||||||
|
digitalWrite(channel4, HIGH);
|
||||||
|
digitalWrite(channel5, HIGH);
|
||||||
|
activeChannel = 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void channel3on() {
|
||||||
|
if (activeChannel != 3) {
|
||||||
|
signalblinking();
|
||||||
|
digitalWrite(channel3, LOW);
|
||||||
|
delay(1000);
|
||||||
|
digitalWrite(channel1, HIGH);
|
||||||
|
digitalWrite(channel2, HIGH);
|
||||||
|
digitalWrite(channel4, HIGH);
|
||||||
|
digitalWrite(channel5, HIGH);
|
||||||
|
activeChannel = 3;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void channel4on() {
|
||||||
|
if (activeChannel != 4) {
|
||||||
|
signalblinking();
|
||||||
|
digitalWrite(channel4, LOW);
|
||||||
|
delay(1000);
|
||||||
|
digitalWrite(channel1, HIGH);
|
||||||
|
digitalWrite(channel2, HIGH);
|
||||||
|
digitalWrite(channel3, HIGH);
|
||||||
|
digitalWrite(channel5, HIGH);
|
||||||
|
activeChannel = 4;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void channel5on() {
|
||||||
|
if (activeChannel != 5) {
|
||||||
|
unsigned long currentMillis = millis();
|
||||||
|
if (channel5workingtime > 0) {
|
||||||
|
if ((currentMillis - channel5workingtime) > 900000) { // 15 min channel5
|
||||||
|
channelOff();
|
||||||
|
delay(5000);
|
||||||
|
channel5workingtime = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
signalblinking();
|
||||||
|
digitalWrite(channel5, LOW);
|
||||||
|
delay(1000);
|
||||||
|
digitalWrite(channel1, HIGH);
|
||||||
|
digitalWrite(channel2, HIGH);
|
||||||
|
digitalWrite(channel3, HIGH);
|
||||||
|
digitalWrite(channel4, HIGH);
|
||||||
|
channel5workingtime = currentMillis;
|
||||||
|
activeChannel = 5;
|
||||||
|
}
|
||||||
|
digitalWrite(led, HIGH);
|
||||||
|
}
|
||||||
|
|
||||||
|
void channelOff() {
|
||||||
|
if (activeChannel != 0) {
|
||||||
|
signalblinking();
|
||||||
|
digitalWrite(channel1, HIGH);
|
||||||
|
digitalWrite(channel2, HIGH);
|
||||||
|
digitalWrite(channel3, HIGH);
|
||||||
|
digitalWrite(channel4, HIGH);
|
||||||
|
digitalWrite(channel5, HIGH);
|
||||||
|
activeChannel = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Main Timer:
|
||||||
|
void checkTime() {
|
||||||
|
if (channel5workingtime == 0) {
|
||||||
|
// 8-10 melioration
|
||||||
|
if (hour() == 8 && minute() < 15) channel1on();
|
||||||
|
if (hour() == 8 && minute() > 14 && minute() < 30) channel2on();
|
||||||
|
if (hour() == 8 && minute() > 29 && minute() < 45) channel3on();
|
||||||
|
if (hour() == 8 && minute() == 45) channelOff();
|
||||||
|
if (hour() == 9 && minute() < 15) channel1on();
|
||||||
|
if (hour() == 9 && minute() > 14 && minute() < 30) channel2on();
|
||||||
|
if (hour() == 9 && minute() > 29 && minute() < 45) channel3on();
|
||||||
|
if (hour() == 9 && minute() == 45) channelOff();
|
||||||
|
// 13-15 melioration
|
||||||
|
if (hour() == 13 && minute() < 15) channel1on();
|
||||||
|
if (hour() == 13 && minute() > 14 && minute() < 30) channel2on();
|
||||||
|
if (hour() == 13 && minute() > 29 && minute() < 45) channel3on();
|
||||||
|
if (hour() == 13 && minute() == 45) channelOff();
|
||||||
|
if (hour() == 14 && minute() < 15) channel1on();
|
||||||
|
if (hour() == 14 && minute() > 14 && minute() < 30) channel2on();
|
||||||
|
if (hour() == 14 && minute() > 29 && minute() < 45) channel3on();
|
||||||
|
if (hour() == 14 && minute() == 45) channelOff();
|
||||||
|
// 18-20 melioration
|
||||||
|
if (hour() == 18 && minute() < 15) channel1on();
|
||||||
|
if (hour() == 18 && minute() > 14 && minute() < 30) channel2on();
|
||||||
|
if (hour() == 18 && minute() > 29 && minute() < 45) channel3on();
|
||||||
|
if (hour() == 18 && minute() == 45) channelOff();
|
||||||
|
if (hour() == 19 && minute() < 15) channel1on();
|
||||||
|
if (hour() == 19 && minute() > 14 && minute() < 30) channel2on();
|
||||||
|
if (hour() == 19 && minute() > 29 && minute() < 45) channel3on();
|
||||||
|
if (hour() == 19 && minute() == 45) channelOff();
|
||||||
|
if ((day() % 2) == 0) {
|
||||||
|
// 1 hour per 2 days greenhouse melioration
|
||||||
|
if (hour() == 8 && minute() > 45) channel4on();
|
||||||
|
if (hour() == 9 && minute() > 45) channel4on();
|
||||||
|
if (hour() == 10 && minute() == 2) channelOff();
|
||||||
|
if (hour() == 18 && minute() > 45) channel4on();
|
||||||
|
if (hour() == 19 && minute() > 45) channel4on();
|
||||||
|
if (hour() == 20 && minute() == 2) channelOff();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Binary file not shown.
After Width: | Height: | Size: 113 KiB |
Binary file not shown.
After Width: | Height: | Size: 202 KiB |
Loading…
Reference in New Issue