"endless summer", Optimierung der Parameter mit Hilfe von Sensoren

LeonardoFiando:
Hier ist ein Schema zum Setup:

Na hab ichs mir doch gedacht.
Stand ja schon hier

#define ONE_WIRE_BUS 3 //Data vom Temp.Sensor 1
#define ONE_WIRE_BUS 4 //Data vom Temp.Sensor 2
  • ich wollts nur nicht ins Blaue hinein probieren.

OneWire ist ein BUS!
Da kommen alle Teilnehmer ran.
Also: entweder PIN 3 ODER PIN 4. Für Beide.
Abfrage über index(0) oder (1)

Siehe auch die Beispiele multiple und multiple simple

my_xy_projekt:
Siehe auch die Beispiele multiple und multiple simple

Die sind ihm ja zu schwer verständlich (#40/#42) und dann müsste man ja auch noch Zeit investieren.

Gruß Tommy

@Tommy56: Ich würde die Zeit ja investieren und es versuchen zu verstehen aber es hat wenig Sinn, wenn ich dann sowieso einen anderen Sensor nehme;). Deshalb warte ich auf den neuen Sensor und mache es dann richtig.

LG Leonardo

Ich habe hier jetzt schonmal die Pumpensteuerung und die Temperaturmessung der Nährlösung ( inklusive der Anzeige auf dem LCD) in einem Sketch verbunden. Am Freitag kommt voraussichtlich der neue Sensor, dann gehts weiter.

Bis dahin alles Gute und liebe Grüße Leonardo

// Pumpensteuerung
unsigned long timestore;               // Zeitmerker für Pumpensteuerung
const byte PumpenPin = 2;
enum {an, aus};

unsigned long timestore_LCD;               // Zeitmerker für LCD Display

// Temperatur Nährlösung
#include <DallasTemperature.h>
#include <LiquidCrystal_I2C.h>
#include <OneWire.h>

LiquidCrystal_I2C lcd(0x27,20,4); 

#define ONE_WIRE_BUS 3 //Data von Temp.Sensor
OneWire oneWire(ONE_WIRE_BUS );
DallasTemperature sensors(&oneWire);


void setup() { 
  
lcd.init(); 
lcd.backlight();
sensors.begin();

pinMode(PumpenPin, OUTPUT); 
}

void loop() {

// Temperatur Nährlösung LCD
   if (millis() - timestore_LCD> 10000 ) // wenn Pausenzeit um
    {
      lcd.setCursor(0,0);               // Werte auf LCD anzeigen
lcd.print("Wurzelzone:  ");
lcd.print(sensors.getTempCByIndex(0));
lcd.print("\337C");
lcd.setCursor(0,1);
lcd.print("Wurzelzone: ");

sensors.requestTemperatures();
lcd.setCursor(0,2);
lcd.print("Naehrloesung:");
lcd.print(sensors.getTempCByIndex(0));
lcd.print("\337C");
      timestore = millis();            // Einschaltzeit merken
    }


// Pumpensteuerung
if (digitalRead(PumpenPin == aus))
  {
    if (millis() - timestore > 900000) // wenn Pausenzeit um
    {
      digitalWrite(PumpenPin, an);     // einschalten
      timestore = millis();            // Einschaltzeit merken
    }
  }
  else
  {
    if (millis() - timestore > 15000)  // wenn Einschaltzeit um
    {                                           
      digitalWrite (PumpenPin, aus);   // ausschalten
      timestore = millis();            // Ausschaltzeit merken
    }
  }
}

Danke für Deine einfache Erklärung my_xy_projekt!

OneWire ist ein BUS!
Da kommen alle Teilnehmer ran.
Also: entweder PIN 3 ODER PIN 4. Für Beide.
Abfrage über index(0) oder (1)

Ich habe es jetzt nochmal ausprobiert nach Deiner Anleitung. Jetzt funktioniert das Auslesen beider Sensoren, sowie das Anzeigen auf dem LCD Display. Hier sind Sketch und Setup.

#include <DallasTemperature.h>
#include <LiquidCrystal_I2C.h>
#include <OneWire.h>


LiquidCrystal_I2C lcd(0x27,20,4); 

