Arduino Microview

Hallo - ich bin neu hier!

Hab bisher nur den CControl mit Basic programmiert.

Ich habe jetzt einen Arduino Microview. Tolles Teil!

Jetzt möchte ich den kleinen in den Schlafzustand versetzen und per ext. Interrupt (Taste) aufwecken.

Leider weiß ich nicht wo ich z.B. die "avr/sleep.h" finde und wie ich sie einbinde!

Wollte hiermit probieren:

An den Anfang:

#include <avr/sleep.h>

Steht auch so in dem von dir verlinkten Artikel!

Steht bei mir auch im Code drin, lässt sich aber nicht kompilieren.

sleep_interrupt_pin2.ino:1:25: fatal error: avr/sleep.h: No such file or directory
compilation terminated.

Muss ich nicht erst die Library einladen? Woher?

Ich habe unter:

C:\Program Files (x86)\Arduino\hardware\tools\avr\avr\include\avr

eine Datei sleep.h gefunden.

Kann sie aber unter Include Library nicht einbinden. Komme dort nicht zu diesem Ordner und kann wohl auch nur .zip laden?!

Du solltest dir mal Grundlagen in C aneignen. sleep.h wird bereits mit der toolchain mitgeliefert. Die sollte somit auch mit #include <avr/sleep.h> eingebunden werden können.

Zeig deinen Sketch (Bitte in CODE-TAGS!)

Hab ich mir eigentlich auch so gedacht.

[code]
#include < avr/sleep.h> 
 
volatile int sleepcounter = 0; // Schlafzyklen mitzählen
int k=0, led=13;
 
void setup() {
  Serial.begin(115200);
  pinMode(led, OUTPUT);
  watchdogOn(); // Watchdog timer einschalten.
  ADCSRA = ADCSRA & B01111111; // ADC abschalten, ADEN bit7 zu 0
  ACSR = B10000000; // Analogen Comparator abschalten, ACD bit7 zu 1
  DIDR0 = DIDR0 | B00111111; // Digitale Eingangspuffer ausschalten, analoge Eingangs Pins 0-5 auf 1
}
 
void loop(){
  digitalWrite(led, HIGH);
  delay(100); // delay für serielle Ausgabe
  Serial.println(k);  
  k++;
  delay(900); // delay für serielle Ausgabe beenden
  digitalWrite(led, LOW);
  pwrDown(10); // ATmega328 fährt runter für 10 Sekunden;
}
 
void pwrDown(int sekunden) {
  set_sleep_mode(SLEEP_MODE_PWR_DOWN); // den tiefsten Schlaf auswählen PWR_DOWN
  for(int i=0; i < sekunden; i++) {
    sleep_enable(); // sleep mode einschalten
    sleep_mode(); // in den sleep mode gehen
    sleep_disable(); // sleep mode ausschalten nach dem Erwachen
  }
}
 
void watchdogOn() {
  MCUSR = MCUSR & B11110111; // Reset flag ausschalten, WDRF bit3 vom MCUSR.
  WDTCSR = WDTCSR | B00011000; // Bit 3+4 um danach den Prescaler setzen zu können
  WDTCSR = B00000110; // Watchdog Prescaler auf 128k setzen > ergibt ca. 1 Sekunde
  WDTCSR = WDTCSR | B01000000; // Watchdog Interrupt einschalten
  MCUSR = MCUSR & B11110111;
}
 
ISR(WDT_vect) {
  sleepcounter ++; // Schlafzyklen mitzählen
}

[/code]

Du solltest den include Befehl auch richtig anwenden, nach der '<' kommt KEIN Leerzeichen

Stimmt!!

Hab den Code von einem Beispiel kopiert.
Na das fängt ja gut an...

Danke!

Einen Microview in Sleep zu versetzen hat wenig Sinn. Das OLED das drauf ist, verbraucht Strom und das auch wenn der Controller fast nichts verbraucht weil in sleep.

Grüße Uwe.

Hast Recht.

Ist auch nur für Testzwecke. Hab momentan nur den MicroView.

Soll später ein Micro sein welcher per Funk-Interrupt aufwacht und ein Hunter Magnetventil per 9V Impulsspule ansteuert.

Hab den Link mit dem falschen Leerzeichen gefunden:

Soll wohl nicht jeder dahergelaufene Möchtegern kopieren - Quasi Kindersicherung... :grin:
Was so ein falschplaziertes Leerzeichen anrichten kann...

Na bitte, geht doch!

In den sleep geschickt und mit Masse an Pin2 geweckt:

