Void Loop - OLED Display schwarz

Hallo zusammen!

Bitte steinigt mich nicht, aber in Bezug auf Arduino bin ich ein absoluter Anfänger.

Sitze nun schon mehrere Tage vor einem Sketch und habe trotz Internet und diesem Forum hier keine Lösung für mein Problem gefunden.

Fangen wir mal an:

Habe einen Nano V3 in Verbindung mit einem ADS1115 und einem OLED 0.96 4 Pin Display um 2 Sensoren für eine Gasanalyse auszulesen.

Der vorgegebene Sketch läuft sein Programm "Void Setup" so ab wie gewünscht. Geht es jetzt aber an die "Void Loop" Schleife, bleibt das Display dunkel.

Die letzte Meldung ist dann "System OK" bevor der Nano dann ein Nickerchen macht.

Warum??

Bin auf der Fehlersuche nach eventuell kalten Lötstellen mit meinem Finger auf die analogen Eingänge des ADS1115 gekommen......plötzlich läuft die "Void Loop" Schleife und zeigt mir abwechselnd die Sensoren an, so wie es sein soll. Das ganze Spiel läuft ca. 2 Minuten, bis das Display wieder schwarz ist.

Unter Arduino IDE habe ich schon einige Tests wie I2C und Display durch.

Ein Problem an der Hardware schliesse ich aus, da ich nun die Platine mit neuen Bauteilen von einem anderen Hersteller auf einem Breadboard nachgebaut habe, und das Problem weiterhin besteht.

Weder beim Kompilieren, noch beim Hochladen zeigt mit IDE irgendeinen Fehler an. Also scheint die Bibliothek ja auch ok zu sein, oder!?

Bin wirklich ratlos.

LG vom Äffchen

Hier noch ein Bild vom Aufbau:

Hoffe nicht das ich noch etwas vergessen habe.




#include <Adafruit_LEDBackpack.h>
#include <Wire.h>
#include <splash.h>
#include <Adafruit_ADS1015.h>
#include <RunningAverage.h>
#include <Adafruit_SSD1306.h>
#include "SSD1306Ascii.h"
#include "SSD1306AsciiWire.h"
#define OLED_RESET 4
#define I2C_ADDRESS 0x3C

SSD1306AsciiWire oled;



Adafruit_ADS1115 ads;

float Vcalib = 0;
float voltage = 0;
float bruecke = 0;

float gain = 0.03125;
float calibMD62 = 661.26;
float brueckeCalib = 10;
float TempKomp = 0 ;
unsigned long time;
bool initialisierung = true;

RunningAverage RA0(10);
RunningAverage RA1(10);

