"gelöst" LCD-Shield und DS18B20 klappt nicht

Ich möchte ein paar Tests mit dem Temperatursensor DS18B20 machen. Klemme ich diesen an die Steckerleiste des LCD-Shields (ebay Art-Nr. 310701795205) an, werden auf dem seriellen Monitor keine Daten (-127 Grad) angezeigt. Lasse ich das Shield weg, läuft alles einwandfrei. Ich nutze Pin 3 und 5 so wie Masse und +5V.

Hat jemand eine Idee, woran das liegen könnte?

Frank

Gelegenheitsbastler:
Hat jemand eine Idee, woran das liegen könnte?

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

Dreimal darfst Du raten, welche Pin-Nummer Du nicht für irgendwas anderes benutzen darfst, wenn Du ein LCD-Keypad-Shield auf Deinen Arduino draufsteckst.

Autsch. Das war wohl selten dämlich. Ich probiere es später noch mal nur mit Pin3.

Frank

edit: Ich habe es nochmal mit Pin 2 und Pin 3 probiert. Das Ergebnis ist ähnlich. Die Temperatur wird allerdings nicht mit -127, sondern mit 0 angezeigt. Lasse ich das LCD-Shield weg, läuft wieder alles. Das war es dann wohl nicht (nur).

Gelegenheitsbastler:
edit: Ich habe es nochmal mit Pin 2 und Pin 3 probiert. Das Ergebnis ist ähnlich. Die Temperatur wird allerdings nicht mit -127, sondern mit 0 angezeigt. Lasse ich das LCD-Shield weg, läuft wieder alles. Das war es dann wohl nicht (nur).

"Probiert" hört sich nicht besonders vertrauenserweckend an, so als wenn Du Dir wegen der Schaltung nicht so ganz sicher bist.

Zeige Deine Schaltung und zeige den verwendeten Programm-Sketch!
Wie lang sind die Leitungen zu den Sensoren? Wie groß hast Du den PullUp-Widerstand für den OneWire-Bus gewählt?

Mir ist aufgrund des bisher von Dir geschriebenen nämlich völlig schleierhaft, was Du am OneWire-Bus "nochmal mit Pin 2 und Pin 3 probiert" hast. An den OneWire-Bus kannst Du zig OneWire-Sensoren an einen einzigen Datenpin dranhängen und darüber abfragen.

Im übrigen darfst Du zusammen mit einem LCD-Keypad-Shield nicht nur die sechs Pins nicht benutzen, über die die Daten übertragen werden, auch diese beiden Pins müssen freibleiben:

  • Pin für die Ansteuerung der Buttons (A0)
  • Pin für die Ansteuerung der Hintergrundbeleuchtung (meist D10)

Gerade beim Pin für die schaltbare Hintergrundbeleuchtung kann es je nach Hersteller des Shields auch mal Abweichungen geben, also dass es nicht D10 ist sondern ein anderer Pin. Über welchen Pin wird denn an Deinem LCD Keypad Shield die Hintergrundbeleuchtung geschaltet?

Probiert bedeutet, dass ich den Sketch geändert und die Kabel umgelegt habe, in der Ungewissheit, ob es denn auch wirklich funktionieren wird. Sollte ich besser schreiben "getestet"? Die Schaltung ansich funktioniert mit dem Sketch. Das ist nicht das Problem. Wenn ich dir von der wilden Verstrippung ein Foto mache, wird das wahrscheinlich auch nicht sehr viel weiter helfen.

Der Sketch sieht so aus:

/********************************************************
**  Downloaded from:                                   **
**  http://www.arduino-projekte.de                     **
********************************************************/


//Konstante Werte definieren
#define ONE_WIRE_BUS  3                             // D5 pin, verbunden mit DS18B20 DQ-pin 
#define waitTime      500                            // Aktualisierungszeit in ms
#define Tmax          35.0                           // max. Temperatur
#define Tmin          22.0                           // min. Temperatur
#define FAN1          2                              // D3 PWM pin
//#define FAN2          5                              // D5 PWM pin
//#define FAN3          6                              // D6 PWM pin
//#define FAN4          9                              // D9 PWM pin

//************************************************************************************************************

//Bibliotheken einbinden
#include <OneWire.h>  
#include <DallasTemperature.h>

//************************************************************************************************************

//Objekte initialisieren
OneWire oneWire(ONE_WIRE_BUS);                       // OneWire initialisierung
DallasTemperature sensors(&oneWire);                 // DallasTemperature initialisierung

float   Temperature;                                 // Temperatur Variable
int     FanSpeed;                                    // Luefter Geschwindigkeit 
int     FANarray[] = {FAN1};

//************************************************************************************************************

void setup() {
 Serial.begin(57600);                                // Serielle Schnittstelle(USB) initialisieren
 Serial.println("Begin");
 
 sensors.begin();                                    // Tempratur-Biblitothek starten

 //Luefter Einzelfunktionspruefung
 Serial.println("Lueftertest");   
 for (int i=0;i<4;i++)
 {
  pinMode(FANarray[i], OUTPUT);  
  digitalWrite(FANarray[i], HIGH);                    // Volle Lueftergeschwindigkeit setzen
  delay(2000);
  digitalWrite(FANarray[i], LOW);                     // Luefter auschalten
 }
 Serial.println("Lueftertest Ende");    
}

//************************************************************************************************************

