LCD-Bildschirm dunkelt ab

Hallo zusammen,

seit einigen Wochen versuche ich mich mit Hilfe des Starter-Kits und anderen kleinen Anwendungsbeispielen aus dem Internet, mit Arduino vertraut zu machen. Mein erstes, eigenes Projekt ist eine kleine Aquarium-Überwachung geworden, welche die Wassertemperatur und den Füllstand misst und mir diesbezüglich Feedback in Form von LEDs und Ausgaben auf einem 16x2 LCD Bildschirm gibt (Schaltung siehe Abbildung). Soweit funktioniert alles wie geplant, allerdings habe ich das Problem, dass ab einem bestimmten Füllstand der LCD-Bildschirm abdunkelt. Meine Vermutung ist, dass der Widerstand im Füllstandssensor bei Berührung mit Wasser abnimmt und damit der Verbrauch ansteigt. Kann es dadurch zu der angesprochenen Abdunkelung kommen und wie kann ich das verhindern ? Wie ich dem Forum schon entnehmen konnte, sollte man beim Arduino Uno ja maximal einen Verbrauch von 200 mA anschließen. Über Datenblätter und Berechnungen habe ich folgendes rausbekommen:

LEDs insgesamt ca. 40 mA
LCD-Bildschirm ca. 110 mA
I2C-Schnittstelle für LCD ?
Füllstandssensor ? (Irgendwie finde ich dazu leider kein Datenblatt)

Bitte korrigiert mich, wenn ich falsch liege, da ich wirklich neu bin auf dem Gebiet. Über Tipps und Anregungen würde ich mich freuen.

Zu deiner Stromversorgung des Arduinos hast du nichts geschrieben bzw. gezeichnet.

Wir könnten sicher helfen, wenn du uns mitteilst, welchen Füllstandssenso du hast.
Poste bitte ein Hyperlink und auch deinen Sketch in Code-Tags.

Was der Transistor in deinem Bild soll, leuchtet mir nicht ein.
Evtl. soll er die Spannung kurzschließen ?

Bitte Bild vom Sensor machen und hier einstellen oder einen Link zum Sensor.
Bilder bitte direkt hier im Forum hochladen und einbinden, sonst fehlen die irgendwann.
Siehe How to use this forum - please read.

Hier nochmal das Bild:

HotSystems:
Was der Transistor in deinem Bild soll, leuchtet mir nicht ein.
Evtl. soll er die Spannung kurzschließen ?

Temperatursensor DS18B20 so wie es aussieht. Sollte aber der TO bestätigen.

Gruß, Jürgen

Katsumi_S:
Temperatursensor DS18B20 so wie es aussieht. Sollte aber der TO bestätigen.

Son Mist, und ich habe schon gedacht, ich habe den Fehler gefunden. :wink:

Mal im Ernst, mit den mageren Infos soll man helfen.

@TO
Gehts auch anders ?

Danke erstmal für eure Antworten.

@Finnlay

Aktuell habe ich den Arduino immer nur über die USB-Schnittstelle versorgt. Also ohne zusätzliches Netzteil.

@HotSystems

Ich nutze das Water Level Detection Sensor Modul, welches im Starter-Kid beigelegt war. Leider gibt es keine genaue Sensor-Bezeichnung, aber der folgende Link müsste zugehörig sein

https://www.ebay.de/i/222845138082

@Katsumi_S

Geht klar, danke. Bezüglich des Hochladens werde ich mich nochmal genauer belesen. Und ja richtig, es handelt sich um die wasserfeste Variante des DS18B20.

@HotSystems

Ich habe mich schon bemüht, es anschaulich und informativ zu gestalten…
Hier noch mein Sketch mit Kommentaren:

/*First Project - Aquarium Sensing System*/

/*Library-Including*/

#include <LiquidCrystal_I2C.h>              // include the library for I2C-LCD-Modul
#include <Wire.h>                           // include the library for 
#include <OneWire.h>                        // include the library for temperature measurement

/*Icons*/

byte thermometer[8] = //Icon für Thermometer
{
  B00100,
  B01010,
  B01010,
  B01110,
  B01110,
  B11111,
  B11111,
  B01110
};

byte wasserstand[8] = //Icon für Thermometer
{
  B00000,
  B11111,
  B00000,
  B00100,
  B01110,
  B11111,
  B00100,
  B00100
};



/*Pin-Mapping*/

LiquidCrystal_I2C lcd(0x27,16,2);           // initialize the library with the numbers of the interface pins


const int DS18S20_Pin = 2;                  // water-temperatur-sensor-pin
const int LED_WLGR = 7;                     // water-level green       --> okay
const int LED_WLRE = 6;                     // water-level red         --> to low
const int LED_WTRE = 5;                     // water-temperature red   --> to warm
const int LED_WTGR = 4;                     // water-temperature green --> okay
const int LED_WTBL = 3;                     // water-temperature blue  --> to cold
int reftemplow = 23;                        // reference-temperature low border
int reftemphigh = 27;                       // reference-temperature high border
int WLRefWert = 270;                        // reference value for analog input
// int WSDelay= 900 000;                    // 15 min measure delay
const int WL = 0;                           // water-level-parameter
int WL_value;


