Das Problem liegt nicht an der Farbe der Kabel
Und, dass die Verdrahtung fehlerfrei ist haben wir auch schon festgestellt...
Grundsätzlich magst du Recht haben.
Aber bedenke dabei, alle die dir helfen möchten, müssen damit klar kommen. Und je mehr dein Schaltbild nicht einer Norm entspricht, um so schwerer wird es für externe dieses zu lesen und zu verstehen.
Ein "korrekt" gezeichnetes Schaltbild wird von vielen, meist auch von Anfängern besser verstanden.
Ich verstehe absolut was ihr meint. Ich könnte jetzt auch in meinem Schaltplan alle Farben so einzeichne wie sie sein sollen - dann stimmen die Farben aber nicht mit meinem aktuelle Versuchsaufbau überein - dann komm ich durcheinander. Ich finde den aktuellen Aufbau ehrlich gesagt auch nicht so unübersichtlich... Die aktuellen Sensor-Kabelfarben sind aktuell noch teilweise fest verlötet. Schnell mal tauschen geht also gerade nicht mal so schnell... und dazu kommt, dass ich den Schaltplan eigentlich auch gar nicht posten/zeigen wollte. Das hab ich nur gemacht, weil jemand danach gefragt hat - mit dem Zusatz, dass der nicht fertig ist und die Verdrahtung in Ordnung ist, WEIL mit anderem Netzteil funktioniert der komplette Aufbau inkl. Sketch. Die ursprüngliche Frage war ja, warum ein DS18B20 -127 anzeigt - also was könnten die theoretischen Ursachen dafür sein. Diesem möchte ich ja nachgehen. Hat doch auch ganz gut geklappt. Die Antworten von euch war alle hilfreich.
Also, ich versteh euch - ihr mich vielleicht auch...
Wenn mein Aufbau und Sketch läuft, wird doch alles farblich und aufbaumäßig in Ordnung gebracht.
Aktueller Stand > Ich werde den Anschluss des Arduino nicht mehr über das 12V-Netzteil machen, sondern ein 12V-zu-9V-Netzteil besorgen und hoffen bzw. testen ob es damit läuft.
@my_xy_projekt
Übrigens hab ich mal 3,3k und 2,2K ausprobiert. Ich habe den Eindruck, dass es mit 3,3k am besten funktioniert - dennoch kommen selten noch die -127 auf der Anzeige.
Mir ist auch gerade aufgefallen, dass der Sensor vorallem dann Probleme bekommt, wenn ich zusätzlich zum 12V-Netzteil das USB-Kabel (für das hochladen des Sketchs) anschließe. Ich habe mal ein Video gemacht:
20220724 164305 - YouTube (lädt gerade noch hoch)
Verlänger mal das delay() am Ende von loop von 2000 auf 3000 - evtl. reicht es schon.
Alternativ könnte man die Fehlmessungen mit einem Counter zählen und erst bei vollem Counter anzeigen.
Ich hab das mal versuch unterzubringen:
(Nur loop tauschen)
void loop(void)
{
static float earthTemp = 0;
static byte counter = 0;
const byte maxCount = 15;
// RTC UHRZEIT
DateTime now = rtc.now(); // Uhrzeit über RTC Modul abfragen
// NÄCHTLICHE TEMPERATURABSENKUNG
if (now.hour() < STUNDE_TAG || now.hour() >= STUNDE_NACHT) // Wenn aktuelle Stunde (Uhrzeit) kleiner als Beginn-Tageszeit ODER größer als Beginn Nachtzeit, dann
{
temp_erde_min = temperatur_erde_min + temperaturabsenkung_erde_nacht; // minimaler Grenzwert für Erd-Temperatur mit nächtlicher Absenkung verrechnen
temp_erde_max = temperatur_erde_max + temperaturabsenkung_erde_nacht; // maximaler Grenzwert für Erd-Temperatur mit nächtlicher Absenkung verrechnen
}
else // Sonst
{
temp_erde_min = temperatur_erde_min; // minimaler Grenzwert für Erd-Temperatur wie eingetragen (ohne Korrektur "Nächtliche Absenkung")
temp_erde_max = temperatur_erde_max; // maximaler Grenzwert für Erd-Temperatur wie eingetragen (ohne Korrektur "Nächtliche Absenkung")
}
// SENSOREN AUSLESEN
// DS18B20
sensors.requestTemperatures(); // DS18B20 Temp-Sensor auslesen
// Giesomat
FreqCounter::f_comp = 8; // Kompensation einstellen
FreqCounter::start(100); // Startet Zählung für 100 ms
while (FreqCounter::f_ready == 0) // Warten bis Zählung abgeschlossen
frq = FreqCounter::f_freq; // Ergebnis lesen
frq = (-frq - -freq_max) * 100 / (-freq_min - -freq_max); // Frequenz in Prozent umrechnen
// DHT22 auslesen
float DHT_Luftfeuchtigkeit = dht.readHumidity(); // die Luftfeuchtigkeit auslesen und definieren als „DHT_Luftfeutchtigkeit“
float DHT_Temperatur = dht.readTemperature(); // die Temperatur auslesen und definieren als „DHT_Temperatur“
// AKTIONEN
// Wenn Tag dann Licht einschalten
if (now.hour() >= STUNDE_TAG && now.hour() < STUNDE_NACHT) // Wenn aktuelle Stunde (Uhrzeit größer gleich Beginn-Tageszeit und kleiner als Beginn Nachtzeit, dann
{
digitalWrite(PIN_RELAY4_LICHT, LOW); // Relais 4 (Licht) einschalten
Serial.println("Tag: Licht EIN!"); // serielle Monitor Ausgabe: "Tag: Licht EIN!"
}
else // Sonst
{
digitalWrite(PIN_RELAY4_LICHT, HIGH); // Relais 4 (Licht) ausschalten
Serial.println("Nacht: Licht AUS!"); // serielle Monitor Ausgabe: "Nacht: Licht AUS!"
}
//BODENTEMPERATUR
if (sensors.getTempCByIndex(0) <= temp_erde_min) // Wenn Bodentemperatur kleiner gleich Grenzwert minimale Erdtemperatur (inkl. nächt. Absenk.) dann
{
digitalWrite(PIN_RELAY1_HEIZEN, LOW); // Relais 1 (Heizmatte) einschalten
Serial.println("Bodentemperatur zu niedrig > Heizmatte EIN"); // serielle Monitor Ausgabe: "Bodentemperatur zu niedrig > Heizmatte EIN"
}
else // Sonst
{
digitalWrite(PIN_RELAY1_HEIZEN, HIGH); // Relais 1 (Heizmatte) ausschalten
Serial.println("Bodentemperatur OK"); // serielle Monitor Ausgabe: "Bodentemperatur OK"
}
//LUFTFEUCHTIGKEIT
if (luefter_steuerung == 0 && DHT_Luftfeuchtigkeit >= luftfeuchte_max || sensors.getTempCByIndex(0) >= temp_erde_max) // Wenn Luftfeuchtigkeit höher max. Grenzwert ODER Bodentemperatur höher als max. Grenzwert, dann
{
digitalWrite(PIN_RELAY2_LUFT, LOW); // Relais 2 (Lüfter) einschalten
Serial.println("Luftfeuchtigkeit ODER Bodentemperatur zu hoch > Lüftung EIN"); // serielle Monitor Ausgabe: "Luftfeuchtigkeit ODER Bodentemperatur zu hoch > Lüftung EIN"
}
else if (luefter_steuerung == 0) // Sonst noch wenn
{
digitalWrite(PIN_RELAY2_LUFT, HIGH); // Relais 2 (Lüfter) ausschalten
Serial.println("Luftfeuchtigkeit UND Bodentemperatur OK"); // serielle Monitor Ausgabe: "Luftfeuchtigkeit UND Bodentemperatur OK"
}
// ZEITSCHALTUHR
if (luefter_steuerung == 1)
{
lcd.setCursor(9, 0); // Cursor setzen: 10. Stelle, 1. Zeile
lcd.write(byte(7));
if ( TimePeriodIsOver(MyLuefterTimer, SchaltIntervall) )
{
if (luefter_laeuft)
{
digitalWrite(PIN_RELAY2_LUFT, HIGH);
Serial.println("Zeitsteuerung aktiv: Lüftung AUS");
luefter_laeuft = false;
SchaltIntervall = luefter_inakt;
}
else
{
digitalWrite(PIN_RELAY2_LUFT, LOW);
Serial.println("Zeitsteuerung aktiv: Lüftung EIN");
luefter_laeuft = true;
SchaltIntervall = luefter_akt;
}
}
}
if (digitalRead(10) == LOW)
{
lcd.setCursor(10, 0); // Cursor setzen: 10. Stelle, 1. Zeile
lcd.write(byte(6));
}
else
{
lcd.setCursor(10, 0); // Cursor setzen: 10. Stelle, 1. Zeile
lcd.print(" ");
}
//BODENFEUCHTIGKEIT
if (frq < feuchtigkeit_erde_min && frq > 0) // Wenn Bodenfeuchtigkeit unter min. Grenzwert UND über Null, dann
{
digitalWrite(PIN_RELAY3_WASSER, LOW); // Relais 3 (Bewässerung) einschalten
Serial.println("Bodenfeuchte zu niedrig > Bewässerung EIN"); // serielle Monitor Ausgabe: "Bodenfeuchte zu niedrig > Bewässerung EIN"
}
else // Sonst
{
digitalWrite(PIN_RELAY3_WASSER, HIGH); // Relais 3 (Bewässerung) ausschalten
Serial.println("Bodenfeuchte OK"); // serielle Monitor Ausgabe: "Bodenfeuchte OK"
}
//DISPLAY AUSGABE
//Datum schreiben
lcd.setCursor(0, 0); // Cursor setzen
char buf3[] = "DD.MMM"; // Tag (zweistellig), Monat (dreistellig als Text)
lcd.print(now.toString(buf3));
//Uhrzeit schreiben
lcd.setCursor(15, 0); // Cursor setzen
char buf1[] = "hh:mm"; // Uhrzeit: Stunden und Minuten (zweistellig)
lcd.print(now.toString(buf1));
//Text schreiben
lcd.setCursor(0, 1); // Cursor setzen
lcd.print("---ERDE-- ---LUFT--"); // Display Ausgabe
//ERDE - DS18B20 Werte schreiben
lcd.setCursor(0, 2); // Cursor setzen: 1. Stelle, 3. Zeile
lcd.write(byte(0)); // Zeichen 0 = Thermometer
lcd.setCursor(1, 2); // Cursor setzen: 2. Stelle, 3. Zeile
if (sensors.getTempCByIndex(0) > -120)
{
earthTemp = sensors.getTempCByIndex(0);
counter = 0;
}
else
{
counter++;
if (counter >= maxCount)
earthTemp = sensors.getTempCByIndex(0);
}
lcd.print(String(earthTemp, 1) + "\xDF" + "C "); // DS18B20 Temperatur schreiben + Grad Symbol + C + Leerzeichen (alte Zeichen überschreiben)
lcd.setCursor(8, 2); // Cursor setzen: 9. Stelle, 3. Zeile
if (earthTemp < temp_erde_min) // Wenn Erd-Temperatur unter Grenzwert, dann
{
lcd.write(byte(2)); // Zeichen 2 = Pfeil hoch
}
else if (earthTemp >= temp_erde_max) // Oder wenn Erd-Temperatur über Grenzwert, dann
{
lcd.write(byte(4)); // Zeichen 4 = Pfeil runter
}
else // Sonst
{
lcd.print(" "); // Leerzeichen (alte Zeichen überschreiben)
}
//ERDE - Giesomat Werte schreiben
lcd.setCursor(0, 3); // Cursor setzen: 1. Stelle, 4. Zeile
lcd.write(byte(1)); // Zeichen 1 = Tropfen
if (frq >= 0 && frq <= 99) // Wenn Frequenz innerhalb, dann
{
lcd.setCursor(1, 3); // Cursor setzen: 2. Stelle, 4. Zeile
lcd.print(String(frq) + " % "); // Frequenz schreiben
lcd.setCursor(3, 3); // Cursor setzen: 4. Stelle, 4. Zeile
lcd.print(" % "); // Prozentzeichen mit Leerzeichen um alte Zeichen zu überschreiben
}
else // Sonst
{
lcd.setCursor(1, 3); // Cursor setzen: 2. Stelle, 4. Zeile
lcd.print(String(frq) + " % "); // Frequenz schreiben mit Prozentzeichen
}
if (frq < feuchtigkeit_erde_min && frq > 0) // Wenn Frequenz unter minimalen Grenzwert UND über Null
{
lcd.setCursor(7, 3); // Cursor setzen: 9. Stelle, 4. Zeile
lcd.print(" "); // Leerzeichen (alte Zeichen überschreiben)
lcd.setCursor(8, 3); // Cursor setzen: 9. Stelle, 4. Zeile
lcd.write(byte(2)); // Zeichen 2 = Pfeil hoch
}
else // Sonst
{
lcd.setCursor(8, 3); // Cursor setzen: 9. Stelle, 4. Zeile
lcd.print(" "); // Leerzeichen (alte Zeichen überschreiben)
}
//LUFT - DHT Temperatur Werte schreiben
lcd.setCursor(11, 2); // Cursor setzen: 12. Stelle, 3. Zeile
lcd.write(byte(0)); // Zeichen 0 = Thermometer
lcd.setCursor(12, 2); // Cursor setzen: 13. Stelle, 3. Zeile
lcd.print(String(DHT_Temperatur, 1) + "\xDF" + "C "); // DHT Temperatur schreiben + Grad Symbol + C + Leerzeichen (alte Zeichen überschrieben)
//LUFT - DHT Feuchtigkeit Werte schreiben
lcd.setCursor(11, 3); // Cursor setzen: 12. Stelle, 4. Zeile
lcd.write(byte(1)); // Zeichen 1 = Tropfen
if (DHT_Luftfeuchtigkeit >= 0 && frq <= 99) // Wenn Luftfeuchtigkeit innerhalb, dann
{
lcd.setCursor(12, 3); // Cursor setzen: 13. Stelle, 4.Zeile
lcd.print(String(DHT_Luftfeuchtigkeit, 0) + " % "); // DHT Luftfeuchtigkeit schreiben + Prozent + Leerzeichen (alte Zeichen überschreiben)
}
else // Sonst
{
lcd.setCursor(12, 3); // Cursor setzen: 13. Stelle, 4. Zeile
lcd.print(String(DHT_Luftfeuchtigkeit, 0) + " %"); // Frequenz schreiben mit Prozentzeichen + Leerzeichen (alte Zeichen überschreiben)
}
if (luefter_steuerung == 0 && DHT_Luftfeuchtigkeit >= luftfeuchte_max) // Wenn Luftfeuchtigkeit über maximalen Grenzwert
{
lcd.setCursor(19, 3); // Cursor setzen: 20. Stelle, 4. Zeile
lcd.write(byte(4)); // Zeichen 4 = Pfeil runter
}
else // Sonst
{
lcd.setCursor(19, 3); // Cursor setzen: 20. Stelle, 4. Zeile
lcd.print(" "); // Leerzeichen (alte Zeichen überschreiben)
}
//LICHT SYMBOL
if (now.hour() >= STUNDE_TAG && now.hour() < STUNDE_NACHT) // Wenn aktuelle Stunde (Uhrzeit größer gleich Beginn-Tageszeit und kleiner als Beginn Nachtzeit
{
lcd.setCursor(12, 0); // Cursor setzen: 13. Stelle, 1. Zeile
lcd.write(byte(3)); // Zeichen 3 = Licht an
}
else // Sonst
{
lcd.setCursor(12, 0); // Cursor setzen: 13. Stelle, 1. Zeile
lcd.print(" "); // Leerzeichen (alte Zeichen überschreiben)
}
//SERIELLE MONITOR AUSGABE
Serial.println("Temperatur: " + String(sensors.getTempCByIndex(0), 1) + "°C"); // Monitor Ausgabe Temperatur DS18B20
Serial.println("Bodenfeuchte: " + String(frq) + "%"); // Monitor Ausgabe Bodenfeuchte in Prozent von Giesomat
Serial.println("Lufttemp: " + String(DHT_Temperatur, 1) + "°C"); // Monitor Ausgabe Luft-Temperatur DHT22
Serial.println("Luftfeuchte: " + String(DHT_Luftfeuchtigkeit, 0) + "%"); // Monitor Ausgabe Luft-Feuchte DHT22
delay(2000); // Pause (2000 = 2 Sekunden)
}
Der Code ist da eindeutig zu lang, das muss modularer werden.
@ my_xy_projekt
Die 3 Sekunden zeigen keine Besserung...
Danke für den Code. Damit zeigt der DS18B20 aber mal 0,0°C, mal 24,2°C und mal -127°C an.
Hab gerade nochmal bisschen rumprobiert.
Es ist tatsächlich so, dass ALLES einwandfrei funktioniert, wenn das Universalnetzteil am Arduino hängt (eingestellt auf 12V).
Nur wenn das 12V-Netzteil-Modul aktiv am Arduino hängt spinnt der Sensor - der Sensor, der seinen Strom über den 5V-Pin vom Arduino bekommt. Der Arduino müsste doch die 12V anständig umwandeln für seine Pins, oder? Macht er ja bei 12V vom Universal-Netzteil auch - ergibt irgendwie keinen Sinn für mich
Mit dem 12V-Netzteil läuft der Sensor mal ein paar Sekunden - aber sobald ich zusätzlich den USB anstecke kommen immer die -127 - immer... es scheint, also ob der Arduino dann ein Problem damit hätte, dass er von zwei Quellen Strom bekommt... macht das Sinn?
"Der Code ist da eindeutig zu lang, das muss modularer werden."
Da geb ich dir Recht Die Optimierung folgt noch...
Das ist richtig.
Wenn der zu Anfang -127 misst, dann gibt er 0 aus, da earthTemp noch nicht gefüllt ist.
Also ich sag mal so, Wenn Du hast, dann such mal ein altes USB-Kabel, was Du ganz sauber irgendwo mittendrin abisolieren kannst und dann trenne den roten Draht.
Versuche es damit - wenn es dann nicht geht, nimm so ein Teilchen wie in #35 (sowas braucht man immer) und regel die runter auf 8-9V und ab auf die Hohlbuchse.
Sonst habe ich auch keine Idee...
Hab das einstellbare Netzteil aus #35 gerade bestellt. Kommt morgen...
Bevor ich USB zerlege werd ich das andere Netzteil erstmal ausprobieren
Ich danke dir für deine Mühe und Zeit. Ich werde morgen Abend mal Bericht erstatten
Bis hierhin erstmal Danke alle
Eine Sache ist mir gerade noch aufgefallen:
- Das verbaute 12V-Netzteil macht einen leisen Fiepen
- Mein kapazitiver Feuchtigkeitsmesser zeigt beim 12V Netzteil eine andere Frequenz an, als wenn ich das komplette Setup mit dem Universal-Netzteil betriebe.
Könnte hier die Hz-Zahl des Netzteils so einen enormen Einfluss auf alle Sensoren haben, dass man gar nicht jedes beliebige 7-12V Netzteil nehmen darf? War mir gar nicht bekannt...
So fließig wie du da am bauen bist hast du bestimmt ein Digitalmutlimeter.
Mit dem würde ich mal messen wie viel Strom in den Arduino über die Hohlbuchse hineinfließt. Und dann das USB-Kabel einstecken ob sich der Stromfluß verändert.
Vermutlicher eher nicht aber es hat noch keiner gefragt: Hast du ein Oszilloskop?
Mit dem könntest du dir den Signalverlauf auf dem Datenpin des DS18B20 anschauen.
Mit dem Multimeter würde ich auch mal die Spannung an GND und Vcc des 18B20 messen,
ob es einen Unterschied macht welches Netzteil angeschlossen ist und wenn du USB zusätzlich anschließt oder nicht.
-127 als "Meßwert" bedeutet ja der Arduino hat keine gültigen Daten vom DS18B20 empfangen.
Wenn sich Fiepton ändert bedeutet das das sich die Stromentnahme ändert.
Hattest du denn mal probiert einen Glättungskondensator parallel zu GND/Vcc des DS18B20 anzuschließen?
vgs
Ich sage Dir, das Ding macht mit seinen angegebenen 0,2V Ripple alles kaputt.
Das pfeifen ist eine Spule auf einem Kern, die nicht ganz fest gewickelt ist. Das ist kein Problem (für mich zumindest nicht mehr
Verbau mal morgen den DC/DC und komm mit der Spannung runter.
Ansonsten brauchts da nen Oszi...
Mit dem Multimeter in AC Bereich kannst Du selbst den Rippel messen-. Bleibt der in allen Netzteilen gleich?
Ich hab's
Das DC-DC Netzteil war die Lösung! Hab ich heute bekommen, auf 7,5V eingestellt und jetzt läuft alles seit ca. einer Stunde ohne Probleme - auch wenn ich USB anstecke, keine falschen Werte mehr
Der Fehler lag also eindeutig am Netzteil - kann man sich mal merken, wenn mal wieder irgendwelche Sensoren spinnen
Vielen Dank für diesen Lösungsvorschlag mit dem DC-DC Netzteil und auch vielen Dank für die ganzen anderen Lösungsvorschläge. Ich habe wieder einiges dazugelernt. Danke dafür. Jetzt kann ich endlich weiterbasteln
Ergänzung:
Ich hab kein Oszilloskop.
Glättungskondensator hab ich ausprobiert - entweder hab ich es falsch gemacht oder es ändert sich dadurch nichts.
Das Problem mit dem Ripple dürfte dann auch geklärt sein, oder? (Ich hab leider keine Ahnung was das bedeutet)
Aber da jetzt alles läuft, beende ich die Suche an dieser Stelle...
Danke für Rückmeldung, und viel Spaß bei Basteln
Rippel oder Restwelligkeit ist eine der Gleichspannung überlagerte Wechselspannung. So wie am See 20 cm hohe Wellen über 3m Wasser. Die Wellen legen den Seegrund nicht trocken stören aber ein bequemes Sonnenliegen auf der Luftmadratze.
Hier ein Beispiel einer 4-Wegegleichrichtung und (unzureichende) Glättung. Die Rote Linie ist die Restwelligkeit.
Grüße Uwe
Noch etwas zu deiner "Aufklärung", das ist kein Netzteil, sondern ein Spannungsregler oder hier besser ein Stepdown-Regler.
Aber prima, dass es jetzt funktioniert.
Vorsicht, das ist kein Netzteil
Das ist ein StepDown-Wandler.
Naja, dem StepDown ist das egal und der bringt hinten durch seine eigene Schaltung vernünftiges raus..
Schön das es funktioniert.
Und danke fürs Feedback!
Na ja der Spezialist AZ nennt das "Netzteil", wahrscheinlich auch schon Patentiert
"AZDelivery-LM2596S-DC-DC-Netzteil-Parent/dp/B07ZQFCFXW"
Auch wenn es bei AZ so steht, ist es großer Mist und immer noch falsch.
Das sollte der TO sich nicht auch noch so aneignen.
Ist ja Klar, wollte nur ein wenig den TO "Schützen"
und warum muss man dann gerade auf ein Produkt von diesem Laden verlinken?
Beim DPMA kann man sich den aktuellen Stand der Anmeldungen ansehen:
(im Feld „Inhaber/Anmelder“ nach AZ-Delivery Vertriebs GmbH suchen)
und dann überlegen ob man dort noch einmal was bestellen will oder gar einen Link darauf setzen will.