Display und GPS-Sensor geht nicht mit Temperatursensoren

Hallo zusammen,
bitte um Nachsicht, das ist mein erster Kontakt mit diesem Forum.
meine Komponenten:
Elegoo Uno R3
Neo-6M (GPS-Sensor) (2-Wire-Bus)
DS 18b20 (Temperatursensor) (OneWireBus)
Display (128x64, I2C)
Ich möchte die GPS Geschwindigkeit und die aktuelle Temperatur auf dem Display anzeigen lassen.
Hierbei schalte ich über einen taster zwischen drei Anzeigen durch.
Das Problem tritt auf sobald ich versuche die Temperatursensoren einzubinden. Der Code mit GPS geht alleine ganz gut. Sobald ich den Temperaturteil hinzufüge scheitert die Verbindung zum Display und es wird kein neues Bild angezeigt. die Fehlermeldung aus zeile 53 ("SSD1306 allocation failed") Wird ebenfals auf dem Serielenmonitor angezeigt.

Außerdem tritt bei dem Code Ohne Temperaturteil ein Ungewöhnlich langes Delay bei Umschalten der Anzeigen auf.

Daher Meine Frage an euch,
Könnt ihr bei diesen zwei Problemen bitte helfen?

Danke
Sebastian

// 060_Project

//GPS, Menü bis 3 Funktioniert und 2 Temperatursensoren (18b20 )
#include <SoftwareSerial.h>
#include <Wire.h>
//Display
#include <Adafruit_SSD1306.h>
//GPS
#include <TinyGPS++.h>
//Temp-Sensor
#include <DallasTemperature.h>
#include <OneWire.h>

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

//On an arduino UNO: A4(SDA), A5(SCL)
#define OLED_RESET -1        //Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C  //See datasheet for Address
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
#define rxPin 2
#define txPin 3
SoftwareSerial neogps(rxPin, txPin);
TinyGPSPlus gps;

//Button def. Menue
#define button_D 11
#define button_E 12
#define DEFAULT_DELAY 300

int Puls = 0;  // Zähler
bool button0read = false;
bool button0on = false;
unsigned long button0millis = 0;
// Temp-Sensor
const int oneWireBus = 4;  //GPIO Pin 1-Wire Bus
OneWire oneWire(oneWireBus);
DallasTemperature sensors(&oneWire);

//Sensor 1: 28  CC  32  07  D6  01  3C  6C
//Sensor 2: 28  F7  2C  07  D6  01  3C  A7
float tempSensor1, tempSensor2;
uint8_t sensor1[8] = { 0x28, 0xFF, 0x64, 0x0E, 0x6D, 0xB1, 0x25, 0x3C };
uint8_t sensor2[8] = { 0x28, 0xFF, 0x64, 0x0E, 0x7B, 0x3C, 0xFA, 0x17 };

void setup() {
  Serial.begin(115200);
  //Begin serial communication Neo6mGPS
  neogps.begin(9600);
  sensors.begin();
  // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
  if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
    Serial.println(F("SSD1306 allocation failed"));
    for (;;)
      ;  // Don't proceed, loop forever
  }

  display.clearDisplay();
  display.display();
  delay(2000);

  //button Menu
  pinMode(button_D, INPUT_PULLUP);
  pinMode(button_E, INPUT_PULLUP);
}

void loop() {

  //Menu
  boolean button0read = digitalRead(button_E);

  if (button0read == true) {
    button0millis = millis();
  }

  if (button0read == false && button0on == false && millis() - button0millis > 1) {
    button0on = true;
  }

  if (button0read == true && button0on == true) {
    button0on = false;
    Puls = Puls + 1;
    if (Puls > 3) {
      Puls = 1;
    }
    Serial.print(Puls);
  }

  // GPS
  boolean newData = false;
  for (unsigned long start = millis(); millis() - start < 1000;) {
    while (neogps.available()) {
      if (gps.encode(neogps.read())) {
        newData = true;
      }
    }
  }

  updateSub();
  //Temp-Sensoren
  sensors.requestTemperatures();
  tempSensor1 = sensors.getTempC(sensor1);  // Gets the Sensor 1 values
  tempSensor2 = sensors.getTempC(sensor2);  // Gets the Sensor 2 values
  Serial.print(tempSensor1);
  Serial.println(" ºC  - Sensor 1");
  Serial.print(tempSensor2);
  Serial.println(" ºC  - Sensor 2");
}