[code]
#include <avr/sleep.h>
#include <avr/power.h>
#include <MicroView.h>      // include MicroView library


int pin2 = 2;


/***************************************************
 *  Name:        pin2Interrupt
 *
 *  Returns:     Nothing.
 *
 *  Parameters:  None.
 *
 *  Description: Service routine for pin2 interrupt  
 *
 ***************************************************/
void pin2Interrupt(void)
{
  /* This will bring us back from sleep. */
  
  /* We detach the interrupt to stop it from 
   * continuously firing while the interrupt pin
   * is low.
   */
  detachInterrupt(0);
}


/***************************************************
 *  Name:        enterSleep
 *
 *  Returns:     Nothing.
 *
 *  Parameters:  None.
 *
 *  Description: Enters the arduino into sleep mode.
 *
 ***************************************************/
void enterSleep(void)
{
  
  /* Setup pin2 as an interrupt and attach handler. */
  attachInterrupt(0, pin2Interrupt, LOW);
  delay(100);
  
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);
  
  sleep_enable();
  
  sleep_mode();
  
  /* The program will continue from here. */
  
  /* First thing to do is disable sleep. */
  sleep_disable(); 
}


/***************************************************
 *  Name:        setup
 *
 *  Returns:     Nothing.
 *
 *  Parameters:  None.
 *
 *  Description: Setup for the Arduino.           
 *
 ***************************************************/
void setup()
{
  Serial.begin(9600);
  
  /* Setup the pin direction. */
  pinMode(pin2, INPUT);
  
  Serial.println("Initialisation complete.");
}



/***************************************************
 *  Name:        loop
 *
 *  Returns:     Nothing.
 *
 *  Parameters:  None.
 *
 *  Description: Main application loop.
 *
 ***************************************************/
int seconds=0;
void loop()
{
  delay(1000);
  seconds++;

  uView.begin();        // start MicroView
  uView.clear(PAGE);      // clear page
  uView.print("wach fuer ");
  uView.print(seconds, DEC);
  uView.print(" s");
  uView.display();
  
  if(seconds == 3)
  {
    uView.begin();        // start MicroView
    uView.clear(PAGE);      // clear page
    uView.print("starte sleep");
    uView.display();
    delay(200);
    seconds = 0;
    enterSleep();
  }
  
}

[/code]

Wenn ich uView weglasse geht er von 65mA auf 25mA runter (mit uView von 68 auf 28mA) - gar nicht so schlecht. Der Micro sollte ohne Display noch sparsamer sein...

Kennt sich jemand mit dem MicroView aus? Library

Ich versuche das OLED (zwecks Bildschirmschoner) nur einzuschalten wenn der angeschlossene Bewegungsmelder sich meldet.

Ausschalten kann ich es per uView.end();. Das klappt auch. Nur geht es nicht wieder mit uView.begin(); an. Einmal aus - immer aus - das will ich nicht glauben!?

  //Anzeige
  if (digitalRead(PirPIN) == HIGH)
  {
    digitalWrite(LED,HIGH);
    uView.begin();        // OLED anschalten
    uView.display();
    if (DisplayChange == HIGH)
    {
      uView.begin();        // start MicroView
      uView.clear(PAGE);      // clear page
      uView.setCursor(0,0);      // set cursor at 0,0
      uView.print(Zeile1);
      uView.setCursor(0,9);     
      uView.print(Zeile2);
      uView.setCursor(0,18);     
      uView.print(Zeile3);
      uView.setCursor(0,27);     
      uView.print(Zeile4);
      uView.setCursor(0,36);     
      uView.print(Zeile5);
      uView.display();
      DisplayChange = LOW;
    }
  }
  else
  {  
    uView.end();        // OLED ausschalten
    digitalWrite(LED,LOW);
  }

Bin wohl der Einzige, der den MicroView nutzt... ;D

Hab was rausgefunden:

Wenn ich nach uView.display(); ein Delay(1000); setze wird wieder was angezeigt.

Liegt wohl daran dass solange (digitalRead(PirPIN) == HIGH) ist immer wieder uView.display(); durchlaufen wird. Das geht wohl so schnell, dass es nicht zur Anzeige kommt.

Ich müsste sicherstellen das nach (digitalRead(PirPIN) == HIGH) die Anzeigeroutine nur einmal durchlaufen wird.