#define ONE_WIRE_BUS 3 
OneWire oneWire(ONE_WIRE_BUS );
DallasTemperature sensors(&oneWire);





void setup() { 
lcd.init();
lcd.backlight();
sensors.begin();
}

void loop() {
lcd.setCursor(0,0);
lcd.print("Wurzelzone:  ");
lcd.print(sensors.getTempCByIndex(0));
lcd.print("\337C");
lcd.setCursor(0,1);
lcd.print("Wurzelzone: ");

sensors.requestTemperatures();
lcd.setCursor(0,2);
lcd.print("Naehrloesung:");
lcd.print(sensors.getTempCByIndex(0));
lcd.print("\337C");

delay(1000);
}

@Tommy56:

Die sind ihm ja zu schwer verständlich (#40/#42) und dann müsste man ja auch noch Zeit investieren.

Du wolltest mich wahrscheinlich auf die Zeilen 40 und 42 in einem Beispiel der Dallas Temperature Bibliothek hinweisen wo ich die Lösung finde? Kannst Du mir die Zeilen bitte mal schreiben oder mich verlinken, ich kann mir nicht vorstellen, dass Du zwei Zeilen von denen hier gemeint hast:

 // report parasite power requirements

Serial.print("Parasite power is: ");
if (sensors.isParasitePowerMode()) Serial.println("ON");
else Serial.println("OFF");

LG Leonardo

Du brauchst für die Sensoren nur einen Pullup-Widerstand.
Und in deinem Sketch liest du nur einen Sensor aus. Mit beiden Routinen liest du Index 0.

Sorry (peinlich:/), ja stimmt hier ist jetzt der richtige Sketch:

#include <DallasTemperature.h>
#include <LiquidCrystal_I2C.h>
#include <OneWire.h>


LiquidCrystal_I2C lcd(0x27,20,4); 

#define ONE_WIRE_BUS 3 
OneWire oneWire(ONE_WIRE_BUS );
DallasTemperature sensors(&oneWire);





void setup() { 
lcd.init();
lcd.backlight();
sensors.begin();
}

void loop() {
lcd.setCursor(0,0);
lcd.print("Wurzelzone:  ");
lcd.print(sensors.getTempCByIndex(0));
lcd.print("\337C");
lcd.setCursor(0,1);
lcd.print("Wurzelzone: ");

sensors.requestTemperatures();
lcd.setCursor(0,2);
lcd.print("Naehrloesung:");
lcd.print(sensors.getTempCByIndex(1));
lcd.print("\337C");

delay(1000);
}

Du brauchst für die Sensoren nur einen Pullup-Widerstand.

Ich habe die schon in das Setup gelötet. Schadet es wenn zwei Pull-Up- Widerstände drin sind? Wenn nicht würde ich das einfach so lassen.

Man kann einen wieder rauskneifen, schadet aber nicht.

LeonardoFiando:
Du wolltest mich wahrscheinlich auf die Zeilen 40 und 42 in einem Beispiel der Dallas Temperature Bibliothek hinweisen wo ich die Lösung finde?

Nein, ich meine diese und die nächste Zeile.

Gruß Tommy

@Tommy56: Ich weiß leider immer noch nicht welche Zeilen Du genau meinst:/.

Dann solltest Du lesen lernen. Die Zeile 146 ist markiert.

Gruß Tommy

@hotsystems: Danke für die Info, dann werde ich es so lassen;)

@Tommy56: Okay jetzt habe ich sie gefunden:

printData(insideThermometer);

Die Markierung ist auf meinem Bildschirm sehr schwer zu erkennen. Ich verstehe trotzdem nicht, was mir das sagen soll. Wenn Du keine Lust mehr hast das jetzt weiter zu erklären kann ich es verstehen. Das Problem wurde ja inzwischen gelöst;)

Hallo liebe community,

Der EZO-HUM Embedded Humidity Sensor ist heute angekommen. Ich habe den Sketch den der Hersteller liefert gerade mal auf einem Arduino Uno hochgeladen und den seriellen Monitor geöffnet.

Im Anhang ist das Setup.

Beim Sketch handelt es sich um den sample code des Herstellers. Ich habe nur die beiden Pins verändert die verwendet werden , statt ursprünglich Pin 3 benutze ich Pin 5 und statt Pin 2 Pin 4.

