#include <Wire.h>
#define RTC_I2C_ADDRESS 0x68 // I2C Adresse des RTC DS3231
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SH1106.h>
#define OLED_MOSI 9
#define OLED_CLK 10
#define OLED_DC 11
#define OLED_CS 12
#define OLED_RESET 13
Adafruit_SH1106 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
#define RTC_I2C_ADDRESS 0x68 // I2C Adresse des RTC DS3231
#include <Adafruit_NeoPixel.h>
#define PIN 6
#define NUM_LEDS 2
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, PIN, NEO_GRBW + NEO_KHZ800);
int Bodenfeuchte = A1;
int sensorWert = 0;
int Einstellen;
int Relay = 2;
/*
const int anstd = 6;
const int anmin = 45;
const int ansek = 6;
const int ausstd = 6;
const int ausmin = 6;
const int aussek = 46;
*/
unsigned long startZeit1 = 0;
unsigned long startZeit2 = 0;
unsigned long startZeit3 = 0;
unsigned long startZeit4 = 0;
const int zeit1 = 1000;
const int zeit2 = 1000;
const int zeit3 = 100;
const int zeit4 = 0;
//Membervariablen
int jahr, monat, tag, stunde, minute, sekunde, wochentag;
int daysInMonth[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
String daysInWeek[7] = {"So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"};
String monthInYear[12] = {"Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"};
String outputFormat = "%s, %02d.%s %04d %02d:%02d:%02d Uhr";
void rtcReadTime() {
Wire.beginTransmission(RTC_I2C_ADDRESS);
Wire.write(0);
Wire.endTransmission();
Wire.requestFrom(RTC_I2C_ADDRESS, 7);
sekunde = bcdToDec(Wire.read() & 0x7f);
minute = bcdToDec(Wire.read());
stunde = bcdToDec(Wire.read() & 0x3f);
/* wochentag =*/ bcdToDec(Wire.read());
tag = bcdToDec(Wire.read());
monat = bcdToDec(Wire.read());
jahr = bcdToDec(Wire.read()) + 2000;
}
void rtcWriteTime(int jahr, int monat, int tag, int stunde, int minute, int sekunde) {
Wire.beginTransmission(RTC_I2C_ADDRESS);
Wire.write(0);
Wire.write(decToBcd(sekunde));
Wire.write(decToBcd(minute));
Wire.write(decToBcd(stunde));
Wire.write(decToBcd(0));
Wire.write(decToBcd(tag));
Wire.write(decToBcd(monat));
Wire.write(decToBcd(jahr - 2000));
Wire.endTransmission();
}
byte calcDayOfWeek(int jahr, byte monat, byte tag) {
static int t[] = {0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4};
jahr -= monat < 3;
return ((jahr + jahr / 4 - jahr / 100 + jahr / 400 + t[monat - 1] + tag) % 7);
}
byte decToBcd(byte val) {
return ( (val / 10 * 16) + (val % 10) );
}
byte bcdToDec(byte val) {
return ( (val / 16 * 10) + (val % 16) );
}
int getIntFromString (char *stringWithInt, byte num) {
char *tail;
while (num > 0) {
num--;
while ((!isdigit (*stringWithInt)) && (*stringWithInt != 0)) {
stringWithInt++;
}
tail = stringWithInt;
while ((isdigit(*tail)) && (*tail != 0)) {
tail++;
}
if (num > 0) {
stringWithInt = tail;
}
}
return (strtol(stringWithInt, &tail, 10));
}
void setup() {
Wire.begin();
Serial.begin(57600);
Serial.println("Mit dem Befehl kann das Datum und die Uhrzeit gesetzt oder veraendert werden.");
Serial.println("set 05.10.2019 14:54:00");
display.begin(SH1106_SWITCHCAPVCC);
pinMode(Relay, OUTPUT);
digitalWrite(Relay, LOW);
strip.begin();
}
void printRTCDateTime() {
{
long runtime = millis() / 1000;
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(3, 55);
char linebuf[60];
int dOW = calcDayOfWeek(jahr, monat, tag);
String wochentagC = daysInWeek[dOW];
String monatC = monthInYear[monat];
String result = "";
result += wochentagC;
result += ", ";
result += tag;
result += ".";
result += monatC;
result += " ";
result += jahr;
result += " ";
display.println(result);
}
{
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(40, 1);
String result = "";
if (stunde < 10) {
result += "0";
}
result += stunde;
result += ":";
if (minute < 10) {
result += "0";
}
result += minute;
result += ":";
if (sekunde < 10) {
result += "0";
}
result += sekunde;
display.println(result);
}
display.display();
display.clearDisplay();
}
void setRTCTime() {
char linebuf[30];
byte counter;
if (Serial.available()&& millis() > startZeit3 + zeit3) {
startZeit3 = millis();
memset(linebuf, 0, sizeof(linebuf));
counter = 0;
while (Serial.available()) {
linebuf[counter] = Serial.read();
if (counter < sizeof(linebuf) - 1) counter++;
}
}
if (strstr(linebuf, "set") == linebuf) {
tag = getIntFromString (linebuf, 1);
monat = getIntFromString (linebuf, 2);
jahr = getIntFromString (linebuf, 3);
stunde = getIntFromString (linebuf, 4);
minute = getIntFromString (linebuf, 5);
sekunde = getIntFromString (linebuf, 6);
} else {
Serial.println("Befehl unbekannt.");
return;
}
if (!checkDateTime(jahr, monat, tag, stunde, minute, sekunde)) {
Serial.println(linebuf);
Serial.println("Fehlerhafte Zeitangabe im 'set' Befehl");
Serial.println("Beispiel: set 28.08.2013 10:54");
return;
}
rtcWriteTime(jahr, monat, tag, stunde, minute, sekunde);
Serial.println("Zeit und Datum wurden auf neue Werte gesetzt.");
}
boolean checkDateTime(int jahr, int monat, int tag, int stunde, int minute, int sekunde) {
boolean result = false;
if (jahr > 2000) {
result = true;
} else {
return false;
}
// Schaltjahr prüfen
if (jahr % 400 == 0 || (jahr % 100 != 0 && jahr % 4 == 0)) {
daysInMonth[1] = 29;
}
if (monat < 13) {
if ( tag <= daysInMonth[monat - 1] ) {
result = true;
}
} else {
return false;
}
if (stunde < 24 && minute < 60 && sekunde < 60 && stunde >= 0 && minute >= 0 && sekunde >= 0) {
result = true;
} else {
return false;
}
return result;
}
void loop() {
if (millis() > startZeit1 + zeit1) {
rtcReadTime();
printRTCDateTime();
setRTCTime();
startZeit1 = millis();
}
if (millis() > startZeit2 + zeit2) {
sensorWert = analogRead(Bodenfeuchte);
startZeit2 = millis();
}
else {
}
if (sensorWert < 300) {
strip.setPixelColor(1, strip.Color(250, 0, 0));
strip.show();
// strip.clear();
long runtime = millis() / 1000;
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(20, 35);
display.println("Pumpe wartet");
if (millis() > startZeit4 + zeit4 && stunde == 17 && minute == 30&& sekunde == 10) {
digitalWrite(Relay, HIGH);
strip.setPixelColor(1, strip.Color(250, 250, 0));
strip.show();
{
long runtime = millis();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(20, 35);
display.println("Pumpe ON");
}
startZeit4 = millis();
}
else if (stunde == 21 && minute == 30 && sekunde == 50) {
digitalWrite(Relay, LOW);
}
}
else
{
strip.setPixelColor(1, strip.Color(0, 250, 0));
strip.show();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(20, 35);
display.println("Pumpe OFF");
}
{
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(35, 10);
display.print("Boden ");
display.println(sensorWert);
}
}
Tommy56:
Meinst Du, wir sind Hellseher? Wie sollen wir ohne Deinen Sketch darauf antworten?
Gruß Tommy