#include <Bounce2.h>
#include <SD.h>
byte Pin_CS = 10;
File Messdatei;
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
// The pins for I2C are defined by the Wire-library.
// On an arduino UNO: A4(SDA), A5(SCL)
// On an arduino MEGA 2560: 20(SDA), 21(SCL)
// On an arduino LEONARDO: 2(SDA), 3(SCL), ...
#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
#define SCREEN_WIDTH 80 // OLED display width, in pixels
#define SCREEN_HEIGHT 32 // OLED display height, in pixels
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
//Zeitvariablen
unsigned long SZeit_akt; // (Sensor)für die aktuelle Zeit, letzter Status
unsigned long SZeit_neu; // (Sensor)gerade gelesene Zeit
unsigned long SDatenpause = 2500; //nur alle 2500ms Sensor Daten aufbereiten
//Encoder implementieren
byte Pin_CLK = 6;
byte Pin_DT = 5;
byte Pin_SW = 4;
byte Encoder_akt = 0; // Startwert und aktueller Wert am Encoder
byte Encoder_neu = 0; // Wert bei neuer Abfrage am Encoder
byte Display_akt = 1; // Startseite und Zähler für Encoder
int Screens = 4; // Anzahl der anzuzeigenden Bildschirmseiten
Bounce EncButton = Bounce();
float TKaltIn = -5;
int pinTKIn = 14; // Pin A0
const float vt_factor_TKIn = 1.88;
const float offset_TKIn = 0;
float TKaltOut = 10;
int pinTKOut = 15; //Pin A1
const float vt_factor_TKOut = 1.88;
const float offset_TKOut = 0;
float TWarmIn = 111;
int pinTWIn = 16; //Pin A2
const float vt_factor_TWIn = 1.88;
const float offset_TWIn = 0;
float TWarmOut = 95;
int pinTWOut = 17; //Pin A3
const float vt_factor_TWOut = 1.88;
const float offset_TWOut = 0;
float dTWKIn;
float dTWKOut;
int pinQW = 2;
float QWarm = 2;
int pinQK = 3;
float QKalt = 1;
int BypassGrenze = 110;
bool Bypass = false;
String StatusBypass = "OFF";
float Spannung = 5.3;
float Strom = 0.99;
float Power;
bool RecStatus = false;
void setup() {
pinMode(Pin_SW, INPUT_PULLUP); // EncoderTaster
pinMode(Pin_DT, INPUT_PULLUP);
pinMode(Pin_CLK, INPUT_PULLUP);
EncButton.attach(Pin_SW);
EncButton.interval(5); // 15ms zum Entprellen
Serial.begin(9600);
// SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;); // Don't proceed, loop forever
}
if (!SD.begin(Pin_CS)) { // Wenn die SD-Karte nicht (!SD.begin) gefunden werden kann, ...
Serial.println("Initialisierung fehlgeschlagen!"); // ... soll eine Fehlermeldung ausgegeben werden. ....
return;
}
Serial.println("Initialisierung abgeschlossen");
Messdatei = SD.open("TEG_Daten.raw", FILE_WRITE);
Messdatei.close();
SZeit_akt = millis();
}
void loop() {
sensordaten();
Encoder_lesen();
Displayausgabe(Screens);
}
void datadisplay_Temp(void) { //Temperaturdatenanzeige
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0,0);
display.print(F("T_Warm_IN:"));
display.setCursor(65,0);
display.print(TWarmIn);
display.setCursor(0,10);
display.print(F("T_Warm_OUT:"));
display.setCursor(65,10);
display.print(TWarmOut);
display.setCursor(0,20);
display.print(F("T_Kalt_IN:"));
display.setCursor(65,20);
display.print(TKaltIn);
display.setCursor(0,30);
display.print(F("T_Kalt_OUT:"));
display.setCursor(65,30);
display.print(TKaltOut);
display.setCursor(0,45);
display.print(F("dT_WK_IN:"));
display.setCursor(65,45);
display.print(dTWKIn);
display.setCursor(0,55);
display.print(F("dT_WK_OUT:"));
display.setCursor(65,55);
display.print(dTWKOut);
if (RecStatus == true) {
display.fillCircle(124, 3, 3, SSD1306_WHITE);
}
display.display();
}
void datadisplay_Power(void) { // Durchfluss- und Ausgangsleistungsanzeige
display.clearDisplay();
display.setTextSize(1); // Normal 1:1 pixel scale
display.setTextColor(SSD1306_WHITE); // Draw white text
display.setCursor(0,0); // Start at top-left corner
display.print(F("Q Warm: "));
display.setCursor(45,0);
display.print(QWarm);
display.print("l/m");
display.setCursor(0,10);
display.print(F("Q Kalt: "));
display.setCursor(45,10);
display.print(QKalt);
display.print("l/m");
display.setCursor(0,20);
display.print(F("Bypass:"));
display.setCursor(45,20);
if (Bypass == true) {
display.setTextColor(SSD1306_BLACK, SSD1306_WHITE); // Draw 'inverse' text
display.print(StatusBypass);
display.setTextColor(SSD1306_WHITE); // normal text
}
else {display.print(StatusBypass);}
display.setCursor(0,35);
display.print(F("U [V]:"));
display.setCursor(45,35);
display.print(Spannung);
display.setCursor(0,45);
display.print(F("A [A]:"));
display.setCursor(45,45);
display.print(Strom);
display.setCursor(0,57);
display.print(F("P [W]:"));
display.setCursor(45,57);
display.print(Power);
if (RecStatus == true) {
display.fillCircle(124, 3, 3, SSD1306_WHITE);
}
display.display();
}
void datadisplay_Effi(void){
display.clearDisplay();
display.cp437(true);
String Power_Text = String(Power, 2);
Power_Text = Power_Text + " W";
int16_t x1;
int16_t y1;
uint16_t width;
uint16_t height;
display.getTextBounds(Power_Text, 0, 0, &x1, &y1, &width, &height);
display.setCursor((SCREEN_WIDTH - width*2) / 2, 9);
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.print(Power_Text);
display.setTextSize(1);
display.drawRect(0, 36, 128, 8, SSD1306_WHITE);
display.fillRect(0, 36, dTWKIn, 8, SSD1306_WHITE);
display.drawLine(0, 35, 0, 45, SSD1306_WHITE);
display.drawLine(100, 35, 100, 45, SSD1306_WHITE);
display.drawLine(127, 35, 127, 45, SSD1306_WHITE);
display.setCursor(0,47);
display.print("0 Effizienz");
display.setCursor(92,47);
display.print("100");
display.setCursor(122,47);
display.write(0x11);
if (RecStatus == true) {
display.fillCircle(124, 3, 3, SSD1306_WHITE);
}
display.display();
}
void datadisplay_Steuerung(void) {
display.clearDisplay();
if (RecStatus == true) {
display.fillCircle(124, 3, 3, SSD1306_WHITE);
}
display.display();
}
void sensordaten(void){
SZeit_neu = millis();
if (SZeit_neu - SZeit_akt >= SDatenpause) {
SZeit_akt = SZeit_neu;
// Berechnungen Temperaturdifferenzen und Leistung
dTWKIn = TWarmIn - TKaltIn; // Berechnung des Temperaturunterschied am Eingang
dTWKOut = TWarmOut - TKaltOut; // Berechnung des Temperaturunterschied am Ausgang
Power = Spannung * Strom; // Berechnung der Leistung
// Bypass Status setzen
if(TWarmIn < BypassGrenze){
StatusBypass = "OFF";
Bypass = false;
}
else {
StatusBypass = " ON ";
Bypass = true;
}
//PT1000er berechnen
int sensorvalue = 0;
sensorvalue = analogRead(pinTKIn);
TKaltIn = ((((sensorvalue * (5.0 / 1023.0)) * 100) / vt_factor_TKIn) + offset_TKIn);
sensorvalue = analogRead(pinTKOut);
TKaltOut = ((((sensorvalue * (5.0 / 1023.0)) * 100) / vt_factor_TKOut) + offset_TKOut);
sensorvalue = analogRead(pinTWIn);
TWarmIn = ((((sensorvalue * (5.0 / 1023.0)) * 100) / vt_factor_TWIn) + offset_TWIn);
sensorvalue = analogRead(pinTWOut);
TWarmOut = ((((sensorvalue * (5.0 / 1023.0)) * 100) / vt_factor_TWOut) + offset_TWOut);
//Durchfluss Warm und Kalt berechnen
//Impuls frequenz: (hz) =[ 11 * q] ± 5% (q -- Fluss l/min)
QKalt = digitalRead(pinQK);
QWarm = digitalRead(pinQW);
Messdaten_speichern();
}
}
void Encoder_lesen() {
if (Display_akt > Screens){
Display_akt = 3;
}
Encoder_neu = digitalRead(Pin_DT);
if (Encoder_neu != Encoder_akt && Encoder_neu == 1){
if (digitalRead(Pin_CLK) != Encoder_neu) {
Display_akt ++;
if (Display_akt >= Screens + 1) {
Display_akt = 1;
}
}
}
else {
Display_akt --;
if (Display_akt <= 0) {
Display_akt = Screens;
}
}
EncButton.update();
if (EncButton.risingEdge()) {
if (RecStatus == true) {
RecStatus = false;
}
else if(RecStatus == false) {
RecStatus = true;
}
}
}
void Displayausgabe (byte Displays1){
switch (Display_akt) {
case 1:
datadisplay_Temp();
break;
case 2:
datadisplay_Power();
break;
case 3:
datadisplay_Effi();
break;
case 4:
datadisplay_Steuerung();
break;
}
}
void Messdaten_speichern(){
if (RecStatus == true){
Messdatei = SD.open("TEG_Daten.raw", FILE_WRITE);
Messdatei.print(TKaltIn); Messdatei.print(" ");
Messdatei.print(TWarmIn); Messdatei.print(" ");
Messdatei.print(dTWKIn); Messdatei.print(" ");
Messdatei.print(TKaltOut); Messdatei.print(" ");
Messdatei.print(TWarmOut); Messdatei.print(" ");
Messdatei.print(dTWKOut); Messdatei.print(" ");
Messdatei.print(Spannung); Messdatei.print(" ");
Messdatei.print(Strom); Messdatei.print(" ");
Messdatei.print(Power); Messdatei.print(" ");
Messdatei.print(QKalt); Messdatei.print(" ");
Messdatei.println(QWarm);
/* Serial.print(TKaltIn); Serial.print(" ");
Serial.print(TWarmIn); Serial.print(" ");
Serial.print(dTWKIn); Serial.print(" ");
Serial.print(TKaltOut); Serial.print(" ");
Serial.print(TWarmOut); Serial.print(" ");
Serial.print(dTWKOut); Serial.print(" ");
Serial.print(Spannung); Serial.print(" ");
Serial.print(Strom); Serial.print(" ");
Serial.print(Power); Serial.print(" ");
Serial.print(QKalt); Serial.print(" ");
Serial.println(QWarm); */
Messdatei.close();
}
}