void setup() {

  Serial.begin(9600);
  Serial.println("Hello");

  Wire.begin();
  Wire.setClock(400000L);
  oled.begin(&Adafruit128x64, I2C_ADDRESS);
  uint16_t time = millis();
  time = millis() - time;
  oled.setFont(Callibri14);
  oled.setCursor(2, 1);
  oled.print("TDI Diver");
  oled.setCursor(2, 4);
  oled.print("TMX Analyser");
  oled.setFont(Callibri10);
  oled.setCursor(2, 6);
  oled.print("Ver 6.0 OLED GER (C) 2021");
  delay(2000);
  oled.clear();
  oled.setFont(Callibri14);
  oled.setCursor(2, 3);
  oled.print(" Rene Baumgarten ");
  delay(2000);
  oled.clear();
  ads.setGain(GAIN_FOUR);
  ads.begin();

  int16_t adc0;
  int16_t adc1;

  adc0 = ads.readADC_Differential_0_1();
  RA0.addValue(adc0);
  voltage = abs(RA0.getAverage() * gain);

  adc1 = ads.readADC_Differential_2_3();
  RA1.addValue(adc1);
  bruecke = RA1.getAverage() * gain;

  oled.setFont(Callibri11);
  oled.setCursor(2, 1);
  oled.print("He Messbruecke");
  oled.setCursor(2, 3);
  oled.print("V cell = ");
  oled.print(voltage, 2);
  oled.print("mV");
  oled.setCursor(2, 5);
  oled.print("VBruecke.=");
  oled.print(bruecke, 2);
  oled.print("mV");
  delay(2000);

  oled.clear();
  oled.setCursor(2, 1);
  oled.print("Kalibrierung");
  oled.setCursor(2, 3);
  oled.print("O2 Sensor");
  oled.setCursor(2, 5);
  oled.print("(Luft 20.9% O2 )");

  int i = 0;
  float Vavg = 0;

  for (i = 1; i < 10 or (abs (voltage - (Vavg / (i - 1)))) > 0.001; i++)
  {
    adc0 = ads.readADC_Differential_0_1();
    RA0.addValue(adc0);
    voltage = abs(RA0.getAverage() * gain);
    Vavg = Vavg + voltage;
    delay(200);
  }

  oled.setFont(Callibri14);
  oled.clear();
  oled.setCursor(2, 1);
  oled.println("Kalibirierung OK");
  Vavg = Vavg / (i - 1);
  Vcalib = Vavg;
  oled.setCursor(2, 3);
  oled.print("V cal. = ");
  oled.print(Vcalib, 2);
  oled.print("mV");
  Serial.println(voltage);

  delay(2000);
  oled.clear();
  oled.setCursor(2, 1);
  oled.print("Vorheizen");
  oled.setCursor(2, 3);
  oled.print("Heliumsensor...");
  delay(500);

  while (bruecke > 10) {
    adc1 = ads.readADC_Differential_2_3();
    RA1.addValue(adc1);
    bruecke = RA1.getAverage() * gain;
    oled.setCursor(2, 5);
    oled.print("V Brücke=");
    oled.print(bruecke, 0);
    oled.print("mV  ");
    delay(50);
  }

  oled.clear();
  oled.setCursor(1, 1);
  oled.print(" Heliumsensor OK");
  delay(2000);
  oled.clear();

  oled.setFont(Callibri14);
  oled.setCursor(2, 3);
  oled.print("System OK");
  delay(2000);
  oled.clear();
  oled.setFont(Callibri14);

}

void loop() {
  
  oled.setFont(Callibri14);
  oled.clear();           
  int16_t adc0;
  int16_t adc1;
  adc0 = ads.readADC_Differential_0_1();
  adc1 = ads.readADC_Differential_2_3();

  time = millis();

  RA0.addValue(adc0);
  voltage = abs(RA0.getAverage() * gain);

  RA1.addValue(adc1);
  bruecke = RA1.getAverage() * gain;

  float nitrox = 0;
  int MOD = 0;
  int EAD = 0;
  float helium = 0;

  nitrox = voltage * (20.9 / Vcalib);
  MOD = 10 * ( (160 / nitrox) - 1);

  if (voltage > 1) {
    oled.setCursor(20, 2);
    oled.set1X();
    oled.print("Oxygen");
    oled.set2X();
    oled.setCursor(20, 4);
    oled.print(nitrox, 1);
    oled.print(" %");
    delay(2000);
    oled.clear();

    oled.set1X();
    oled.setCursor(20, 2);
    oled.print("Helium");
    oled.setCursor(60, 1);
    oled.print("VBr: ");
    oled.print(bruecke);
    oled.set2X();
    oled.setCursor(20, 4);

    bruecke = bruecke - brueckeCalib;

    if (time < 480000) {
      TempKomp = 1 ;
    }
    if (time < 360000) {
      TempKomp = 2 ;
    }
    if (time < 300000) {
      TempKomp = 3 ;
    }
    if (time < 270000) {
      TempKomp = 4 ;
    }
    if (time < 240000) {
      TempKomp = 5 ;
    }
    if (time < 210000) {
      TempKomp = 6 ;
    }
    if (time < 180000) {
      TempKomp = 7 ;
    }
    if (time < 165000) {
      TempKomp = 8 ;
    }
    if (time < 150000) {
      TempKomp = 9 ;
    }
    if (time < 120000) {
      TempKomp = 10 ;
    }
    if (time < 105000) {
      TempKomp = 11 ;
    }
    if (time < 90000) {
      TempKomp = 12 ;
    }
    if (time < 80000) {
      TempKomp = 13 ;
    }
    if (time < 70000) {
      TempKomp = 14 ;
    }
    if (time < 60000) {
      TempKomp = 15 ;
    }
    if (time < 50000) {
      TempKomp = 16 ;
    }
    if (time < 40000) {
      TempKomp = 17 ;
    }
    if (time < 30000) {
      TempKomp = 18 ;
    }

    bruecke = bruecke - TempKomp;

    helium = 100 * bruecke / calibMD62;

    if (helium > 50) {
      helium = helium * (1 + (helium - 50) * 0.4 / 100);
    }
    if (helium < 0) {
      helium = 0;
    }

    else {
      helium = 100 * bruecke / calibMD62;
    }


    oled.print(helium, 1);
    oled.print(" %");
    delay(2000);





  }

  delay(2000);
}

