Mechanisches Thermometer DHT22 umbau DS18B20

Hallo Ich bin Neu hier.
ich Habe eine Bekannten der mir ein Thermometer Programmiert hat
mit DHT22 ich leider festgestellt das die Temperatur zB. 0 Grad außen Temperatur mein
Thermometer -2 grad anzeigt. Ich hatte es auch schon mit einem BME280 probiert aber der ist leider noch schlechter jetzt will ich es mit einem DS18B20 probieren ob der genauer ist .
ich habe den Sketch von dem Freund und hoffe das mir hier jemand helfen kann

Das Thermometer ist mir einem Motor der einen Pfeil auf eine Skala bewegt
die Rückmeldung passier über ein Poti hier mal ein Bild

#include "DHT.h"
#include <math.h>
#include <stdio.h>

DHT dht(4, DHT22);                //Datenpin Sensor

int pwm_a = 3;  //PWM control for motor outputs 1 and 2
int pwm_b = 9;  //PWM control for motor outputs 3 and 4
int dir_a = 2;  //direction control for motor outputs 1 and 2
int dir_b = 8;  //direction control for motor outputs 3 and 4

const int potiPin = A0;
const int potiVCC = A1;

int potiValue = 0;
int cspeed = 0;
float tempValue = 0;
float humidityValue = 0;

//----------------- Hier Konfiguration und Anpassung -------------------------

const int interval = 5;           //Messinterval in Sekunden
const int mspeed = 255;           //Motorgeschwindigkeit max. 255
const int steigung = 116;         //Wert für Anpassung, max 125

//----------------------------------------------------------------------------


void mset (int mpos)
{
  cspeed = 0;
  mpos = mpos + 10;
  if (mpos > 1010)mpos = 1010;
  if (mpos != potiValue)
  {
    Serial.print("running to ");
    Serial.println(mpos - 10);
  }
  while (mpos != potiValue)
  {
    potiValue = analogRead(potiPin);
    if (mpos > potiValue)
    {
      digitalWrite(dir_a, LOW);
    }
    if (mpos < potiValue)
    {
      digitalWrite(dir_a, HIGH);
    }
    if(cspeed < mspeed)cspeed++;
    analogWrite(pwm_a, cspeed);
    delay(10);
  }
  potiValue = analogRead(potiPin);
  Serial.print("Set: ");^
  Serial.print(mpos - 10);
  Serial.print(" Poti: ");
  Serial.println(potiValue - 10);
  analogWrite(pwm_a, 0);
}

void messung()
{
  tempValue = dht.readTemperature(); // ()+1,3)Temaraturdiverrenz einstelung
  humidityValue = dht.readHumidity();
  //temp = dht.readTemperature();
  //tempValue = tempValue + 2,8;
}


void setup()
{
  Serial.begin(9600);
  Serial.println("- Thermometer -");
  dht.begin();

  pinMode(pwm_a, OUTPUT);  //Set control pins to be outputs
  pinMode(pwm_b, OUTPUT);
  pinMode(dir_a, OUTPUT);
  pinMode(dir_b, OUTPUT);
  pinMode(potiVCC, OUTPUT);

  digitalWrite(potiVCC, HIGH);
  analogWrite(pwm_a, 0);
  analogWrite(pwm_b, 0);

  //Serial.println("Referenzfahrt zu - 30°C");
  //mset((0 * steigung) / 10);
  //delay(5000);
  //Serial.println("Referenzfahrt zu  0°C");
  //mset((30 * steigung) / 10);
  //delay(1000);
  //Serial.println("Referenzfahrt zu + 50°C");
  //mset((80 * steigung) / 10);
  //delay(1000);
}

void loop()
{
  messung();
  
  Serial.print("Temperature = ");
  Serial.print(tempValue);
  Serial.print(" °C");
  Serial.print(" - ");
  Serial.print("Humidity = ");
  Serial.print(humidityValue);
  Serial.println(" %");

  mset(((tempValue + 30) * steigung) / 10);

  delay(interval * 120000);
}

Vielleicht kann mir das jemand umschreiben auf das DS18B20

vielen Dank

Marc

Erstmal sowas korrigieren ?

Stimmt denn die Motor-Ansteuerung?
2° ist doch nicht sooo schlecht...

HalloJa das stimmt alles der Sensor ist auch aktiv mit Ventilator
und die Referenz Fahrt stimmt auch ich habe sie nur deaktiviert

Bei BME280 ist erstmal Luftdruck, und Relative Feuchtigkeit angesagt deshalb ist die Temp so schlecht. der BMP 280 ist schon genauer wen es geht um Temp. die DS18B20 sind meistens China nachbauten und die streuen unheimlich, um auf die 0.5°C Genauigkeit kommen muss man schon Original kaufen nur der kostet schon was == keine 5 Stk für 3 € :wink:

Wenn du da statt 2,8 einen passenden Offset (mit Dezimalpunkt statt Komma) nimmst, die Kommentarzeichen entfernst, kannst du die 2° Abweichung etwas kleiner machen.

Sind das 8 Stellen nach Komma ? :wink:
Ok Ist Kommentiert aber trotz dem

