Oled display, software crased
11 berichten
• Pagina 1 van 2 • 1, 2
- babbelkwebbel
- Berichten: 68
- Geregistreerd: 21 Apr 2013, 22:48
- Woonplaats: Hoorn
Oled display, software crased
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
}
}
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
Re: Oled display, software crased
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
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 ?
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
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 ?
- babbelkwebbel
- Berichten: 68
- Geregistreerd: 21 Apr 2013, 22:48
- Woonplaats: Hoorn
Re: Oled display, software crased
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..
Alvast bedankt voor het meedenken ben er zelf al bijna de hele dag mee bezig, maar er niet uitgekomen..
- babbelkwebbel
- Berichten: 68
- Geregistreerd: 21 Apr 2013, 22:48
- Woonplaats: Hoorn
- Gij Kieken
- Berichten: 631
- Geregistreerd: 15 Nov 2015, 11:54
Re: Oled display, software crased
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.
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.
- babbelkwebbel
- Berichten: 68
- Geregistreerd: 21 Apr 2013, 22:48
- Woonplaats: Hoorn
Re: Oled display, software crased
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.
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.
Re: Oled display, software crased
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.
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:
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.
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.
- Gij Kieken
- Berichten: 631
- Geregistreerd: 15 Nov 2015, 11:54
Re: Oled display, software crased
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.
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.
- babbelkwebbel
- Berichten: 68
- Geregistreerd: 21 Apr 2013, 22:48
- Woonplaats: Hoorn
Re: Oled display, software crased
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...
Wordt vervolgt...
Re: Oled display, software crased
Je hebt nog steeds geen sketch laten zien die mis gaat.
Misschien ga je met die andere library dezelfde fout maken
Misschien ga je met die andere library dezelfde fout maken
11 berichten
• Pagina 1 van 2 • 1, 2
Wie is er online?
Gebruikers in dit forum: iwesuqe, Majestic-12 [Bot] en 65 gasten