INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Oled 0.91 wechselnde Anzeige . Benötige hilfe
16.03.2019, 07:57 (Dieser Beitrag wurde zuletzt bearbeitet: 16.03.2019 07:58 von MotD.)
Beitrag #1
Oled 0.91 wechselnde Anzeige . Benötige hilfe
Moin

Habe gestern das erste mal mit meinem 0.91 128x32 Oled gearbeitet .

Nutze die u8g lib und habe es mit einem dht22 getestet.

Anzeige klappt soweit .

Ich würde gerne humidity und temp wechselnd anzeigen lassen .
Jeweils ca 4 Sekunden danach wieder von vorne .
Später kommen natürlich noch mehr Sensoren ran die dann eingebunden werden sollen .

Ich weiß nur leider nicht wonach ich googeln kann .

Wer für Tipps dankbar .

Schönes Wochenende
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.03.2019, 10:54
Beitrag #2
RE: Oled 0.91 wechselnde Anzeige . Benötige hilfe
(16.03.2019 07:57)MotD schrieb:  Moin

Habe gestern das erste mal mit meinem 0.91 128x32 Oled gearbeitet .

Nutze die u8g lib und habe es mit einem dht22 getestet.

Anzeige klappt soweit .

Ich würde gerne humidity und temp wechselnd anzeigen lassen .
Jeweils ca 4 Sekunden danach wieder von vorne .
Später kommen natürlich noch mehr Sensoren ran die dann eingebunden werden sollen .

Ich weiß nur leider nicht wonach ich googeln kann .

Wer für Tipps dankbar .

Schönes Wochenende

Moin,
dann poste doch mal deinen Sketch und zwar bitte in Code Tags... oben in der Editorleiste das "#" benutzen.
Ähm bist du dir sicher das dein OLED x32 ist und nicht x64 was diese kleinen Dinger üblicherweise sind ?
lgbk

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.03.2019, 13:05
Beitrag #3
RE: Oled 0.91 wechselnde Anzeige . Benötige hilfe
hier der sketch

Code:
#include <U8glib.h>
#include "DHT.h"

#define DHTPIN 2     // connect to D2
#define DHTTYPE DHT22   // DHT 22  (AM2302)

DHT dht(DHTPIN, DHTTYPE);

U8GLIB_SSD1306_128X32 u8g(U8G_I2C_OPT_NONE);

void setup()
{
  Serial.begin(9600);
  dht.begin();
  delay(10);
}

void loop(void)
{
  delay(2000); // Wait a few seconds between measurements.
  float h = dht.readHumidity(); // Read humidity
  float t = dht.readTemperature(); //Read temperature
  u8g.firstPage();  
  do {
  u8g.setFont(u8g_font_profont12);
  u8g.setPrintPos(0, 10);
  u8g.print ("Hum");
  u8g.setPrintPos(65, 10);
  u8g.print (h);
  u8g.setPrintPos(100, 10);
  u8g.print ("%");
  u8g.setPrintPos(0, 30);
  u8g.print ("Temp.:");
  u8g.setPrintPos(43, 30);
  u8g.print (t);
  u8g.setPrintPos(75, 30);
  u8g.print ("*C");
      } while( u8g.nextPage() );
  delay(100);

}

habe keine Ahnung wie ich das getrennt mache mit der wechselnden anzeige und ja, es ist definitiv ein 0.91 Oleg mit 128x32

wie hier. display
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.03.2019, 13:28
Beitrag #4
RE: Oled 0.91 wechselnde Anzeige . Benötige hilfe
Baue deinen Sketch mit Funktionen auf.
1. Funktion: Messung ausführen.
2. Funktion: Anzeigen der Daten

In der Anzeige wechselst du per SimpleTimer die entsprechenden Messdaten.
Sieh dir die Library "SimpleTimer" mal an, dies ist sehr simple.
Da kannst du per Zeitvorgabe den entsprechenden Wechsel einstellen.

Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.03.2019, 15:58
Beitrag #5
RE: Oled 0.91 wechselnde Anzeige . Benötige hilfe
Man kann das aber auch mit switch case aufbauen, also in etwa so:

Code:
byte disp =1; // Display Auswahl beginnt bei 1
unsigned long int lastdisplay, displaytime;
#define maxdisplay 2

