Hier ist der erste Teil des Codes:
////////////////////////////////////////////////////////////////////////
//Installation des Displays
#include <Wire.h>
#include <LCD.h>
// Einbinden der LiquidCrystal Bibliothek für das I2C Modul des Displays.
#include <LiquidCrystal_I2C.h>
// Es gibt min. 2 Adressen welche ein Display verwenden kann: 0x3F oder 0x27.
// Setzt die PINs des I2C Moduls für die Kommunikation mit dem Display.
// Adresse: 0x27
// EN: 2
// RW; 1
// RS: 0
// D4: 4
// D5: 5
// D6: 6
// D7: 7
// BL: 3
// BLPOL: POSITIVE
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
unsigned long previousmillis4 = 0;
long interval4 = 1000;
////////////////////////////////////////////////////////////////////
// Installation des Tastenfelds
#include <Keypad.h>
const byte ROWS = 4; //four rows
const byte COLS = 4; //four columns
//define the cymbols on the buttons of the keypads
char keys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPins[ROWS] = {39, 41, 43, 45}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {47, 49, 51, 53}; //connect to the column pinouts of the keypad
long zahl, zahla=0, zahlb=0, zahlc=0, zahld=0;
bool a=0, b=0, c=0, d=0;
//initialize an instance of class NewKeypad
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
////////////////////////////////////////////////////////////////////
//Serielle Daten empfangen, senden und verarbeiten -> Definition von Variablen
double Setpoint = 4; //Sollwert für Heizpatronen
int DS18B20_int = 0; // für Übertragung der Solltemperatur
float DS18B20_01;
float DS18B20_01alt = 1000;
int Setpoint_Trans = 4;
unsigned long previousmillis3 = 0;
long interval3 = 1000;
////////////////////////////////////////////////////////////////////
//Schrittmotor Antriebswelle
#define ENA1 2 //Konfiguration der PINS 2,8,9,3,4&5 für Schrittmotor
#define STP1 8
#define DIR1 9
#define MS11 3
#define MS21 4
#define MS31 5
unsigned long previousmillis1 = 0; //Definition von Variablen
long interval1 = 0;
int stepState1 = LOW;
///////////////////////////////////////////////
// Installation der Temperaturreglung für Heizpatronen
#include <OneWire.h> //Einbinden der Bibliotheken
#include <DallasTemperature.h>
#include <PID_v1.h>
#define ONE_WIRE_BUS 10 // Pin für Thermistor
// #define PIN_Relais 11 //Pin für Relais (Heizpatronen) Lieber pinMode
// #define PIN_MOSFET 12 //Pin für Mosfet (Ventil) bringt nix! Lieber pinMode
#define Light 13
double Input;
double Output; //Definition der Variablen für PID-Regler
double Kp=5, Ki=2, Kd=3; //Definition der Variablen für PID-Regler
PID myPID(&Input, &Output, &Setpoint, Kp, Ki, Kd, DIRECT);
//Installation der OneWire Instanz für die Kommunikation mit allen OneWire Bauelementen
OneWire oneWire(ONE_WIRE_BUS);
//Übergabe der OneWire Referenz für die Kommunikation mit dem Sensor
DallasTemperature sensors(&oneWire);
void temperaturregelung () {
//Temperaturaufnahme durch Thermistor (sensors= One_Wire_Bus Pin 10) = Ist-Temperatur
sensors.requestTemperatures();
Input = sensors.getTempCByIndex(0); // Input für PID Regler = Ist-Temperatur
//999 weil sonst der Wert 0 möglich ist, was zu Problemen bei der If-Abfrage führen würde
DS18B20_int = (((sensors.getTempCByIndex(0))*10)+999);
while(sensors.getTempCByIndex(0) == -127){ //Falls Temperatursensor nicht verbunden ist, Heizpatrone nicht einschalten
digitalWrite(Light,LOW);
delay(500);
digitalWrite(Light,HIGH);
delay(500);
sensors.requestTemperatures();
Input = sensors.getTempCByIndex(0);
}
myPID.Compute();
analogWrite(11, Output); // Pin 11 Relais
Serial.println (sensors.getTempCByIndex(0));
//Serial.println(Output);
}
//////////////////////////////////////////////////////////
void setup() {
lcd.backlight();
Serial.begin(9600); // start serial port
pinMode(12,OUTPUT); // Pin für Mosfet (Ventil Schaltun)
/////////////////////////////////////////////
//Display
lcd.begin(20,4); // initialisieren des Displays mit 20 Zeichen und 4 Zeilen
lcd.setCursor ( 0, 0 );
lcd.print("speed:");
lcd.setCursor ( 0, 1 );
lcd.print("setpoint:");
lcd.setCursor ( 0, 2);
lcd.print ("valve open:");
lcd.setCursor ( 0, 3 );
lcd.print("valve closed:");
lcd.setCursor ( 13, 1 );
lcd.print("T:");
////////////////////////////////////////////////////////////////////
//Schrittmotor Antriebswelle
pinMode(ENA1,OUTPUT);
pinMode(STP1,OUTPUT);
pinMode(DIR1,OUTPUT);
pinMode(MS11,OUTPUT);
pinMode(MS21,OUTPUT);
pinMode(MS31,OUTPUT);
digitalWrite(ENA1,HIGH);
digitalWrite(MS11,HIGH);
digitalWrite(MS21,HIGH);
digitalWrite(MS31,HIGH);
digitalWrite(DIR1,HIGH);
////////////////////////////////////////////////////////////////////
//Temperaturreglung
sensors.begin(); // Start up the library
sensors.setResolution(11); //Auflösung 9- 12 Bits
sensors.requestTemperatures(); // Temperaturmessung durchführen
Setpoint = 4; //Solltemperatur
//if (Setpoint > 50) { //Prüfen ob Solltemperatur zu hoch ist und ggf. Verringerung auf maximale Solltemperatur
// Serial.println("Solltemperatur zu hoch! maximale Solltemperatur von 50 wird nun verwendet");
// Setpoint = 50;
//}
myPID.SetMode(AUTOMATIC); //PID-Regler starten
pinMode(Light,OUTPUT);
digitalWrite(Light,LOW);
}
////////////////////////////////////////////////////////////////////
//Serielle Daten empfangen, senden und verarbeiten
void DatenEinAus(){
Setpoint_Trans = (Setpoint+999);
Serial.println (Setpoint_Trans); //über das Display würde 1003 ausgegeben werden
int incoming = Serial.available();
if (incoming > 0){ //wenn über das Display ein Wert >0 ausgegeben wird, wird
DS18B20_int = Serial.parseInt();
DS18B20_01 = (((-999)/10.0));//999 weil sonst der Wert 0 möglich ist, was zu Problemen bei der If-Abfrage führen würde
if (DS18B20_01 < 7 * DS18B20_01alt){ //Ab und zu tritt ein Faktor 10 Fehler auf. Daher hier der Filter
DS18B20_01alt = DS18B20_01;
}
}
}