/*
Name: Test.ino
Created: 21.06.2022 16:37:04
Author: FOTOPC\Manfred
*/
struct MarkStr
{
int RausTime;
int ReinTime;
} Mark;
String _Eingabe;
//{
int ProzentOpen;
int _ProzentOpenNeu;
int ProzentGelaufen;
int ProzentZuLaufen;
int _pinState;
long _MarkcurrentMillis;
long _MarkpreviousMillis;
int RunTime;
int RausTime;
int ReinTime;
int _RausReinTime;
void BerechneProzentGelaufen()
{
_MarkcurrentMillis = millis();
RunTime = _MarkcurrentMillis - _MarkpreviousMillis;
if (_pinState == 1) {
ProzentGelaufen = int((float(RunTime) / float(RausTime) * 100) + 0.5);
}
else if (_pinState == 2) {
ProzentGelaufen = - (int((float(RunTime) / float(ReinTime) * 100) + 0.5));
}
else { ProzentGelaufen = 0; }
Serial.printf("BerechneProzentGelaufen --> Runtime: %d ProzentGelaufen: %d _PinState: %d RausTime: %d\n", RunTime, ProzentGelaufen, _pinState, RausTime);
}
void BerechneProzentOpen()
{
BerechneProzentGelaufen();
ProzentOpen += ProzentGelaufen;
if (ProzentOpen > 100) { ProzentOpen = 100; }
if (ProzentOpen < 0) { ProzentOpen = 0; }
}
String BerechneRausReinTime(int PlusMinus = 0)
{
Serial.printf("BerechneRausReinTime 1 --> ProzentOpen: %d _ProzentOpenNeu: %d ProzentGelaufen: %d ProzentZuLaufen: %d PlusMinus: %d _PinState: %d\n", ProzentOpen, _ProzentOpenNeu, ProzentGelaufen, ProzentZuLaufen, PlusMinus, _pinState);
if (_pinState == 0 & PlusMinus == 0) {
ProzentZuLaufen = _ProzentOpenNeu - ProzentOpen + PlusMinus;
}
else if (_pinState == 0 & PlusMinus > 0) {
ProzentZuLaufen = ProzentOpen + PlusMinus;
}
else if (_pinState > 0) {
BerechneProzentGelaufen();
ProzentZuLaufen = _ProzentOpenNeu - (ProzentOpen + ProzentGelaufen + PlusMinus); // (70 - (50 + 10) + 0)
}
Serial.printf("BerechneRausReinTime 2 --> _ProzentOpenNeu: %d ProzentGelaufen: %d ProzentZuLaufen: %d PlusMinus: %d _PinState: %d\n", _ProzentOpenNeu, ProzentGelaufen, ProzentZuLaufen, PlusMinus, _pinState);
if (_pinState == 0 & ProzentZuLaufen > 0) {
// _RausReinTime = map(ProzentZuLaufen,0,100,0,RausTime);
_RausReinTime = int(float(abs(ProzentZuLaufen)) * float(RausTime) / 100);
Serial.printf("BerechneRausReinTime 3 Raus --> ProzentLauf: %d RausTime: %d _RausReinTime: %d\n", ProzentZuLaufen, RausTime, _RausReinTime);
return("Raus");
}
else if (_pinState == 0 & ProzentZuLaufen < 0) {
// _RausReinTime = map(ProzentZuLaufen,0,100,0,ReinTime);
_RausReinTime = int(float(abs(ProzentZuLaufen)) * float(ReinTime) / 100);
Serial.printf("BerechneRausReinTime 4 Rein --> ProzentLauf: %d RausTime: %d _RausReinTime: %d\n", ProzentZuLaufen, RausTime, _RausReinTime);
return("Rein");
}
else if (_pinState == 1 & ProzentZuLaufen > 0) {// Markise muss länger laufen
// _RausReinTime = map(_ProzentOpenNeu - ProzentOpen,0,100,0,RausTime);
_RausReinTime = int(float(abs(_ProzentOpenNeu - ProzentOpen)) * float(RausTime) / 100);
Serial.printf("BerechneRausReinTime 5 Raus OK --> ProzentLauf: %d RausTime: %d _RausReinTime: %d\n", ProzentZuLaufen, RausTime, _RausReinTime);
return("OK"); //Sonst Nichtstun --> Weiterlaufen mit neuem Wert
}
else if (_pinState == 1 & ProzentZuLaufen < 0) { //
BerechneProzentOpen();
// _RausReinTime = map(ProzentZuLaufen,0,100,0,ReinTime);
_RausReinTime = int(float(abs(ProzentZuLaufen)) * float(ReinTime) / 100);
return ("StopRein"); //Stoppe und Fahre Rein zu neuem Sollwert
}
else if (_pinState == 2 & ProzentZuLaufen < 0) {// Markise muss länger laufen
// _RausReinTime = map(_ProzentOpenNeu - ProzentOpen,0,100,0,ReinTime);
_RausReinTime = int(float(abs(_ProzentOpenNeu - ProzentOpen)) * float(ReinTime) / 100);
return("OK"); //Sonst Nichtstun --> Weiterlaufen mit neuem Wert
}
else if (_pinState == 2 & ProzentZuLaufen > 0) { //
BerechneProzentOpen();
// _RausReinTime = map(ProzentZuLaufen,0,100,0,RausTime);
_RausReinTime = int(float(abs(ProzentZuLaufen)) * float(RausTime) / 100);
return ("StopRaus"); //Stoppe und Fahre Rein zu neuem Sollwert
}
Serial.printf("BerechneRausReinTime Ende --> _ProzentOpenNeu: %d ProzentGelaufen: %d ProzentZuLaufen: %d PlusMinus: %d _PinState: %d _RausReinTime: %d\n",
_ProzentOpenNeu, ProzentGelaufen, ProzentZuLaufen, PlusMinus, _pinState, _RausReinTime);
return ("");
}
void MarkiseSTOP()
{
BerechneProzentOpen();
_pinState = 0;
MarkiseSwitch("Stop");
}
void MarkiseRausRein(String Eingabe)
{
Serial.printf("MarkiseRausRein --> ProzNeu: %d ProzentOpen: %d Eingabe: %s RausReinTime: %d PinState: %d\n\n\n",
_ProzentOpenNeu, ProzentOpen, Eingabe.c_str(), _RausReinTime, _pinState);
if (_pinState == 0 & Eingabe == "Raus") {
_MarkpreviousMillis = _MarkpreviousMillis = millis();
_pinState = _pinState = 1;
Serial.printf("Raus --> ProzNeu: %d ProzentOpen: %d _Eingabe: %s RausReinTime: %d PinState: %d\n\n\n", _ProzentOpenNeu, ProzentOpen, _Eingabe.c_str(), _RausReinTime, _pinState);
MarkiseSwitch("Raus");
}
else if (_pinState == 0 & Eingabe == "Rein") {
_MarkpreviousMillis = _MarkpreviousMillis = millis();
_pinState = _pinState = 2;
Serial.printf("Rein --> ProzNeu: %d ProzentOpen: %d _Eingabe: %s RausReinTime: %d PinState: %d\n\n\n", _ProzentOpenNeu, ProzentOpen, _Eingabe.c_str(), _RausReinTime, _pinState);
MarkiseSwitch("Rein");
}
else if (Eingabe == "OK") {
_RausReinTime = _RausReinTime;
Serial.printf("ReinRaus OK --> ProzNeu: %d ProzentOpen: %d _Eingabe: %s RausReinTime: %d PinState: %d\n\n\n", _ProzentOpenNeu, ProzentOpen, _Eingabe.c_str(), _RausReinTime, _pinState);
}
else if (Eingabe == "StopRein")
{
MarkiseSTOP();
_MarkpreviousMillis = _MarkpreviousMillis = millis();
_pinState = _pinState = 2;
Serial.printf("StopRein --> ProzNeu: %d ProzentOpen: %d _Eingabe: %s RausReinTime: %d PinState: %d\n\n\n", _ProzentOpenNeu, ProzentOpen, _Eingabe.c_str(), _RausReinTime, _pinState);
MarkiseSwitch("Rein");
}
else if (Eingabe == "StopRaus")
{
MarkiseSTOP();
_MarkpreviousMillis = _MarkpreviousMillis = millis();
_pinState = 1;
Serial.printf("StopRaus --> ProzNeu: %d ProzentOpen: %d _Eingabe: %s RausReinTime: %d PinState: %d\n\n\n", _ProzentOpenNeu, ProzentOpen, _Eingabe.c_str(), _RausReinTime, _pinState);
MarkiseSwitch("Raus");
}
else if ((_pinState == 1 || _pinState == 2) == true & Eingabe == "STOP") {
MarkiseSTOP();
Serial.printf("STOP PinSt 1 or 2--> ProzNeu: %d ProzentOpen: %d _Eingabe: %s RausReinTime: %d PinState: %d\n\n\n",
_ProzentOpenNeu, ProzentOpen, _Eingabe.c_str(), _RausReinTime, _pinState);
}
}
void UpdateMarkise()
{
if (_pinState == 0) return;
if (millis() - _MarkpreviousMillis > _RausReinTime)
{
BerechneProzentOpen();
_pinState = 0;
MarkiseSwitch("Stop");
}
}
void MarkiseSwitch(String _Eingabe )
{
Serial.printf("MarkiseAnf: %s --> ProzNeu: %d ProzentOpen: %d _Eingabe: %s RausReinTime: %d PinState: %d\n\n\n",
_Eingabe.c_str(), _ProzentOpenNeu, ProzentOpen, _Eingabe.c_str(), _RausReinTime, _pinState);
switch ( _pinState) {
case 1:
SwitchLED(0,HIGH);
break;
case 2:
SwitchLED(1,HIGH);
break;
case 0:
SwitchLED(0,LOW);
SwitchLED(1,LOW);
break;
}
}
String Eingabee;
void Vorgabe()
{
RausTime = 10000;
ReinTime = 12000;
_pinState = 0;
ProzentOpen = 0;
}
void MarkiseEingabe(String Eingabee)
{
if (Eingabee == "Proz 0") {
_ProzentOpenNeu = 0;
}
else if (Eingabee == "Proz 100") {
_ProzentOpenNeu = 100;
}
else if (Eingabee == "Raus" & _pinState == 0) {
if (ProzentOpen <= 40) { _ProzentOpenNeu = 60; }
else if (ProzentOpen <= 100) {_ProzentOpenNeu = ProzentOpen + 10; }
if (_ProzentOpenNeu > 100) { _ProzentOpenNeu = 100; }
}
else if (Eingabee == "Raus") {
//_ProzentOpenNeu += 10;
Eingabee = "STOP";
if (_ProzentOpenNeu > 100) { _ProzentOpenNeu = 100; }
}
else if (Eingabee == "Rein" & _pinState == 0) {
if (ProzentOpen <= 40) { _ProzentOpenNeu = 0; }
else if (ProzentOpen > 40) { _ProzentOpenNeu = ProzentOpen - 10; }
if (_ProzentOpenNeu < 0) { _ProzentOpenNeu = 0; }
}
else if (Eingabee == "Rein") {
Eingabee = "STOP";
// _ProzentOpenNeu -= 10;
if (_ProzentOpenNeu < 0) { _ProzentOpenNeu = 0; }
}
else if (Eingabee == "STOP") {
}
else {
int Neu = Eingabee.toInt();
_ProzentOpenNeu = Neu;
}
if (Eingabee != "STOP") _Eingabe = BerechneRausReinTime(); else _Eingabe = Eingabee;
Serial.printf("MarkiseEingabe: %s, BerechnetEingabe: %s _ProzOpeNeu: %u rausReinTime: %u PinState: %u\n", Eingabee.c_str(), _Eingabe.c_str(), _ProzentOpenNeu, _RausReinTime, _pinState);
MarkiseRausRein(_Eingabe);
}
#define Raus 27
#define Rein 14
#define Steckdosen 12
#define Licht 13
#define STOP 26
const byte buttonPins[] = {Raus, Rein, Steckdosen, Licht, STOP};
#define LEDRaus 15
#define LEDRein 4
#define LEDSteckdosen 5
#define LEDLicht 18
#define MarkiseDim 34
const byte LEDPins[] = {LEDRaus, LEDRein, LEDSteckdosen, LEDLicht};
bool Firstread = true;
int DebPoti = 500;
int OldValue;
long PotiCurrTime;
long PotiPrevTim = 0;
byte readButtons() {
for (byte i = 0; i < 5; i++) {
byte buttonPin = buttonPins[i];
if (digitalRead(buttonPin) == LOW) {
return i;
}
delay(1);
}
return(255);
}
void SwitchLED(byte Pin, bool State)
{
// if (digitalRead(LEDPins[Pin]) == LOW) { digitalWrite(LEDPins[Pin] , HIGH); }
// else { digitalWrite(LEDPins[Pin] , LOW); }
digitalWrite(LEDPins[Pin], State);
}
void SwitchLED(byte Pin)
{
if (digitalRead(LEDPins[Pin]) == LOW) { digitalWrite(LEDPins[Pin] , HIGH); }
else { digitalWrite(LEDPins[Pin] , LOW); }
}
int OldPotValue;
bool AusgPotValue = false;
int readPoti()
{
PotiCurrTime = millis();
int potValue = analogRead(MarkiseDim);
potValue = map(potValue,0,4096,0,100);
if (potValue != OldPotValue)
{
// Serial.printf("AnalogRead: %u\n",potValue);
OldPotValue = potValue;
AusgPotValue = false;
PotiPrevTim = millis();
}
else if (potValue == OldPotValue & (PotiCurrTime - PotiPrevTim) > DebPoti & AusgPotValue == false )
{
if (Firstread == false ) {
// Serial.printf("AnalogRead: %u\n",potValue);
AusgPotValue = true;
return (potValue);
}
if (Firstread == true) { AusgPotValue = true; Firstread = false; }
}
else return(1000);
}
void setup()
{
pinMode(LEDRaus, OUTPUT);
pinMode(Raus, INPUT_PULLUP);
pinMode(LEDRein, OUTPUT);
pinMode(Rein, INPUT_PULLUP);
pinMode(STOP, INPUT_PULLUP);
pinMode(LEDSteckdosen, OUTPUT);
pinMode(Steckdosen, INPUT_PULLUP);
pinMode(LEDLicht, OUTPUT);
pinMode(Licht, INPUT_PULLUP);
Serial.begin(115200);
Vorgabe();
}
bool Eins2000 = false;
long ButtonBegin = 0;
long ButtonEnde = 0;
int ButtonPressed;
void loop()
{
byte But = readButtons();
if (OldValue != But & But != 5) {
OldValue = But;
if (But != 255) {
Serial.printf("Button Nr: %u\n", But);
switch (But) {
case 0:
MarkiseEingabe("Raus"); break;
case 1:
MarkiseEingabe("Rein"); break;
case 2:
MarkiseEingabe("0"); break;
case 3:
MarkiseEingabe("100"); break;
case 4:
MarkiseEingabe("STOP"); break;
}
// SwitchLED(But);
}
}
int Neu = readPoti();
if (Neu != 1000) {
String yy(Neu);
Serial.printf("NeuerMarkisenwert: %u\n",Neu);
MarkiseEingabe(yy);
}
UpdateMarkise();
}