Der serielle Monitor zeigt mir Werte für die Luftfeuchtigkeit an aber keine Werte für die Lufttemperatur und den Taupunkt.

HUM:51.37
Air TMP:
DEW:

Hat jmd. eine Idee wo das Problem liegt?

LG Leonardo

//This code was written to be easy to understand.
//Modify this code as you see fit.
//This code will output data to the Arduino serial monitor.
//Type commands into the Arduino serial monitor to control the humidity sensor.
//This code was written in the Arduino 1.8.13 IDE
//An Arduino UNO was used to test this code.
//This code was last tested 8/2020


#include <SoftwareSerial.h>                           //we have to include the SoftwareSerial library, or else we can't use it
#define rx 4                                         //define what pin rx is going to be
#define tx 5                                         //define what pin tx is going to be

SoftwareSerial myserial(rx, tx);                      //define how the soft serial port is going to work


String inputstring = "";                              //a string to hold incoming data from the PC
String sensorstring = "";                             //a string to hold the data from the Atlas Scientific product
boolean input_string_complete = false;                //have we recived all the data from the PC
boolean sensor_string_complete = false;               //have we recived all the data from the Atlas Scientific product

void setup() {                                        //set up the hardware
  Serial.begin(9600);                                 //set baud rate for the hardware serial port_0 to 9600
  myserial.begin(9600);                               //set baud rate for the software serial port to 9600
  inputstring.reserve(10);                            //set aside some bytes for reciving data from the PC
  sensorstring.reserve(30);                           //set aside some bytes for reciving data from Atlas Scientific product
}


void serialEvent() {                                  //if the hardware serial port_0 recives a char
  inputstring = Serial.readStringUntil(13);           //read the string until we see a <CR>
  input_string_complete = true;                       //set the flag used to tell if we have recived a completed string from the PC
}


void loop() {                                         //here we go...

  if (input_string_complete == true) {                //if a string from the PC has been recived in its entirety
    myserial.print(inputstring);                      //send that string to the Atlas Scientific product
    myserial.print('\r');                             //add a <CR> to the end of the string
    inputstring = "";                                 //clear the string
    input_string_complete = false;                    //reset the flag used to tell if we have recived a completed string from the PC
  }

  if (myserial.available() > 0) {                     //if we see that the Atlas Scientific product has sent a character
    char inchar = (char)myserial.read();              //get the char we just recived
    sensorstring += inchar;                           //add the char to the var called sensorstring
    if (inchar == '\r') {                             //if the incoming character is a <CR>
      sensor_string_complete = true;                  //set the flag
    }
  }


  if (sensor_string_complete == true) {               //if a string from the Atlas Scientific product has been recived in its entirety
    if (isdigit(sensorstring[0]) == false) {          //if the first character in the string is a digit
      Serial.println(sensorstring);                   //send that string to the PC's serial monitor
    }
    else                                              //if the first character in the string is NOT a digit
    {
      print_Humidity_data();                          //then call this function 
    }
    sensorstring = "";                                //clear the string
    sensor_string_complete = false;                   //reset the flag used to tell if we have recived a completed string from the Atlas Scientific product
  }
}



void print_Humidity_data(void) {                      //this function will pars the string  

  char sensorstring_array[30];                        //we make a char array
  char *HUM;                                          //char pointer used in string parsing.
  char *TMP;                                          //char pointer used in string parsing.
  char *NUL;                                          //char pointer used in string parsing (the sensor outputs some text that we don't need).
  char *DEW;                                          //char pointer used in string parsing.

float HUM_float;                                      //float var used to hold the float value of the humidity.
float TMP_float;                                      //float var used to hold the float value of the temperatur.
float DEW_float;                                      //float var used to hold the float value of the dew point.
  
  sensorstring.toCharArray(sensorstring_array, 30);   //convert the string to a char array 
  HUM = strtok(sensorstring_array, ",");              //let's pars the array at each comma
  TMP = strtok(NULL, ",");                            //let's pars the array at each comma
  NUL = strtok(NULL, ",");                            //let's pars the array at each comma (the sensor outputs the word "DEW" in the string, we dont need it)
  DEW = strtok(NULL, ",");                            //let's pars the array at each comma

  Serial.println();                                   //this just makes the output easier to read by adding an extra blank line. 
 
  Serial.print("HUM:");                               //we now print each value we parsed separately.
  Serial.println(HUM);                                //this is the humidity value.

  Serial.print("Air TMP:");                           //we now print each value we parsed separately.
  Serial.println(TMP);                                //this is the air temperatur value.

  Serial.print("DEW:");                               //we now print each value we parsed separately.
  Serial.println(DEW);                                //this is the dew point.
  Serial.println();                                   //this just makes the output easier to read by adding an extra blank line. 
    
  //uncomment this section if you want to take the values and convert them into floating point number.
  /*
    HUM_float=atof(HUM);
    TMP_float=atof(TMP);
    DEW_float=atof(DEW);
  */
}

