Problem mit dem Sleep Mode

Guten Tag
ich habe ein Problem mit dem #aufbau eines Sketches. Hintergrund: ich möchte ein Relais über eine Lichtschranke steuern nach dem Auslösen der Lichtschranke geht eine LED an und ein Relais wird geschaltet danach geht der Arduino Nano schlafen bis er wieder durch einen externen Interupt geweckt wird. dann beginnt die loop funktion von vorn . jetzt das problem . bei einer Lichtschranke und einem relais funktioniert der Sketch super möchte ich aber den Sketch anpassen und ein zweites relais schalten geht nichts mehr ........ich möchte euch bitten mal einen Blick auf den Sketch zu werfen und mir Hinweise zu geben was ich übersehen habe. Ich bin für alles dankbar...
Sketch mit einem Relais:

#include <avr/sleep.h>
#include <avr/power.h>
int ledPin = 9;
int sensorValue = 0;
int lichtschranke = A0;
int relais1 = 8;
unsigned long previousTime = 0;
unsigned long interval = 5000;
void setup() {
Serial.begin(9600);
pinMode(ledPin, OUTPUT);
pinMode(lichtschranke, INPUT);
pinMode(relais1, OUTPUT);

attachInterrupt(0, interrupt, RISING);
}
void loop() {
checkLichtschranke();
digitalWrite(relais1, LOW);
}
void interrupt() {
// leere Interruptfunktion
}
void checkLichtschranke() {
unsigned long currentTime = millis();
sensorValue = analogRead(lichtschranke);
Serial.println(sensorValue);
if (sensorValue >= 500) {
digitalWrite(ledPin, HIGH);
digitalWrite(relais1, HIGH);

delay(10000);

digitalWrite(ledPin, LOW);

enterSleep();


}
}
void enterSleep() {
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
sleep_enable();
sleep_mode();
sleep_disable();
power_all_enable();
}

Sketch der nicht funktioniert

#include <avr/sleep.h>
#include <avr/power.h>
int ledPin = 9;
int ledPin2 = 10;
int sensorValue1 = 0;
int sensorValue2 = 0;
int lichtschranke1 = A0;
int lichtschranke2 = A2;
int relais1 = 8;
int relais2 = 6;
unsigned long previousTime = 0;
unsigned long interval = 5000;
boolean lichtschranke1Triggered = false;
boolean lichtschranke2Triggered = false;
void setup() {
Serial.begin(9600);
pinMode(ledPin, OUTPUT);
pinMode(ledPin2, OUTPUT);
pinMode(lichtschranke1, INPUT);
pinMode(lichtschranke2, INPUT);
pinMode(relais1, OUTPUT);
pinMode(relais2, OUTPUT); }
void loop() {
if (lichtschranke1Triggered && lichtschranke2Triggered) {
runLogic();
} }
void runLogic() {
// Logic to run when both light barriers are triggered
sensorValue1 = analogRead(lichtschranke1);
Serial.print("Lichtschranke 1: ");
Serial.println(sensorValue1);
if (sensorValue1 >= 500) {
digitalWrite(ledPin, HIGH);
digitalWrite(relais1, HIGH);
delay(10000);
digitalWrite(ledPin, LOW);
digitalWrite(relais1, LOW);
enterSleep(); }
sensorValue2 = analogRead(lichtschranke2);
Serial.print("Lichtschranke 2: ");
Serial.println(sensorValue2);
if (sensorValue2 >= 500) {
digitalWrite(ledPin2, HIGH);
digitalWrite(relais2, HIGH);
delay(10000);
digitalWrite(ledPin2, LOW);
digitalWrite(relais2, LOW);
enterSleep(); } }
void enterSleep() {
lichtschranke1Triggered = false;
lichtschranke2Triggered = false;
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
sleep_enable();
sleep_mode();
sleep_disable();
power_all_enable();
}

danke schonmal

Im englischen Teil des Forum müssen die Beiträge und Diskussionen in englischer Sprache verfasst werden. Deswegen wurde diese Diskussion in den deutschen Teil des Forums verschoben.

mfg ein Moderator.

Der AVR wird durch Interrupts geweckt.
Sowas sehe ich da nicht.