Nur weiß ich nicht so recht WIE - habt ihr einen Tip für mich?

  // Verriegelungszeit Bewegungsmelder
  if (digitalRead(PirPIN) == HIGH)
  {
    aktBewMillis = millis();
    BewegungErkannt = HIGH;
    DisplayChange = HIGH
  }
  if (millis() - aktBewMillis > BewMeldverzoegerung)  // Bewegungsmelder aus
  {
    BewegungErkannt = LOW;
    Serial.println ("Bewegung auf LOW");
    //delay(2000);
  }


  

Serial.println (BewegungErkannt);





  //Anzeige
  if (BewegungErkannt == HIGH) 
  {
    if (DisplayChange == HIGH)
    {
      uView.begin();        // start MicroView
      uView.clear(PAGE);      // clear page
      uView.setCursor(0,0);      // set cursor at 0,0
      uView.print(Zeile1);
      uView.setCursor(0,9);     
      uView.print(Zeile2);
      uView.setCursor(0,18);     
      uView.print(Zeile3);
      uView.setCursor(0,27);     
      uView.print(Zeile4);
      uView.setCursor(0,36);     
      uView.print(Zeile5);
      uView.display();
      DisplayChange = LOW;
    }
  }
  if (BewegungErkannt == LOW)
  {  
    uView.begin();        // start MicroView
    uView.clear(PAGE);      // clear page
    uView.display();
    digitalWrite(LED,LOW);
  }

TIPP ... :wink:

Setz doch eine Art "Display-Flag"... so im Sinne von:

.
.
.
flag = true;
.
.
.
if( flag == true )
  {
    ZeigeDiesesUndJenes();
    flag = false;
  }
.
.
.
und irgendwann später, wenn wieder etwas gezeigt werden soll:

flag = true;

that's all...

stoni99:
Ich müsste sicherstellen das nach (digitalRead(PirPIN) == HIGH) die Anzeigeroutine nur einmal durchlaufen wird.

Nur weiß ich nicht so recht WIE - habt ihr einen Tip für mich?

Grundsätzlich macht man das mit Flankenerkennung.

if (digitalRead(PirPIN) == HIGH)

Das macht so keinen Sinn, da der Impuls vom Arduino mehrfach erkannt wird. Eher so:

altStatusPir = aktStatusPir;
aktStatusPir = digitalRead(PirPIN);
...
if (aktStatusPir && !altStatusPir)

Hmm, will nicht so recht funktionieren - hab heute Denkblockade :smiley: ...

Werde mal besser einen anderen Tag weitertüfteln.

Ich habe jetzt das Programm umgestellt und die Anzeige-Routine als Unterprogramm laufen lassen.
Das funktioniert prima. Mein Plan ist das einmalige Durchlaufen der Anzeige-Routine im Unterprogramm besser steuern zu können.

#include <MicroView.h>      // include MicroView library

int Pin0 = 0;
int Pin1 = 1;
int Pin2 = 2;
int Pin3 = 3;
int Pumpe = 5;

int State0 = HIGH;
int LastState0 = HIGH;
int State1 = HIGH;
int LastState1 = HIGH;
int State2 = HIGH;
int LastState2 = HIGH;
int State3 = HIGH;
int LastState3 = HIGH;
int Pumpenverzoegerung = 10000;

String Zeile1;
String Zeile2;
String Zeile3;
String Zeile4;
String Zeile5;
String Zeile6;
String Ereignis;

bool AutoPumpeAus = LOW;
bool AutoPumpeAusErkannt = LOW;
bool SchonAngezeigt1 = LOW;
bool SchonAngezeigt2 = LOW;
bool SchonAngezeigt3 = LOW;
bool SchonAngezeigt4 = LOW;
bool SchonAngezeigt5 = LOW;
bool SchonAngezeigt6 = LOW;
bool SchonAngezeigt7 = LOW;
bool SchonAngezeigt8 = LOW;
bool SchonAngezeigt9 = LOW;
bool SchonAngezeigt10 = LOW;
 

unsigned long aktMillis, altMillis, printMillis, pumpenMillis;  // speichert wie viele Sekunden seit derletzten Änderung vergangen sind




void setup()
{
  Serial.begin(9600);
  
  /* Setup the pin direction. */
  pinMode(Pin0, INPUT);
  pinMode(Pin1, INPUT);
  pinMode(Pin2, INPUT);
  pinMode(Pin3, INPUT);
  pinMode(Pumpe, OUTPUT);

  digitalWrite(Pumpe, LOW);
  
  uView.begin();        // start MicroView
  uView.clear(PAGE);      // clear page
  uView.setCursor(5,0);
  uView.print("Sprenger");
  uView.setCursor(12,9);
  uView.print("Pumpen-");
  uView.setCursor(5,18);
  uView.print("Steuerung");
  uView.display();
  delay(3000);
}









