MKR Iot Carrier Rev2 Display print

Hallo, ich habe mir das MKR Iot Carrier Rev2 kit als Neuling in der programmierung des Arduinos gekauft.

Ich habe die ersten Tutorials, getting Starteds und online Kurse soweit fertig und wollte anfangen einen vorhandenen Code nach meinen Wünschen zu bearbeiten.
Als Basis habe ich den Code der Personal Weather Station verwendet.
Soweit funktioniert auch alles nur das die Werte wie z.b Temperatur sich erst aktualisieren wenn ich den angewählten Button drücke.

Mein erster Gedankengang war das er ja in der "if" funktion von oben nach unten arbeitet und dann am ende stehen bleibt und wartet bis was passiert, d.h im Endeffekt das er 1x die temp mit Print schreibt.

Ich kann ja in der "if" funktion keinen weitern loop machen, wie kann ich es dann anders anstellen das er die werte aktualisiert.

Der Code ist noch recht durcheinander, das muss ich noch ordentlich machen, dafür muss ich erstmal das Gerüst verstehen.

LG Tim

#include "arduino_secrets.h"
#include "thingProperties.h"
#include <Arduino_MKRIoTCarrier.h>
MKRIoTCarrier carrier;

unsigned int threshold = 10;
unsigned int threshold_btn_0 = 10;
 
void setup() {
  // Initialize serial and wait for port to open:
  Serial.begin(2000);
  // This delay gives the chance to wait for a Serial Monitor without blocking if none is found
  delay(1500); 
 
  // Defined in thingProperties.h
  initProperties();
 
  // Connect to Arduino IoT Cloud
  ArduinoCloud.begin(ArduinoIoTPreferredConnection);
  //Get Cloud Info/errors , 0 (only errors) up to 4
  setDebugMessageLevel(2);
  ArduinoCloud.printDebugInfo();
 
  //Wait to get cloud connection to init the carrier
  while (ArduinoCloud.connected() != 1) {
    ArduinoCloud.update();
    delay(500);
  }
  delay(500);
  CARRIER_CASE = true;
  carrier.begin();
  carrier.display.setRotation(0);
  
}
 
void loop() {
  ArduinoCloud.update();
  carrier.Buttons.update();
 
  while(!carrier.Light.colorAvailable()) {
    delay(5);
  }
  int none;
  carrier.Light.readColor(none, none, none, light);
  
  temperature = carrier.Env.readTemperature();
  humidity = carrier.Env.readHumidity();
  pressure = carrier.Pressure.readPressure();
  float co2 = carrier.AirQuality.readCO2();
  float volatileOrgan = carrier.AirQuality.readVOC();
  float gasResistor = carrier.AirQuality.readGasResistor();

  carrier.leds.setBrightness(80);
  
 
 
  if (carrier.Buttons.onTouchDown(TOUCH2)) {
    carrier.leds.setPixelColor(2, 0, 125, 0);
    carrier.leds.setPixelColor(1, 0, 0, 0);
     carrier.leds.setPixelColor(0, 0, 0, 0);
    carrier.leds.show();
    
    carrier.display.fillScreen(ST77XX_BLACK);
    carrier.display.setTextColor(ST77XX_WHITE);
    carrier.display.setTextSize(3);
    carrier.display.setCursor(30, 110);
    carrier.display.print("Temp:");
    carrier.display.print(temperature);
    carrier.display.print("C");
    
    
 }
    
  
 
  if (carrier.Buttons.onTouchDown(TOUCH1)) {
    carrier.leds.setPixelColor(1, 125, 0, 0);
    carrier.leds.setPixelColor(2, 0, 0, 0);
     carrier.leds.setPixelColor(0, 0, 0, 0);
     carrier.leds.show();

    carrier.display.fillScreen(ST77XX_BLACK);
    carrier.display.setTextColor(ST77XX_WHITE);
    carrier.display.setTextSize(3);
 
    carrier.display.setCursor(30, 110);
    carrier.display.print("Licht:");
    carrier.display.print(light);
  }
 

  if (carrier.Buttons.onTouchDown(TOUCH0)) {
    carrier.leds.setPixelColor(0, 0, 0, 125);
    carrier.leds.setPixelColor(1, 0, 0, 0);
    carrier.leds.setPixelColor(2, 0, 0, 0);
    carrier.leds.show();

    carrier.display.fillScreen(ST77XX_BLACK);
    carrier.display.setTextColor(ST77XX_WHITE);
    carrier.display.setTextSize(3);
  
 
    carrier.display.setCursor(20, 80);
    carrier.display.print("Temp:");
    carrier.display.print(temperature);
    carrier.display.setCursor(20, 110);
    carrier.display.print("Feucht:");
    carrier.display.print(humidity);
    carrier.display.setCursor(20, 140);
    carrier.display.print("Druck:");
    carrier.display.print(pressure);
    }
  
  
  if (carrier.Buttons.onTouchDown(TOUCH3)) {
    carrier.leds.setPixelColor(0, 0, 0, 125);
    carrier.leds.setPixelColor(1, 0, 0, 0);
    carrier.leds.setPixelColor(2, 0, 0, 0);
    carrier.leds.show();

    carrier.display.fillScreen(ST77XX_BLACK);
    carrier.display.setTextColor(ST77XX_WHITE);
    carrier.display.setTextSize(3);
  
 
    carrier.display.setCursor(20, 80);
    carrier.display.print("CO2:");
    carrier.display.print(co2);
    carrier.display.setCursor(20, 110);
    carrier.display.print("Volatile:");
    carrier.display.print(volatileOrgan);
    carrier.display.setCursor(20, 140);
    carrier.display.print("Gas:");
    carrier.display.print(gasResistor);
    }


  
  if (carrier.Buttons.onTouchDown(TOUCH4)){
    carrier.leds.clear();
    carrier.leds.show();
    carrier.display.fillScreen(0x0000);
  }
if (humidity >= 60 && temperature >= 15) {
    weather_report = "It is very humid outside";
    
  }
else if (temperature >= 15 && light >= 700) {
    weather_report = "Warm and sunny outside";
    
  }
else if (temperature <= 16 && light >= 700) {
    weather_report = "A little cold, but sunny outside";
  }
  
  else{
   weather_report = "Weather is normal"; 
  }
 
  
  
 
}
/*
  Since WeatherReport is READ_WRITE variable, onWeatherReportChange() is
  executed every time a new value is received from IoT Cloud.
*/
void onWeatherReportChange()  {
  // Add your code here to act upon WeatherReport change
}