.

In der Tat hatte ich das nicht genau überprüft und verwende die Funktion auch nicht.

Du hat Dir die Funktion von strtok schon mal angeschaut/verstanden? - nach Deiner Antwort --> nein

Gruß Tommy

Hallo liebe community,

Ich habe zwei Probleme mit meinem Sketch und würde mich freuen wenn mir jmd. helfen könnte:)

Erstes Problem: Nach Zustand 3 ( siehe Skizze) geht die Förderpumpe an und pumpt Wasser in den Tank aber wenn dann Zustand 2 erreicht wird geht sie wieder aus. Ich will aber, dass die Förderpumpe erst in Zustand 1 wieder ausgeht. Kann mir bitte jmd. helfen das Problem zu lösen? Ich habe es versucht mit dem Niveauschalterminimumstatus zu lösen, klappt so aber nicht.

Zweites Problem: Die Pumpensteuerung für die Hochdruckpumpe soll in Zustand 2 und 3 aktiviert sein, also immer dann wenn das RelaisHochdruckpumpe LOW ist.

Herzliche Grüße Leonardo

// Ezo-Hum-Sensor

//This code was written to be easy to understand.
//Modify this code as you see fit.
//This code will output data to the Arduino serial monitor.
//Type commands into the Arduino serial monitor to control the humidity sensor.
//This code was written in the Arduino 1.8.13 IDE
//An Arduino UNO was used to test this code.
//This code was last tested 8/2020


#include <SoftwareSerial.h>                           //we have to include the SoftwareSerial library, or else we can't use it
#define rx 4                                         //define what pin rx is going to be
#define tx 5                                         //define what pin tx is going to be

SoftwareSerial myserial(rx, tx);                      //define how the soft serial port is going to work


String inputstring = "";                              //a string to hold incoming data from the PC
String sensorstring = "";                             //a string to hold the data from the Atlas Scientific product
boolean input_string_complete = false;                //have we recived all the data from the PC
boolean sensor_string_complete = false;               //have we recived all the data from the Atlas Scientific product

// Pumpensteuerung
unsigned long timestore;               // Zeitmerker für Pumpensteuerung
unsigned long timestore_LCD;               // Zeitmerker für LCD Display

// Temperatur Nährlösung
#include <DallasTemperature.h>
#include <LiquidCrystal_I2C.h>
#include <OneWire.h>

LiquidCrystal_I2C lcd(0x27,20,4);

#define ONE_WIRE_BUS 3 //Data von Temp.Sensor
OneWire oneWire(ONE_WIRE_BUS );
DallasTemperature sensors(&oneWire);

// Notabschaltung Heizstab, Hochdruckpumpe, Umwaelzpumpe und Foerderpumpe

int RelaisHeizstab = 8;
int RelaisHochdruckpumpe = 9;
int RelaisUmwaelzpumpe = 10;
int RelaisFoerderpumpe= 11;
enum {an, aus};

int Niveauschalterminimum = 2;
int Niveauschaltermaximum = 6;
boolean Niveauschalterminimumstatus = HIGH; // Der Niveauschalterminimumstatus ist normally off