void loop()
{
  State0 = digitalRead (Pin0);
  State1 = digitalRead (Pin1);
  State2 = digitalRead (Pin2);
  State3 = digitalRead (Pin3);
  


  //Aktion für Pin0
  if(LastState0 == LOW && State0 == HIGH)
  {
    Zeile2 = "Spr O aus";
    LastState0 = State0;
    AutoPumpeAus = HIGH;
    SchonAngezeigtLoeschen ();     //Unterprogramm aufrufen
    Anzeige ();                    //Unterprogramm um Daten anzuzeigen
  }

  if(LastState0 == HIGH && State0 == LOW)
  {
    Zeile2 = "Spr O an";
    Zeile1 = "Pumpe an";
    LastState0 = State0;
    digitalWrite(Pumpe, HIGH);
    AutoPumpeAus = LOW;
    AutoPumpeAusErkannt = LOW;
    Anzeige ();                    //Unterprogramm um Daten anzuzeigen
  }



  //Aktion für Pin1
  if(LastState1 == LOW && State1 == HIGH)
  {
    Zeile3 = "Spr S aus";
    LastState1 = State1;
    AutoPumpeAus = HIGH;
    SchonAngezeigtLoeschen ();     //Unterprogramm aufrufen
    Anzeige ();                    //Unterprogramm um Daten anzuzeigen
  }

  if(LastState1 == HIGH && State1 == LOW)
  {
    Zeile3 = "Spr S an";
    Zeile1 = "Pumpe an";
    LastState1 = State1;
    digitalWrite(Pumpe, HIGH);
    AutoPumpeAus = LOW;
    AutoPumpeAusErkannt = LOW;
    Anzeige ();                    //Unterprogramm um Daten anzuzeigen
  }

  

  
  //Aktion für Pin2
  if(LastState2 == LOW && State2 == HIGH)
  {
    Zeile4 = "Spr W aus";
    LastState2 = State2;
    AutoPumpeAus = HIGH;
    SchonAngezeigtLoeschen ();     //Unterprogramm aufrufen
    Anzeige ();                    //Unterprogramm um Daten anzuzeigen
  }

  if(LastState2 == HIGH && State2 == LOW)
  {
    Zeile4 = "Spr W an";
    Zeile1 = "Pumpe an";
    LastState2 = State2;
    digitalWrite(Pumpe, HIGH);
    AutoPumpeAus = LOW;
    AutoPumpeAusErkannt = LOW;
    Anzeige ();                    //Unterprogramm um Daten anzuzeigen
  }




  //Aktion für Pin3
  if(LastState3 == LOW && State3 == HIGH)
  {
    Zeile5 = "Spr N aus";
    //Zeile1 = "Pumpe aus";
    LastState3 = State3;
    AutoPumpeAus = HIGH;
    SchonAngezeigtLoeschen ();     //Unterprogramm aufrufen
    Anzeige ();                    //Unterprogramm um Daten anzuzeigen
  }

  if(LastState3 == HIGH && State3 == LOW)
  {
    Zeile5 = "Spr N an";
    Zeile1 = "Pumpe an";
    LastState3 = State3;
    digitalWrite(Pumpe, HIGH);
    AutoPumpeAus = LOW;
    AutoPumpeAusErkannt = LOW;
    Anzeige ();                    //Unterprogramm um Daten anzuzeigen
  }




  //Automatische Pumpenabschaltung nach Zeit
  if(AutoPumpeAus == HIGH)
  {
    if(AutoPumpeAusErkannt == LOW)
    {
      aktMillis = millis();
      altMillis = aktMillis;
      AutoPumpeAusErkannt = HIGH;
    }
    Ereignis = "Automatische Pumpenabschaltung an";

    
    switch ((millis() - altMillis)/1000)
    {
      case 1:
        Zeile1 = "Pumpe 9s";
        if (SchonAngezeigt1 == LOW)
        {
          Anzeige ();                    //Unterprogramm um Daten anzuzeigen
          SchonAngezeigt1 = HIGH;
        }
        break;
      case 2:
        Zeile1 = "Pumpe 8s";
        if (SchonAngezeigt2 == LOW)
        {
          Anzeige ();                    //Unterprogramm um Daten anzuzeigen
          SchonAngezeigt2 = HIGH;
        }
        break;
      case 3:
        Zeile1 = "Pumpe 7s";
        if (SchonAngezeigt3 == LOW)
        {
          Anzeige ();                    //Unterprogramm um Daten anzuzeigen
          SchonAngezeigt3 = HIGH;
        }
        break;
      case 4:
        Zeile1 = "Pumpe 6s";
        if (SchonAngezeigt4 == LOW)
        {
          Anzeige ();                    //Unterprogramm um Daten anzuzeigen
          SchonAngezeigt4 = HIGH;
        }
        break;
      case 5:
        Zeile1 = "Pumpe 5s";
        if (SchonAngezeigt5 == LOW)
        {
          Anzeige ();                    //Unterprogramm um Daten anzuzeigen
          SchonAngezeigt5 = HIGH;
        }
        break;
      case 6:
        Zeile1 = "Pumpe 4s";
        if (SchonAngezeigt6 == LOW)
        {
          Anzeige ();                    //Unterprogramm um Daten anzuzeigen
          SchonAngezeigt6 = HIGH;
        }
        break;
      case 7:
        Zeile1 = "Pumpe 3s";
        if (SchonAngezeigt7 == LOW)
        {
          Anzeige ();                    //Unterprogramm um Daten anzuzeigen
          SchonAngezeigt7 = HIGH;
        }
        break;
      case 8:
        Zeile1 = "Pumpe 2s";
        if (SchonAngezeigt8 == LOW)
        {
          Anzeige ();                    //Unterprogramm um Daten anzuzeigen
          SchonAngezeigt8 = HIGH;
        }
        break;
      case 9:
        Zeile1 = "Pumpe 1s";
        if (SchonAngezeigt9 == LOW)
        {
          Anzeige ();                    //Unterprogramm um Daten anzuzeigen
          SchonAngezeigt9 = HIGH;
        }
        break;
    }

    
    
    


    
    if (millis() - altMillis > Pumpenverzoegerung)  //Pumpe aus
    {
      Ereignis = "5s Automatische Pumpenabschaltung vorbei";
      Zeile1 = "Pumpe aus";
      Anzeige ();                    //Unterprogramm um Daten anzuzeigen
      digitalWrite(Pumpe, LOW);
      AutoPumpeAusErkannt = LOW;
      AutoPumpeAus = LOW;
      SchonAngezeigtLoeschen ();     //Unterprogramm aufrufen
    }
  }
}