Wenn du deinen Sketch mit entsprechenden Print-Ausgaben ausstattest, z.B. in jedem If-Block eine Ausgabe auf die Serielle Schnittstelle ergänzen, dann kannst du im Serial Monitor mitverfolgen was dein Programm wirklich macht und somit deine Gedankengänge überprüfen. Daher mein erster Tipp: Nutze Serial.print zum Debuggen!

Übrigens Serial:

Serial.begin(2000);

das ist schon ÄUSSERST langsam. Warum nicht 115200?

Wenn du mal STRG-T in der IDE drückst, wird dein Code besser formatiert, die Einrückungen stimmen wieder und du siehst leichter die Struktur deines Programms.

Weiters rate ich dir, zunächst aufzuschreiben WAS dein Programm in welchen Schritten machen soll. Du kannst das als Ablaufplan zeichnen oder in ganz kurzen Sätzen untereinander schreiben. Das ergibt dann genau das Gerüst das dir derzeit offenbar noch fehlt.

Danke für die Antwort,
die 2000 im Serial.begin habe ich aus dem alten Code entnommen, habe es nun auf 115200 geändert.

Das mit dem Serial.Print war eine gute Idee, es hat meine Vermutung bestätigt, nun muss ich mir was überlegen wie ich das konstant aktualisieren kann.

Das STRG-T funktioniert gerade leider nicht, da ich mit dem Web-Editor arbeite.

Hast du eine Idee wie ich das Problem mit der Aktualisierung angehen kann?

Lg Tim

ich würde hier anfangen:

So was mache ich mit switch, case
jedem Touch ein case zuweisen im case die die daten auswerten anzeigen, also einer Art Menü bauen
zb
Im Header (= vor Setup)
byte wah = 0;

In loop

if(touch0) wahl = 0;
if(touch1) whal = 1;

usw.
Danach

switch (wahl) {
   case 1:
     zeige mir Temperatur
     break;
   case 2 :
     zeige mir das und das
     break;
      
 }

Somit kannst dir vier Untermenüs bauen hast ja 4 toch Taster
Wie funktioniert das?
wenn touch0 wird betätigt wird durch switch (wahl), case 0 gewählt und "bleibt" dort so lange bis andere toch wird betätigt.

Ja für Anfänger ist das erst mall schwierig, musst sich gut einlesen was und wie.
Am besten lernt man das in kleinen Häppschien in dem man erst die Komponenten lernt kennen, nie, alles auf einmal versuchen.
Habe das ding nicht, somit kann das nicht testen.