Display mit mehreren Seiten für Sensoren

Hallo,

ich habe das Grove Beginner Kit mit 0,96" OLED Display und einen DHT11 (Temperatur- und Luftfeuchtigkeitssensor).

Nun möchte ich, dass die Werte auf dem Display angezeigt werden aber nur ein Wert pro Seite. Um von einer Seite zur nächsten zu kommen habe ich noch einen Button.

Mein Problem: Die Messwerte aktualisieren sich ein Mal, wenn man auf die Seite geht aber dann nicht mehr.
Wie kann ich dafür sorgen, dass die Werte in regelmäßigem Abstand abgefragt und angezeigt werden?

Code:

#include "DHT.h"
#include <Arduino.h>
#include <U8x8lib.h>
#define DHTPIN 3 // what pin we're connected to
#define DHTTYPE DHT11 // DHT 11
DHT dht(DHTPIN, DHTTYPE);
U8X8_SSD1306_128X64_ALT0_HW_I2C u8x8(U8X8_PIN_NONE);

int Button = 6;
int menu = 0;

void setup(void)
{
Serial.begin(9600);
Serial.println("DHTxx test!");
dht.begin();
u8x8.begin();
u8x8.setPowerSave(0);
u8x8.setFlipMode(1);
pinMode(Button, INPUT);
updateMenu();
}

void loop(void)
{
float AirPres, Light, Sound;
u8x8.setFont(u8x8_font_amstrad_cpc_extended_r);

if (!digitalRead(Button)){
menu++;
updateMenu();
delay(100);
while (!digitalRead(Button));
}
}

void updateMenu() {
switch (menu) {
case 0:
menu = 1;
break;

case 1:
  int temp;
  u8x8.clear();
  u8x8.print("Lufttemp");
  u8x8.setCursor(0, 33);
  u8x8.print("Temp:");
  temp = dht.readTemperature();
  u8x8.print(temp);
  u8x8.print("C");
//  u8x8.refreshDisplay();
  delay(50);
  break;
  
case 2:
  int humi;
  u8x8.clear();
  u8x8.print("Luftfeuchtigkeit");
  u8x8.setCursor(0, 33);
  u8x8.print("Feuchte:");
  humi = dht.readHumidity();
  u8x8.print(humi);
  u8x8.print("%");
 // u8x8.refreshDisplay();
  delay(100);
  break;
  
case 3:
  menu = 0;
  break; }}

Das hier:

  if (!digitalRead(Button))
  {
    menu++;
    updateMenu();

nicht auf das lesen der Taste beschränken, sondern umlaufend updateMenu() aufrufen.

Nur als Vorsichtsmassnahme: Damit allein ist es nicht getan.

Da Du wartest solange die Taste gedrückt ist updatest Du das Display nicht.

Du mußt nicht blockierend programmieren und die Messung und Darstellung regelmäßig aufrufen.

Grüße Uwe

Danke für die Tips soweit!
Ich bin noch komplett am lernen und weiß nicht so genau was "nicht blockierend" gemeint ist.
Ich denke mal, dass du meinst, dass ich in der if-Schleife nur die Aktion des Buttons habe und hier noch eine weitere Aktion (Sensorabfrage) einbringen muss.

Allerdings habe ich keine Idee, wie das geht.

Könnt ihr mir auf die Sprünge helfen?

Evtl. hilft das hier.
Gruß
Gregor

Um Dein Programm vernüftig darzustellen, solltest Du die in diesem Forum verfügbaren Code-Tags verwenden. Das hilft den Helfenden!

Hallo

Suche "arduino flanken zählen"

da findest Du

#3 macht genau das was Du benötigst um Deine Variable menu hoch zählen zu lassen
Heinz

Ein Vorschlag ohne Sensoren und mit meinem Display:

//#include "DHT.h"
//#include <Arduino.h>
#include <U8x8lib.h>
#define DHTPIN 3 // what pin we're connected to
#define DHTTYPE DHT11 // DHT 11
//DHT dht(DHTPIN, DHTTYPE);
//U8X8_SSD1306_128X64_ALT0_HW_I2C u8x8(U8X8_PIN_NONE);
U8X8_SSD1306_128X64_NONAME_HW_I2C u8x8(U8X8_PIN_NONE);

const uint8_t tasterPin = 6;
uint8_t menu = 0;
boolean altTaster; // zum erkennen der Änderung
uint32_t jetzt;

void setup(void)
{
  Serial.begin(9600);
  Serial.println("DHTxx test!");
  //dht.begin();
  u8x8.begin();
  u8x8.setPowerSave(0);
  u8x8.setFont(u8x8_font_amstrad_cpc_extended_r);
  u8x8.setFlipMode(1);
  pinMode(tasterPin, INPUT_PULLUP);
}

void loop(void)
{
  jetzt = millis();
  static uint32_t vorhin;
  const uint32_t intervall = 50;
  boolean aktTaster = digitalRead(tasterPin);
  if ( (jetzt - vorhin >= intervall) && (altTaster != aktTaster) ) {
    altTaster = aktTaster;
    vorhin = jetzt;
    if ( !aktTaster ) {
      if (++menu > 2) menu = 1;
      u8x8.clear();
    }
  }
  updateMenu();
}

void updateMenu() {
  static uint32_t vorhin;
  const uint32_t intervall = 200;
  if (jetzt - vorhin >= intervall) {
    vorhin = jetzt;
    switch (menu) {
      case 1:
        int temp;
        u8x8.setCursor(0, 0);
        u8x8.print("Lufttemp");
        u8x8.setCursor(0, 1);
        u8x8.print("Temp: ");
        temp = random(15, 25);  //dht.readTemperature();
        u8x8.print(temp);
        u8x8.print("C");
        break;

      case 2:
        int humi;
        u8x8.setCursor(0, 0);
        u8x8.print("Luftfeuchtigkeit");
        u8x8.setCursor(0, 1);
        u8x8.print("Feuchte: ");
        humi = random(40, 50);  //dht.readHumidity();
        u8x8.print(humi);
        u8x8.print("%");
        break;

      default:
        menu = 1;
    }
  }
}

Vielen Dank für den Code! Ich habe ihn nun etwas geändert und er läuft richtig gut :slight_smile:

Danke für die Rückmeldung!