Here's the code:
//
#include <Wire.h> // I2C-Biblioteek
#include "RTClib.h" // RTC-Biblioteek
RTC_DS1307 RTC; // RTC Module
#include <OneWire.h> // OneWire-Biblioteek
#include <DallasTemperature.h> // DS18B20-Biblioteek
#include <LiquidCrystal.h>
LiquidCrystal lcd (7, 8, 9, 10, 11, 12); //I2C word nie gebruik nie, dws baie drade.
#define DS18B20_PIN 2 // Pin vir die DS18B20
#define CH1 4 // Relay 1: Hoofligte
#define CH2 14 // Relay 2: LEDs in die kuikenkamer
//variables to keep track of the timing of recent interrupts
unsigned long button_time = 0;
unsigned long last_button_time = 0;
int x = 0; // variable to be updated by the interrupt
OneWire oneWire(DS18B20_PIN); // OneWire verwysing gestel
DallasTemperature sensors(&oneWire); // DS18B20 initialisering
int ledPin = 13;
volatile byte LigteOverride=0;
void setup(void) {
// Initialisiere I2C
Wire.begin();
// Initialisiere RTC
RTC.begin();
lcd.begin(16, 2);
Serial.begin(9600);
// Teks op die rekenaarskerm
Serial.println("... hier begin ons...");
pinMode(CH1, OUTPUT);
digitalWrite(CH1,LOW);
pinMode(CH2, OUTPUT);
digitalWrite(CH2,LOW);
pinMode(ledPin, OUTPUT);
//attachInterrupt(1, increment, FALLING);
attachInterrupt(1, increment, CHANGE);
digitalWrite(3, HIGH); // Enable pullup on digital pin 3, interrupt pin 1
// check die RTC
if (! RTC.isrunning()) {
// As hy nie aktief is nie, gee hom die huidige datum en tyd
RTC.adjust(DateTime(__DATE__, __TIME__));
Serial.println("RTC has been started and is set to system time.");
}
else Serial.println("RTC is already running.");
sensors.begin(); // DS18B20 starten
}
void loop()
{
DateTime now=RTC.now(); // Retrieving current time
show_time_and_date(now); // Output date and time
sensors.requestTemperatures(); // Temperatuursensor gelees
show_temperature(sensors.getTempCByIndex(0)); // Temperatuur gegee
delay(9153); // +-10 Sekondes
}
// Datum en tyd gegee
void show_time_and_date(DateTime nou){
// Jaar-Maand-dag, weeksdag
Serial.print(nou.year(),DEC);
Serial.print("-");
if(nou.month()<10)Serial.print(0);
Serial.print(nou.month(),DEC);
Serial.print("-");
if(nou.day()<10)Serial.print(0);
Serial.print(nou.day(),DEC);
Serial.print(", ");
Serial.print(" ");
if(nou.hour()<10)Serial.print(0);
Serial.print(nou.hour(),DEC);
Serial.print(":");
if(nou.minute()<10)Serial.print(0);
Serial.print(nou.minute(),DEC);
Serial.print(":");
if(nou.second()<10)Serial.print(0);
Serial.print(nou.second(),DEC);
bool Ligte=0;
bool LEDs=0;
word Jaar=nou.year();
byte Maand=nou.month();
byte Dag=nou.day();
byte Uur=nou.hour();
byte Min=nou.minute();
short AansitMin=180;
short AfsitMin=414;
short AfsitMinLED=1000;
short NouMin= (Uur*60)+Min;
// Hoe laat moet ligte aangeskakel word?
//14 uur dag
if (Maand== 2 && Dag== 16 ) AansitMin=( 4 *60)+ 0 ;
if (Maand== 2 && Dag== 17 ) AansitMin=( 4 *60)+ 0 ;
if (Maand== 2 && Dag== 18 ) AansitMin=( 4 *60)+ 0 ;
//etc.... I took out the rest, as the message became too long
// Hoe laat moet ligte afgeskakel word?
//Afgeskakel met sonsopkoms
if (Maand== 2 && Dag== 16 ) AfsitMin=( 05 *60)+ 51 ;
if (Maand== 2 && Dag== 17 ) AfsitMin=( 05 *60)+ 52 ;
if (Maand== 2 && Dag== 18 ) AfsitMin=( 05 *60)+ 53 ;
//etc.... I took out the rest, as the message became too long
// Hoe laat moet LEDs in B1 afgeskakel word?
//Afgeskakel 1 uur voor Sonondergang
if (Maand== 2 && Dag== 16 ) AfsitMinLED=( 17 *60)+ 48 ;
if (Maand== 2 && Dag== 17 ) AfsitMinLED=( 17 *60)+ 47 ;
if (Maand== 2 && Dag== 18 ) AfsitMinLED=( 17 *60)+ 47 ;
//etc.... I took out the rest, as the message became too long
// for testing only:
if (Jaar==2016 && Maand==2 && (Dag==14 || Dag==12) && Uur==15)
{
AansitMin=((60*15)+45);
AfsitMin=((60*15)+47);
AfsitMinLED=((60*15)+48);
}
if (NouMin >= AansitMin and NouMin < AfsitMin)
{
digitalWrite(ledPin, HIGH);
digitalWrite(CH1, LOW);
digitalWrite(CH2, LOW);
Ligte = 1;
LEDs = 1;
}
else
{
if (LigteOverride)
{
digitalWrite(ledPin, HIGH);
digitalWrite(CH1, LOW);
digitalWrite(CH2, LOW);
Ligte = 1;
LEDs = 1;
}
else
{
digitalWrite(ledPin, LOW);
digitalWrite(CH1, HIGH);
Ligte = 0;
if (NouMin >= AansitMin and NouMin < AfsitMinLED)
{
digitalWrite(CH2, LOW);
LEDs = 1;
}
else
{
digitalWrite(CH2, HIGH);
LEDs = 0;
}
}
}
short AansitUur=3;
short AfsitUur=7;
short AfsitUurLED=17;
short AansitFraksie=0;
short AfsitFraksie=0;
short AfsitFraksieLED=0;
AansitUur=int(AansitMin/60);
AfsitUur=int(AfsitMin/60);
AfsitUurLED=int(AfsitMinLED/60);
AansitFraksie=AansitMin-(AansitUur*60);
AfsitFraksie=AfsitMin-(AfsitUur*60);
AfsitFraksieLED=AfsitMinLED-(AfsitUurLED*60);
Serial.print(" Ligte=");
Serial.print(Ligte);
Serial.print(" LEDs=");
Serial.print(LEDs);
Serial.print(" ");
//Serial.print("Aansit Tyd=");
Serial.print(AansitUur);
Serial.print(":");
if (AansitFraksie < 10) Serial.print("0");
Serial.print(AansitFraksie);
Serial.print("-");
//Serial.print(" Afsit Tyd=");
Serial.print(AfsitUur);
Serial.print(":");
if (AfsitFraksie < 10) Serial.print("0");
Serial.print(AfsitFraksie);
Serial.print(" -");
//Serial.print(" Afsit Tyd LEDs=");
Serial.print(AfsitUurLED);
Serial.print(":");
if (AfsitFraksieLED < 10) Serial.print("0");
Serial.print(AfsitFraksieLED);
Serial.print(" LigteOverride=");
Serial.print(LigteOverride);
lcd.setCursor(8,0);
lcd.print(" ");
lcd.setCursor(0,0);
//lcd.print("DATUM: ");
lcd.print(nou.year(), DEC);
lcd.print("-");
lcd.print(nou.month(), DEC);
lcd.print("-");
lcd.print(nou.day(), DEC);
if (Uur < 10)
{
lcd.setCursor(12,0);
lcd.print(nou.hour(), DEC);
}
else
{
lcd.setCursor(11,0);
lcd.print(nou.hour(), DEC);
}
lcd.setCursor(13,0);
lcd.print(":");
lcd.setCursor(14,0);
if (Min < 10)
{
lcd.print("0");
lcd.print(nou.minute(), DEC);
}
else
{
lcd.print(nou.minute(), DEC);
}
int DieTemp=0;
DieTemp = int(sensors.getTempCByIndex(0));
lcd.setCursor(0,1);
if (DieTemp<10 && DieTemp>0) lcd.print(" ");
lcd.print(DieTemp);
//lcd.print(temp(), DEC);
//lcd.print(" ");
lcd.print((char)223); //degree sign
lcd.print("C");
lcd.print(" ");
lcd.print(AansitUur);
lcd.print(":");
if (AansitFraksie < 10) lcd.print("0");
lcd.print(AansitFraksie);
lcd.print("-");
lcd.print(AfsitUur);
lcd.print(":");
if (AfsitFraksie < 10) lcd.print("0");
lcd.print(AfsitFraksie);
}
// Temperatuur gegee
void show_temperature(float temp){
Serial.print(" Temperatuur: ");
Serial.print(temp);
Serial.print(" "); //
Serial.write(176); // om die °-teken te wys
Serial.println("C ");
}
void increment()
{
button_time = millis();
//check to see if increment() was called in the last 250 milliseconds
if (button_time - last_button_time < 500)
{
x++;
}
else
{
LigteOverride=!LigteOverride;
if (LigteOverride)
{
digitalWrite(ledPin, HIGH);
digitalWrite(CH1, LOW);
digitalWrite(CH2, LOW);
}
else
{
digitalWrite(ledPin, LOW);
digitalWrite(CH1, HIGH);
//digitalWrite(CH2, HIGH);
}
last_button_time = button_time;
}
}