Arduino Sleep Mode funktioniert nicht zuverlässig

Liebes Forum,
ich bin neu hier. Ich habe nun schon eine Menge mitgelesen, nun sitze ich vor meinem ersten "Problem" und hoffe es weiß jemand rat. Ich habe inzwischen einiges an Code Umstellung und Variablen-Änderungen ausprobiert, aber es findet sich keine Lösung da ich den Fehler nicht klar reproduzieren kann und es mehr wie ein Zufall wirkt (Wäre komisch, scheint aber so).

Zum Projekt/Idee:
Ich habe im Keller einen Pufferspeicher stehen (speichert warmes Wasser in unterschiedlichen Schichten/Temperaturen). Dieser bekommt sein warmes Wasser aus einem Kaminofen im Erdgeschoss. Wenn der Ofen brennt wird durch Pumpen kaltes Wasser unten aus dem Speicher entnommen und als warmes Wasser wieder oben "aufgeschichtet". Im Idealfall heize ich den Ofen nur solange bis ausreichend warmes Wasser im Speicher vorhanden ist. ->dieser versorgt dann die Heizkreise im Haus mit Wärme durch entnähme des warmen Wassers oben und zurückgeben des kalten Wassers unten.

Ich würde gerne am Speicher 8 Messpunkte mit Thermistoren anlegen. Diese werden dann vom Arduino in Celsius Temperaturen umgerechnet und einmal in der seriellen Schnittstelle ausgegeben, sowie je Messpunkt an einer RGB-LED in einer Farbrange von Blau (0°C) bis Rot (100°C). Diese sollen später im Erdgeschoss den Speicher Füllstand als Farbverlauf anzeigen. Aktuell arbeite ich mit RGB-LED später soll es ein adressable RGB-Strip werden.
Das hat auch alles funktioniert -> Nun möchte ich aber das es nur angezeigt wird wenn ich eine Abfrage im EG mache. Dazu habe ich einen Infrarot Obstacle Avoidance Module an PIN 2, sowie die sleep Funktion verwendet.

Das funktioniert auch ab und zu. Manchmal schaltet das Board aber ab und die RGB-LED leuchtet noch blau oder blau+rot. Wenn man den Näherungssensor aktiviert springt es immer auf die richtige Farbe, aber es geht eben nicht immer aus, tut es auch ab und zu, aber eben nicht zuverlässig.

#include <avr/sleep.h>
#define beta 3950 // beta des thermistor 
#define resistance 10 //the value of the pull-up resistor
#define INT_PIN 2

/* Hier werden alle 8 LED definiert (aktuell nur 1 in Verwendung) */
byte R_1, G_1, B_1;
byte R_2, G_2, B_2;
byte R_3, G_3, B_3;
byte R_4, G_4, B_4;
byte R_5, G_5, B_5;
byte R_6, G_6, B_6;
byte R_7, G_7, B_7;
byte R_8, G_8, B_8;


void INT_PINisr(void)
  /* ISR fuer Pin 2 */
  {
  /* detach Interrupt, damit er nur einmal auftritt */
  detachInterrupt(0);
  }

void enter_sleep(void)
  {
  attachInterrupt(0, INT_PINisr, LOW);
  /* Arduino schlafen legen */
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);
  sleep_enable();
  sleep_mode();
  sleep_disable(); 
  }


void setup() {
  Serial.begin(9600);

  Serial.println("Starte ...");
  /* Pin 2 als Interrupt-Pin, Pullup einschalten */
  pinMode(INT_PIN, INPUT);
  digitalWrite(INT_PIN, HIGH); 
  Serial.println("Init erfolgt ...");
  delay(100);
}


void loop()
    {  
      /* warten, bis der Interrupt-Eingang wieder frei ist */
  while (digitalRead(INT_PIN) == LOW)
    {
  Serial.println("*** Schalte ab in spätestens 5 Sekunden ***");  
  delay(5000);
       }
  Serial.println("Abfrage beendet");  
  delay(100);
  enter_sleep();
  
  Serial.println("Abfrage gestartet");  
  delay(100);
  
      /* Messung und Ausgabe LED1 */
pinMode(R_1, OUTPUT); // Rote LED als Ausgabe
pinMode(G_1, OUTPUT); // Grüne LED als Ausgabe - aktuell nicht in Verwendung
pinMode(B_1, OUTPUT); // Blaue LED als Ausgabe
   
   long a_1 = analogRead(A0);

    int temperature_1 = (beta / (log((1025.0 * 10 / a_1 - 10) / 10) + beta / 298.0) - 273.0) * 2.55 ;  // Berechnung auf Celcius in Scala 255
    G_1 = 0;
    R_1 = 255-temperature_1;  // 255 für 100°C, 0 für 0°C
    B_1 = temperature_1/2.55;  // 0 für 100°C, 255 für 0°C

    float temp_1 = beta / (log((1025.0 * 10 / a_1 - 10) / 10) + beta / 298.0) - 273.0;
    Serial.print("Die Temperatur an Messpunkt 1 beträgt: "); 
    Serial.print(temp_1); Serial.println("° Celsius");
    delay(200);

   analogWrite( 9, R_1);
   analogWrite(10, G_1);
   analogWrite(11, B_1);

   }