void updateSub() {
  display.clearDisplay();
  display.setTextColor(SSD1306_WHITE);

  switch (Puls) {
    case 0:
      Puls = 1;
      break;

    case 1:
      //String gps_speed = String(gps.speed.kmph());
      display.setCursor(0, 0);
      display.setTextSize(3);
      display.print(gps.speed.kmph());
      display.setCursor(75, 20);
      display.setTextSize(2);
      display.print("km/h");
      display.setTextSize(1);
      display.setCursor(0, 50);
      display.print("SAT:");
      display.setCursor(25, 50);
      display.print(gps.satellites.value());

      display.setTextSize(1);
      display.setCursor(70, 50);
      display.print("ALT:");
      display.setCursor(95, 50);
      display.print(gps.altitude.meters(), 0);
      display.display();
      break;

    case 2:
      //String gps_speed = String(gps.speed.kmph());
      display.setCursor(0, 0);
      display.setTextSize(3);
      //display.print(gps.speed.kmph());
      //display.print(Puls+5);
      display.print("Zwoa");
      display.setCursor(75, 20);
      display.setTextSize(2);
      display.print("km/h");

      display.setTextSize(1);
      display.setCursor(0, 50);
      display.print("SAT:");
      display.setCursor(25, 50);
      display.print(gps.satellites.value());

      display.setTextSize(1);
      display.setCursor(70, 50);
      display.print("ALT:");
      display.setCursor(95, 50);
      display.print(gps.altitude.meters(), 0);
      display.display();
      break;

    case 3:
      //String gps_speed = String(gps.speed.kmph());
      display.setCursor(0, 0);
      display.setTextSize(3);
      //display.print(gps.speed.kmph());
      display.print("Droa");
      display.setCursor(75, 20);
      display.setTextSize(2);
      display.print("km/h");

      display.setTextSize(1);
      display.setCursor(0, 50);
      display.print("SAT:");
      display.setCursor(25, 50);
      display.print(gps.satellites.value());

      display.setTextSize(1);
      display.setCursor(70, 50);
      display.print("ALT:");
      display.setCursor(95, 50);
      display.print(gps.altitude.meters(), 0);
      display.display();
      break;
  }
}

was soll das denn bedeuten?

  for (unsigned long start = millis(); millis() - start < 1000;) {
    while (neogps.available()) {
      if (gps.encode(neogps.read())) {
        newData = true;
      }
    }
  }
// 060_Project

//GPS, Menü bis 3 Funktioniert und 2 Temperatursensoren (18b20 )
#include <SoftwareSerial.h>
#include <Wire.h>
#include <Adafruit_SSD1306.h>//Display
#include <TinyGPS++.h>//GPS
#include <DallasTemperature.h>//Temp-Sensor
#include <OneWire.h>

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

//On an arduino UNO: A4(SDA), A5(SCL)
#define OLED_RESET -1        //Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C  //See datasheet for Address
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
#define rxPin 2
#define txPin 3
SoftwareSerial neogps(rxPin, txPin);
TinyGPSPlus gps;

//Button def. Menue
#define button_D 11
#define button_E 12
#define DEFAULT_DELAY 300

byte Puls = 1;  // Zähler

// Temp-Sensor
const int oneWireBus = 4;  //GPIO Pin 1-Wire Bus
OneWire oneWire(oneWireBus);
DallasTemperature sensors(&oneWire);

//Sensor 1: 28  CC  32  07  D6  01  3C  6C
//Sensor 2: 28  F7  2C  07  D6  01  3C  A7
float tempSensor1, tempSensor2;
uint8_t sensor1[8] = { 0x28, 0xFF, 0x64, 0x0E, 0x6D, 0xB1, 0x25, 0x3C };
uint8_t sensor2[8] = { 0x28, 0xFF, 0x64, 0x0E, 0x7B, 0x3C, 0xFA, 0x17 };

void setup() {
  Serial.begin(115200);
  neogps.begin(9600); //Begin serial communication Neo6mGPS
  sensors.begin();
  // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
  if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
    Serial.println(F("SSD1306 allocation failed"));
    for (;;);  // Don't proceed, loop forever
  }
  delay(2000);
  display.setTextColor(SSD1306_WHITE);
  updateSub();

  //button Menu
  pinMode(button_D, INPUT_PULLUP);
  pinMode(button_E, INPUT_PULLUP);
}

void loop() {
  static boolean button0read = false;
  static bool button0on = false;
  static unsigned long button0millis = millis();
  static unsigned long GPSmillis = button0millis;

  //Menu
  button0read = digitalRead(button_E) == LOW;
  if (button0read  && !button0on ) {
    button0millis = millis();
    button0on = true;
    Puls = Puls + 1;
    if (Puls > 3)Puls = 1;
    Serial.print(Puls);
    updateSub();
  }
  if (button0on)if (!button0read && millis() - button0millis > 20)button0on = false;

  // GPS
  if (millis() - GPSmillis >= 1000) {
    GPSmillis += 1000;
    while (neogps.available()) gps.encode(neogps.read());
  }
  //Temp-Sensoren
  sensors.requestTemperatures();
  tempSensor1 = sensors.getTempC(sensor1);  // Gets the Sensor 1 values
  tempSensor2 = sensors.getTempC(sensor2);  // Gets the Sensor 2 values
  Serial.print(tempSensor1);
  Serial.println(" ºC  - Sensor 1");
  Serial.print(tempSensor2);
  Serial.println(" ºC  - Sensor 2");
}

