Durchschalten verschiedener Sensoren mit Taster

Ich habe mehrere Sensoren wie z.B ein MPU6050 Gyroskop, VL53LXX-V2 oder BMP180 und möchte diese per Tastendruck "durchschalten", d.h. drücke ich einen Button einmal, wird der erste Sensor ausgelesen, drücke ich den Button erneut, wird der zweite Sensor ausgelesen usw.
Dies soll in einem Loop funktionieren, sprich wenn der letzte Sensor erreicht wurde und der Button nochmals gedrückt wird, soll wieder der erste ausgelesen werden.
Die Werte der Sensoren sollen dabei immer auf einem 128x32 SSD1306 OLED-Display angezeigt werden und sich bei z.B Lageänderung des Gyroskops aktualisieren und direkt angezeigt werden (Der Sensorwert soll also nicht nur einmal beim Durchschalten zwischen den Sensoren aktualisiert werden).
Mein bisheriger Code sieht so aus, aktuell hänge ich an dem Punkt mit dem Durchschalten, dies funktioniert nicht und der Sensorwert des MPU6050 wird nicht dauerhaft aktualisiert.

//OLED     0x3C
//Gyroskop MPU-6050	0x68	
//GY-21		0x40	
//BMP180		0x77
//VL53 Entfernungsmesser		0x29	

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_MPU6050.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_Sensor.h>

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 32 // OLED display height, in pixels
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

Adafruit_MPU6050 mpu;

int taste = 7;
int zaehler = 0;

void setup() {
  Serial.begin(115200);
  pinMode(taste,INPUT);

  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { 
    Serial.println(F("SSD1306 allocation failed"));
    for(;;);
  }

  if (!mpu.begin()) {
  Serial.println("Sensor init failed");
  while (1)
  yield();
  }

  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setRotation(0);
  
}

void loop() {
 
  if (digitalRead(taste) == HIGH ) {
    zaehler++;
    delay(300);
    Serial.print(zaehler);

    if(zaehler==1){
    sensors_event_t a, g, temp;
    mpu.getEvent(&a, &g, &temp);
    display.clearDisplay();
    display.setCursor(0, 0);
    display.println("Accelerometer - m/s^2");
    display.print(a.acceleration.x, 1);
    display.print(", ");
    display.print(a.acceleration.y, 1);
    display.print(", ");
    display.print(a.acceleration.z, 1);
    display.println("");
    display.display();
    delay(100);
    }

    if(zaehler==2){
    display.clearDisplay();
    display.setCursor(0, 0);
    display.println("Sensor 2");
    display.display();
    }

    if (zaehler>=2){
    zaehler=1;
    
    }
  }
}

Danke schonmal im Vorraus.

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.

Schau mall nach switch case

Oben kann man auf Deutsch umschalten.

Es würde auch funktionieren wenn du die Bedingungen
if (Zaehler == 1 )
if (Zaehler == 2 )

ausserhalb der Bedingung
if (digitalRead(taste) == HIGH ) {
setzen würdest.

Du scheinst die auto-Formatierungsfunktion nicht zu benutzen
Das geht ganz einfach mit der Tastenkombination Strg-T
Dann sieht dein Code so aus

  if (digitalRead(taste) == HIGH ) {

Hier auch als Bild um es markieren zu können
alles entlang der roten Linie wird nur dann ausgeführt wenn die Bedingung

  if (digitalRead(taste) == HIGH ) {

erfüllt ist
Das bedeutet nur so lange wie du die Taste runtergedrückt hälst

Es müsste so aussehen


vgs

Jetzt funktioniert es! (Zumindest mit dem einen Sensor, den ich bisher zum testen benutze).
Vielen Dank.
EIn weiteres Problem, welches ich aktuell noch habe, ist der hohe Speicherverbrauch. Das aktuelle Programm braucht schon 72% des Programmspeichers und 35% des dynamischen Speichers.
Irgendwelche Ideen zum verringern?
Ich benutze einen Arduino Nano Klon von AZDelivery.

Zunächst einmal AZDelivery ist eine Firma die ein - Meiner Meinung nach teilweise unter moralischen Gesichtspunkten fragwürdiges Verhalten zeigt.
Die Firma AZDelivery beantragt die Markennamenrechte an elektronischen Allerweltsbegriffen bei denen andere Firmen niemals auf die Idee kommen würden dafür die Namensrechte zu beantragen. Teilweise Begriffe die seit Jahrzehnten in Gerbrauch sind.
Deshalb empfehle ich dir zukünftig bei anderen Firmen zu kaufen.

Ein OLED-Pixel-Display braucht nun mal viel Speicher. Es gibt da Optionen die Buffergröße zu reduzieren. Ich habe dazu neulich ein bißchen etwas nachgelesen aber nicht verstanden wie man das einstellt.

Möglicherweise gibt es hier Experten die dazu mehr sagen können.

Die Alternative ist einen anderen Microcontroller zu nehmen. Du willst ja kleine Maße haben

Einen Seeeduino SAMD21 XIAO zum Beispiel: 16mal mehr Speicher als ein Arduino Nano
https://www.reichelt.de/xiao-samd21-samd21-cortex-m0-32-bit-arm-xiao-samd21-p350827.html

Noch mehr Speicher
https://www.reichelt.de/xiao-rp2040-dual-core-133-mhz-2-mb-xiao-rp2040-p350757.html

vgs

1 Like

Du willst ja nur werte anzeigen dafür reicht die U8g2 Lib die hat ein Speicher sparenden Modus u8g8, hat auch ein paar Schriftarten für die u8g8 wie die sich Nennen ist unter keywords zu finden

1 Like