setup()
{
..
lastdisplay = millis();  // lastdisplay initialisieren
displaytime = 3000; // erstes Fenster 3 Sec. anzeigen
}


loop(){

if (millis() >= lastdisplay+dsiplaytime){
   lastdisplay = millis();
   disp++;   // das nächste Fenster auswählen
   if(disp > maxdisplay)disp = 1;  // wenn alle Fenster durch wieder von vorne  
   }


switch (disp) {
  case 1:
  displaytime = 3000; // dieses Fenster 3 Sek anzeigen
  float h = dht.readHumidity(); // Read humidity
  float t = dht.readTemperature(); //Read temperature
  u8g.firstPage();  
  do {
  u8g.setFont(u8g_font_profont12);
  u8g.setPrintPos(0, 10);
  u8g.print ("Hum");
  u8g.setPrintPos(65, 10);
  u8g.print (h);
  u8g.setPrintPos(100, 10);
  u8g.print ("%");
  u8g.setPrintPos(0, 30);
  u8g.print ("Temp.:");
  u8g.setPrintPos(43, 30);
  u8g.print (t);
  u8g.setPrintPos(75, 30);
  u8g.print ("*C");
      } while( u8g.nextPage() );
    break;


  case 2:   // Zweiter Display Inhalt
    displaytime = 5000; // dieses Fenster 5 Sec. anzeigen

    //do something when var equals 2
    break;

  default:
    // if nothing else matches, do the default
    // default is optional
    break;
}

} // Loop Ende
Warum bei dir die Displayausgabe in eine do - while Schleife gepackt ist verstehe ich nicht... aber ich vermisse auch ein Clear.Display am Anfang der Ausgabe und ein Aufruf das nun die Ausgabe angezeigt wird am Ende der Ausgabe.

Weil ich habe das ähnliche 0,96" Display mit 128x64 Pixeln im Einsatz und da sieht das so aus:
Code:
display.clear(); // clear the display

  display.setTextAlignment(TEXT_ALIGN_LEFT);
  display.setFont(ArialMT_Plain_16);
  display.drawString(0, 0, "Uhrzeit");
  display.setTextAlignment(TEXT_ALIGN_RIGHT);
  getLocalTime(&timeinfo);
  sprintf(ausg,"%02d:%02d:%02d",timeinfo.tm_hour, timeinfo.tm_min, timeinfo.tm_sec);
  display.drawString(128, 0, String(ausg));

  rssi = WiFi.RSSI();
  display.setTextAlignment(TEXT_ALIGN_LEFT);
  display.setFont(ArialMT_Plain_16);
  display.drawString(0, 16, "RSSI");
  display.setTextAlignment(TEXT_ALIGN_RIGHT);
  display.drawString(100, 16, String(rssi));
  display.drawString(128, 16, " dB");

//#### Ausgabe IAQ
  display.setTextAlignment(TEXT_ALIGN_LEFT);
  display.setFont(ArialMT_Plain_16);
  display.drawString(0, 32, "IAQ");
  display.setTextAlignment(TEXT_ALIGN_RIGHT);
  display.drawString(96, 32, String(IAQ));
  display.drawString(118, 32, String("G"));
  display.drawString(128, 32, String(IAQ_accuracy));

//###### Ausgage Telegrammcounter
  display.setTextAlignment(TEXT_ALIGN_LEFT);
  display.setFont(ArialMT_Plain_16);
  display.drawString(0, 48, "GYr");
  display.setTextAlignment(TEXT_ALIGN_RIGHT);
  display.drawString(128, 48, String(gyread));

  display.display(); // write the buffer to the display