void setup() {

// Ezo-Hum-Sensor
  Serial.begin(9600);                                 //set baud rate for the hardware serial port_0 to 9600
  myserial.begin(9600);                               //set baud rate for the software serial port to 9600
  inputstring.reserve(10);                            //set aside some bytes for reciving data from the PC
  sensorstring.reserve(30);                           //set aside some bytes for reciving data from Atlas Scientific product
  
lcd.init();
lcd.backlight();
sensors.begin();

// Notabschaltung Heizstab und Hochdruckpumpe, Umwaelzpumpe und Foerderpumpe
  pinMode(RelaisHeizstab, OUTPUT);          
  pinMode(RelaisHochdruckpumpe, OUTPUT);             
  pinMode(RelaisUmwaelzpumpe, OUTPUT);
  digitalWrite(RelaisHeizstab, LOW);                  
  digitalWrite(RelaisHochdruckpumpe, LOW);
  digitalWrite(RelaisUmwaelzpumpe, LOW);
  digitalWrite(RelaisHeizstab, LOW);
  

// Foerderpumpe
pinMode(RelaisFoerderpumpe, OUTPUT);              
digitalWrite(RelaisFoerderpumpe, HIGH);             // Die Förderpumpe ist normalerweise aus
  pinMode(Niveauschalterminimum, INPUT_PULLUP); 
  pinMode(Niveauschaltermaximum, INPUT_PULLUP);        
  
}

//Ezo-Hum-Sensor
void serialEvent() {                                  //if the hardware serial port_0 recives a char
  inputstring = Serial.readStringUntil(13);           //read the string until we see a <CR>
  input_string_complete = true;                       //set the flag used to tell if we have recived a completed string from the PC
}

hier ist der Rest, war zu groß für ein Reply:

void loop() {

//Ezo-Hum-Sensor
if (input_string_complete == true) {                //if a string from the PC has been recived in its entirety
    myserial.print(inputstring);                      //send that string to the Atlas Scientific product
    myserial.print('\r');                             //add a <CR> to the end of the string
    inputstring = "";                                 //clear the string
    input_string_complete = false;                    //reset the flag used to tell if we have recived a completed string from the PC
  }

  if (myserial.available() > 0) {                     //if we see that the Atlas Scientific product has sent a character
    char inchar = (char)myserial.read();              //get the char we just recived
    sensorstring += inchar;                           //add the char to the var called sensorstring
    if (inchar == '\r') {                             //if the incoming character is a <CR>
      sensor_string_complete = true;                  //set the flag
    }
  }


  if (sensor_string_complete == true) {               //if a string from the Atlas Scientific product has been recived in its entirety
    if (isdigit(sensorstring[0]) == false) {          //if the first character in the string is a digit
      Serial.println(sensorstring);                   //send that string to the PC's serial monitor
    }
    else                                              //if the first character in the string is NOT a digit
    {
      print_Humidity_data();                          //then call this function 
    }
    sensorstring = "";                                //clear the string
    sensor_string_complete = false;                   //reset the flag used to tell if we have recived a completed string from the Atlas Scientific product
  }
}



