Danke erstmal für eure Antworten.
@Finnlay
Aktuell habe ich den Arduino immer nur über die USB-Schnittstelle versorgt. Also ohne zusätzliches Netzteil.
@HotSystems
Ich nutze das Water Level Detection Sensor Modul, welches im Starter-Kid beigelegt war. Leider gibt es keine genaue Sensor-Bezeichnung, aber der folgende Link müsste zugehörig sein
https://www.ebay.de/i/222845138082
@Katsumi_S
Geht klar, danke. Bezüglich des Hochladens werde ich mich nochmal genauer belesen. Und ja richtig, es handelt sich um die wasserfeste Variante des DS18B20.
@HotSystems
Ich habe mich schon bemüht, es anschaulich und informativ zu gestalten...
Hier noch mein Sketch mit Kommentaren:
/*First Project - Aquarium Sensing System*/
/*Library-Including*/
#include <LiquidCrystal_I2C.h> // include the library for I2C-LCD-Modul
#include <Wire.h> // include the library for
#include <OneWire.h> // include the library for temperature measurement
/*Icons*/
byte thermometer[8] = //Icon für Thermometer
{
B00100,
B01010,
B01010,
B01110,
B01110,
B11111,
B11111,
B01110
};
byte wasserstand[8] = //Icon für Thermometer
{
B00000,
B11111,
B00000,
B00100,
B01110,
B11111,
B00100,
B00100
};
/*Pin-Mapping*/
LiquidCrystal_I2C lcd(0x27,16,2); // initialize the library with the numbers of the interface pins
const int DS18S20_Pin = 2; // water-temperatur-sensor-pin
const int LED_WLGR = 7; // water-level green --> okay
const int LED_WLRE = 6; // water-level red --> to low
const int LED_WTRE = 5; // water-temperature red --> to warm
const int LED_WTGR = 4; // water-temperature green --> okay
const int LED_WTBL = 3; // water-temperature blue --> to cold
int reftemplow = 23; // reference-temperature low border
int reftemphigh = 27; // reference-temperature high border
int WLRefWert = 270; // reference value for analog input
// int WSDelay= 900 000; // 15 min measure delay
const int WL = 0; // water-level-parameter
int WL_value;
OneWire ds(DS18S20_Pin); // temparture chip i/o
void setup()
{
pinMode(LED_WLGR,OUTPUT);
pinMode(LED_WLRE,OUTPUT);
pinMode(LED_WTRE,OUTPUT);
pinMode(LED_WTGR,OUTPUT);
pinMode(LED_WTBL,OUTPUT);
lcd.begin(); // set up the LCD without colums and rows
lcd.createChar(1, thermometer); // save thermometer symbol on LCD
lcd.createChar(2, wasserstand); // save water level symbol on LCD
Serial.begin(9600);
}
void loop()
{
int WL_value = analogRead(WL); // get water level value
/*LCD and LED water level visualization*/
lcd.setCursor(0, 0);
Serial.print("Analog-Wert Wasserstand ist = ");
Serial.println(WL_value);
if(WL_value > WLRefWert)
{
lcd.write(2);
lcd.print(" in Ordnung"); // water level is okay
digitalWrite(LED_WLGR, HIGH);
digitalWrite(LED_WLRE, LOW);
delay (5000);
}
else
{
lcd.write(2);
lcd.print(" zu niedrig"); // water level is too low
digitalWrite(LED_WLRE, HIGH);
digitalWrite(LED_WLGR, LOW);
delay (5000);
}
float temperature = getTemp(); // get temperature from function
/*LCD and LED water temperature visualization*/
lcd.setCursor(0, 1); // set the cursor to column 0, line 1 ; line 1 is second row
lcd.write(1);
lcd.print(" ");
lcd.print(temperature);
lcd.print(" ");
lcd.print((char)223);
lcd.print("C");
Serial.print("Wassertemperatur ist = ");
Serial.print(temperature);
Serial.println("°C");
if (temperature <= reftemplow)
{
digitalWrite (LED_WTBL,HIGH);
digitalWrite (LED_WTGR,LOW);
digitalWrite (LED_WTRE,LOW);
delay (5000);
}
else if (temperature > reftemphigh)
{
digitalWrite (LED_WTRE,HIGH);
digitalWrite (LED_WTGR,LOW);
digitalWrite (LED_WTBL,LOW);
delay (5000);
}
else
{
digitalWrite (LED_WTGR,HIGH);
digitalWrite (LED_WTBL,LOW);
digitalWrite (LED_WTRE,LOW);
delay (5000);
}
}
/* temperature function;
returns the temperature from the DS18S20 in DEG Celsius */
float getTemp()
{
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;
}