redesign, add digit display
This commit is contained in:
parent
c2d4d99d28
commit
e5e0352111
Binary file not shown.
|
@ -1,149 +1,137 @@
|
||||||
// 2 relay-buttons on timer
|
// 2 relay-buttons on timer with 4-digit display
|
||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include <Wire.h>
|
#include <Wire.h>
|
||||||
#include <TimeLib.h>
|
#include <TimeLib.h>
|
||||||
#include <Thread.h>
|
#include <Thread.h>
|
||||||
#include <DS1307RTC.h> // A basic DS1307 library that returns time as a time_t
|
#include <DS1307RTC.h> // A basic DS1307 library that returns time as a time_t
|
||||||
|
#include <SevenSegmentExtended.h> // Extended TM1637 library https://github.com/bremme/arduino-tm1637
|
||||||
|
|
||||||
int stopButton = 8;
|
const byte PIN_CLK = 2; // Define CLK pin (for 4-Digit Display)
|
||||||
int startButton = 9;
|
const byte PIN_DIO = 3; // Define DIO pin (for 4-Digit Display)
|
||||||
int led = 13;
|
const byte redButton = 4; // RedButton: light on, open door
|
||||||
int indicator = 0;
|
const byte blackButton = 5; // BlackButton: light off, close door
|
||||||
|
const byte stopButtonRelay = 6;
|
||||||
|
const byte startButtonRelay = 7;
|
||||||
|
// const byte led = 13;
|
||||||
|
const int msStart = 639; // Interval for pressing start button, ms
|
||||||
|
const int msStop = 637; // Interval for pressing stop button, ms
|
||||||
|
const int updateTime = 1000; // Interval for digit display update
|
||||||
|
const int buttonCheck = 200; // Interval for checking button state
|
||||||
|
const long manualButtonTime = 3600000; // 60 min - actual state of manual pressed button
|
||||||
|
long buttonMillis = 0; // Previous button press counter
|
||||||
|
byte indicator = 0; // Indicator of working states: 0 - scheduled off; 1 - scheduled on;
|
||||||
|
// 2 - manual off, 3 - manual on
|
||||||
|
|
||||||
int msStart = 639; // Interval for pressing start button, ms
|
SevenSegmentExtended display(PIN_CLK, PIN_DIO);
|
||||||
int msStop = 637; // Interval for pressing stop button, ms
|
|
||||||
long ledPulseNormal = 500; // Interval for normal LED blinking pulse
|
|
||||||
|
|
||||||
Thread ledThread = Thread(); // Create thread for LED pulse indication
|
Thread showTimeThread = Thread(); // Create thread for LED pulse indication
|
||||||
|
Thread pressButtonThread = Thread(); // Create thread for button state checking
|
||||||
|
|
||||||
void setup() {
|
void setup() {
|
||||||
Serial.begin(9600); // Initializes the Serial connection @ 9600 baud for debug
|
Serial.begin(9600); // Initializes the Serial connection @ 9600 baud for debug
|
||||||
serStr("starting setup...");
|
serStr("starting setup...");
|
||||||
pinMode(stopButton, OUTPUT);
|
display.begin(); // Initializes the display
|
||||||
pinMode(startButton, OUTPUT);
|
display.setBacklight(100); // Set the brightness to 100 %
|
||||||
pinMode(led, OUTPUT);
|
display.print("INIT"); // Display INIT on the display
|
||||||
while (!Serial); // Wait until Arduino Serial Monitor opens
|
pinMode(redButton, INPUT);
|
||||||
setSyncProvider(RTC.get); // The function to get the time from the RTC
|
pinMode(blackButton, INPUT);
|
||||||
|
pinMode(stopButtonRelay, OUTPUT);
|
||||||
|
pinMode(startButtonRelay, OUTPUT);
|
||||||
|
// pinMode(led, OUTPUT);
|
||||||
|
while (!Serial); // Wait until Arduino Serial Monitor opens
|
||||||
|
setSyncProvider(RTC.get); // The function to get the time from the RTC
|
||||||
if(timeStatus()!= timeSet)
|
if(timeStatus()!= timeSet)
|
||||||
Serial.println("Unable to sync with the RTC");
|
Serial.println("Unable to sync with the RTC");
|
||||||
else
|
else
|
||||||
Serial.println("RTC has set the system time");
|
Serial.println("RTC has set the system time");
|
||||||
// LED blinking thread:
|
// showTime thread:
|
||||||
ledThread.onRun(ledBlink);
|
showTimeThread.onRun(showTime);
|
||||||
ledThread.setInterval(ledPulseNormal); // Interval for LED blinking
|
showTimeThread.setInterval(updateTime); // Interval for update time
|
||||||
|
// pressButtonThread thread:
|
||||||
|
pressButtonThread.onRun(pressButton);
|
||||||
|
pressButtonThread.setInterval(buttonCheck); // Interval for checking button pressing
|
||||||
|
delay(1000);
|
||||||
|
display.off();
|
||||||
|
delay(500);
|
||||||
|
display.on();
|
||||||
serStr("...setup finished");
|
serStr("...setup finished");
|
||||||
}
|
}
|
||||||
|
|
||||||
void loop() {
|
void loop() {
|
||||||
// Threads init:
|
// Threads init:
|
||||||
if (ledThread.shouldRun())
|
if (showTimeThread.shouldRun())
|
||||||
ledThread.run();
|
showTimeThread.run();
|
||||||
|
if (pressButtonThread.shouldRun())
|
||||||
|
pressButtonThread.run();
|
||||||
if (timeStatus() == timeSet) {
|
if (timeStatus() == timeSet) {
|
||||||
checkTime();
|
checkTime();
|
||||||
} else { // Fast blinking after boot indicates that time is not set or DS1307RTC is not plugged
|
} else {
|
||||||
int i;
|
display.on();
|
||||||
for (i = 1; i <= 100; i++) {
|
display.print("SET TIME");
|
||||||
digitalWrite(led, LOW);
|
delay(5000);
|
||||||
delay(50);
|
|
||||||
digitalWrite(led, HIGH);
|
|
||||||
delay(50);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
delay(5000);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// LED pulse blinking thread
|
// showTime thread
|
||||||
void ledBlink() {
|
void showTime() {
|
||||||
static bool ledStatus = false; // LED status bool
|
display.printTime(hour(), minute(), true);
|
||||||
ledStatus = !ledStatus; // Invert LED state
|
static bool showTimeStatus = false; // showTime status bool
|
||||||
if (indicator==1) { // Fast blinking after long light (planned work indicator)
|
showTimeStatus = !showTimeStatus; // Invert showTime state
|
||||||
delay(200);
|
if ((indicator==1)||(indicator==3) && showTimeStatus==true) {
|
||||||
digitalWrite(led, LOW);
|
display.print("BODA");
|
||||||
delay(200);
|
|
||||||
digitalWrite(led, HIGH);
|
|
||||||
delay(100);
|
|
||||||
digitalWrite(led, LOW);
|
|
||||||
delay(100);
|
|
||||||
digitalWrite(led, HIGH);
|
|
||||||
delay(200);
|
|
||||||
digitalWrite(led, LOW);
|
|
||||||
delay(200);
|
|
||||||
digitalWrite(led, HIGH);
|
|
||||||
}
|
|
||||||
digitalWrite(led, ledStatus); // Activate LED state
|
|
||||||
}
|
|
||||||
|
|
||||||
// Winter timing 6:00-7:31, 12:00-13:01, 17:00-18:01
|
|
||||||
void checkTime() {
|
|
||||||
// Winter
|
|
||||||
if (month()==12 || month()==1 || month()==2 ) {
|
|
||||||
// 6:00 - 7:01 - working
|
|
||||||
if ((hour()==6) && (indicator==0)) pressStart();
|
|
||||||
// 7:01 - stop
|
|
||||||
if ((hour()==7) && (minute()==1)) pressStop();
|
|
||||||
// 12:00 - 13:01 - working
|
|
||||||
if ((hour()==12) && (indicator==0)) pressStart();
|
|
||||||
// 13:01 - stop
|
|
||||||
if ((hour()==13) && (minute()==1)) pressStop();
|
|
||||||
// 17:00 - 18:01 - working
|
|
||||||
if ((hour()==17) && (indicator==0)) pressStart();
|
|
||||||
// 18:01 - stop
|
|
||||||
if ((hour()==18) && (minute()==1)) pressStop();
|
|
||||||
}
|
|
||||||
// Spring & Autumn
|
|
||||||
if (month()==3 || month()==4 || month()==5 || month()==9 || month()==10 || month()==11) {
|
|
||||||
// 6:00 - 7:41 - working
|
|
||||||
if ((hour()==6) && (indicator==0)) pressStart();
|
|
||||||
// 7:41 - stop
|
|
||||||
if ((hour()==7) && (minute()==41)) pressStop();
|
|
||||||
// 12:00 - 13:01 - working
|
|
||||||
if ((hour()==12) && (indicator==0)) pressStart();
|
|
||||||
// 13:01 - stop
|
|
||||||
if ((hour()==13) && (minute()==1)) pressStop();
|
|
||||||
// 17:00 - 18:21 - working
|
|
||||||
if ((hour()==17) && (indicator==0)) pressStart();
|
|
||||||
// 18:21 - stop
|
|
||||||
if ((hour()==18) && (minute()==21)) pressStop();
|
|
||||||
}
|
|
||||||
// Summer
|
|
||||||
if (month()==6 || month()==7 || month()==8 ) {
|
|
||||||
// 6:00 - 8:01 - working
|
|
||||||
if ((hour()==6 || hour()==7) && (indicator==0)) pressStart();
|
|
||||||
// 8:01 - stop
|
|
||||||
if ((hour()==8) && (minute()==1)) pressStop();
|
|
||||||
// 12:00 - 14:01 - working
|
|
||||||
if ((hour()==12 || hour()==13) && (indicator==0)) pressStart();
|
|
||||||
// 14:01 - stop
|
|
||||||
if ((hour()==14) && (minute()==1)) pressStop();
|
|
||||||
// 17:00 - 18:25 - working
|
|
||||||
if ((hour()==17) && (indicator==0)) pressStart();
|
|
||||||
// 18:25 - stop
|
|
||||||
if ((hour()==18) && (minute()==25)) pressStop();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void pressStart() {
|
void pressStart() {
|
||||||
serStr("scheduled start button pressed");
|
serStr("scheduled start button pressed");
|
||||||
|
display.print("on__");
|
||||||
delay(5000);
|
delay(5000);
|
||||||
indicator = 1;
|
indicator = 1;
|
||||||
digitalWrite(startButton, HIGH);
|
digitalWrite(startButtonRelay, HIGH);
|
||||||
delay(msStart);
|
delay(msStart);
|
||||||
digitalWrite(startButton, LOW);
|
digitalWrite(startButtonRelay, LOW);
|
||||||
delay(61000); // wait a minute
|
delay(61000); // wait a minute
|
||||||
serStr("scheduled start button delay finished");
|
serStr("scheduled start button delay finished");
|
||||||
}
|
}
|
||||||
|
|
||||||
void pressStop() {
|
void pressStop() {
|
||||||
serStr("scheduled stop button pressed");
|
serStr("scheduled stop button pressed");
|
||||||
|
display.print("off_");
|
||||||
delay(5000);
|
delay(5000);
|
||||||
indicator = 0;
|
indicator = 0;
|
||||||
digitalWrite(stopButton, HIGH);
|
digitalWrite(stopButtonRelay, HIGH);
|
||||||
delay(msStop);
|
delay(msStop);
|
||||||
digitalWrite(stopButton, LOW);
|
digitalWrite(stopButtonRelay, LOW);
|
||||||
delay(61000); // wait a minute
|
delay(61000); // wait a minute
|
||||||
serStr("scheduled stop button delay finished");
|
serStr("scheduled stop button delay finished");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void pressStartManual() {
|
||||||
|
serStr("manual start button pressed");
|
||||||
|
display.print("on__");
|
||||||
|
buttonMillis = millis();
|
||||||
|
delay(500);
|
||||||
|
indicator = 3;
|
||||||
|
digitalWrite(startButtonRelay, HIGH);
|
||||||
|
delay(msStart);
|
||||||
|
digitalWrite(startButtonRelay, LOW);
|
||||||
|
delay(1500);
|
||||||
|
serStr("manual start button delay finished");
|
||||||
|
}
|
||||||
|
|
||||||
|
void pressStopManual() {
|
||||||
|
serStr("manual stop button pressed");
|
||||||
|
display.print("off_");
|
||||||
|
buttonMillis = millis();
|
||||||
|
delay(500);
|
||||||
|
indicator = 2;
|
||||||
|
digitalWrite(stopButtonRelay, HIGH);
|
||||||
|
delay(msStop);
|
||||||
|
digitalWrite(stopButtonRelay, LOW);
|
||||||
|
delay(1500);
|
||||||
|
serStr("manual stop button delay finished");
|
||||||
|
}
|
||||||
|
|
||||||
// Send string to serial monitor with millis() counter and date/time
|
// Send string to serial monitor with millis() counter and date/time
|
||||||
void serStr(const char* serString) {
|
void serStr(const char* serString) {
|
||||||
long currentTime = millis();
|
long currentTime = millis();
|
||||||
|
@ -165,3 +153,101 @@ void serStr(const char* serString) {
|
||||||
Serial.print(year());
|
Serial.print(year());
|
||||||
Serial.println();
|
Serial.println();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check button pressing thread
|
||||||
|
void pressButton() {
|
||||||
|
unsigned long currentMillis = millis();
|
||||||
|
if (buttonMillis>0) {
|
||||||
|
if (indicator==3) {
|
||||||
|
if ((currentMillis-buttonMillis) > manualButtonTime) {
|
||||||
|
serStr("manualButtonTime expired...press stop");
|
||||||
|
buttonMillis = 0;
|
||||||
|
pressStop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (indicator==2) {
|
||||||
|
if ((currentMillis-buttonMillis) > manualButtonTime) {
|
||||||
|
serStr("manualButtonTime expired...indicator state reset");
|
||||||
|
buttonMillis = 0;
|
||||||
|
indicator = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (digitalRead(redButton) == HIGH || digitalRead(blackButton) == HIGH) {
|
||||||
|
if (digitalRead(redButton) == HIGH) {
|
||||||
|
serStr("Manual red button short press");
|
||||||
|
pressStartManual();
|
||||||
|
}
|
||||||
|
if (digitalRead(blackButton) == HIGH) {
|
||||||
|
serStr("Manual black button short press");
|
||||||
|
pressStopManual();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Winter timing 6:00-7:31, 12:00-13:01, 17:00-18:01
|
||||||
|
void checkTime() {
|
||||||
|
// Winter
|
||||||
|
if (month()==12 || month()==1 || month()==2 ) {
|
||||||
|
// 6:00 - 7:01 - working
|
||||||
|
if ((hour()==6) && (indicator==0)) pressStart();
|
||||||
|
// 7:01 - stop
|
||||||
|
if ((hour()==7) && (minute()==1)) pressStop();
|
||||||
|
// 12:00 - 13:01 - working
|
||||||
|
if ((hour()==12) && (indicator==0)) pressStart();
|
||||||
|
// 13:01 - stop
|
||||||
|
if ((hour()==13) && (minute()==1)) pressStop();
|
||||||
|
// 17:00 - 18:01 - working
|
||||||
|
if ((hour()==17) && (indicator==0)) pressStart();
|
||||||
|
// 18:01 - stop
|
||||||
|
if ((hour()==18) && (minute()==1)) pressStop();
|
||||||
|
}
|
||||||
|
// Spring & Autumn
|
||||||
|
/*
|
||||||
|
// ! TEMPORARY CHANGES !
|
||||||
|
if (month()==3 || month()==4 || month()==5 || month()==9 || month()==10 || month()==11) {
|
||||||
|
// 6:00 - 7:41 - working
|
||||||
|
if ((hour()==6) && (indicator==0)) pressStart();
|
||||||
|
// 7:41 - stop
|
||||||
|
if ((hour()==7) && (minute()==41)) pressStop();
|
||||||
|
// 12:00 - 13:01 - working
|
||||||
|
if ((hour()==12) && (indicator==0)) pressStart();
|
||||||
|
// 13:01 - stop
|
||||||
|
if ((hour()==13) && (minute()==1)) pressStop();
|
||||||
|
// 17:00 - 18:21 - working
|
||||||
|
if ((hour()==17) && (indicator==0)) pressStart();
|
||||||
|
// 18:21 - stop
|
||||||
|
if ((hour()==18) && (minute()==21)) pressStop();
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
// ! TEMPORARY CHANGES !
|
||||||
|
if (month()==3 || month()==4 || month()==5 || month()==9 || month()==10 || month()==11) {
|
||||||
|
// 6:00 - 8:01 - working
|
||||||
|
if ((hour()==6 || hour()==7) && (indicator==0)) pressStart();
|
||||||
|
// 8:01 - stop
|
||||||
|
if ((hour()==8) && (minute()==1)) pressStop();
|
||||||
|
// 12:00 - 13:31 - working
|
||||||
|
if ((hour()==12) && (indicator==0)) pressStart();
|
||||||
|
// 13:31 - stop
|
||||||
|
if ((hour()==13) && (minute()==31)) pressStop();
|
||||||
|
// 17:00 - 18:41 - working
|
||||||
|
if ((hour()==17) && (indicator==0)) pressStart();
|
||||||
|
// 18:41 - stop
|
||||||
|
if ((hour()==18) && (minute()==41)) pressStop();
|
||||||
|
}
|
||||||
|
// Summer
|
||||||
|
if (month()==6 || month()==7 || month()==8 ) {
|
||||||
|
// 6:00 - 8:01 - working
|
||||||
|
if ((hour()==6 || hour()==7) && (indicator==0)) pressStart();
|
||||||
|
// 8:01 - stop
|
||||||
|
if ((hour()==8) && (minute()==1)) pressStop();
|
||||||
|
// 12:00 - 14:01 - working
|
||||||
|
if ((hour()==12 || hour()==13) && (indicator==0)) pressStart();
|
||||||
|
// 14:01 - stop
|
||||||
|
if ((hour()==14) && (minute()==1)) pressStop();
|
||||||
|
// 17:00 - 18:25 - working
|
||||||
|
if ((hour()==17) && (indicator==0)) pressStart();
|
||||||
|
// 18:25 - stop
|
||||||
|
if ((hour()==18) && (minute()==25)) pressStop();
|
||||||
|
}
|
||||||
|
}
|
Binary file not shown.
Before Width: | Height: | Size: 111 KiB After Width: | Height: | Size: 156 KiB |
Loading…
Reference in New Issue