void loop() {
  sensors.requestTemperatures();                      // Temperatur lesen
  Temperature = sensors.getTempCByIndex(0);           // Temperatur vom Sensor 0 auslesen  
  Serial.print("Temperatur: ");                       // Werte ueber RS232 Port ausgeben
  Serial.println(Temperature);       
  
  FanSpeed = map(Temperature, Tmin, Tmax, 0, 255);    // Tmin->0% // Tmax->100%
  Serial.print("Lueftergeschwindigkeit: ");           // Werte ueber RS232 Port ausgeben
  
  if (FanSpeed<25)   FanSpeed = 0;
  if (FanSpeed>255) FanSpeed = 255;
  Serial.println(FanSpeed);        
  
  for (int i=0;i<4;i++)
  {
    analogWrite(FANarray[i], FanSpeed);               // PWM Geschwindigkeit setzen
  }

  delay(waitTime);  
}

//************************************************************************************************************

Die Leitungen zwischen dem Uno und dem Steckbrett sind ca. 10-15 cm lang. Der PullUp hat 4,7 K.

Ich brauche zwei Pins, da ich einemal die Temperatur erfassen muss und mit dem anderen den Lüfter, bzw. Mosfet ansteuern muss. Aber auch wenn ich den Lüfter weg lasse klappt es nicht, sobald das LCD dazwischen hängt. Die Temperatur wird einfach nicht angezeigt. Ich werde wohl das Display vom Shield ablöten, dann habe ich diese Probleme nicht mehr.

A0 und D10 sind nicht auf die Steckerleiste (Platinenlayout sieht das nicht vor) verbunden. Daher kann ich die gar nicht versehentlich nutzen. Wo die Hintergrundbeleuchtung geschaltet ist, weiss ich nicht. Aber an zwei Pins gleichzeitig wird das nicht sein. Also muss die Ursache wo anders liegen.

Ich habe auch noch andere Sketche mit Pin 2 und Pin 3 getestet, die den DS18S20 ansprechen. Alles läuft, wenn das LCD nicht angeschlossen ist. Sobald es dran hängt, läuft es nicht mehr.

Frank

Nur eine Idee: hast Du die Stromversorung kontrolliert? Welche Spannung misst Du zwischen 5V und GND Pin? Wie wird die Combo mit Strom versorgt? Über USB?

Gelegenheitsbastler:
Der Sketch sieht so aus:

OK. Also den Temperatursensor an 3 und einen Ventilator an 2:

#define ONE_WIRE_BUS  3
#define FAN1          2
und ein Fan-Array, in dem dieser eine Fan-Pin drinsteht:
int     FANarray[] = {FAN1};

Was für ein Board verwendest Du eigentlich?
An einem UNO sind die PWM-Pins: 3, 5, 6, 9, 10, und 11.
Aber nicht 2.

Weiterhin hast Du zweimal eine falsche Schleife drin:

 for (int i=0;i<4;i++)
 {
  pinMode(FANarray[i], OUTPUT);  
  digitalWrite(FANarray[i], HIGH);                    // Volle Lueftergeschwindigkeit setzen
  delay(2000);
  digitalWrite(FANarray[i], LOW);                     // Luefter auschalten
 }

Wenn Dein Fanarray nur ein einziges Element enthält und Du den Index von 0 bis 3 laufen läßt, dann greifst Du mit FANarray[1], FANarray[2] und FANarray[3] auf irgendwelche Variablen zu, die HINTER Deinem Array liegen. Es gibt bei C kein Range-Checking auf gültige Array-Indizes, dafür bist Du als Programmierer selbst zuständig, dass Du nicht mit falschem Index außerhalb des deklarierten Arrays zugreifst!

Hier übrigens dasselbe nochmal:

  for (int i=0;i<4;i++)
  {
    analogWrite(FANarray[i], FanSpeed);               // PWM Geschwindigkeit setzen
  }

Nur ein Fan im Array, aber Index läuft über 0, 1, 2 und 3?

Im Code sehe ich übrigens keinerlei Code für das LCD-Shield.
Das Shield steckst Du nur auf, aber Du initialisierst es nicht?

Die Stromversorgung läuft über USB. Es sind 4,8xx V. Den genauen Wert müsste ich heute Abend messen. Bin grad nicht daheim.

Selbst wenn der Venti nicht an einem PWM-Pin hängt, läuft er zumindest bei überschreiten der Temperatur an. Dass die Pins nicht stimmen hatte ich gesehen und sie daher auch nochmal getauscht. Das Ergebnis ist immer gleich. Es läuft nicht. Ich verwende den Uno.

Das mit der Schleife wusste ich nicht. Aber ist auch in meinem Testaufbau nicht so tragisch, nehme ich an. Denn es läuft ja, wenn das Shield nicht installiert ist. Das LCD habe ich noch nicht initialisiert, weil das erst im zweiten Schritt kommen sollte. Heute Mittag kam die Lösung meines Problems. Das 20x4 Display wurde vom Postboten gebracht. Endlich. Das Thema LCD-Shield und DS18S20 hat sich also vorerst erledigt.

Damit hat sich das Shield-Problem von selbst gelöst. Ich brauche das kleine Display des Shields nicht mehr. Aber jetzt kommt schon das nächste Problem. Ich habe einen I²C Adapter für mein 2004 vom freundlichen Chinamann gekauft. Damit bekomme ich das Display aber nicht ans laufen. Aber das die Überschrift nicht mehr passt, werde ich dazu einen neuen Faden aufmachen.

Frank

Wenn Du mit einem Array über seine Größe hinausschreibst dann überschreibst Du irgendwelche Variablen die irgend etwas machen oder bedeuten. Da ist es möglich daß darum der DC18B20 oder das I2C Display nicht funktioniert.

Grüße Uwe