// ab hier Unterprogramme....................................................................................


void Anzeige ()         // Unterprogramm um Daten anzuzeigen
{
  uView.begin();        // start MicroView
  uView.clear(PAGE);      // clear page
  uView.setCursor(0,0);      // set cursor at 0,0
  uView.print(Zeile1);
  uView.setCursor(0,9);     
  uView.print(Zeile2);
  uView.setCursor(0,18);     
  uView.print(Zeile3);
  uView.setCursor(0,27);     
  uView.print(Zeile4);
  uView.setCursor(0,36);     
  uView.print(Zeile5);
  uView.display();
}





void SchonAngezeigtLoeschen ()     //Unterprogramm
{
  SchonAngezeigt1 = LOW;
  SchonAngezeigt2 = LOW;
  SchonAngezeigt3 = LOW;
  SchonAngezeigt4 = LOW;
  SchonAngezeigt5 = LOW;
  SchonAngezeigt6 = LOW;
  SchonAngezeigt7 = LOW;
  SchonAngezeigt8 = LOW;
  SchonAngezeigt9 = LOW;
  SchonAngezeigt10 = LOW;
}

Jetzt also den Bewegungsmelder mit einprogrammiert.
Anzeige wird korrekt bei Bewegung ein und nach Zeitverzögerung 10s wieder ausgeschalten.

Aber was ist das: Eingang PIN1 (Spr S an) spielt IRRER IWAN !! :smiley: :astonished: :cry:

Schon nach dem Einschalten wird Spr S an als aktiv erkannt und schaltet nach ein paar Sekunden allein auf inaktiv.

An meiner Hardwarebeschaltung hat sich nix geändert. Muss also am Programm liegen.
Ich finde auch keine Überschneidung von Variablen:

Code mit Bewegungsmelder im nächsten Post - weil sonst zu lang.

#include <MicroView.h>      // include MicroView library

int Pin0 = 0;
int Pin1 = 1;
int Pin2 = 2;
int Pin3 = 3;
int Pumpe = 5;
int PirPIN = 6;               // Anschlusspin am PIR-Modul
int LED = A0;

