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 Bildschirm Problem
03.01.2021, 16:23
Beitrag #73
RE: OLED Bildschirm Problem
Ich hoff ich habs richtig gemacht. Hab das noch nie verwendet

Code:
//Einbindung der Bibliotheken

//SD Kartenmodul
#include <SD.h>
#include <Wire.h>
#include <SPI.h>
File Datei;

//OLED Display
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels

#define OLED_RESET -1
Adafruit_SSD1306 display(OLED_RESET);

//RTC
#include <DS3231.h>
DS3231 Clock;

bool Century = false;
bool h12;
bool PM;

int Jahr;
int Monat;
int Datum;
int Stunde;
int Minute;
int Sekunde;



//Allgemeine Variablen
unsigned long milli;
unsigned long millidavor=0;


int freeRam () {
   extern int __heap_start, *__brkval;
   int v;
   return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
}
void printRam() {
int ram;
  ram = freeRam ();
  Serial.println(ram);
}



void setup() {
  Serial.begin(9600);
  Serial.println(F("Serial Begin"));
  Wire.begin();
  
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);

  display.clearDisplay();
  display.drawPixel(10,10, SSD1306_WHITE);
  display.display();
  delay(2000);

  Serial.print(F("Initialisierung von SD-Karte..."));
  printRam();
while(!SD.begin(4)){
    Serial.println(F("SD Initialisierung fehlgeschlagen"));  
    delay(500);
    }
  Serial.println("OK");
  printRam();

}

void loop() {
  Serial.println(F("Loop"));
  milli = millis();

  Serial.println(F("Zeit aus RTC holen"));
  Jahr = Clock.getYear();
  Monat = Clock.getMonth(Century);
  Datum = Clock.getDate();
  Stunde = Clock.getHour(h12, PM);
  Minute = Clock.getMinute();
  Sekunde = Clock.getSecond();

  Serial.println(F("SD Karte Datei Test.txt oeffnen"));
  printRam();
  Datei = SD.open("Test.txt", FILE_WRITE);
  if(Datei){
    Serial.println(F("Zeit in Datei schreiben"));
    Datei.print(Datum);
    Datei.print(Monat);
    Datei.print(Jahr);
    Datei.print(Stunde);
    Datei.print(Minute);
    Datei.println(Sekunde);
    Datei.close();
    Serial.println(F("Schreiben auf SD beendet"));
    printRam();
    delay(500);
  }
  else{
    Serial.print(F("Fehler bei schreiben auf SD"));
  }

printRam();
  Serial.println(F("Display anzeige aktualisieren"));
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(INVERSE);
  display.setCursor(0,0);
  display.print(Sekunde);
  display.display();
  Serial.println(F("Aktualisierung abgeschlossen"));
printRam();
  delay(2000);
}

Serialle Ausgabe:
Code:
Serial Begin
Initialisierung von SD-Karte...204
OK
204
Loop
Zeit aus RTC holen
SD Karte Datei Test.txt oeffnen
204
Zeit in Datei schreiben
Schreiben auf SD beendet
204

So wie es aussieht funktioniert das mit dem F Macro Big Grin
Die Micro SD wird beschrieben und das Display aktualisiert die Sekunden.Rolleyes

Mal schaun ob ich das so weiter aufbauen kann ohne weitere beeinträchtigung.
Danke Cool


Sollen wir noch mim schließen warten, bis ich die anderen Komponenten mit eingebunden habe?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
03.01.2021, 16:29
Beitrag #74
RE: OLED Bildschirm Problem
Viel ausbauen kannst Du nicht mehr, Du bist am Limit.

Serial.println(F("OK")); hast Du vergessen.

Die beiden Funktionen zur Speicheranzeige und deren Aufruf wieder raus,
int Monat; int Datum; int Stunde; int Minute; int Sekunde;
kann byte werden (spart 5 Byte)

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
03.01.2021, 16:29
Beitrag #75
RE: OLED Bildschirm Problem
Hi,

wenn alles nicht hilft, andere Lib für das SSD1306 Display nehmen: https://github.com/greiman/SSD1306Ascii
Kann keine Grafik, nur ASCII, benötigte Sonderzeichen kann man sich im Font zurecht basteln.

Aus dem Readme:

Here is Uno memory use for the SPI "Hello world!" example with scrolling disabled:
Sketch uses 2928 bytes (9%) of program storage space. Maximum is 32256 bytes.
Global variables use 54 bytes (2%) of dynamic memory, leaving 1994 bytes for local variables. Maximum is 2048 bytes.

