Bewegungsmelder

Langsam nimmt das Projekt fahrt auf.

Meinen Bewegungsmelder kann ich programmieren und auch temporär nutzen.

loop code

  get_bmp280();
  delay(2000);
  get_dht22();
  delay(2000); 
  get_mq135();
  delay(2000); 
  get_bewegungsmelder();

Bewegungsmeldercode

void get_bewegungsmelder(){
  val = digitalRead(DIN2);
  Serial.println(val, DEC);
  if(val >0)
  {
    get_oled();
  }
  else
  {
    get_mq135();
  }

}

Es schaltet um.

Nun möchte ich aber das Bewegungsmeldersignal so nutzen, das 5 Minuten das Display angeht und dann wieder ausgeht. Der restliche Code, also Anzeigewechsel soll aber weiterlaufen.

Wie mache ich das am besten.

Kann ich überhaupt ein Display einfach Ein-/Ausschalten?

Martin

Wenn Du mehrere unabhängige Sachen machen willst, solltest Du Dich zuerst von den ganzen Delay verabschieden, sonst wird das nichts.
Ob die Displaybeleuchtung schaltbar ist, hängt vom Display ab. Da sollte ein Blick ins Datenblatt die Informationen geben können.

Gruß Tommy

Darter69:
Langsam nimmt das Projekt fahrt auf.

Das bezweifel ich.

Bei den delays, die du verwendest, wird der Controller ja ständig ausgebremst.
Für einen Loopdurchlauf braucht der 6 Sekunden, das ist ziemlich langsam.

Und poste immer kompletten Sketch, mit Fragmenten können wir nichts anfangen und somit auch nicht helfen.

Der Code ist unterteilt in mehrere Reiter. Müsste also alle Reiter als einzelnen Code auflisten.

Delay löschen, wie kriege ich dann den Zeitwechsel vom Display.

Nach jedem Delay wechselt die Anzeige

Grunddefinition

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h> // OLED
#include <Adafruit_SSD1306.h> // OLED
#include <DHT.h>
#include "MQ135.h"
#include "cactus_io_BME280_I2C.h"

// bmp280
BME280_I2C bme(0x76);  // I2C address = 0x76

// mq135
int sensorValue;
MQ135 gasSensor = MQ135(A2);
float rzero = gasSensor.getRZero();
int ppm = gasSensor.getPPM();

// Oled-Display
#define OLED_RESET 4 // OLED
Adafruit_SSD1306 display(OLED_RESET); // OLED

#if (SSD1306_LCDHEIGHT != 64) // OLED
#error("Height incorrect, please fix Adafruit_SSD1306.h!"); // OLED
#endif // OLED

// DHT22
#define DHTPIN A0                                           
#define DHTTYPE DHT22                                      
DHT dht(DHTPIN, DHTTYPE);
                                
// tempberechnung
float temp;
float humi;

// bewegungsmelder
int DIN2 = 2; 
int val = 0;

Setup

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

//  get_bewegungsmelder(); 
   
  display.begin(SSD1306_SWITCHCAPVCC); // OLED
  if (!bme.begin()) {
    Serial.println("Could not receive values from sensor");
    while (1);
  }
}

Loop

void loop() {

  get_bmp280();
  delay(2000);
  get_dht22();
  delay(2000); 
  get_mq135();
  delay(2000); 
//  get_bewegungsmelder();
}

BMP

void get_bmp280() {
  bme.readSensor();
  display.clearDisplay(); //Display leeren
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.setCursor(0,0);
  display.print("Temp:");
  display.println(bme.getTemperature_C(),1); // neu
  display.setCursor(0,18);
  display.print("Luft:");
  display.println(bme.getHumidity(),1); // neu
  display.setCursor(0,36);
  display.print("Druck:");
  display.println(bme.getPressure_HP() / 100, 0); // neu
  display.display();
}

DHT22

void get_dht22(){
  display.clearDisplay(); // OLED Display leeren
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.setCursor(0,0);
  display.print("Temp:");
  display.println(dht.readTemperature(),1); // neu
  display.setCursor(0,18);
  display.print("Luft:");
  display.println(dht.readHumidity(),1); // neu
//  get_bmp280();
  display.display();
}

MQ135

void get_mq135(){
  sensorValue = analogRead(A2);
  float rzero = gasSensor.getRZero();
  int pindigi = 2;
  display.clearDisplay();
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.setCursor(0,0);
  display.print("CO2:");
  display.println((String)sensorValue); // neu
  display.display();
}

Die Codefragmente sollten so sein, macht für mich die Sache übersichtlicher wenn ich die Sensoren anpassen will, oder später mehrere unterschiedliche Standorte mit Display habe.

Anstatt der delays kannst du die Funktion "millis()" verwenden.
Dazu sieh dir "BlinkWithoutDelay" an.
Aber warum du den kleinen Sketch auf verschiedene Tabs verteilst,, kann ich nicht verstehen.

Einzelne von diesen Modulen werden auf verschiedenen Systemen laufen.

Mit dieser Aufteilung habe ich es einfacher, wenigstens im Moment, die einzelnen Systeme zu programmieren.

Am Schluss wird jedes System über Funk/WLAN auf einem Grundsystem vereint. Natürlich dann auch einzelne Systeme zum auswählen.

Darter69:
Delay löschen, wie kriege ich dann den Zeitwechsel vom Display.

Wenn Du hier im Forum nach "agmue anleitung" suchst, stößt Du auf mein möglicherweise hilfreiches Geschreibsel und Links zu anderen Erklärungen wie die beliebte vom Nachtwächter.

Neben millis benötigst Du wahrscheinlich auch noch eine Ablaufsteuerung.