OneWire ds(DS18S20_Pin);                    // temparture chip i/o

void setup() 

  {

    pinMode(LED_WLGR,OUTPUT);
    pinMode(LED_WLRE,OUTPUT);
    pinMode(LED_WTRE,OUTPUT);
    pinMode(LED_WTGR,OUTPUT);
    pinMode(LED_WTBL,OUTPUT);
  
    lcd.begin();                              // set up the LCD without colums and rows
    lcd.createChar(1, thermometer);           // save thermometer symbol on LCD 
    lcd.createChar(2, wasserstand);           // save water level symbol on LCD 
    Serial.begin(9600);                       


  } 

void loop() 

  {

    int WL_value = analogRead(WL);            // get water level value

/*LCD and LED water level visualization*/
    
    lcd.setCursor(0, 0);

    Serial.print("Analog-Wert Wasserstand ist = ");
    Serial.println(WL_value);
    
    if(WL_value > WLRefWert)                         
    {
    lcd.write(2);
    lcd.print(" in Ordnung");                   // water level is okay
    digitalWrite(LED_WLGR, HIGH);
    digitalWrite(LED_WLRE, LOW);
    delay (5000);
    }

    else
    {
    lcd.write(2);
    lcd.print(" zu niedrig");                   // water level is too low
    digitalWrite(LED_WLRE, HIGH);  
    digitalWrite(LED_WLGR, LOW); 
    delay (5000); 
    }

      

    float temperature = getTemp();              // get temperature from function

/*LCD and LED water temperature visualization*/
  
    lcd.setCursor(0, 1);                        // set the cursor to column 0, line 1 ; line 1 is second row 
    lcd.write(1);       
    lcd.print(" ");     
    lcd.print(temperature);
    lcd.print(" "); 
    lcd.print((char)223);
    lcd.print("C");
    

    Serial.print("Wassertemperatur ist = ");
    Serial.print(temperature);
    Serial.println("°C");
  
    if (temperature <= reftemplow)

    {
    digitalWrite (LED_WTBL,HIGH);
    digitalWrite (LED_WTGR,LOW);
    digitalWrite (LED_WTRE,LOW);
    delay (5000);
    }

    else if (temperature > reftemphigh)

    {
    digitalWrite (LED_WTRE,HIGH);
    digitalWrite (LED_WTGR,LOW);
    digitalWrite (LED_WTBL,LOW);
    delay (5000);
    }

    else 

    {
    digitalWrite (LED_WTGR,HIGH);
    digitalWrite (LED_WTBL,LOW);
    digitalWrite (LED_WTRE,LOW);
    delay (5000);  
    }

   
  }


/* temperature function;
returns the temperature from the DS18S20 in DEG Celsius */


  float getTemp()                         
  {

  byte data[12];
  byte addr[8];

  if ( !ds.search(addr))                               //no more sensors on chain, reset search
  
  {
      ds.reset_search();
      return -1000;
  }
 
  if ( OneWire::crc8( addr, 7) != addr[7]) 
  
  {
      Serial.println("CRC is not valid!");
      return -1000;
  }
 
  if ( addr[0] != 0x10 && addr[0] != 0x28) {
      Serial.print("Device is not recognized");
      return -1000;

  }

  ds.reset();
  ds.select(addr);
  ds.write(0x44,1);                                     // start conversion, with parasite power on at the end

  byte present = ds.reset();
  ds.select(addr);    
  ds.write(0xBE);                                       // Read Scratchpad


  for (int i = 0; i < 9; i++)                           // we need 9 bytes
  
  { 
    data[i] = ds.read();
  }
  
  ds.reset_search();
  
  byte MSB = data[1];
  byte LSB = data[0];
 
  float tempRead = ((MSB << 8) | LSB);                   // using two's compliment
  float TemperatureSum = tempRead / 16;
  
  return TemperatureSum;
  
}

naja....wenn alles da wäre, bräuchten wir nicht nachfragen.

Aber ok, durch deinen Sketch muss ich mich mal durchfinden.

Dein Wassersensor solltest du besser tauschen. Der ist nicht dafür geeignet, im Wasser zu baden.
Dann sind die Leiterbahnen schnell weg.

Ich vermute der deine Spannung geht in die Knie, hast du die mal nachgemessen ?

@HotSystems

Ist ja auch richtig, dass ihr nachfragt. Ich bin neu und für mich ist das alles nicht so selbstverständlich, wie für euch. :slight_smile:

Ja es hat keine Eile, aber ich vermute am Sketch wird es nicht liegen.