Gruß André
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
03.01.2021, 16:50
Beitrag #76
RE: OLED Bildschirm Problem
(03.01.2021 16:29)Tommy56 schrieb:  Viel ausbauen kannst Du nicht mehr, Du bist am Limit.

Serial.println(F("OK")); hast Du vergessen.

Die beiden Funktionen zur Speicheranzeige und deren Aufruf wieder raus,
int Monat; int Datum; int Stunde; int Minute; int Sekunde;
kann byte werden (spart 5 Byte)

Gruß Tommy

Würde ich was Sparen, wenn ich statt den Dateityp "int" "byte" verwende.
Zitat:int Monat; int Datum; int Stunde; int Minute; int Sekunde;
und wie meinst du das. Ich nehm jetzt die Variablen oben raus und erstelle die gleich beim beschreiben
-->
Code:
byte Monat = Clock.getDate;
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
03.01.2021, 17:00 (Dieser Beitrag wurde zuletzt bearbeitet: 03.01.2021 23:07 von Tommy56.)
Beitrag #77
RE: OLED Bildschirm Problem
(03.01.2021 16:50)JoeIsFame schrieb:  [quote='Tommy56' pid='80347' dateline='1609687762']
int Monat; int Datum; int Stunde; int Minute; int Sekunde;
kann byte werden (spart 5 Byte)

Würde ich was Sparen, wenn ich statt den Dateityp "int" "byte" verwende.
Zitat:Das hatte ich bereits geschrieben.
und wie meinst du das. Ich nehm jetzt die Variablen oben raus und erstelle die gleich beim beschreiben
-->
Code:
byte Monat = Clock.getDate;
Das kannst Du auch machen, wenn Du sie nur innerhalb von loop benutzt.

Wenn Du keine Grafik brauchst, solltest Du dem Rat von SpaghettiCode folgen.

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
03.01.2021, 21:57
Beitrag #78
RE: OLED Bildschirm Problem
...so mal nüchtern betrachtet nach meiner Erfahrung...mehr als 3 Librarys verträgt ein UNO Speicher einfach nicht...war früher schon so.
lgbk


An alle Neuankömmlinge hier, wenn ihr Code(Sketch) hier posten wollt dann liest euch bitte diese Anleitung durch.

Ich spreche fließend Schwäbisch, Deutsch das Notwendigste und für die Begriffsstutzigen erprobtes Tacheles mit direkten Hinweisen ohne Schnörkel...

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
04.01.2021, 06:05 (Dieser Beitrag wurde zuletzt bearbeitet: 04.01.2021 06:18 von JoeIsFame.)
Beitrag #79
RE: OLED Bildschirm Problem
Das Thema kann endlich geschlossen werden. (Wird das gemacht oder muss ich das machen. Wenn ja: Wie?)
Hat ja lang genug gedauert Big Grin
Danke für eure Hilfe Cool Tongue

Hab jetzt die DSS1306ASCII Bibliothek hergenommen. Musste allerdings eine Aktualisierungszeit einbauen, da der Bildschirm sonst zu stark flackert.

Ich konnte alle Komponenten anschließen (OLED, RTC, Micro-SD Modul, DHT22, Fotowiderstand) und es funktioniert alles. Ich kann meine Daten erfolgreich auf die Micro SD schreiben und mein Bildschirm zeigt was an. Die PullUp Widerstände werden zwingend fürs Display benötigt!

Hier zum Schluss nochmal mein Sketch mit allem was dran ist:
Code:
/*Arduinoprogramm zum Überwachen von Daten
*
* Enthaltene Bauteile:
* - OLED 0,96" I2C Display 128x64 px
* [5V -> VCC | GND -> GND | A4 -> SDA | A5 -> SCL]
*
* - DHT22 Zum Überwachen von Luftfeuchtigkeit und Temperatur
* [5V -> VCC | D2 -> IO | GND -> GND]
*
* - Kapazativer Bodenfeuchte Sensor
* [5V -> VCC | A2 -> Data | GND -> GND]
*
* - Fotowiderstand
* [Spannungsteiler -> A1 | 10k Widerstand als Spannungsteiler zu GND]
*
* - RTC (Real Time Clock) für das Anzeigen der Uhrzeit
* [5V -> VCC | GND -> GND | A4 -> SDA | A5 -> SCL]
*
* - MicroSD Board zum Abspeichern der Daten
* [5V -> VCC | GND -> GND | D11 -> MOSI | D12 -> MISO | D13 -> SCK | D4 -> CS]
*
*/

