Arduino aus Schleife wieder Setup aufrufen

Hallo Zusammen,

neuer Tag, neues Problem:

ich habe bei meinem Display das Grundbild im Setup.
Nun möchte ich einen Sensor alle 5 Sekunden auslesen und in einem extra Bild anzeigen lassen.

Sobald ich allerdings eine Wiederholung einbaue komm ich nichtmehr ins Setup zurück, was davor allerdings funktioniert.

Hat hier jemand einen Lösungsvorschlag? Hab auch schon mit While herumprobiert allerdings bleibt er auch hier in der Endlosschleife hängen.

Falls euch sonst noch etwas auffällt, gerne meckern.

Danke euch schonmal.



#include <Arduino.h>

#include <SPI.h>

#include <Adafruit_GFX.h>
#include <Waveshare4InchTftShield.h>
#include <Fonts/FreeSans18pt7b.h>


#define BLACK   0x0000
#define BLUE    0x001F
#define RED     0xF800
#define GREEN   0x07E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define YELLOW  0xFFE0
#define WHITE   0xFFFF





    Waveshare4InchTftShield Waveshield;
    boolean buttonBF = true;
    boolean buttonZurueck =false;

    const int soilMoistPin = A0;
    const int soilMoistLevelLow = 836;    //Dieser Wert soll von euch entsprechend angepasst werden
    const int soilMoistLevelHigh = 402;   //Dieser Wert soll von euch entsprechend angepasst werden

void setup() 
{

    SPI.begin();
    Waveshield.begin();
    Waveshield.setRotation(1);
    Waveshield.setFont(&FreeSans18pt7b);
    Serial.begin(115200);
    pinMode(soilMoistPin, INPUT);

     Waveshield.fillScreen(WHITE);

         //Start-Bild 

    Waveshield.fillRect(5, 5, 470, 60, RED);
    Waveshield.drawRect(5, 5, 470, 60,BLACK);
    Waveshield.setCursor(35,47);
    Waveshield.setTextColor(WHITE);
    Waveshield.setTextSize(1);
    Waveshield.print("Start-Fenster");

        
    Waveshield.fillRect(5, 70, 470, 60, WHITE); 
    Waveshield.drawRect(5, 70, 470, 60,BLACK); 
    Waveshield.setCursor(35,112);
    Waveshield.setTextSize(1);
    Waveshield.setTextColor(BLACK);
    Waveshield.print("Bodenfeuchte anzeigen");
  
 

}

int i = 0;

// the loop function runs over and over again until power down or reset
void loop() {
 
  TSPoint p = Waveshield.getPoint(); //Ganzen Touchscreen verwenden
  Waveshield.normalizeTsPoint(p); // Automatische Rotation


// Mitte von Rechteck:    Höhe + Abstand - Schriftgröße


//Bodenfeuchte Bild  
if(p.z > Waveshield.pressureThreshhold) {
if(p.x>5 && p.x<475 && p.y>70 && p.y<130){ 

    Waveshield.fillRect(5, 5, 470, 60, RED); // fillRect = Rechteck ausfüllen
    Waveshield.drawRect(5, 5, 470, 60,BLACK); // drawRect = Rechteck-Kontur
    Waveshield.setCursor(35,47);  // setCursor      = Text-Ausrichtung
    Waveshield.setTextColor(WHITE); // setTextColor   = Text-Farbe
    Waveshield.setTextSize(1);  // setTextSize = Text-Größe
    Waveshield.print("Bodenfeuchte"); // print = Text
    
    Waveshield.fillRect(5, 255, 475, 60, WHITE); // fillRect = Rechteck ausfüllen
    Waveshield.drawRect(5, 255, 475, 60,BLACK); // drawRect = Rechteck-Kontur
    Waveshield.setCursor(35,297);  // setCursor      = Text-Ausrichtung
    Waveshield.setTextSize(1);  // setTextSize = Text-Größe
    Waveshield.setTextColor(BLACK); // setTextColor   = Text-Farbe
    Waveshield.print("Zurueck"); // print = Text

    Waveshield.fillRect(5, 70, 470, 60, WHITE); // fillRect = Rechteck ausfüllen
    Waveshield.drawRect(5, 70, 470, 60,BLACK); // drawRect = Rechteck-Kontur
    

refresh:
     //Bodenfeuchte Sensor
    int soilMoist = analogRead(soilMoistPin);
    Serial.print("Analog Value: ");
    Serial.print(soilMoist);
    // Auswertung der Bodenfeuchtigkeit in Prozent
    int percentSoilMoist = map(soilMoist, soilMoistLevelHigh, soilMoistLevelLow, 100, 0);
    Serial.print("\t"); 
    Serial.print(percentSoilMoist);
    Serial.println(" %");
    
 


  {
     
    Waveshield.setCursor(35,112);  // setCursor      = Text-Ausrichtung
    Waveshield.setTextColor(WHITE); // setTextColor   = Text-Farbe
    Waveshield.setTextSize(1);  // setTextSize = Text-Größe
    Waveshield.setTextColor(BLACK); // setTextColor   = Text-Farbe
  
    Waveshield.fillRect(5, 70, 470, 60, WHITE); // fillRect = Rechteck ausfüllen
    Waveshield.drawRect(5, 70, 470, 60,BLACK); // drawRect = Rechteck-Kontur

    Waveshield.print("BodenFeuchte  "); // print = Text
    Waveshield.print(percentSoilMoist);
    Waveshield.print(" %");

if(p.x>5 && p.x<475 && p.y>255 && p.y<315)
    {
    setup();    
    }
    delay (5000);
    goto refresh;
  }

}
   
}
    
}

