1. Zeile wird jede Sekunde die Zeit akualisiert.
2. Zeile wird der aktuelle Schritt i angezeigt.
Ich bekomme in undefenierbaren Zeitständen Probleme mit dem Display. Es kann direkt zu Beginn sein, oder aber erst nach einigen Schritten.
Dann ist das Display nicht mehr lesbar. Undefenierbare Zeichen mit einem Teil meiner gewünschten Zeichen. Die Zeichen flackern dann auch noch Teils.
Display ist über I2C (A5 = SCL, A4 = SDA, GND = Arduino GND, Vcc = Arduino 5V) angeschlossen. Das RTC Glied ist parallel dazu aufgelegt. Ansonsten befindet sich nichts auf der Platine.
//Uhrzeit
#include <DS1307RTC.h>
#include <Time.h>
//I2C
#include <Wire.h>
//LCD Display
#include <LCD.h>
#include <LiquidCrystal_I2C.h>
#define I2C_ADDR 0x27
#define BACKLIGHT_PIN 3
#define En_pin 2
#define Rw_pin 1
#define Rs_pin 0
#define D4_pin 4
#define D5_pin 5
#define D6_pin 6
#define D7_pin 7
LiquidCrystal_I2C
lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin);
const int buttonPin = 2;
int buttonStatus = 0;
const int buzzerPin = 3; //Starwars
const int pumpePin = 4;
int pumpeStatus = 0;
int neblerStatus = 0;
const int neblerPin = 7;
void setup() {
Serial.begin(9600);
pinMode(buttonPin, INPUT);
digitalWrite(buttonPin, HIGH);
pinMode(pumpePin, OUTPUT);
pinMode(neblerPin, OUTPUT);
pinMode(buzzerPin, OUTPUT);
// LCD Display
lcd.begin (16,2);
lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE);
lcd.setBacklight(HIGH);
lcd.home ();
}
void loop() {
lcd.setCursor(0,0);
timestamp();
lcd.setCursor(0,1);
menu();
}
void menu() {
unsigned long aktuelleZeit = millis();
static unsigned long vorherigeZeit;
static int i;
int wartezeit[] = {
/* 0 */ 5000,
/* 1 */ 2000,
/* 2 */ 2000,
/* 3 */ 2000,
/* 4 */ 2000,
/* 5 */ 2000,
/* 6 */ 2000,
/* 7 */ 2000,
/* 8 */ 2000,
/* 9 */ 2000,
};
char* meldetext[] = {
/* 0 */ " ",
/* 1 */ "Schritt 1 ",
/* 2 */ "Schritt 2 ",
/* 3 */ "Schritt 3 ",
/* 4 */ "Schritt 4 ",
/* 5 */ "Schritt 5 ",
/* 6 */ "Schritt 6 ",
/* 7 */ "Schritt 7 ",
/* 8 */ "Schritt 8 ",
/* 9 */ "Schritt 9 ",
};
if(aktuelleZeit - vorherigeZeit > wartezeit[i]) {
vorherigeZeit = aktuelleZeit;
i++;
if(i > 9) i = 0;
lcd.print(meldetext[i]);
}
if(i > 0) digitalWrite(pumpePin, HIGH);
else digitalWrite(pumpePin, LOW);
switch(i) {
case 1:
digitalWrite(neblerPin, HIGH);
//starwars
break;
case 2:
digitalWrite(neblerPin, LOW);
break;
case 3:
digitalWrite(neblerPin, HIGH);
break;
case 4:
digitalWrite(neblerPin, HIGH);
break;
case 5:
digitalWrite(neblerPin, LOW);
break;
case 6:
digitalWrite(neblerPin, HIGH);
break;
case 7:
digitalWrite(neblerPin, LOW);
break;
case 8:
digitalWrite(neblerPin, HIGH);
break;
case 9:
digitalWrite(neblerPin, LOW);
break;
default:
digitalWrite(pumpePin, LOW);
digitalWrite(neblerPin, LOW);
}
}
void timestamp() {
unsigned long aktuelleZeit = millis();
static unsigned long vorherigeZeit;
int wartezeit = 1000;
if(aktuelleZeit - vorherigeZeit > wartezeit) {
vorherigeZeit = aktuelleZeit;
tmElements_t tm;
RTC.read(tm);
print2digits(tm.Day);
lcd.print('.');
print2digits(tm.Month);
lcd.print(". ");
print2digits(tm.Hour);
lcd.print(':');
print2digits(tm.Minute);
lcd.print(':');
print2digits(tm.Second);
}
}
void print2digits(int i) {
if(i >= 0 && i < 10) {
lcd.print('0');
lcd.print(i);
}
else lcd.print(i);
}