Zwei Wassertemperatursensoren DS18B20

Hallo,
ich versuche zwei DS18B20 an die Sensebox anzuschließen. Die Programmierung über Blockly funktioniert allerdings nicht. Woran liegt das? Wird zeitnah bei Blockly nachgebessert? Wie könnte ich es abändern, womöglich innerhalb von Blockly?
Für den zweiten Sensor bei Blockly wird keine zweite Zeile „#define …“ erstellt
Viele Grüße
Hannes

Hi Hannes,

danke für die Info. Habe ein Issues angelegt und werde es einbauen, dass mehrere DS18B20 verwendet werden können.

Viele Grüße

Mario

An der Stelle vielleicht noch wichtig ob mehrere an einen Pin angesteckt werden oder mehrere an mehrere Pins. Zur Eindeutigen Zuordnung sinnvoll sie auch an mehrere Pins anzustecken, obwohl ein großer Vorteil der OneWire Sensoren eben das auslesen über ein Kabel ist…

Kannst du schon etwas zum Zeitfenster sagen bis das umgesetzt wird?

Viele Grüße
Hannes

Hab´s gelöst. Hier vielleicht als Ansatz, es geht sicherlich sauberer.

Blockly.Arduino.sensebox_sensor_watertemperature = function () {
  var dropdown_port = this.getFieldValue("Port");
  var dropdown_pin = 1;
  if (dropdown_port === "A") {
    dropdown_pin = 1;
  } else if (dropdown_port === "B") {
    dropdown_pin = 3;
  } else if (dropdown_port === "C") {
    dropdown_pin = 5;
  }
  var dropdown_pin = this.getFieldValue("PIN");
  Blockly.Arduino.libraries_["library_oneWire"] = '#include "OneWire.h"';
  Blockly.Arduino.libraries_["library_oneDallasTemperature"] =
    '#include "DallasTemperature.h"';
  Blockly.Arduino.definitions_["define_OneWire_" + dropdown_pin] =
    "#define ONE_WIRE_BUS_" + dropdown_pin + " " +
    dropdown_pin +
    "\nOneWire oneWire" + dropdown_pin + "(ONE_WIRE_BUS_" + dropdown_pin + ");\nDallasTemperature sensors" + dropdown_pin + "(&oneWire" + dropdown_pin + ");";
  Blockly.Arduino.setupCode_["sensebox_oneWireSetup"] = "sensors" + dropdown_pin + ".begin();";
  Blockly.Arduino.codeFunctions_["sensebox_requestTemp_" + dropdown_pin] =
    "float getWaterTemp" + dropdown_pin + "(){\nsensors" + dropdown_pin + ".requestTemperatures();\nsensors" + dropdown_pin + ".getTempCByIndex(0);\n}";
  var code = "getWaterTemp" + dropdown_pin + "()";
  return [code, Blockly.Arduino.ORDER_ATOMIC];
};

Hi @hannes,

ich habe es hier mal eingebaut:
link entfernt

Ich habe gerade keinen Sensor hier, um es zu testen. Kannst du das überprüfen und Rückmeldung geben ob es funktioniert?

Der Ansatz ist sehr ähnlich zu deine nur übergebe ich den Sensor der Funktion, damit wir diese nicht doppelt deklarieren müssen.

Beste Grüße

Mario

Hallo!
Der Link springt ins neue Blockly und funktioniert nicht.
Bitte ändern

Der Link war nur zum testen gedacht, aber es gab leider keine Rückmeldung ob es so funktionierte.

Da es nun das kleine One-Wire Adapterboard zum Anschluss von mehreren Wassertemperatursensoren gibt wird sich die Programmierung noch minimal ändern.

Ich habe den Link zum alten Preview entfernt.

Ich habe es so benutzt. Sorry, dass ich nicht hier geantwortet habe.

Wie kann der senseBox One-Wire Adapter mit Blockly genutzt werden?
Wo gibt es eine Beschreibung dafür?