Vermutung Pull Up Widerstände fehlen, in die SDA und SCL Pin's und +5V jeweils 4,7 K ( 2 ~10K) einbauen.

Bin ich auch schon drüber gestolpert hier im Forum.

Aber sind das nicht die Widerstände!?:

Normal ja 103 = 10K, haste Multimeter bei Hand? messen zw +5V und SDA, SCL.
Jedoch wen Widerstände vorhanden probieren

1 Like

Habe ich alles hier liegen....mein Wohnzimmer sieht aus wie eine Werkstatt!

Gehe davon aus du meinst die Messung am ADS1115 ohne Strom.

5V zu SCL: 4.48K
5V zu SDA: 6.47K

Das sollte OK sein = bin mit meinem Lateinisch am Ende.

Schade, wäre ja auch zu einfach gewesen :slightly_smiling_face: .

Danke dir trotzdem für deine Mühe!

Ohne Finger nur mit Bewegung geht nicht?
Die Striepen schon getauscht? Anderen Platz benutzt?

Nein, leider nicht. Dann hätte ich auf ein Kontaktproblem getippt.

Hab es gerade auch nochmal probiert....ich übertrage anscheinend einen kleinen Kriechstrom mit meinen Fingern. Mit Kunststoff funktioniert es nicht.

Komisch das auf dem ADC Eingang es Funktioniert, oder egal wo Du drauf kommst ?

Vielleicht hilft ein Bild vom ganzen Aufbau.

So....wenn ich den A1 und GND kurz brücke geht er in den "Void Loop". Also gebe ich dem ADS1115 mit meinem Finger Masse auf den A1.

Habe leider keinen richtigen Schaltplan über die Schaltung. Den einfachen Aufbau siehst du oben im Post.

Brauchst du Detail Aufnahmen von irgendeinem Bauteil?

Nein.
Wie tust Du messen Differential, oder Single-Ended?
Differential = A0 +A1
Single-Ended = A0 gegen GND usw.

Wenn ich den Sketch und das System richtig verstanden habe, dann differential!

A0+A1 und A2+A3

Stimmt versuch mal gegen GND messen, oder anders, in den Display beispiel ADS als Single einbauen was passiert,
Vorsicht aber, ich habe einem ADS loch im Bauch gemacht bei Differential, und sei dem will er nicht mehr blödes Ding :wink:

DAS übersteigt schon meine Kompetenz :joy:

Bleibt nix Übrig wie ADS Beispiele studieren und in Display einbinden == langsam vorwärts kommen

Angeblich soll der Sketch ja funktionieren bei allen Anderen. Keine Ahnung warum das bei mir nicht funktionieren will.