You have some strange stuff going on there - it's not normal to call setup from loop - I'm not sure what repeated SPI.begins will do to you.

Also, that goto once executed means that half of your loop function will never be called again - you code needs some major refactoring.

1 Like

Du hast in loop() schon eine Schleife. Weitere Schleifen und ähnliches sind in der Regel nicht nötig. Auch keine gotos.

Du musst in ganz anderen Strukturen denken. Wenn du etwas mehrmals aufrufen willst darfst du nicht in "springen", "Schleifen" und "wiederholen" denken. Lagere das statt dessen in eine Funktion aus. Diese Funktion kannst du dann beliebig oft aufrufen.

1 Like

Versuche eine Programmstruktur wie diese:

void setup()
{
  SPI.begin();
  init();
}

void init()
{
  Waveshield.begin();
...
}
...
        if (p.x > 5 && p.x < 475 && p.y > 255 && p.y < 315)
        {
          init();
        }
1 Like

Ersetz Dein Setup zusätzlich mit zwei Funktionen:


void setup()
{
  SPI.begin();
  Waveshield.begin();
  Waveshield.setRotation(1);
  Waveshield.setFont(&FreeSans18pt7b);
  Serial.begin(115200);
  pinMode(soilMoistPin, INPUT);
  Waveshield.fillScreen(WHITE);
  //Start-Bild
  startBild();
  bodenfeuchteBild();
}

void startBild()
{
  Waveshield.fillRect(5, 5, 470, 60, RED);
  Waveshield.drawRect(5, 5, 470, 60, BLACK);
  Waveshield.setCursor(35, 47);
  Waveshield.setTextColor(WHITE);
  Waveshield.setTextSize(1);
  Waveshield.print("Start-Fenster");
}
void bodenfeuchteBild()
{
  Waveshield.fillRect(5, 70, 470, 60, WHITE);
  Waveshield.drawRect(5, 70, 470, 60, BLACK);
  Waveshield.setCursor(35, 112);
  Waveshield.setTextSize(1);
  Waveshield.setTextColor(BLACK);
  Waveshield.print("Bodenfeuchte anzeigen");
}

Du kannst jetzt jederzeit im loop oder wo auch immer aufrufen:
startBild();
bzw.
bodenfeuchteBild();

Drauf achten: Keine delays!

1 Like

Danke euch für die Schnellen antworten,
wie ihr erkennen könnt bin ich noch absoluter Anfänger.. :sweat_smile:

Wenn ich die Bilder die aufzurufen sind in den Loop packe, habe ich das Problem, dass der Text ständig neu aufgebaut wird.

Mit Funktionen werde ich mich definitiv die Tage beschäftigen.

Hat jemand noch eine Lösung für das Flackern?

Habe schon versucht die Bilder Boolabhängig zu machen und dann durch drücken auf den Touch diese zu resetten und die nächste zu setzen, hab dann allerdings das selbe Problem.

Bin sehr positiv überrascht von der Hilfsbereitschaft hier ohne dumme Kommentare, sowas kennt man ja aus Foren gar nicht . :grin:

Das sieht so aus als ob die Text mit Rechtecken löscht. Das ist ein riesiger Fehler, weil das Zeichnen der Rechtecke ewig dauert.