//Einbindung der Bibliotheken

//DHT22
#include <DHT.h>
#include <DHT_U.h>

#define DHTPIN 9
#define DHTTYPE DHT22

DHT dht = DHT(DHTPIN, DHTTYPE);

//SD Kartenmodul
#include <SD.h>
#include <Wire.h>
#include <SPI.h>
File Datei;

//OLED Display
#include "SSD1306Ascii.h"
#include "SSD1306AsciiAvrI2c.h"

#define I2C_ADDRESS 0x3C

#define RST_PIN -1

SSD1306AsciiAvrI2c oled;

//RTC
#include <DS3231.h>
DS3231 Clock;

bool Century = false;
bool h12;
bool PM;

int Jahr;
int Monat;
int Datum;
int Stunde;
int Minute;
int Sekunde;



//Allgemeine Variablen
unsigned long milli;
unsigned long millidavor=0;
unsigned long millidavor2=0;
unsigned long millidavor3=0;

float lf;
float tem;
int boden;
int Licht;
String sdfail = "";

void setup() {
  Serial.begin(9600);
  Serial.println(F("Serial Begin"));
  Wire.begin();
  dht.begin();
  pinMode(A2, INPUT); //Bodenfeuchtesensor
  pinMode(A1, INPUT); //Fotowiderstand
  
  oled.begin(&Adafruit128x32, I2C_ADDRESS);
  oled.setFont(Adafruit5x7);

  oled.clear();
  
  
  delay(2000);

  Serial.print(F("Initialisierung von SD-Karte..."));
  while(!SD.begin(4)){
    Serial.println(F("SD Initialisierung fehlgeschlagen"));  
    oled.clear();
    oled.println("SD nicht drin");
    delay(500);
    }
  Serial.println(F("OK"));

  
  if(SD.exists("Werte.txt")){ //Falls die Datei vorhanden ist...
    getSensors();
    SDwrite();
    }else{ //Falls die Datei nicht vorhanden ist
    Datei = SD.open("Werte.txt", FILE_WRITE);
    Datei.println("Datum$Uhrzeit$Luftfeuchte$Temperatur$Bodenfeuchte$Helligkeit");
    Datei.close();
    getSensors();
    SDwrite();
    }
    

  /*
   Clock.setClockMode(false); //24h
   Clock.setYear(21);
   Clock.setMonth(1);
   Clock.setDate(4);
   Clock.setHour(5);
   Clock.setMinute(42);
   Clock.setSecond(30);
*/
  

}

void loop() {
  Serial.println(F("Loop"));
  milli = millis();

  getSensors();


  if(boden<=108&&boden>=8&&milli-millidavor3>=2000){ //Auf SD alle 2 Sekunden schreiben, wenn Bodensensor Map im Bereich ist
    millidavor3 = milli;
    SDwrite();
  }

if(milli-millidavor >= 300000){ //Werte alle 5 Minuten abspeichern
  millidavor = milli;
  SDwrite();
}

if(milli-millidavor2>=2500){ //Display alle 2,5 Sekunden aktualisieren um flackern zu verhindern
  millidavor2 = milli;
  Serial.println(F("Display anzeige aktualisieren"));
  oled.clear();
  
  //OLED Bildschirm beschreiben
  oled.setCursor(0,0);
  oled.print("Luftfeuchte: ");
  oled.println(lf);
  oled.print("Temperatur: ");
  oled.println(tem);
  oled.print("Boden: ");
  oled.print(boden);
  oled.print("  Licht: ");
  oled.print(Licht);
  oled.println(sdfail);
  
  Serial.println(F("Aktualisierung abgeschlossen"));
}
}



void SDwrite(){ //Funktion zum beschreiben der SD Karte
  Datei = SD.open("Werte.txt", FILE_WRITE);
  if(Datei){
    sdfail = "";
    Serial.println(F("Zeit in Datei schreiben"));
    Datei.print(Datum);
    Datei.print(".");
    Datei.print(Monat);
    Datei.print(".");
    Datei.print(Jahr);
    Datei.print("$");
    Datei.print(Stunde);
    Datei.print(":");
    Datei.print(Minute);
    Datei.print(":");
    Datei.print(Sekunde);
    Datei.print("$");
    Datei.print(lf);
    Datei.print("$");
    Datei.print(tem);
    Datei.print("$");
    if(boden<=108&&boden>=8){
      Datei.print(boden);
    }else{
      Datei.print("0");
    }
    Datei.print("$");
    Datei.println(Licht);
    
    Datei.close();
    Serial.println(F("Schreiben auf SD beendet"));
    delay(500);
  }
  else{
    Serial.println(F("Fehler bei schreiben auf SD"));
    sdfail = "Fehler";
    delay(1000);
    }
}