Hallo,
ich hab jetzt den Sleepmodus bei einem Nano noch nie probiert, aber warum willst Du das so machen ?
Aber schau mal hier
https://elektro.turanis.de/html/prj270/index.html

vielen dank für eure unterstützung das Beispiel ist gut und auch nützlich was ich nicht hinbekomme ist eine weitere lichtschranke und ein relais zu intergrieren an dieser stelle komme ich nicht weiter ich habe nun schon so lange die verschiedenen möglichkeiten probiert das ich mittlerweile betriebsblind bin der hinweis mit dem interrupt von combi ist gut habe den sketch angepasst allerdings gehts immer noch nicht ...................

#include <avr/sleep.h>
#include <avr/power.h>



const int lichtschrankePin = A0;   // Pinnummer der Lichtschranke
const int relaisPin1 = 8;          // Pinnummer des Relais
const int ledPin1 = 9;             // Pinnummer der LED

const int lichtschrankePin2 = A2;   // Pinnummer der Lichtschranke
const int relaisPin2 = 6;          // Pinnummer des Relais
const int ledPin2 = 10;             // Pinnummer der LED


void setup() {
  pinMode(lichtschrankePin, INPUT);
  pinMode(relaisPin1, OUTPUT);
  pinMode(ledPin1, OUTPUT);

   pinMode(lichtschrankePin2, INPUT);
  pinMode(relaisPin2, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  
 attachInterrupt(0, interrupt, RISING);

}

void interrupt() {
  // leere Interruptfunktion
}

void checkLichtschranke2() { 

  int sensorValue2 = analogRead(lichtschrankePin2);
  Serial.println(sensorValue2);
 
    if (sensorValue2 >= 500) {
    digitalWrite(ledPin2, HIGH);
    digitalWrite(relaisPin2, HIGH);
   
  delay(10000);     
     
      digitalWrite(ledPin2, LOW);
        
    
  } 
}

void checkLichtschranke() {
  
  int sensorValue = analogRead(lichtschrankePin);
  Serial.println(sensorValue);  

  if (sensorValue >= 500) {
    digitalWrite(ledPin1, HIGH);
    digitalWrite(relaisPin1, HIGH);
  
   
  delay(10000);  
   
      digitalWrite(ledPin1, LOW);
         
    
  } 

}


void loop() {
  checkLichtschranke();
  checkLichtschranke2();

}

void enterSleep() {
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);
  sleep_enable();
  sleep_mode();
  sleep_disable();
  power_all_enable();
}

Ist auf deiner Tastatur die Taste [.] mit dem Punkt defekt?

nein aber danke für den hinweis gibt es einen Hinweis was mein problem lösen könnte?

Wieso? sind doch jede Menge '.' am Ende seines Texts versammelt vohanden.

1 Like

gut zu lesen das meine punkte so interessant sind aber mein eigentliches problem löst das nicht :slightly_smiling_face:

Da hast Du Recht, dass das Dein Problem nicht löst. Deine Aussage, dass der Skech immer noch nicht funktioniert , ist etwas dürftig. Was genau funktioniert nicht? Kompiliert der Sketch ohne Fehlermeldung? Wenn ja, was Macht der Sketch, und was macht er nicht? Was soll er machen?

Zeig mir doch mal in Deinem Sketch, wie Du den Nano aus dem Sleep aufweckst.

der sketch kompiliert ohne fehler
die funktion soll sein : eine lichtschranke löst aus und schaltet ein relais und bringt eine led zum leuchten die led geht nach 30 sec aus nachdem beide lichtschranken ausgelöst haben soll der nano in den tiefschlaf gehen und erst durch ein impuls am pin 2 erwachen und alles geht von vorn los so die idee........ das programm funktioniert soweit aber der nano geht nicht in den tiefschlaf und es gibt auch keine reaktion am pin 2 .........ab hier könnte ich unterstützung gebrauchen .......

#include <avr/sleep.h>
#include <avr/power.h>

const int lichtschrankePin = A0;   // Pinnummer der Lichtschranke
const int relaisPin = 8;          // Pinnummer des Relais
const int ledPin = 9;             // Pinnummer der LED

const int lichtschrankePin2 = A4;   // Pinnummer der Lichtschranke
const int relaisPin2 = 6;          // Pinnummer des Relais
const int ledPin2 = 10;             // Pinnummer der LED

unsigned long previousMillis = 0; // speichert den Zeitpunkt an dem zuletzt geschalten wurde
const long interval = 30000; // Länge der Pause in ms
unsigned long previousMillis2 = 0; // speichert den Zeitpunkt an dem zuletzt geschalten wurde
const long interval2 = 30000; // Länge der Pause in ms

void setup() {
pinMode(lichtschrankePin, INPUT);
pinMode(relaisPin, OUTPUT);
pinMode(ledPin, OUTPUT);

pinMode(lichtschrankePin2, INPUT);
pinMode(relaisPin2, OUTPUT);
pinMode(ledPin2, OUTPUT);

digitalWrite(relaisPin, LOW);
digitalWrite(ledPin, LOW);
digitalWrite(relaisPin2, LOW);
digitalWrite(ledPin2, LOW);

attachInterrupt(0, interrupt, RISING);
}

void Relais1() {
unsigned long currentMillis = millis(); // Aktuelle Zeit wird in currentMillis gespeichert
if (currentMillis - previousMillis >= interval) { // Falls mehr als 1000 ms vergangen sind
previousMillis = currentMillis; // Zeitpunkt der letzten Schaltung wird festgehalten 
digitalWrite(ledPin, LOW);   
}               // LED ausschalten
if (digitalRead(lichtschrankePin) == HIGH) {  // Wenn Lichtschranke unterbrochen wurde
digitalWrite(relaisPin, HIGH);              // Relais schalten
digitalWrite(ledPin, HIGH);                 // LED einschalten
}
}

void Relais2() {
unsigned long currentMillis2 = millis(); // Aktuelle Zeit abrufen
if (currentMillis2 - previousMillis2 >= interval2) { // Überprüfen, ob 5 Sekunden vergangen sind
previousMillis2 = currentMillis2; // Aktuelle Zeit als letzte bekannte Zeit speichern
digitalWrite(ledPin2, LOW); // LED ausschalten
}
if (digitalRead(lichtschrankePin2) == HIGH) {  // Wenn Lichtschranke unterbrochen wurde
digitalWrite(relaisPin2, HIGH);              // Relais schalten
digitalWrite(ledPin2, HIGH);                 // LED einschalten 
}
}
void interrupt() {
  // leere Interruptfunktion
}
void loop() { 
Relais1();
Relais2();
}

void enterSleep() {
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
sleep_enable();
sleep_mode();
sleep_disable();
power_all_enable();
}

Nur für mich:

  • Wenn LS1 auslöst -> Output für 30 sekunden setzen und LS2 scharf schalten
  • Wenn LS2 auslöst -> Output für 30 sekunden setzen
  • Zeit ist abgelaufen -> Nano geht schlafen
  • PIN 2 weckt Nano auf -> Fange an von vorn.

Das macht keinen Sinn.
Wenn Du willst, dass eine beliebige LS den Nano weckt, gehört die LS auf einen Intterruptpin.
LS1 -> Pin 2
LS2 -> Pin 3
Für jeden Pin eine ISR, bei der die Startzeit gesetzt wird.
Ist die laufzeit (aktuelleZeit - startzeit >= relaiszeit) abgelaufen, geht der wieder schlafen.
So wäre mein Ansatz...

danke für die info der nano soll nicht durch die ls geweckt werden sonder nur durch einen impulse am pin 2 den impulse bekommt er durch einen anderen nano

damit legst Du den Interrupt fest. Wenn Du zwei Eingänge benutzen willst dann benötigst Du das für jeden Eingang. ich habe Dir oben einen Link angegeben das ist das beschrieben, lesen musst Du das schon selber. Allerdings kannst Du die Eingänge für den Interrupt nicht frei wählen. Die analogen Eingänge gehen gar nicht.

Nachtrag
das hat sich überschnitten

danke an alle für die Hinweise mittlerweile habe ich das problem gelöst

Es wäre schön, die Lösung für die Nachwelt hier zu veröffentlichen.