Ich wollte ihn auch nicht ganz eintauchen, sondern nur am oberen Rand des Beckens einsetzen und die empfindlichen Kontakte mit Schrumpfschlauch oder Ähnlichem schützen. Zusätzlich hätte ich die Messzeitpunkte dann auch mit großen Abständen gemacht, um die Elektrolyse zu verhindern. Das der Sensor nicht optimal ist, hab ich mir gedacht. Aber so eine richtig passende Alternative habe ich noch nicht gefunden. Entweder recht teuer, oder ich gehe dann z.B.: über Ultraschall, wo allerdings die Frage ist, ob der Sensor mit der dauerhaft erhöhten Luftfeuchtigkeit zurecht kommt.

Nein stimmt, das kann ich mal machen, danke.

Ultraschallsensoren sind besser, da gibt es auch wasserdichte, die messen allerdings erst ab 20 cm.

Wenn du die Kontakte isolierst, funktioniert es nicht mehr.
Du könntest die Kontaktflächen deines Sensors mit V2A-Schrauben verlängern, die dann ins Wasser reichen.

Okay, da muss ich nochmal recherchieren, ob ich da etwas passendes finde, was den preislichen Rahmen nicht sprengt. Es ist ja mehr oder weniger eine Spielerei für mich und zum Üben gedacht.

Klar, die unteren Leiterbahnen wollte ich nicht isolieren. Ging mir um den Bereich, wo man die Kabel anschließt und wo die SMD Bauteil aufgelötet sind.

Gut, das wäre auch eine Option. Dann bleibt aber irgendwie noch das Problem mit dem vermutlichen Spannungsabfall zu prüfen. Ich werde morgen mal nachmessen und schauen, ob das die Ursache ist.

Schließ doch die ganze Elektronik erstmal an ein Handynetzteil. Die leisten in der Regel mehr als 1000 mA. Wenn das reibungslos funktioniert, hat man schon Gewissheit.
War es nicht eigentlich so, dass standardmäßig nur 100 mA dem USB-Port entnommen werden können und erst nach entsprechender Anmeldung beim Controller bis zu 500 mA freigegeben werden?

wie wäre es mit einem kapazitivem Feuchtigkeitssensor

Danke für eure Antworten. :slight_smile:

@sth77

Gute Frage, habe das jetzt mal nachgelesen im Netz mit dem USB 2.0 Port. Das könnte natürlich eine Erklärung sein. Dann muss ich jetzt mal rausfinden, wie man dem Controller mitteilt, dass er mehr als 100 mA nutzt. Das mit dem Handynetzteil werde ich auch mal probieren.

@ardubu

Das wäre vielleicht auch eine Lösung, aber ich könnte mir aber vorstellen, dass dieser Sensor die gleichen Probleme hervorruft. Ich schaue es mir aber auf jeden Fall mal an, danke.

Das hier Füllstandssensor wäre doch auch etwas ?

sth77:
War es nicht eigentlich so, dass standardmäßig nur 100 mA dem USB-Port entnommen werden können und erst nach entsprechender Anmeldung beim Controller bis zu 500 mA freigegeben werden?

Die Spezifikation der Schnittstelle sagt das, aber praktisch funktionierts auch ohne Aushandeln gleich mit 500mA.

Das Problem kann man aber einfach durch Ausmessen der Versorgungsspannung verifizieren, notfalls durch den Arduino selbst (siehe Secret Voltmeter zB https://www.instructables.com/id/Secret-Arduino-Voltmeter/ )
Grüße Uwe

@HotSystems

Das sieht doch sehr interessant aus. Mal sehen, was ich dazu so finde.

@uwefed

Wieder was gelernt, danke.

Guenthuino:
Das sieht doch sehr interessant aus. Mal sehen, was ich dazu so finde.

Was mich aber auch interessiert, warum wird das Display dunkel.

Hast du schon die Spannungen gemessen ? Das sollte doch auch machbar sein.

@HotSystems

Also ich habe es jetzt mal nachgemessen und wie vermutet, bricht die Spannung ein. Hatte am LCD beim eingetauchten Water-Level-Sensor einen Abfall von ca. 0,7 V ...

Da mir der andere Füllstandssensor so gut gefallen hat, hab ich ihn vorhin gleich bestellt. Mal schauen, wie es damit dann funktioniert.

Guenthuino:
@HotSystems

Also ich habe es jetzt mal nachgemessen und wie vermutet, bricht die Spannung ein. Hatte am LCD beim eingetauchten Water-Level-Sensor einen Abfall von ca. 0,7 V ...

Auch wenn du jetzt den Grund für das Dunkel werden des LCD gefunden hast, solltest du mal untersuchen, warum die Spannung zusammen bricht.
Das ist bei einer guten Spannungsreglung nicht normal. Vermutlich ist da auch noch etwas faul.

Edit:
passiert das auch, wenn du den Sensor in ein separates Gefäß, z.B. eine Tasse, hältst ?

@HotSystems

Okay, was würdest du vorschlagen ? Wie soll ich vorgehen bzw. was soll ich nachprüfen ?

Ja, also für die Versuche habe ich den Sensor immer in ein, mit Wasser befülltes Gefäß eingetaucht. Dabei wurde die Anzeige dann dunkler.