int State0 = HIGH;
int LastState0 = HIGH;
int State1 = HIGH;
int LastState1 = HIGH;
int State2 = HIGH;
int LastState2 = HIGH;
int State3 = HIGH;
int LastState3 = HIGH;
int Pumpenverzoegerung = 10000;
int BewMeldverzoegerung = 10000;

String Zeile1;
String Zeile2;
String Zeile3;
String Zeile4;
String Zeile5;
String Zeile6;

bool AutoPumpeAus = LOW;
bool AutoPumpeAusErkannt = LOW;
bool BewegungErkannt = LOW;
bool altStatusBewegungErkannt = LOW;
bool SchonAngezeigt1 = LOW;
bool SchonAngezeigt2 = LOW;
bool SchonAngezeigt3 = LOW;
bool SchonAngezeigt4 = LOW;
bool SchonAngezeigt5 = LOW;
bool SchonAngezeigt6 = LOW;
bool SchonAngezeigt7 = LOW;
bool SchonAngezeigt8 = LOW;
bool SchonAngezeigt9 = LOW;
bool SchonAngezeigt10 = LOW;
 

unsigned long aktMillis, aktBewMillis, altMillis, printMillis, pumpenMillis;  // speichert wie viele Sekunden seit derletzten Änderung vergangen sind




void setup()
{
  Serial.begin(9600);
  
  /* Setup the pin direction. */
  pinMode(Pin0, INPUT);
  pinMode(Pin1, INPUT);
  pinMode(Pin2, INPUT);
  pinMode(Pin3, INPUT);
  pinMode(Pumpe, OUTPUT);
  pinMode(PirPIN, INPUT);
  pinMode(LED, OUTPUT);


  digitalWrite(Pumpe, LOW);
  digitalWrite(LED, LOW);
  
  uView.begin();        // start MicroView
  uView.clear(PAGE);      // clear page
  uView.setCursor(5,0);
  uView.print("Sprenger");
  uView.setCursor(12,9);
  uView.print("Pumpen-");
  uView.setCursor(5,18);
  uView.print("Steuerung");
  uView.display();
  delay(5000);
}









