stefs26
10
//===========================================================Projekt Growduino================================================//
//erstellt/angepasst von Stefano Scarpelli
//Vorlage basiert auf der Grundlage Youtube-Video von Bastelbruder: https://www.youtube.com/watch?v=DaSagesHyGM
//====================================== Bibliotheken
#include <Servo.h>
Servo myservo; // Objekt myservo anlegen
#include "DHT.h"
#define DHTTYPE DHT22
#define DHTPIN 13
DHT dht(DHTPIN, DHTTYPE); // Objekt dht anlegen und Zuweisung Typ und PIN13
#include "LiquidCrystal_I2C.h"
LiquidCrystal_I2C lcd(0x27, 20, 4); // Objekt lcd anlegen und Typenbeschreibung (4Zeilen, 20Zeichen)
//====================================== Temperatureinstellungen
#define solltemp 22 // Solltemperatur 22°C
#define stufe1 solltemp+2 // Stufe 1 sind 2°C mehr als Soll
#define stufe2 solltemp+4 // Stufe 2 sind 4°C mehr als Soll
#define stufe3 solltemp+6 // Stufe 3 sind 6°C mehr als Soll
//====================================== Datentyp- und Wertzuweisung
int FeuchtigkeitProzent;
int csmsWert;
const int trocken = 416; // Wert für trockene Erde vom Bodenfeuchtesensor
const int nass = 249; // dito für nasse Erde
float temp;
String status; // das Wort status wird einem String zugewiesen
#define RELAIS 12 // Zuweisung RELAIS an Pin 12
boolean Relaiszustand = false; // Relaiszustand wird boolscher Wert zugewiesen
//====================================== Setup (wird einmalig beim Start ausgeführt)
void setup() {
myservo.attach(3); // myservo wird an PIN11 zugewiesen
lcd.init(); // LCD-Display wird initialisiert
lcd.backlight(); // LCD-Hintergrundbeleuchtung wird eingeschaltet
dht.begin(); // Temp- und Luftfeuchtesensor wird initialisiert
pinMode(RELAIS, OUTPUT); // der Pin 12 wird als Output deklariert
}
//===================================== Funktionen definieren
void csmsMessen()
{
const unsigned long interval1 = 5000; // Intervall für Temperaturmessung
static unsigned long lastMessung1 = 0; // Zwischenspeicher für Zeitstempel letzte Messung
if (millis() - lastMessung1 >= interval1) { // wenn der Zähler millis minus Wert letzte Messung grösser gleich interval ist
csmsWert = analogRead(A0); // Messung und Zuweisung an csmsWert
FeuchtigkeitProzent = map(csmsWert, nass, trocken, 99, 10); // der csmsWert wird in 0-100% umgerechnet und Zuweisung an FeuchtigkeitProzent
FeuchtigkeitProzent = constrain(FeuchtigkeitProzent, 10, 99); // den Wert FeuchtigkeitProzent auf 10 bis 99% begrenzen
lastMessung1 = millis();
}
}
void dhtMessen()
{
const unsigned long interval2 = 2000; // Intervall für Temperaturmessung
static unsigned long lastMessung2 = 0; // Zwischenspeicher für Zeitstempel letzte Messung
if (millis() - lastMessung2 >= interval2) // wenn der Zähler millis minus Wert letzte Messung grösser gleich interval ist
{
temp = dht.readTemperature(); // DHT22 Temperatur auslesen und dem Wert temp zuweisen
lastMessung2 = millis(); // Wert von millis wird in letzte Messung geschrieben
}
}
void servoAktion()
{
if (temp <= solltemp) {
myservo.write(0);
status = "AUS ";
} else if (temp >= stufe2) {
myservo.write(150);
status = "Stufe 3";
} else if (temp >= stufe1) {
myservo.write(90);
status = "Stufe 2";
} else if (temp >= solltemp) {
myservo.write(40);
status = "Stufe 1";
}
}
void relaisAktion()
{
if (FeuchtigkeitProzent < 15)
Relaiszustand = false;
if (FeuchtigkeitProzent > 30)
Relaiszustand = true;
digitalWrite(RELAIS, Relaiszustand);
}
void AnzeigenEins()
{
lcd.setCursor(0, 0);
lcd.print("Growduino by Scarpi");
lcd.setCursor(0, 1);
lcd.print("Temp SOLL: ");
lcd.print(solltemp);
lcd.print("\337C ");
lcd.setCursor(0, 2);
lcd.print("Temp IST: ");
lcd.print(temp);
lcd.print("\337C");
lcd.setCursor(0, 3);
lcd.print("Frischluft: ");
lcd.print(status);
}
void AnzeigenZwei()
{
lcd.setCursor(0, 0);
lcd.print("Growduino by Scarpi");
lcd.setCursor(0, 1);
lcd.print("Bodenfeuchte: ");
//if (FeuchtigkeitProzent < 10)
//lcd.print("0");
lcd.print(FeuchtigkeitProzent);
lcd.print("%");
lcd.setCursor(0, 2);
lcd.print("Pumpenstatus: ");
if (Relaiszustand == false)
lcd.print("Ein");
else
lcd.print("Aus");
}
void Wechselanzeige()
{
switch ((millis() / 8000) % 2)
{
case 0: AnzeigenEins(); break;
case 1: AnzeigenZwei(); break;
default: lcd.print("Error");
}
}
//====================================== Loop (wird zyklisch abgearbeitet / analog SPS)
void loop()
{
csmsMessen();
relaisAktion();
dhtMessen();
servoAktion();
Wechselanzeige();
}