void print_Humidity_data(void) {                      //this function will pars the string  

  char sensorstring_array[30];                        //we make a char array
  char *HUM;                                          //char pointer used in string parsing.
  char *TMP;                                          //char pointer used in string parsing.
  char *NUL;                                          //char pointer used in string parsing (the sensor outputs some text that we don't need).
  char *DEW;                                          //char pointer used in string parsing.

float HUM_float;                                      //float var used to hold the float value of the humidity.
float TMP_float;                                      //float var used to hold the float value of the temperatur.
float DEW_float;                                      //float var used to hold the float value of the dew point.
  
  sensorstring.toCharArray(sensorstring_array, 30);   //convert the string to a char array 
  HUM = strtok(sensorstring_array, ",");              //let's pars the array at each comma
  TMP = strtok(NULL, ",");                            //let's pars the array at each comma
  NUL = strtok(NULL, ",");                            //let's pars the array at each comma (the sensor outputs the word "DEW" in the string, we dont need it)
  DEW = strtok(NULL, ",");                            //let's pars the array at each comma

  Serial.println();                                   //this just makes the output easier to read by adding an extra blank line. 
 
  Serial.print("HUM:");                               //we now print each value we parsed separately.
  Serial.print(HUM);                                //this is the humidity value.

  Serial.print("Air TMP:");                           //we now print each value we parsed separately.
  Serial.print(TMP);                                //this is the air temperatur value.

  Serial.print("DEW:");                               //we now print each value we parsed separately.
  Serial.print(DEW);                                //this is the dew point.
  Serial.println();                                   //this just makes the output easier to read by adding an extra blank line. 
    
  //uncomment this section if you want to take the values and convert them into floating point number.
  /*
    HUM_float=atof(HUM);
    TMP_float=atof(TMP);
    DEW_float=atof(DEW);
  */
  
// Temperatur Nährlösung LCD
   if (millis() - timestore_LCD> 10000 ) // wenn Pausenzeit um
    {
      lcd.setCursor(0,0);               // Werte auf LCD anzeigen
lcd.print("Wurzelzone:");
lcd.setCursor(0,1);
lcd. print ("T:");
lcd.print(TMP);
lcd.print("\337C");
lcd. print (" Hum:");
lcd.print(HUM);
lcd.print("%");
lcd.setCursor(0,2);
lcd.print("NL:");
lcd.print(sensors.getTempCByIndex(0));
lcd.print("\337C");
lcd.print(" Dew:");
lcd.print(DEW);

sensors.requestTemperatures();

lcd.setCursor(0,3);
lcd.print("Rasen:     ");
lcd.print("T:");
lcd.print(sensors.getTempCByIndex(1));
lcd.print("\337C");



      timestore = millis();            // Ausschaltzeit merken
    }


// Pumpensteuerung

if (digitalRead(RelaisHochdruckpumpe == aus))
  {
    if (millis() - timestore > 900000) // wenn Pausenzeit um
    {
      digitalWrite(RelaisHochdruckpumpe, an);     // einschalten
      timestore = millis();            // Einschaltzeit merken
    }
  }
  else
  {
    if (millis() - timestore > 15000)  // wenn Einschaltzeit um
    {                                           
      digitalWrite (RelaisHochdruckpumpe, aus);   // ausschalten
      timestore = millis();            // Ausschaltzeit merken
    }
  }

  
// Notabschaltung Heizstab, Hochdruckpumpe, Umwälzpumpe und Förderpumpe
  if (digitalRead(Niveauschalterminimum) == HIGH && digitalRead(Niveauschaltermaximum)== HIGH)// wenn der Niveauschalterminimum offen ist und der Niveauschaltermaximum offen ist
  {
    digitalWrite(RelaisHeizstab, HIGH);       // Heizstab ausmachen
    digitalWrite(RelaisHochdruckpumpe, HIGH); // Hochdruckpumpe ausmachen
    digitalWrite(RelaisUmwaelzpumpe, HIGH);   // Umwälzpumpe ausmachen
    digitalWrite(RelaisFoerderpumpe, LOW);
 Niveauschalterminimumstatus = LOW;           // notieren, dass die Foerderpumpe an ist
   
  }
  if (digitalRead(Niveauschalterminimum) == LOW && digitalRead(Niveauschaltermaximum)== HIGH) // wenn der Niveauschalterminimum geschlossen ist und der Niveauschaltermaximum offen ist
  {                                    
                                             // muss sein, sonst werden die Relais nicht wieder LOW!
 digitalWrite(RelaisHeizstab, LOW);          // Heizstab anschalten
 digitalWrite(RelaisHochdruckpumpe, LOW);    // Hochdruckpumpe anschalten
 digitalWrite(RelaisUmwaelzpumpe, LOW);       // Umwälzpumpe anschalten
  }

  if (digitalRead(Niveauschalterminimum) == LOW && digitalRead(Niveauschaltermaximum)== HIGH) // wenn der Niveauschalterminimum geschlossen ist und der Niveauschaltermaximum geschlossen ist
  {
   digitalWrite(RelaisHeizstab, LOW);          // Heizstab bleibt angeschaltet
 digitalWrite(RelaisHochdruckpumpe, LOW);    // Hochdruckpumpe bleibt angeschaltet
 digitalWrite(RelaisUmwaelzpumpe, LOW);       // Umwälzpumpe bleibt angeschaltet
 Niveauschalterminimumstatus = HIGH;
 
 
  }
  if (Niveauschalterminimumstatus == HIGH)     // wenn der Niveauschalterminimumstatus HIGH ist, 
  {
    digitalWrite(RelaisFoerderpumpe, HIGH);    // Foerderpumpe aussschalten
  }

}

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.
Reopen