Ich habe gesehen, dass man jetzt 3 Thermometer ansprechen kann. Allerdings wird mir nicht klar, welcher der Anschlüsse auf dem One-Wire-Adapter A, B oder C ist. Außerdem gibt es insgesamt 6 Anschlüsse.
Ich würde gerne 6 Thermometer anschließen, um in unserem See die Temperatur in 6 verschiedenen Tiefen zu messen. Wie kann ich dass in blockly umsetzen?

Über eine Rückmeldung würde ich mich freuen.

Viele Grüße

Volker

Hallo zusammen,

zunächst einmal zu dem One-Wire-Adapter. Da man sich kein Bild davon machen kann, wie er aussieht, zeige ich hier eines von unserem:

Nach ein wenig ausprobieren habe ich folgendes herausgefunden:

  1. In blockly kann man mit der aktuellen Version nur ein Wasserthermometer ansteuern.
  2. Über den Port legt man fest, an welchen digital-Port der One-Wire-Adapter angeschlossen wird.
  3. Wenn man mehrere (bis zu 6 bei unserem One-Wire-Adapter) Thermometer nutzen möchte, muss man die Temperaturabfrage in der Arduino-Programmierumgebung nachträglich eintragen.

Bei meinem Beispiel lasse ich die Temperatur von zwei Thermometern alle 2 Sekunden auf dem OLED-Display untereinander ausgeben. Dazu habe ich in blockly folgendes Script vorbereitet:

Dann kopiere ich den Programmcode in die Zwischenablage, öffne die Arduino-Programmierumgebung und ersetze den dortigen Code durch den in der Zwischenablage. Dann ändere ich den Code.

Der folgende Programmcode ruft die Temperaturen aller an den Adapter angeschlossenen Thermometer ab:

sensors.requestTemperatures();

Für das Absichern der einzelnen Temperaturen muss du folgenden Programmcode verwenden:

temp1 = sensors.getTempCByIndex(0);
temp2 = sensors.getTempCByIndex(1);

Die Zahlen in den Klammern geben jeweils an, von welchem Thermometer die jeweilige Temperatur abgespeichert werden soll. 0 ist dabei das erste usw. In der Beschreibung der Befehle steht drin, dass das erste Thermometer das erste in der Reihe der Thermometer ist. Wenn du den One-Wire-Adapter nutzt, gibt es diese Reihenfolge nicht. es ist also unwichtig, in welche der Buchsen du die Thermometer jeweils steckst. Du musst nur einmal die richtige Zuordnung durch Ausprobieren herausfinden und dann die Thermometer dementsprechend markieren. Genauso ist es unwichtig, in welche der JST 4 Buchsen du die Verbindung zur SenseBox einsteckst.

Der fertige Programmcode sieht dann folgendermaßen aus:

#include <senseBoxIO.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h> // http://librarymanager/All#Adafruit_GFX_Library
#include <Adafruit_SSD1306.h> // http://librarymanager/All#Adafruit_SSD1306
#include <OneWire.h> // http://librarymanager/All#OneWire
#include <DallasTemperature.h> // http://librarymanager/All#DallasTemperature

float temp1 // Temperatur des ersten Thermometers 
float temp2 //  Temperatur des ersten Thermometers 

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
#define ONE_WIRE_BUS 1
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

void setup() {
display.begin(SSD1306_SWITCHCAPVCC, 0x3D);
display.display();
delay(100);
display.clearDisplay();
sensors.begin();
}

void loop() {
  sensors.requestTemperatures(); // Abrufen aller Temperaturen
temp1 = sensors.getTempCByIndex(0); // Abstreichern der Temperatur des ersten Thermometers
temp2 = sensors.getTempCByIndex(1); // Abstreichern der Temperatur des zweiten Thermometers
display.clearDisplay();
  display.setCursor(0,0);
  display.setTextSize(2);
  display.setTextColor(WHITE,BLACK);
  display.println(temp1);
  display.setCursor(0,16);
  display.setTextSize(2);
  display.setTextColor(WHITE,BLACK);
  display.println(temp2);
display.display();
delay(2000);

}
1 Like