Generell überschreibt man bei Displays einfach den alten Text direkt mit dem Neuen und löscht nur die Differenz. Und Löschen heißt mit Leerzeichen überschreiben. Wenn der neue Text länger als der Alte muss man gar nichts machen. Wenn er kürzer ist muss man nur die übrigen Zeichen überschreiben.
Daher bietet es sich generell an alles auf eine konstante Breite zu formatieren. Bei festen Texten wie hier ist das trivial.

1 Like

Probiere

  1. Nur Text schreiben, wenn er sich ändert, aber maximal ca. alle 200 ms.
  2. Auch die Hintergrundfarbe zum Löschen nutzen setTextColor(uint16_t c, uint16_t bg) also beispielsweise setTextColor(WHITE, BLACK)
1 Like

Das Problem habe ich auch mit den festen Texten, z.B. im Startbild die Überschrift.
Sprich: ich starte das Display, der Startbildschirm wird aufgerufen, die Texte werden ständig neu erzeugt.

Habe nun das dauerhafte neuzeichnen der Rechtecke entfernt und siehe da: das flackern hat aufgehört!
Auch das durchblättern mit verschiedenen Funktionen funktioniert, vielen Dank euch.
Ein Anliegen habe ich allerdings noch: Ich habe wieder auf die Pixelige Standart Font zurückgerudert. Bei der vorher verwendeten hat das Text-Hintergrund setzen nicht funktioniert. Gibt es hier eine Möglichkeit trotzdem eine andere Font zu verwenden?

Grüße
Peter

Es ist in dieser Bibliothek leider nicht vorgesehen. Kannst Du eine andere Bibliothek verwenden?

Sonst mal diesen Beitrag testen.

NACHTRAG 1: Inzwischen habe ich meine Anleitung: Anzeige einer sich schnell ändernden Zahl ohne Flackern wiedergefunden. Da habe ich zwar einen anderen Displaytyp verwendet, aber das dürfte unerheblich sein, weil die Bibliothek Adafruit_GFX beteiligt ist.

Ich bin aber unsicher, ob es Dir hilft.

NACHTRAG 2: Die Bibliotheken von OliKraus müßten hinsichtlich Textdarstellung gut für Dein Vorhaben geeignet sein. Ucglib Ucglib_Arduino

1 Like

Danke für deine Hilfe,

Nachtrag 1 werde ich versuchen, in der Lob im Nachtrag 2 steht mein ili9486 leider nicht bei unterstützen Controllern.

Mal schauen ob ich das mit der Anleitung gemeistert bekomme. :+1:

Sorry, ich bin falsch abgebogen: Ucglib_Arduino "Supported display controller: ST7735, ILI9163, ILI9325, ILI9341, ILI9486, LD50T6160, PCF8833, SEPS225, SSD1331, SSD1351, HX8352C"

Interessant ist das Beispiel HowToUseFonts.ino.

1 Like

Hallo,
wenn ich versuche die examples zu Laden kommt:
Arduino: 1.8.13 (Windows 10), Board: "Arduino Mega or Mega 2560, ATmega2560 (Mega 2560)"

C:\Users\Peter\Documents\Arduino\libraries\Ucglib_Arduino-1.5.2\examples\GraphicsTest\GraphicsTest.ino: In function 'void ucglib_graphics_test()':

GraphicsTest:118:3: error: 'ucg' was not declared in this scope

ucg.setColor(0, 0, 40, 80);

^~~

C:\Users\Peter\Documents\Arduino\libraries\Ucglib_Arduino-1.5.2\examples\GraphicsTest\GraphicsTest.ino:118:3: note: suggested alternative: 'ucg_t'

ucg.setColor(0, 0, 40, 80);

^~~

ucg_t

C:\Users\Peter\Documents\Arduino\libraries\Ucglib_Arduino-1.5.2\examples\GraphicsTest\GraphicsTest.ino: In function 'void gradient()':

GraphicsTest:137:3: error: 'ucg' was not declared in this scope

ucg.setColor(0, 0, 255, 0);

^~~

C:\Users\Peter\Documents\Arduino\libraries\Ucglib_Arduino-1.5.2\examples\GraphicsTest\GraphicsTest.ino:137:3: note: suggested alternative: 'ucg_t'

ucg.setColor(0, 0, 255, 0);

^~~

ucg_t

C:\Users\Peter\Documents\Arduino\libraries\Ucglib_Arduino-1.5.2\examples\GraphicsTest\GraphicsTest.ino: In function 'void box()':

GraphicsTest:169:3: error: 'ucg' was not declared in this scope

ucg.setColor(0, 0, 40, 80);

^~~