void updateSub() {
  display.clearDisplay();

  switch (Puls) {
    case 1:
      //String gps_speed = String(gps.speed.kmph());
      display.setCursor(0, 0);
      display.setTextSize(3);
      display.print(gps.speed.kmph());
      display.setCursor(75, 20);
      display.setTextSize(2);
      display.print("km/h");
      display.setTextSize(1);
      display.setCursor(0, 50);
      display.print("SAT:");
      display.setCursor(25, 50);
      display.print(gps.satellites.value());

      display.setTextSize(1);
      display.setCursor(70, 50);
      display.print("ALT:");
      display.setCursor(95, 50);
      display.print(gps.altitude.meters(), 0);
      display.display();
      break;

    case 2:
      //String gps_speed = String(gps.speed.kmph());
      display.setCursor(0, 0);
      display.setTextSize(3);
      //display.print(gps.speed.kmph());
      //display.print(Puls+5);
      display.print("Zwoa");
      display.setCursor(75, 20);
      display.setTextSize(2);
      display.print("km/h");

      display.setTextSize(1);
      display.setCursor(0, 50);
      display.print("SAT:");
      display.setCursor(25, 50);
      display.print(gps.satellites.value());

      display.setTextSize(1);
      display.setCursor(70, 50);
      display.print("ALT:");
      display.setCursor(95, 50);
      display.print(gps.altitude.meters(), 0);
      display.display();
      break;

    case 3:
      //String gps_speed = String(gps.speed.kmph());
      display.setCursor(0, 0);
      display.setTextSize(3);
      //display.print(gps.speed.kmph());
      display.print("Droa");
      display.setCursor(75, 20);
      display.setTextSize(2);
      display.print("km/h");

      display.setTextSize(1);
      display.setCursor(0, 50);
      display.print("SAT:");
      display.setCursor(25, 50);
      display.print(gps.satellites.value());

      display.setTextSize(1);
      display.setCursor(70, 50);
      display.print("ALT:");
      display.setCursor(95, 50);
      display.print(gps.altitude.meters(), 0);
      display.display();
      break;
  }
}

Danke für deine Bemühungen,
Leider wird immernoch der Fehler "SSD1306 allocation failed" angezeigt.
der von dir entfernte code wäre eine entprellung gewesen.
Leider geht die Kommunikation mit dem Display nicht, es bleibt schwarz.

Hallo wei5br0t

Entkompliziere das Projekt und starte mit einem Tutorial für die SSD1306 Anzeige alleine.

Ich schalte mich mall ein :wink:
Für den kleinen OLED nimm die U8g2 Lib nach dem Beispiel für u8x8, ist viel kleiner, gut dokumentiert. Die Adafruit_SSD1306 ist viel zu dick für reine alphanumerische Ausgabe, eventuell die ssd1306ascii, ist auch nur für alphanumerische Ausgabe gemacht.

Mit display.begin() versucht er intern ja mit malloc dynamisch speicher zu allokieren und die ausgabe hört sich so an als ob das fehlschlägt weil nicht mehr genügend frei ist. Deshalb die Vorschläge mit dem programm aufräumen bzw erstmal nur das ssd1306 tutorial reinzuladen. Hilft dir am Ende nicht viel denn du brauchst den Rest des Programms ja auch irgendwie :slightly_smiling_face:
Oft ist es aber günstiger für ein paar Euro nen "dickeren" Controller mit mehr Speicher zu nehmen als tagelang Code zu optimieren (falls das mit der schlanken Lib auch noch nicht klappt) :wink:

Vielen Danke Für eure ideen,
das hilft mir weiter
Ich werde es die nächsten tage mit der u8g2 Lib versuchen :grinning:

Für Fixtexte könntest du das F-Makro anwenden. Das hilft ein wenig SRAM sparen.

Außerdem fällt mir auf du hast da duplizierten Code. Z.B. die Ausgabe der GPS Daten. kmh/SAT/ALT ... kommt in mehreren Cases for.
Pack das in eine Funktion "gpsDaten()" und ruf in beiden Cases nur mehr die Funktion "gpsDaten()" auf.

In den Beispielen ist Ordner u8x8 mit weiteren Beispielen. Wünsche viel Spaß .

@db-engineer egal was der TO macht, bei GPS, OneWire, DS18B20, geht der Speicher mit der Ada Lib für das Display zu neige, deshalb der Vorschlag die u8x8 nutzen, ist eine reine Alphanumerische Lib ohne schnick schnack, so wie die ssd1306ascii, jedoch die letzte braucht auch mehr als u8x8. Bei der u8x8 hat Oli Kraus sich gut in Zeug gelegt.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.