void loop()
{
  State0 = digitalRead (Pin0);
  State1 = digitalRead (Pin1);
  State2 = digitalRead (Pin2);
  State3 = digitalRead (Pin3);
  


  //Aktion für Pin0
  if(LastState0 == LOW && State0 == HIGH)
  {
    Zeile2 = "Spr O aus";
    LastState0 = State0;
    AutoPumpeAus = HIGH;
    SchonAngezeigtLoeschen ();     //Unterprogramm aufrufen
    Anzeige ();                    //Unterprogramm um Daten anzuzeigen
  }

  if(LastState0 == HIGH && State0 == LOW)
  {
    Zeile2 = "Spr O an";
    Zeile1 = "Pumpe an";
    LastState0 = State0;
    digitalWrite(Pumpe, HIGH);
    AutoPumpeAus = LOW;
    AutoPumpeAusErkannt = LOW;
    Anzeige ();                    //Unterprogramm um Daten anzuzeigen
  }



  //Aktion für Pin1
  if(LastState1 == LOW && State1 == HIGH)
  {
    Zeile3 = "Spr S aus";
    LastState1 = State1;
    AutoPumpeAus = HIGH;
    SchonAngezeigtLoeschen ();     //Unterprogramm aufrufen
    Anzeige ();                    //Unterprogramm um Daten anzuzeigen
  }

  if(LastState1 == HIGH && State1 == LOW)
  {
    Zeile3 = "Spr S an";
    Zeile1 = "Pumpe an";
    LastState1 = State1;
    digitalWrite(Pumpe, HIGH);
    AutoPumpeAus = LOW;
    AutoPumpeAusErkannt = LOW;
    Anzeige ();                    //Unterprogramm um Daten anzuzeigen
  }

  

  
  //Aktion für Pin2
  if(LastState2 == LOW && State2 == HIGH)
  {
    Zeile4 = "Spr W aus";
    LastState2 = State2;
    AutoPumpeAus = HIGH;
    SchonAngezeigtLoeschen ();     //Unterprogramm aufrufen
    Anzeige ();                    //Unterprogramm um Daten anzuzeigen
  }

  if(LastState2 == HIGH && State2 == LOW)
  {
    Zeile4 = "Spr W an";
    Zeile1 = "Pumpe an";
    LastState2 = State2;
    digitalWrite(Pumpe, HIGH);
    AutoPumpeAus = LOW;
    AutoPumpeAusErkannt = LOW;
    Anzeige ();                    //Unterprogramm um Daten anzuzeigen
  }




  //Aktion für Pin3
  if(LastState3 == LOW && State3 == HIGH)
  {
    Zeile5 = "Spr N aus";
    //Zeile1 = "Pumpe aus";
    LastState3 = State3;
    AutoPumpeAus = HIGH;
    SchonAngezeigtLoeschen ();     //Unterprogramm aufrufen
    Anzeige ();                    //Unterprogramm um Daten anzuzeigen
  }

  if(LastState3 == HIGH && State3 == LOW)
  {
    Zeile5 = "Spr N an";
    Zeile1 = "Pumpe an";
    LastState3 = State3;
    digitalWrite(Pumpe, HIGH);
    AutoPumpeAus = LOW;
    AutoPumpeAusErkannt = LOW;
    Anzeige ();                    //Unterprogramm um Daten anzuzeigen
  }




  //Automatische Pumpenabschaltung nach Zeit
  if(AutoPumpeAus == HIGH)
  {
    if(AutoPumpeAusErkannt == LOW)
    {
      aktMillis = millis();
      altMillis = aktMillis;
      AutoPumpeAusErkannt = HIGH;
    }
   
    
    switch ((millis() - altMillis)/1000)
    {
      case 1:
        Zeile1 = "Pumpe 9s";
        if (SchonAngezeigt1 == LOW)
        {
          Anzeige ();                    //Unterprogramm um Daten anzuzeigen
          SchonAngezeigt1 = HIGH;
        }
        break;
      case 2:
        Zeile1 = "Pumpe 8s";
        if (SchonAngezeigt2 == LOW)
        {
          Anzeige ();                    //Unterprogramm um Daten anzuzeigen
          SchonAngezeigt2 = HIGH;
        }
        break;
      case 3:
        Zeile1 = "Pumpe 7s";
        if (SchonAngezeigt3 == LOW)
        {
          Anzeige ();                    //Unterprogramm um Daten anzuzeigen
          SchonAngezeigt3 = HIGH;
        }
        break;
      case 4:
        Zeile1 = "Pumpe 6s";
        if (SchonAngezeigt4 == LOW)
        {
          Anzeige ();                    //Unterprogramm um Daten anzuzeigen
          SchonAngezeigt4 = HIGH;
        }
        break;
      case 5:
        Zeile1 = "Pumpe 5s";
        if (SchonAngezeigt5 == LOW)
        {
          Anzeige ();                    //Unterprogramm um Daten anzuzeigen
          SchonAngezeigt5 = HIGH;
        }
        break;
      case 6:
        Zeile1 = "Pumpe 4s";
        if (SchonAngezeigt6 == LOW)
        {
          Anzeige ();                    //Unterprogramm um Daten anzuzeigen
          SchonAngezeigt6 = HIGH;
        }
        break;
      case 7:
        Zeile1 = "Pumpe 3s";
        if (SchonAngezeigt7 == LOW)
        {
          Anzeige ();                    //Unterprogramm um Daten anzuzeigen
          SchonAngezeigt7 = HIGH;
        }
        break;
      case 8:
        Zeile1 = "Pumpe 2s";
        if (SchonAngezeigt8 == LOW)
        {
          Anzeige ();                    //Unterprogramm um Daten anzuzeigen
          SchonAngezeigt8 = HIGH;
        }
        break;
      case 9:
        Zeile1 = "Pumpe 1s";
        if (SchonAngezeigt9 == LOW)
        {
          Anzeige ();                    //Unterprogramm um Daten anzuzeigen
          SchonAngezeigt9 = HIGH;
        }
        break;
    }

    
    
    


    
    if (millis() - altMillis > Pumpenverzoegerung)  //Pumpe aus
    {
      Zeile1 = "Pumpe aus";
      Anzeige ();                    //Unterprogramm um Daten anzuzeigen
      digitalWrite(Pumpe, LOW);
      AutoPumpeAusErkannt = LOW;
      AutoPumpeAus = LOW;
      SchonAngezeigtLoeschen ();     //Unterprogramm aufrufen
    }
  }





  // Verriegelungszeit Bewegungsmelder
  if (digitalRead(PirPIN) == HIGH)
  {
    Serial.println ("Bewegung auf HIGH");
    aktBewMillis = millis();
    if (altStatusBewegungErkannt == LOW)
    {
      Serial.println ("Beschreibe Display");
      Anzeige ();                    //Unterprogramm um Daten anzuzeigen
      //BewegungErkannt = HIGH;
      digitalWrite(LED,HIGH);
      altStatusBewegungErkannt = HIGH;  //nur ein Durchlauf
    }
  }
  if (millis() - aktBewMillis > BewMeldverzoegerung)  // Bewegungsmelder aus
  {
    uView.begin();        // start MicroView
    uView.clear(PAGE);      // clear page
    uView.display();
    //BewegungErkannt = LOW;
    altStatusBewegungErkannt = LOW;
    digitalWrite(LED,LOW);
    Serial.println ("Bewegung auf LOW");
    //delay(2000);
  }





  
}