Wenn ich es so zum laufen bekomme wurde ich im nächsten Schritte auf adressable RGB-Strip umstellen und dann die Kommunikation zwischen Keller und EG per Bluetooth lösen.

Ziel:
1 Board im Keller mit 8 analogen Ports mit Thermistoren + Bluetooth-Sender
1 Board im EG mit Näherungssensor und RGB-Strip + Bluetooth-Empfänger

Aber Schritt für Schritt ist mein erstes "Projekt"....

Ich hoffe damit kann man etwas anfangen und ich habe weder zu kurz noch zu lang beschrieben.

finnster:
ich bin neu hier. Ich habe nun schon eine Menge mitgelesen,

Das Eine schliesst das Andere leider aus - ok. schaun wa ma..

Was ich nicht verstehe: Was willst Du damit bezwecken?

  pinMode(INT_PIN, INPUT);
  digitalWrite(INT_PIN, HIGH);

Zudem:

    Serial.println("*** Schalte ab in spätestens 5 Sekunden ***");
    delay(5000);
  }
  Serial.println("Abfrage beendet");
  delay(100);
  enter_sleep();

NÖ!
Nach dem Serial.println wartet der MINDESTENS 5 Sekunden Dann noch 0,1sek und dann sleep.

Und rein aus eigener Erfahrung nur als Hinweis: // 255 für 100°C, 0 für 0°C
Bei 100 Grad ist es zu spät.

      /* Messung und Ausgabe LED1 */

pinMode(R_1, OUTPUT); // Rote LED als Ausgabe
pinMode(G_1, OUTPUT); // Grüne LED als Ausgabe - aktuell nicht in Verwendung
pinMode(B_1, OUTPUT); // Blaue LED als Ausgabe

Das ist leider Unsinn!

 pinMode(INT_PIN, INPUT);

digitalWrite(INT_PIN, HIGH);

Das ist hingegen korrekt!

Wobei ich aber
pinMode(INT_PIN, INPUT_PULLUP);
schreiben würde.

aber es geht eben nicht immer aus,

Kein Wunder!
Wird ja auch nirgendwo aus gemacht.

combie:

          /* Messung und Ausgabe LED1 */

pinMode(R_1, OUTPUT); // Rote LED als Ausgabe
   pinMode(G_1, OUTPUT); // Grüne LED als Ausgabe - aktuell nicht in Verwendung
   pinMode(B_1, OUTPUT); // Blaue LED als Ausgabe




Das ist leider Unsinn!

Warum ist das Unsinn ?
Die Definition ist doch korrekt, einzig die Kommentare sind evtl. nicht passend.

Nein, er füllt R_1, G_1 & B_1 mit den Werten von 0-255.
Damit würde er dann 255 als Output setzen.
Zwar erst später, da die Reihenfolge von Delay, Deepsleep und Auslesen & Darstellen der Werte wild durcheinander ist, aber falsch ist es so oder so.

Also sobald er die Reihenfolge der Anweisungen auf Linie bringt, knallt es!

Abgesehen davon, dass das Setzen als Output einmalig im Setup() ausreichend wäre und nicht laufend im loop geschehen müsste.

TriB:
Nein, er füllt R_1, G_1 & B_1 mit den Werten von 0-255.
Damit würde er dann 255 als Output setzen.
Zwar erst später, da die Reihenfolge von Delay, Deepsleep und Auslesen & Darstellen der Werte wild durcheinander ist, aber falsch ist es so oder so.

Also sobald er die Reihenfolge der Anweisungen auf Linie bringt, knallt es!

Abgesehen davon, dass das Setzen als Output einmalig im Setup() ausreichend wäre und nicht laufend im loop geschehen müsste.

Genau diese Aussage fehlt im obigen Kontex.
Ein Anfänger kann so wie von combie geschrieben, nichts anfangen.

Deswegen meine Anmerkung auch mit der Definition.

Welchen Näherungssensor hast Du?

pinMode() bei analogWrite() braucht es nicht.

/* Hier werden alle 8 LED definiert (aktuell nur 1 in Verwendung) */
byte R_1, G_1, B_1;
byte R_2, G_2, B_2;
byte R_3, G_3, B_3;
byte R_4, G_4, B_4;
byte R_5, G_5, B_5;
byte R_6, G_6, B_6;
byte R_7, G_7, B_7;
byte R_8, G_8, B_8;

Bitte verwende ein array dann kannst Du die Abfrage und ausgabe über eine schleife und nicht über spaghetticode machen.
Grüße Uwe

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