Gruß Tommy

gern kann ich den sketch für interessierte nutzer veröffentlichen er ist nicht perfekt aber funktioniert vielleicht kann jemand den sketch noch weiter optimieren .............

#include <avr/sleep.h>
#include <avr/power.h>

const int lichtschrankePin = A0;   // Pinnummer der Lichtschranke
const int relaisPin = 8;          // Pinnummer des Relais
const int ledPin = 9;             // Pinnummer der LED

const int lichtschrankePin2 = A4;   // Pinnummer der Lichtschranke
const int relaisPin2 = 6;          // Pinnummer des Relais
const int ledPin2 = 10;             // Pinnummer der LED

unsigned long previousMillis = 0; // speichert den Zeitpunkt an dem zuletzt geschalten wurde
const long interval = 30000; // Länge der Pause in ms
unsigned long previousMillis2 = 0; // speichert den Zeitpunkt an dem zuletzt geschalten wurde
const long interval2 = 30000; // Länge der Pause in ms
const int wakeUpPin = 2; // Pin zum Aufwecken des Arduinos

void setup() {
pinMode(lichtschrankePin, INPUT);
pinMode(relaisPin, OUTPUT);
pinMode(ledPin, OUTPUT);

pinMode(lichtschrankePin2, INPUT);
pinMode(relaisPin2, OUTPUT);
pinMode(ledPin2, OUTPUT);

digitalWrite(relaisPin, LOW);
digitalWrite(ledPin, LOW);
digitalWrite(relaisPin2, LOW);
digitalWrite(ledPin2, LOW);

 pinMode(wakeUpPin, INPUT); // Pin als Eingang konfigurieren
  attachInterrupt(digitalPinToInterrupt(wakeUpPin), wakeUp, RISING); // Interrupt hinzufügen
 }
void Relais1() {
unsigned long currentMillis = millis(); // Aktuelle Zeit wird in currentMillis gespeichert
if (currentMillis - previousMillis >= interval) { // Falls mehr als 1000 ms vergangen sind
previousMillis = currentMillis; // Zeitpunkt der letzten Schaltung wird festgehalten 
digitalWrite(ledPin, LOW);   
}               // LED ausschalten
if (digitalRead(lichtschrankePin) == HIGH) {  // Wenn Lichtschranke unterbrochen wurde
digitalWrite(relaisPin, HIGH);              // Relais schalten
digitalWrite(ledPin, HIGH);                 // LED einschalten
}
}
void Relais2() {
unsigned long currentMillis2 = millis(); // Aktuelle Zeit abrufen
if (currentMillis2 - previousMillis2 >= interval2) { // Überprüfen, ob 5 Sekunden vergangen sind
previousMillis2 = currentMillis2; // Aktuelle Zeit als letzte bekannte Zeit speichern
digitalWrite(ledPin2, LOW); // LED ausschalten
}
if (digitalRead(lichtschrankePin2) == HIGH) {  // Wenn Lichtschranke unterbrochen wurde
digitalWrite(relaisPin2, HIGH);              // Relais schalten
digitalWrite(ledPin2, HIGH);                 // LED einschalten 
}
}
void interrupt() {
  // leere Interruptfunktion
}
void loop() { 
Relais1();
Relais2();
}
void wakeUp() {
attachInterrupt(digitalPinToInterrupt(wakeUpPin), wakeUp, RISING); // Interrupt hinzufügen
digitalWrite(relaisPin2, LOW);  
digitalWrite(relaisPin, LOW);  
}
void enterSleep() {
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
sleep_enable();
sleep_mode();
sleep_disable();
power_all_enable();
power_adc_disable(); // ADC deaktivieren, um Energie zu sparen
power_spi_disable(); // SPI deaktivieren, um Energie zu sparen
power_timer0_disable(); // Timer0 deaktivieren, um Energie zu sparen
power_timer1_disable(); // Timer1 deaktivieren, um Energie zu sparen
power_timer2_disable(); // Timer2 deaktivieren, um Energie zu sparen
power_twi_disable(); // I2C deaktivieren, um Energie zu sparen
sleep_mode(); // In den Schlafmodus wechseln
}

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.