Das mit dem switch case werde ich nun auch bei mir einpflegen weil ich bislang Zwei Fenster ausgebe und das noch etwas getürkt geschieht Rolleyes
Btw. den switch case Code habe ich noch nicht geprüft...nur blind geschrieben.
lgbk

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.03.2019, 16:20 (Dieser Beitrag wurde zuletzt bearbeitet: 16.03.2019 16:21 von Tommy56.)
Beitrag #6
RE: Oled 0.91 wechselnde Anzeige . Benötige hilfe
Der Zeile
Code:
if (millis() >= lastdisplay+dsiplaytime){
muss ich widersprechen, da diese nicht ordentlich über den Überlauf von millis kommt.
Ich habe die Problematik als Beispiel mit unsigned char dargestellt (damit es nicht so lange läuft). Die Casts sind notwendig, damit der Kompiler es nicht als int behandelt.

Code:
unsigned char aktuelleMillis = 0, letzteMillis = 0, dauer = 10;
int cnt = 0;
void setup() {
  Serial.begin(115200);
  Serial.println("Start");
  Serial.println("Initialwerte:");
  Serial.print("Dauer = "); Serial.println(dauer);
  Serial.print("letzte = "); Serial.println(letzteMillis);
  Serial.print("aktuell"); Serial.print('\t'); Serial.print("Diff.");
  Serial.print('\t'); Serial.println("letze");
}

void loop() {
  if (cnt <= 300) { // Damit das nicht ewig läuft
    if ((unsigned char)(aktuelleMillis - letzteMillis) >= dauer) {  // richtig
    // if ((unsigned char)aktuelleMillis >= (unsigned char)(dauer + letzteMillis)) {  // falsch
      // tu was
      Serial.print(aktuelleMillis);
      Serial.print('\t'); Serial.print((unsigned char)(aktuelleMillis - letzteMillis));
      Serial.print('\t'); Serial.print(letzteMillis); Serial.println("\tAktion");
      letzteMillis = aktuelleMillis;
    }  
    else {
      Serial.print(aktuelleMillis); Serial.print('\t');
      Serial.println((unsigned char)(aktuelleMillis - letzteMillis));
    
    }
    aktuelleMillis++;
    cnt++;
  }  
}
Durch umkommentieren der beiden Vergleichszeilen kann man beide Verhalten nachvollziehen.
Bei richtig ergibt sich am Überlauf:
Code:
240    10    230    Aktion
241    1
242    2
243    3
244    4
245    5
246    6
247    7
248    8
249    9
250    10    240    Aktion
251    1
252    2
253    3
254    4
255    5
0    6
1    7
2    8
3    9
4    10    250    Aktion

Bei dem falschen Vergleich kommt dagegen:
Code:
240    10    230    Aktion
241    1
242    2
243    3
244    4
245    5
246    6
247    7
248    8
249    9
250    10    240    Aktion
251    1    250    Aktion
252    1    251    Aktion
253    1    252    Aktion
254    1    253    Aktion
255    1    254    Aktion
0    1
1    2
2    3
3    4
4    5
5    6
6    7
7    8
8    9
9    10    255    Aktion


Also immer: if (aktueller Wert - letzter Wert >= Dauer) verwenden.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
24.03.2019, 22:48
Beitrag #7
RE: Oled 0.91 wechselnde Anzeige . Benötige hilfe
Hallo Tommy,
sorry das ich erst jetzt antworte...aber ein wildgewordener Bagger hatte unser Dorf für mehrere Tage vom Internet abgetrennt gehabt...

Deinen Beitrag mit dem behandeln vom überlaufenden millis() Counter hat schon lange unterschwellig in mir gekocht und nun habe ich deinen Beitrag als Anstoß genommen das mit dem 32 Bit Wert also dem unsigned long int nachzuvollziehen.
Dabei kam mir eine frühere Recherche über das setzen des millis() Wertes zu Hilfe...
deswegen nun mit echten millis() Werten und in 32Bit...
Hier dein von mir angepasster Sketch:
Code:
#include <wiring.c>

unsigned long int aktuelleMillis = 0xffffec70, letzteMillis, dauer = 1000;
int cnt = 0;

void setup() {
  Serial.begin(115200);
  //  Serial.println("Start");
  //  Serial.println("Initialwerte:");
  //  Serial.print("Dauer = "); Serial.println(dauer);
  //  Serial.print("letzte = "); Serial.println(letzteMillis);
  //  Serial.print("aktuell"); Serial.print('\t'); Serial.print("Diff.");
  //  Serial.print('\t'); Serial.println("letze");
}

void loop() {
  Serial.println();
  Serial.println("millis \t\tDauer \tletzte Millis");

  setmillis();
  letzteMillis = millis();
  while (cnt <= 10) { // Damit das nicht ewig läuft
    if ((millis() - letzteMillis) >= dauer) {  // richtig
   // if (millis() >= (dauer + letzteMillis)) {  // falsch
      Serial.print(millis(), HEX);
      Serial.print('\t'); Serial.print((millis() - letzteMillis));
      Serial.print('\t'); Serial.print(letzteMillis, HEX); Serial.println("\tAktion");
      letzteMillis = millis();
      cnt++;
    }
    //    else {
    ////      Serial.println("else");
    //      Serial.print(millis(), HEX); Serial.print('\t');
    //      Serial.println((millis() - letzteMillis), HEX);
    //
    //    }
    //    aktuelleMillis++;
    //  cnt++;
  }
  cnt = 0;
  delay(10000);

}
//###################### Ende Loop ##############


void setmillis()
{
  uint8_t oldSREG = SREG;

  // disable interrupts while we read timer0_millis or we might get an
  // inconsistent value (e.g. in the middle of a write to timer0_millis)
  cli();
  timer0_millis = aktuelleMillis;
  SREG = oldSREG;
}

Und das kommt dann dabei raus:
Code:
millis              Dauer    letzte Millis
FFFFF058             1000    FFFFEC70    Aktion
FFFFF441             1000    FFFFF059    Aktion
FFFFF82A             1000    FFFFF442    Aktion
FFFFFC13             1000    FFFFF82B    Aktion
FFFFFFFC             1000    FFFFFC14    Aktion
     3E5             1000    FFFFFFFD    Aktion
     7CD             1000         3E5    Aktion
     BB5             1000         7CD    Aktion
     F9D             1000         BB5    Aktion
    1385             1000         F9D    Aktion
    176D             1000        1385    Aktion
Also wie von dir schon im kleinen Stil erprobt ist da auch alles richtig.

Und hier die Ausgabe wenn man es falsch macht:
Code:
millis             Dauer            letzte Millis
FFFFF058            1000            FFFFEC70    Aktion
FFFFF441            1000            FFFFF059    Aktion
FFFFF82A            1000            FFFFF442    Aktion
FFFFFC14            1001            FFFFF82B    Aktion
FFFFFFFD            1000            FFFFFC15    Aktion
FFFFFFFE               0            FFFFFFFE    Aktion
FFFFFFFF               0            FFFFFFFF    Aktion
     3E9            1001                   0    Aktion
     7D1            1000                 3E9    Aktion
     BB9            1000                 7D1    Aktion
     FA1            1000                 BB9    Aktion
Interessant ist das bei diesem Durchlauf bei der Dauer auch Werte mit 1001mS auftauchen was ich seither nicht gesehen hatte.
Zum Test habe ich einen Arduino MEGA2560 verwendet

lgbk

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Hilfe für Kita-Projekt gesucht. cyberiss 8 500 06.08.2019 07:57
Letzter Beitrag: Der Hobbyelektroniker
  Brauche Hilfe bei Arrays mega-hz 23 1.234 10.07.2019 15:59
Letzter Beitrag: MartinZ
  Hilfe benötigt bei der folgenden Aufgabe hanneswave 10 746 01.07.2019 18:08
Letzter Beitrag: Wochenendprogrammierer
  Spielstand Anzeige holzmichel 4 442 27.03.2019 15:51
Letzter Beitrag: holzmichel
  Simon Says bzw. Senso - Spiel bitte Hilfe Riddle 3 694 15.03.2019 13:46
Letzter Beitrag: Tommy56
  Hilfe benötigt beim Verknüpfen von Klassen Batucada 7 786 02.03.2019 23:47
Letzter Beitrag: georg01
  Hilfe bei Formulierung der Frage Matt 3 823 23.02.2019 12:45
Letzter Beitrag: Tommy56
  Timer Sketch für OLED SSD1331 Talon 20 1.366 17.02.2019 10:48
Letzter Beitrag: Tommy56
  Hilfe bei Fehlermeldung Badboy89 9 1.087 13.02.2019 15:23
Letzter Beitrag: Tommy56
Sad Neuling verzweifelt braucht Hilfe delay durch timer ersetzen Lois 1 785 06.02.2019 16:15
Letzter Beitrag: Tommy56

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste