Oled display, software crased

Arduino specifieke Software
Berichten: 53
Geregistreerd: 21 Apr 2013, 22:48
Woonplaats: Horn

Oled display, software crased

Berichtdoor babbelkwebbel » 06 Sep 2020, 20:54

Beste Allemaal,

Iemand een idee wat hier mis gaat?.

Als ik de variable text_choice een waarde geef van 0 t/m 5 en deze in de global sectie declareer dan werkt sketch goed, maar zodra ik de variable text_choice in de void loop zet of in de void text loop zet dan crashed de software????....
Ik heb inmiddels alleen nog het Oled display aan de Arduino nano hangen, verder niets, iemand een idee dan wel de oplossing?.

hoe kan je trouwens de opbouw behouden zoals deze in de Arduino IDE staat, nu zijn alle taps versprongen??..

bijvoorbaat dank
Erik.

[code]
#include <Adafruit_GFX.h> // Librabry Adafruit graphic
#include <Adafruit_SSD1306.h> // Librabry Adafruit display driver
#define SCREEN_WIDTH 128 // set OLED display width, in pixels
#define SCREEN_HEIGHT 64 // set OLED display height, in pixels
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT); // make object display
int pos_start = 0; // variable for text scrolling on Oled display
int pos_end = 9; // variable for text scrolling on Oled display
int run_once_text = 0; // variable to make sure that routine runs once
int text_choice = 4; //<<<<<<<<<<<<<<<< // variable to choose with text will be loaded from array
unsigned long timer_text; // software timer for text scrol routine
unsigned long timer_text_old; // software timer for text scrol routine
unsigned long timer_text_delay = 300; // software timer for text scrol routine, delay time is 300 milli seconds

char *myStrings[] = {" text 1 text 1 text 1 text 1 text 1 text 1 text 1 text 1 ",
" text 2 text 2 text 2 text 2 text 2 text 2 text 2 text 2 ",
" text 3 text 3 text 3 text 3 text 3 text 3 text 3 text 3 ",
" text 4 text 4 text 4 text 4 text 4 text 4 text 4 text 4 ",
" text 5 text 5 text 5 text 5 text 5 text 5 text 5 text 5 ",
" text 6 text 6 text 6 text 6 text 6 text 6 text 6 text 6 "};

// 012345678901234567890123456789012345678901234567890123456789012

void setup() // void setup runs once
{
Serial.begin(115200); // start serial interface
Wire.begin(); // start I2C interface
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // start display driver at adress 0x3C
display.clearDisplay(); // display clear function
display.display(); // display refresh content
}


void loop() // void loop runs over and over again
{
display.setTextSize(2); // set the font size, supports sizes from 1 to 8
display.setTextColor(WHITE); // set the color to white
display.setCursor(0, 0); // set the coordinates to start writing text
display.clearDisplay(); // display clear function
text(); // calling subroutine text
}


void text()
{
display.setCursor(0, 36); // set cursor coordinate

if (run_once_text == 0) // if variable run once text = 0, run routine
{
pos_start = 0; // start position for display counter, see FOR counter
pos_end = 9; // end position for display counter, see FOR counter
run_once_text = 1; // set run once text variable to 1, so that routine can't run again
}

timer_text = millis(); // make software timer with millis function

if (timer_text - timer_text_old >= timer_text_delay) // make software timer with millis function
{
timer_text_old = timer_text; // make software timer with millis function

for (int counter = (pos_start); counter < (pos_end); counter++) // FOR loop to get 10 character from array mystring
{
display.print(myStrings[(text_choice)][(counter)]); // print the 10 characters from mystring, with index text choice
}

pos_start ++; // increment variable position start with 1
pos_end ++; // increment variable position end with 1

if (pos_end == 63) // if loop is for text width in element of array, if 63 set counters back
{
pos_start = 0; // start position for display counter set back to 0
pos_end = 9; // end position for display counter set back to 9
}
display.display(); // call function display, to refresh display contents
}
}

Advertisement

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Oled display, software crased

Berichtdoor Koepel » 06 Sep 2020, 21:17

Een OLED werkt op 3.3V. Heb je een OLED van Adafruit die geschikt gemaakt is voor zowel 3.3V en 5V ?
Alle andere OLED displays worden wel verkocht als 3-5V, maar dat klopt niet. Soms zit er een voltage regulator op om een spanning 3.3V te maken, maar dan zorgt het OLED display alsnog voor problemen op de I2C bus. Vaak werkt het OLED display dan nog wel, maar andere I2C sensoren niet meer.

De OLED libraries van Adafruit vragen zoveel geheugen, dat het niet geschikt is voor een Uno of een Nano. Het kan bijna niet anders dan dat het crasht :o

Andere mogelijkheden:
1. De U8g2 library heeft drie modes. Een mode die veel geheugen vraag, een mode die stukjes van het display update, en een 8x8 mode voor weinig geheugen.
2. Een Nextion display kan wel met een Arduino Nano. Het kost echter heel wat tijd om je daar in te verdiepen en de Arduino library die ze bij Nextion hebben gemaakt is ronduit slecht.

Let je op de [ code ] en [ / code ] tags ?

Berichten: 53
Geregistreerd: 21 Apr 2013, 22:48
Woonplaats: Horn

Re: Oled display, software crased

Berichtdoor babbelkwebbel » 06 Sep 2020, 21:46

Dat is het probleem niet, alles werkt goed, alleen als ik de variable text_choice (regel 9 van boven) verplaats naar een ander void (b.v. void loop of void text) in het programma dan werkt het niet meer, als ik deze in de global sectie laat werkt het, maar als ik ergens in het programma bijvoorbeeld de waarde verander (b.v. een increment van text_choice variable), crashed het programma????....