// ab hier Unterprogramme....................................................................................


void Anzeige ()         // Unterprogramm um Daten anzuzeigen
{
  uView.begin();        // start MicroView
  uView.clear(PAGE);      // clear page
  uView.setCursor(0,0);      // set cursor at 0,0
  uView.print(Zeile1);
  uView.setCursor(0,9);     
  uView.print(Zeile2);
  uView.setCursor(0,18);     
  uView.print(Zeile3);
  uView.setCursor(0,27);     
  uView.print(Zeile4);
  uView.setCursor(0,36);     
  uView.print(Zeile5);
  uView.display();
}





void SchonAngezeigtLoeschen ()     //Unterprogramm
{
  SchonAngezeigt1 = LOW;
  SchonAngezeigt2 = LOW;
  SchonAngezeigt3 = LOW;
  SchonAngezeigt4 = LOW;
  SchonAngezeigt5 = LOW;
  SchonAngezeigt6 = LOW;
  SchonAngezeigt7 = LOW;
  SchonAngezeigt8 = LOW;
  SchonAngezeigt9 = LOW;
  SchonAngezeigt10 = LOW;
}

Nu brat mir einer 'nen Storch !!! :smiley: :astonished:

Es scheint am "Serial.println" zu liegen.

Das funktioniert:

  // Verriegelungszeit Bewegungsmelder
  if (digitalRead(PirPIN) == HIGH)
  {
    //Serial.println ("Bewegung auf HIGH");
    aktBewMillis = millis();
    if (altStatusBewegungErkannt == LOW)
    {
      //Serial.println ("Beschreibe Display");
      Anzeige ();                    //Unterprogramm um Daten anzuzeigen
      //BewegungErkannt = HIGH;
      digitalWrite(LED,HIGH);
      altStatusBewegungErkannt = HIGH;  //nur ein Durchlauf
    }
  }
  if (millis() - aktBewMillis > BewMeldverzoegerung)  // Bewegungsmelder aus
  {
    uView.begin();        // start MicroView
    uView.clear(PAGE);      // clear page
    uView.display();
    //BewegungErkannt = LOW;
    altStatusBewegungErkannt = LOW;
    digitalWrite(LED,LOW);
    //Serial.println ("Bewegung auf LOW");
    //delay(2000);
  }

Hier gibt es irren Iwan:

  // Verriegelungszeit Bewegungsmelder
  if (digitalRead(PirPIN) == HIGH)
  {
    Serial.println ("Bewegung auf HIGH");
    aktBewMillis = millis();
    if (altStatusBewegungErkannt == LOW)
    {
      Serial.println ("Beschreibe Display");
      Anzeige ();                    //Unterprogramm um Daten anzuzeigen
      //BewegungErkannt = HIGH;
      digitalWrite(LED,HIGH);
      altStatusBewegungErkannt = HIGH;  //nur ein Durchlauf
    }
  }
  if (millis() - aktBewMillis > BewMeldverzoegerung)  // Bewegungsmelder aus
  {
    uView.begin();        // start MicroView
    uView.clear(PAGE);      // clear page
    uView.display();
    //BewegungErkannt = LOW;
    altStatusBewegungErkannt = LOW;
    digitalWrite(LED,LOW);
    Serial.println ("Bewegung auf LOW");
    //delay(2000);
  }

Wenn ich "Serial.println" rausnehme ist auch der irre Iwan weg. Häää?! :o Hat schon mal jemand sowas gehabt?

Stoni geht ein Licht auf! Ja, sowas passiert manchmal auch... :grin:

Lt. Pin-Configuration ist auf Pin1 auch TXD. Bei Serial.println sende ich also an den Pin1 Daten welche von meinem Programm registriert wurden und den irren Iwan auslösten.

Also alles Physik und keine versteckte Kamera! :grin: Aber erst mal drauf kommen...