C:\Users\Peter\Documents\Arduino\libraries\Ucglib_Arduino-1.5.2\examples\GraphicsTest\GraphicsTest.ino:169:3: note: suggested alternative: 'ucg_t'

ucg.setColor(0, 0, 40, 80);

^~~

ucg_t

C:\Users\Peter\Documents\Arduino\libraries\Ucglib_Arduino-1.5.2\examples\GraphicsTest\GraphicsTest.ino: In function 'void pixel_and_lines()':

GraphicsTest:201:8: error: 'ucg' was not declared in this scope

mx = ucg.getWidth() / 2;

    ^~~

C:\Users\Peter\Documents\Arduino\libraries\Ucglib_Arduino-1.5.2\examples\GraphicsTest\GraphicsTest.ino:201:8: note: suggested alternative: 'ucg_t'

mx = ucg.getWidth() / 2;

    ^~~

    ucg_t

C:\Users\Peter\Documents\Arduino\libraries\Ucglib_Arduino-1.5.2\examples\GraphicsTest\GraphicsTest.ino: In function 'void color_test()':

GraphicsTest:239:8: error: 'ucg' was not declared in this scope

mx = ucg.getWidth() / 2;

    ^~~

C:\Users\Peter\Documents\Arduino\libraries\Ucglib_Arduino-1.5.2\examples\GraphicsTest\GraphicsTest.ino:239:8: note: suggested alternative: 'ucg_t'

mx = ucg.getWidth() / 2;

    ^~~

    ucg_t

C:\Users\Peter\Documents\Arduino\libraries\Ucglib_Arduino-1.5.2\examples\GraphicsTest\GraphicsTest.ino: In function 'void cross()':

GraphicsTest:276:3: error: 'ucg' was not declared in this scope

ucg.setColor(0, 250, 0, 0);

^~~

C:\Users\Peter\Documents\Arduino\libraries\Ucglib_Arduino-1.5.2\examples\GraphicsTest\GraphicsTest.ino:276:3: note: suggested alternative: 'ucg_t'

ucg.setColor(0, 250, 0, 0);

^~~

ucg_t

C:\Users\Peter\Documents\Arduino\libraries\Ucglib_Arduino-1.5.2\examples\GraphicsTest\GraphicsTest.ino: In function 'void triangle()':

GraphicsTest:325:3: error: 'ucg' was not declared in this scope

ucg.setColor(0, 0, 80, 20);

^~~

C:\Users\Peter\Documents\Arduino\libraries\Ucglib_Arduino-1.5.2\examples\GraphicsTest\GraphicsTest.ino:325:3: note: suggested alternative: 'ucg_t'

ucg.setColor(0, 0, 80, 20);

^~~

ucg_t

C:\Users\Peter\Documents\Arduino\libraries\Ucglib_Arduino-1.5.2\examples\GraphicsTest\GraphicsTest.ino: In function 'void text()':

GraphicsTest:359:3: error: 'ucg' was not declared in this scope

ucg.setColor(0, 80, 40, 0);

^~~

C:\Users\Peter\Documents\Arduino\libraries\Ucglib_Arduino-1.5.2\examples\GraphicsTest\GraphicsTest.ino:359:3: note: suggested alternative: 'ucg_t'

ucg.setColor(0, 80, 40, 0);

^~~

ucg_t

C:\Users\Peter\Documents\Arduino\libraries\Ucglib_Arduino-1.5.2\examples\GraphicsTest\GraphicsTest.ino: In function 'void fonts()':

GraphicsTest:392:3: error: 'ucg' was not declared in this scope

ucg.setColor(0, 0, 40, 80);

^~~

C:\Users\Peter\Documents\Arduino\libraries\Ucglib_Arduino-1.5.2\examples\GraphicsTest\GraphicsTest.ino:392:3: note: suggested alternative: 'ucg_t'

ucg.setColor(0, 0, 40, 80);

^~~

ucg_t

C:\Users\Peter\Documents\Arduino\libraries\Ucglib_Arduino-1.5.2\examples\GraphicsTest\GraphicsTest.ino: In function 'void clip()':

GraphicsTest:450:3: error: 'ucg' was not declared in this scope

ucg.setColor(0, 0x00, 0xd1, 0x5e); // dark green

^~~

C:\Users\Peter\Documents\Arduino\libraries\Ucglib_Arduino-1.5.2\examples\GraphicsTest\GraphicsTest.ino:450:3: note: suggested alternative: 'ucg_t'

ucg.setColor(0, 0x00, 0xd1, 0x5e); // dark green

^~~

ucg_t

C:\Users\Peter\Documents\Arduino\libraries\Ucglib_Arduino-1.5.2\examples\GraphicsTest\GraphicsTest.ino: In function 'void setup()':

GraphicsTest:532:3: error: 'ucg' was not declared in this scope

ucg.begin(UCG_FONT_MODE_TRANSPARENT);

^~~

C:\Users\Peter\Documents\Arduino\libraries\Ucglib_Arduino-1.5.2\examples\GraphicsTest\GraphicsTest.ino:532:3: note: suggested alternative: 'ucg_t'

ucg.begin(UCG_FONT_MODE_TRANSPARENT);

^~~

ucg_t

C:\Users\Peter\Documents\Arduino\libraries\Ucglib_Arduino-1.5.2\examples\GraphicsTest\GraphicsTest.ino: In function 'void set_clip_range()':

GraphicsTest:544:19: error: 'ucg' was not declared in this scope

x = (lcg_rnd()*(ucg.getWidth()-w))>>8;

               ^~~

C:\Users\Peter\Documents\Arduino\libraries\Ucglib_Arduino-1.5.2\examples\GraphicsTest\GraphicsTest.ino:544:19: note: suggested alternative: 'ucg_t'

x = (lcg_rnd()*(ucg.getWidth()-w))>>8;

               ^~~

               ucg_t

C:\Users\Peter\Documents\Arduino\libraries\Ucglib_Arduino-1.5.2\examples\GraphicsTest\GraphicsTest.ino: In function 'void loop()':

GraphicsTest:556:13: error: 'ucg' was not declared in this scope

 case 0: ucg.undoRotate(); break;

         ^~~

C:\Users\Peter\Documents\Arduino\libraries\Ucglib_Arduino-1.5.2\examples\GraphicsTest\GraphicsTest.ino:556:13: note: suggested alternative: 'ucg_t'

 case 0: ucg.undoRotate(); break;

         ^~~

         ucg_t

GraphicsTest:564:5: error: 'ucg' was not declared in this scope

 ucg.clearScreen();

 ^~~

C:\Users\Peter\Documents\Arduino\libraries\Ucglib_Arduino-1.5.2\examples\GraphicsTest\GraphicsTest.ino:564:5: note: suggested alternative: 'ucg_t'

 ucg.clearScreen();

 ^~~

 ucg_t

GraphicsTest:582:3: error: 'ucg' was not declared in this scope

ucg.setMaxClipRange();

^~~

C:\Users\Peter\Documents\Arduino\libraries\Ucglib_Arduino-1.5.2\examples\GraphicsTest\GraphicsTest.ino:582:3: note: suggested alternative: 'ucg_t'

ucg.setMaxClipRange();

^~~

ucg_t

exit status 1

'ucg' was not declared in this scope

Worauf ist das zurückzuführen? Habe zuerst die lib per Ordner, dann auch installieren per Manager versucht?

>>> Please uncomment (and update) one of the following constructors. <<<

Ucglib_ILI9486_18x320x480_HWSPI ucg(/*cd=*/ 9, /*cs=*/ 10, /*reset=*/ 8);

Ich teste mit ESP32 und ST7735:

Ucglib_ST7735_18x128x160_HWSPI ucg(/*cd=*/ 2, /*cs=*/ 17, /*reset=*/ 14);

grafik

Leider bleibt mein Display einfach Weiß, sobald ich die Zeile ungeändert hochlade.
Laut der Anleitung des Displays (Habs auch mit der Lib verglichen steht das selbe drin) sollten die Zeile doch wie folgt aussehen:
Ucglib_ST7735_18x128x160_HWSPI ucg(/cd=/ 7, /cs=/ 10, /reset=/ 8);
Dann bleibt es allerdings aus.
Hier noch der Auszug aus der Lib:
constexpr unsigned int LCD_CS = 10; // LCD Chip Select
constexpr unsigned int LCD_BL = 9; // LCD Backlight
constexpr unsigned int LCD_RST = 8; // LCD Reset
constexpr unsigned int LCD_DC = 7; // LCD Data/Control

constexpr unsigned int TP_CS = 4;
constexpr unsigned int TP_IRQ = 3;
constexpr unsigned int TP_BUSY = 6;

constexpr unsigned int SD_CS = 5;

Bin mal davon ausgegangen dass CD DC meint?
Danke schonmal.

Da ist noch LCD back light, könntest Du mal auf HIGH oder LOW legen, bei mir an 3,3 V (ESP32!).