Go Down

Topic: Dallas-Abfrage bremst Ablauf aus (Read 88 times) previous topic - next topic

buffalo64

Oct 16, 2020, 12:26 pm Last Edit: Oct 17, 2020, 07:27 pm by uwefed
Hallo

Nach längerer Zeit beschäftige ich mich wieder mit dem Arduino.
Ich möchte gerne 2 DS18B20 auslesen, ausgeben und eine Uhr mitlaufen lassen. Leider bremst die Abfrage den Ablauf aus. Ich habe hier (https://forum.arduino.cc/index.php?topic=224167.0) zwar Abhilfe gefunden, aber es funktioniert bei mir nicht. Ich habe die relevanten Teile von dem letzten Sketch von Doc_Ardino verwendet, da wo er sagt, es funktioniert und es bremst bei mir aber weiterhin. Habe ich etwas übersehen?
Leider kann ich in dem alten Thread nicht antworten, darum ein neuer.

Code: [Select]

#include <LiquidCrystal_I2C.h>
#include <Timer.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define DS18B20_PIN 7                   // Temperatursensoren OneWire auf PIN 7

OneWire sensorWire(DS18B20_PIN);        // OneWire initialisieren

DallasTemperature sensors(&sensorWire); // Verknüpfen der Temp-sensoren mit OneWire

DeviceAddress sensors1 = {0x28, 0xFF, 0x62, 0xE7, 0x35, 0x16, 0x04, 0xD9};    // Adressen der DS18B20 Temp-sensoren
DeviceAddress sensors2 = {0x28, 0xFF, 0x65, 0xFE, 0x35, 0x16, 0x04, 0x23};

LiquidCrystal_I2C lcd(0x27,20,4);       // LCD auf I2C-Bus

const int START = 2;                     // Start-taster auf PIN2
const int STOP = 6;                      // Aus-taster auf PIN6

unsigned long milliSec = millis();
int Sekunde;
int Minute;
int Stunde;
bool Run = 0;                            // Variable für Start-Taster
//float Sensor1;                             
//float Sensor2;                             

void setup() {
  pinMode(START, INPUT_PULLUP);           // Start-taster
  pinMode(STOP, INPUT_PULLUP);            // Stop-taster
 
  milliSec = millis();
 
  lcd.init();                             // LCD initialisieren
  lcd.backlight();                        // LCD Hintergrundbeleuchtung aktivieren
 
}

void loop()
{
  if (digitalRead (START) == LOW)
    { Run = 1;
       lcd.clear();     
       milliSec = millis();

       while (Run == 1)
        {
          sensors.requestTemperatures();          // DS18B20 Temperaturen abfragen

          temp_calc();
   
          Sekunde = ((millis() - milliSec)/1000) % 60;
          Minute = ((millis() - milliSec)/60000) % 60;
          Stunde = ((millis() - milliSec)/3600000) % 24;

          lcd.setCursor(0,3);

          if (Stunde<10) lcd.print("0"); // fuehrende Null
            {
              lcd.print(Stunde);
              lcd.print(":");
            }
          if (Minute<10) lcd.print("0");
            {
              lcd.print(Minute);
              lcd.print(":");
            }
          if (Sekunde<10) lcd.print("0");
            {
              lcd.print(Sekunde);
            }
         
          if ((Stunde == 0) && (Minute == 1) && (Sekunde == 15))
            {
              milliSec = 0;
              Run = 0;
            } 
          }
        }

        else
        {
          lcd.setCursor(0,0);
          lcd.print("********************");
          lcd.setCursor(0,1);
          lcd.print("*     Programm     *");
          lcd.setCursor(0,2);
          lcd.print("*     starten      *");
          lcd.setCursor(0,3);
          lcd.print("********************");
        }
}

void temp_calc()                           // Unterprogramm zur Temperaturberechnung
{
  float Sensor1 = getDallasTempC(sensors1);  // Dallas Sensor auslesen
  float Sensor2 = getDallasTempC(sensors2);  // Dallas Sensor auslesen
  lcd.setCursor(0,0);                     // Ausgabe des Wortes "Alu: " auf Pos. links 1. Zeile
  lcd.print("Sensor1: ");                     
  lcd.setCursor(9,0);                     // Ausgabe der Temperatur über Alu-Platte
  lcd.print(Sensor1, 1);
  lcd.setCursor(14,0);                     // Ausgabe des Wortes "Alu: " auf Pos. links 1. Zeile
  lcd.print("\337C");                                           
  lcd.setCursor(0,1);                    // Ausgabe des Wortes "Top: " auf Pos. Mitte 2. Zeile
  lcd.print("Sensor2: ");
  lcd.setCursor(9,1);                    // Ausgabe der Temperatur oben
  lcd.print(Sensor2, 1);
  lcd.setCursor(14,1);                     // Ausgabe des Wortes "Alu: " auf Pos. links 1. Zeile
  lcd.print("\337C"); 
}

// Funktionen für Dallas DS1820 Temperatursenor
float getDallasTempC(DeviceAddress deviceAddress)
{
  float tempC = sensors.getTempC(deviceAddress);
  //Serial.print("Temp C: ");
  //Serial.println(tempC);
  return (tempC);
}

Rentner

Hallo,

schau Dir mal das Beispiel "waitforConversion" aus der DallesThemperatur Lib an. 

Heinz

Peter-CAD-HST

Moin buffalo64
der Sensor hat die folgenden Wandelzeiten in Abhängigkeit der Auflösung:

Table 1. DS18B20 Conversion Times and Resolution Settings
Resolution                9 bit 10 bit 11 bit 12 bit
Conversion Time (ms) 93.75 187.5 375        750
LSB (°C)                        0.5        0.25 0.125 0.0625

Gruß Peter
und gesund bleiben
KISS Q&D - keep calm and carry on - mind the gap - beware of sharks! -

Serenifly

Du liest weiterhin blockierend aus

Da sagst den Sensoren weder dass sie nicht selbst warten sollen, noch machst du irgendwas mit der Zeit selbst

buffalo64

Danke Heinz, jetzt läuft's.

LG
Friedrich

Go Up