void getSensors(){ //Funktion zum Auslesen aller Sensoren und Werte
  lf = dht.readHumidity();
  tem = dht.readTemperature();
  boden = analogRead(A2);
  boden = map(boden,610, 280, 0, 100);

  Licht = analogRead(A1);
  Licht = map(Licht,700, 10, 100, 0);
  
  if (boden <= 0){
  boden = 0;
}

  Serial.println(F("Zeit aus RTC holen"));
  Jahr = Clock.getYear();
  Monat = Clock.getMonth(Century);
  Datum = Clock.getDate();
  Stunde = Clock.getHour(h12, PM);
  Minute = Clock.getMinute();
  Sekunde = Clock.getSecond();
}

Die Speicherbelegungen dazu:
Code:
Der Sketch verwendet 21724 Bytes (70%) des Programmspeicherplatzes. Das Maximum sind 30720 Bytes.
Globale Variablen verwenden 1331 Bytes (64%) des dynamischen Speichers, 717 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
04.01.2021, 06:41 (Dieser Beitrag wurde zuletzt bearbeitet: 04.01.2021 06:42 von Bitklopfer.)
Beitrag #80
RE: OLED Bildschirm Problem
Sehr schöne Ergebnisdarstellung Heart
I2C braucht eben Pull-Up's wobei manche I2C Module bringen die auch gleich mit...also immer prüfen.
Das mit dem LCD Update Delay hat mich etwas gewundert aber anscheinend geht die Adafruit Lib da anderster vor und schreibt die Daten direkt ins Display.
Auf dem ESP32 habe ich da eine andere Lib, wobei hier die Anmerkung nötig ist das ein ESP32 einfach mehr Speicher hat:
Code:
#include <SSD1306.h> // alias for `#include "SSD1306Wire.h"`
// Include custom images
#include "images.h"  // damit kann man Grafiken ausgeben - nutze ich aber nicht
// Initialize the OLED display using Wire library
//SSD1306  display(0x3c, 5, 4); //5,4  21,22 4,15  ESP mit Oled
SSD1306  display(0x3c, 21, 22); //5,4  21,22 4,15  ESP ohne Oled
die dann auch anderster das Update gestaltet:
Code:
display.clear(); // clear the display    #### Pufferspeicher OLED löschen
// Ausgabe Uhrzeit
  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));
// Ausgabe RSSI Wert - WiFi Verbindung
  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");

// #### erst hier werden dann die Daten ins Display übernommen
  display.display(); // write the buffer to the display

lgbk


An alle Neuankömmlinge hier, wenn ihr Code(Sketch) hier posten wollt dann liest euch bitte diese Anleitung durch.

Ich spreche fließend Schwäbisch, Deutsch das Notwendigste und für die Begriffsstutzigen erprobtes Tacheles mit direkten Hinweisen ohne Schnörkel...

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
  Problem Relaisplatine Maui 14 748 23.03.2021 15:20
Letzter Beitrag: hotsystems
  Laserwert auf OLED Display ausgeben Blauepi 18 965 22.03.2021 14:00
Letzter Beitrag: Blauepi
  Problem mit "pow" awillib 9 721 27.02.2021 19:22
Letzter Beitrag: Tommy56
  Pwm Problem safitom 4 424 20.02.2021 12:14
Letzter Beitrag: safitom
  SH1107 Oled Display und Multiplexer Feuchtigkeitssteuerung Kanka 35 2.180 06.02.2021 22:38
Letzter Beitrag: Kanka
  Problem mit "Keyboard" und "Mouse" LK2567 4 479 03.02.2021 16:11
Letzter Beitrag: MicroBahner
  const char zu int Konvertierung Problem Lumplux 1 312 02.02.2021 10:26
Letzter Beitrag: Lumplux
  Arduino Uno+ Ethernetshield W5100 Website Problem Justus S. 9 714 31.01.2021 17:37
Letzter Beitrag: Tommy56
Sad MAX7221 mit gemeinsamer Anode und Problem Dezimalpunkt daja64 11 727 30.01.2021 11:07
Letzter Beitrag: daja64
  Oled Wire Frequenz huber5093 3 400 21.01.2021 23:45
Letzter Beitrag: hotsystems

Gehe zu:


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