Arduino Nano DS18B20 CRC Fehler

Hallo ich bin neu hier im Forum und hoffe hier kann mir einer Helfen.

Ich habe ein kleines Problem mit der Temperaturmessung mit einem DS18B20.
Jedoch ist mein Programm für einen DS18S20 und nun bekomme ich einen CRC-Fehler. Da ich mich mit dem CRC noch nicht intensiv beschäftigt habe, weiß ich leider nicht wie ich diesen Fehler wieder weg bekomme. Auf meinem Display wird dann als Temperatur -1000 angezeigt.

Kann mir jemand sagen was es mit der CRC aufsicht hat bzw. wie ich den Fehler wieder wegbekomme.

//simple wireless temperature tranmitter   
// DS18S20 sensor is connected to pin 8  
// Rf modules tranmit (data) pin is connected to pin 7 on the arduino 
 
 #include <VirtualWire.h>  
 #include <OneWire.h>   
 int DS18S20_Pin = 8; //DS18S20 Signal pin on digital 8  
 OneWire ds(DS18S20_Pin); // on digital pin 8  
 char *controller;  
 char msg[6];  
 void setup()   
   {  
      Serial.begin(9600);  
      vw_set_ptt_inverted(true); //  
      vw_set_tx_pin(7);  
      vw_setup(500);// speed of data transfer Kbps  
   }  
 void loop()  
   {   
      float temperature = getTemp();  
      Serial.println(temperature);  
      dtostrf(temperature, 6, 2, msg);  
      digitalWrite(13,0);  
      vw_send((uint8_t *)msg, strlen(msg)); // Send temperature.  
      vw_wait_tx();  
      delay(750);  
     
   }  
 float getTemp()  
 {  
  //returns the temperature from one DS18S20 in DEG Celsius  
  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;  
 }

CRC Fehler?
Meist Leitungsprobleme.

Nach einem CRC Fehler brauchst du nichts mehr anzeigen zu lassen. Verwerfen!
Schrottdaten habe auf einem Display (eigentlich) nix zu suchen.

Also im Serial Monitor wird nach einem neustart 1 mal die Temperatur angezeigt und dann komm folgende Meldung :

CRC is not valid!
Device is not recognized

Ich verstehe nur nicht warum das 1mal funktioniert und dann diese Meldung kommt

Weil danach diese Bedingungen wahr werden:

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;
}

Ich verstehe nur nicht warum das 1mal funktioniert

Ich auch nicht. (wie auch)

Reduziere das Script aufs nötigste. Raus mit VirtualWire.
Verkabelung kontrollieren.

CRC is not valid!
Device is not recognized

Die Meldungen können nicht auf einmal auftreten.
Das sind mehrere Durchläufe.

combie:
Ich auch nicht. (wie auch)

Reduziere das Script aufs nötigste. Raus mit VirtualWire.
Verkabelung kontrollieren.

Die Meldungen können nicht auf einmal auftreten.
Das sind mehrere Durchläufe.

Also es sieht zumindest so aus, als würden sie auf einmal auftreten.
Wenn ich die VirtualWire raus nehme, bekomme ich folgende Fehlermeldung.

Arduino: 1.6.5 (Windows XP), TD: 1.24, Platine: "Arduino Nano, ATmega328"

Build-Optionen wurden verändert, alles wird neu gebaut

Kommunikation_Sender.ino: In function 'void setup()':
Kommunikation_Sender:14: error: 'vw_set_ptt_inverted' was not declared in this scope
Kommunikation_Sender:15: error: 'vw_set_tx_pin' was not declared in this scope
Kommunikation_Sender:16: error: 'vw_setup' was not declared in this scope
Kommunikation_Sender.ino: In function 'void loop()':
Kommunikation_Sender:24: error: 'vw_send' was not declared in this scope
Kommunikation_Sender:25: error: 'vw_wait_tx' was not declared in this scope
'vw_set_ptt_inverted' was not declared in this scope

Aber ich brauche doch die VirtuelWire für die 433MHz Funkübertragung.

Scherheinz:
Weil danach diese Bedingungen wahr werden:

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;
}

Brauche ich diese Programmzeilen nicht?

Verkabelung ist kontrolliert,alles richtig soweit.
Kann es sein das es am Widerstand liegen, denn ich habe einen 3,3kOhm anstatt 4,7kOhm.

Hallo,

wenn Du nur die VirtualWire Lib rausnimmst, beschwert sich der Compiler das ihm was fehlt.
Er meinte, Du mußt den Code radikal reduzieren nur für den Sensor.

Nur irgendwie fehlt mir im Code auch ein sauberer Temp. Request und Adressensuche. Der Code sieht seltsam aus. Kann mich aber auch täuschen. Mein Rat, nimm diese Library unten, guck dir alle Bsp. durch, notiere die Sensoradresse, wirst Du später noch brauchen. Weil das feste delay wird dich später noch maßlos stören.
http://milesburton.com/Main_Page?title=Dallas_Temperature_Control_Library
Und versorge den Sensor bitte nicht parasitär sondern sauber mit 5V. Erspart Ärger.

wenn ich einen anderen code für den sensor nehme, funktioniert das auch. Aber ich brauche diese funkübertragung. deswegen kann ich den code nicht auf den sensor beschränken.

Dein Code besteht aus 2 Komponenten.
Diese sollten getrennt getestet werden, bis zur Lauffähigkeit.
Dann kannst du es verschmelzen.

Tipp:
Achte auf saubere Schnittstellen zwischen den Bereichen, dann wird der Kram leichter wiederverwendbar.