Hallo Michael_x

ja das mit dem Offset Habich auch schon Versucht, aber zB. bei -1 grad geht er auf -3 und bei 15 Grad Plus Stimmt es also ich kann noch mal einen Originalen Sensor Kaufen wie das fony gemeint hat Hmm ich bastel da schon eine weile herum

Dan mach doch

tempValue = tempValue + 2.8

Wen ein mall korrigiert dann stimt die Temp
Punkt '.' nicht Komma ',' schreiben
Der DHT22 ist doch ziemlich genau

Hallo fony
ja aber das Läuft weg ,das habe ich schon Versucht aber dann stimmt es im Plus Grad nicht mehr.
Weil wenn es 15 Grad plus hat zeig es 17,8 an.
des wegen wollte ich das um schreiben auf einen DS18B20
aber ich selber kann es nicht, ich kann nur bisschen was verändern in Sketch aber Komplet Neu schreiben beherrsche ich leider nicht
die andere Lösung ist wenn mehrere Kalibrierungen Macht
zB. bei -1 grad -2
5+ grad +1
usw eine Korrektur

Dan stimmt was nicht mit dem DHT wen ich am BME korrektur eintrage meistens nur um +- 1°C dann stimmen die werte ab 0° bis 45° bei 1 Nachkommastelle.
Nehme erstes bestes Beispiel aus der DS18B20 Lib und baue das bei dir ein.

Wen du wirklich ein DS haben willst dann damit erst mall die Adresse herausfinden und notieren. Die Lib ist diese
unter Code die ZIP datei runterladen und in die IDE einbinden Sketch --> Bibliothek einbinden. DS18B20 ds(2); anpassen hier wird Pin 2 verwendet.

#include <DS18B20.h>

DS18B20 ds(2);

void setup() {
  Serial.begin(9600);
  Serial.print("Devices: ");
  Serial.println(ds.getNumberOfDevices());
  Serial.println();
}

void loop() {
  while (ds.selectNext()) {
    switch (ds.getFamilyCode()) {
      case MODEL_DS18S20:
        Serial.println("Model: DS18S20/DS1820");
        break;
      case MODEL_DS1822:
        Serial.println("Model: DS1822");
        break;
      case MODEL_DS18B20:
        Serial.println("Model: DS18B20");
        break;
      default:
        Serial.println("Unrecognized Device");
        break;
    }

    uint8_t address[8];
    ds.getAddress(address);

    Serial.print("Address:");
    for (uint8_t i = 0; i < 8; i++) {
      Serial.print(" ");
      Serial.print(address[i]);
    }
    Serial.println();

    Serial.print("Resolution: ");
    Serial.println(ds.getResolution());

    Serial.print("Power Mode: ");
    if (ds.getPowerMode()) {
      Serial.println("External");
    } else {
      Serial.println("Parasite");
    }

    Serial.print("Temperature: ");
    Serial.print(ds.getTempC());
    Serial.print(" C / ");
    Serial.print(ds.getTempF());
    Serial.println(" F");
    Serial.println();
  }

  delay(10000);
}

wen du das hast melde dich der Rest ist einfach :wink:

ok ich bestelle mal einen Besseren DHT 22 beim Reichel aber ich hab schon ein paar Probiert
mein Sketch Funktioniert nur mit dem DHT 22 wenn das mit dem DS18B20 laufen soll
muss ich den Sketch erst ändern aber ich kann das leider nicht vielleicht kannst du den so um Programmieren das er für den DS18B20 funktioniert

ok Vielen Dank

Du schreibst das ein BME vorhanden ist dann teste den mall mit Temp Anpassung

Vielen Dank schon mal
Hier die Adresse 40 112 26 149 240 1 60 115 vom Temperatursensor

Das heißt du hast schon einen? Jeder DS hat eigene Adresse

Ich habe es mit einem BME 280 Probiert

Ja das weiß ich das ich die immer eine eigene Adresse haben
hab da schon mal mir einem Raspy gebastelt

Dann versuch doch ein map.
Mal angenommen, du hast bei -1°C tatsächlichem Wert eine Anzeige von -2°C und bei 15°C 17°C, dann könnten es bei -15°C eigentlich -17°C in der Anzeige sein.
Da weicht es also vom Nullpunkt aus fast in jede Richtung gleich ab.

Wenn Du jetzt ein map() benutzt, musst Du nur darauf achten, das Du sowohl den untenen als auch den oberen Wert passend zu 0 als Mitte machst.
Um sicher zu gehen, das alles rein passt, setze +-60°C an. Das wäre das 4fache vom derzeitigen.
Du schreibst leider nicht, wie das Verhalten bei 30°C tatsächlicher Temperatur ist - also sprich, ob die Abweichung linear ansteigt.
Wenn ja, braucht es keine weiteren Bedingungen.

myTemp=map(temp,-64, 64, -60, 60);

ja das habe ich schon probiert und es ist leider nicht linear
des wegen wollte ich mal eine DS18B20 Probieren
aber ich bestelle noch mal einen DHT22 der präziser ist
aber diese Sensoren glaube Ich haben alle ihre schwächen