Alvast bedankt voor het meedenken ben er zelf al bijna de hele dag mee bezig, maar er niet uitgekomen..

Berichten: 53
Geregistreerd: 21 Apr 2013, 22:48
Woonplaats: Horn

Re: Oled display, software crased

Berichtdoor babbelkwebbel » 06 Sep 2020, 21:51

we hebben het trouwens over dit display

https://nl.aliexpress.com/item/32639731 ... 4c4dxGClC3

Gebruikers-avatar
Berichten: 615
Geregistreerd: 15 Nov 2015, 11:54

Re: Oled display, software crased

Berichtdoor Gij Kieken » 07 Sep 2020, 09:49

Als je <int text_choice>uit de declaraties wegneemt en ergens anders plaatst ,dan is die variabel niet meer globaal.
Dus kun je die variabel niet meer over gans je programma aanspreken maar enkel daar waar en hoe je ze declareert.
Zoek eens op scope en hopelijk gaat er een lichtje aan.

Berichten: 53
Geregistreerd: 21 Apr 2013, 22:48
Woonplaats: Horn

Re: Oled display, software crased

Berichtdoor babbelkwebbel » 07 Sep 2020, 13:53

Iedereen alvast bedankt voor het meedenken.

Helemaal eens, beetje beroerd uitgelegd, als ik de <int text_choice> in de global sectie laat, maar vervolgens in de void loop of void text verhoog met b.v. text_choice++; is het afgelopen, ben er wel achter dat Arduino niet crashed, heb een Serial.print in de void text loop gezet en die blijft printen naar de serial monitor, dus de text loop blijft werken, echter om een of andere reden houd het display het voor gezien als ik iets met text_choice doe, het wordt een freeze op het display, na een reset werkt het weer, tot je de waarde van text_choice veranderd en dan is het weer afgelopen.

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Oled display, software crased

Berichtdoor Koepel » 07 Sep 2020, 18:39

Je laat een sketch zien die werkt, maar wij willen natuurlijk de sketch zien waarbij het mis gaat. En dan natuurlijk ook nog tussen code-tags.

Voordat je die sketch laat zien, kun je eerst nog wat dingen wijzigen.
Code: Alles selecteren
// verwarrend
for (int counter = (pos_start); counter < (pos_end); counter++)

// beter
for (int counter = pos_start; counter < pos_end; counter++)

// verwarrend
display.print(myStrings[(text_choice)][(counter)]);

// beter
display.print(myStrings[text_choice][counter]);


Je hebt een array van pointers die wijzen naar 6 stukken tekst. De compiler heeft die tekst ergens neergezet. Dus de tekst zit niet in het array.
Dat maakt voor de code niet uit.

Je kunt die tekst in een array zetten, maar dan moet je een vaste grootte opgeven:
Code: Alles selecteren
char myStrings[][60] = {
  " text 1 text 1 text 1 text 1 text 1 text 1 text 1 text 1 ",
  " text 2 text 2 text 2 text 2 text 2 text 2 text 2 text 2 ",
  " text 3 text 3 text 3 text 3 text 3 text 3 text 3 text 3 ",
  " text 4 text 4 text 4 text 4 text 4 text 4 text 4 text 4 ",
  " text 5 text 5 text 5 text 5 text 5 text 5 text 5 text 5 ",
  " text 6 text 6 text 6 text 6 text 6 text 6 text 6 text 6 " };


Is het echt nodig om honderden keren per seconde het display schoon te maken ?
Je loop() loopt lekker snel, dat is mooi. Maar je gaat op volle snelheid dingen naar het display sturen.

Wanneer je een text_choice++ doet, dan gaat het al mis als text_choice 6 is. Dan zit je al buiten het array.
Als je dat honderden keren per seconde doet, dan crasht het in een fractie van een seconde.

Hou je er rekening mee dat de I2C geen normale I2C bus meer is met die OLED ? Als je een sensor toevoegt, dan kan die sensor soms/vaak wel/niet werken, of alleen op een dinsdagochtend als het hard waait en je een groen T-shirt aan hebt.

Gebruikers-avatar
Berichten: 615
Geregistreerd: 15 Nov 2015, 11:54

Re: Oled display, software crased

Berichtdoor Gij Kieken » 07 Sep 2020, 18:50

Hier declareer je char *myStrings[] = ,als een pointer naar een 1_dimensionele char array.
Verder in void text() verlang je een 2-dimensionele aray.
In dit geval zal je iets als char *myStrings[][] moeten declareren ,beter is het om vaste waarde te geven als je weet over hoeveel characters het gaat.

Haha Koepel was terug sneller, en heeft het probleem al mooi en duidelijk geschetst.

Berichten: 53
Geregistreerd: 21 Apr 2013, 22:48
Woonplaats: Horn

Re: Oled display, software crased

Berichtdoor babbelkwebbel » 07 Sep 2020, 20:26

Heren bedankt voor jullie reacties, heb de voorstellen ten harte genomen, echter helaas, als ik maar ook iets wijzig aan de waarde van <text_choice> gaat het mis, enige wat ik kan bedenken is dat de Adafruit Librabry niet hier ondersteund, en zoals koepel al schreef om de Olikraus librabry te gebruiken en dat ga ik proberen.
Wordt vervolgt...

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Oled display, software crased

Berichtdoor Koepel » 08 Sep 2020, 02:44

Je hebt nog steeds geen sketch laten zien die mis gaat.
Misschien ga je met die andere library dezelfde fout maken :?

Volgende

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 10 gasten