arduino:flaschenkuehler:programmversion_0.3
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen RevisionVorhergehende Überarbeitung | Nächste ÜberarbeitungBeide Seiten der Revision | ||
arduino:flaschenkuehler:programmversion_0.3 [23.07.2017 10:54] – Frickelpiet | arduino:flaschenkuehler:programmversion_0.3 [23.07.2017 12:24] – Frickelpiet | ||
---|---|---|---|
Zeile 12: | Zeile 12: | ||
Eine erhebliche Beschleunigung der Ausführung des Codes (nämlich um ca. 229 %) konnte dadurch erreicht werden, den PID-Regler nicht in jeder Programmschleife einmal auszuführen, | Eine erhebliche Beschleunigung der Ausführung des Codes (nämlich um ca. 229 %) konnte dadurch erreicht werden, den PID-Regler nicht in jeder Programmschleife einmal auszuführen, | ||
+ | < | ||
+ | // Flaschenkühler - Programmversion 0.3 | ||
+ | // Diese Version steuert einen PC-Lüfter mit 4-Pin-Anschluss ... | ||
+ | // ... liest das Tachosignal aus ... | ||
+ | // ... berechnet die Drehzahl des Lüfters ... | ||
+ | // ... liest einen Thermistor aus und berechnet die Temperatur ... | ||
+ | // ... stellt über ein Poti die ZieltemperatureHotSidee ein ... | ||
+ | // ... regelt den Lüfter mit einem PID-Modul ... | ||
+ | // ... zeigt verschiedene Werte auf einem OLED-Display an ... | ||
+ | // ... zählt die Betriebsstunden (viertelstundengenau) und speichert sie im EEPROM ... | ||
+ | // ... pollt die Taster und speichert die Solltemperatur im EEPROM. | ||
+ | // | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | |||
+ | // | ||
+ | #define potiPin | ||
+ | #define thermistorPin | ||
+ | #define tachoPin | ||
+ | #define peltierPin | ||
+ | #define powerPin | ||
+ | #define dc 5 // | ||
+ | #define cs 6 // Chip Select | ||
+ | #define rst | ||
+ | #define button1Pin | ||
+ | #define fanPin | ||
+ | #define button2Pin | ||
+ | |||
+ | |||
+ | // | ||
+ | #define BLACK | ||
+ | #define BLUE 0x0418 | ||
+ | #define BLUEBERRY | ||
+ | #define RED | ||
+ | #define GREEN | ||
+ | #define CYAN 0x07FF | ||
+ | #define MAGENTA | ||
+ | #define YELLOW | ||
+ | #define WHITE | ||
+ | |||
+ | |||
+ | // | ||
+ | float thermistorValue = 0; // Variable in der der Wert des Thermistors gespeichert wird | ||
+ | int potiValue = 0; // variable to store the value coming from the sensor | ||
+ | |||
+ | // PWM Frequenzen | ||
+ | uint16_t frequencyFan = 25000; | ||
+ | uint16_t frequencyPeltier = 50000; // PWM-Frequenz für den Lüfter (in Hz) | ||
+ | |||
+ | // Lüfter | ||
+ | int tachoSignal; | ||
+ | uint32_t pulseOn = 0; // Ansteigende Signalflanke (Variablenformat nicht verändern!) | ||
+ | uint32_t pulseOff = 0; // Abfallende Signalflanke (Variablenformat nicht verändern!) | ||
+ | uint32_t duration; | ||
+ | bool high = false; | ||
+ | int rpm = 0; // Drehzahl des Lüfters in U/Min | ||
+ | float rpmAverage = 0; // Gemittelte Drehzahl des Lüfters in U/min | ||
+ | bool fanAlert = false; | ||
+ | bool fanAlertState = true; | ||
+ | unsigned long fanAlertDelay = 2000;// Gibt die Verzögerung des Alarms " | ||
+ | unsigned long previousMillis = 0; | ||
+ | |||
+ | // Temperaturen | ||
+ | float temperatureHotSide = 0; | ||
+ | float previousTempHotSide = 0; // Wird verwendet um festzustellen, | ||
+ | |||
+ | // Betriebsstundenzähler und Serviceintervall | ||
+ | float operatingTime; | ||
+ | long lastTime = 0; | ||
+ | float serviceInterval; | ||
+ | bool serviceIntervalReset = false; // Wird wahr, wenn das Service Intervall zurückgesetzt wird | ||
+ | |||
+ | // Adressen im EEPROM | ||
+ | int addrOperatingTime = 0; // Startadresse für eine Variable im Datentyp float (4 Byte!) | ||
+ | int addrTargetTemp = 4; // Startadresse für eine Variable im Datentyp double (8 Byte!) | ||
+ | int addrDisplayMode = 13; // Adresse für den Anzeigemodus (2 Byte reserviert) | ||
+ | int addrServiceInterval = 15; // Startadresse für eine Variable im Datentyp float (4 Byte!) | ||
+ | |||
+ | // Definiert das OLED | ||
+ | Adafruit_SSD1351 tft = Adafruit_SSD1351(cs, | ||
+ | |||
+ | // Definiert ein Array, aus dem Farbwerte ausgelesen werden | ||
+ | unsigned long colors[] = {0x07FF, 0x07DF, 0x077F, 0x06FF, 0x069F, 0x063F, 0x05DF, 0x057F, 0x053F, 0x049F, 0x043F, 0x03DF, 0x037F, 0x031F, 0x029F, 0x023F, 0x01DF, 0x017F, 0x011F, 0x009F, | ||
+ | 0x003F, 0x001F, 0x101F, 0x201F, 0x281F, 0x381F, 0x401F, | ||
+ | 0xF81F, 0xF81F, 0xF81D, 0xF81B, 0xF81A, 0xF818, 0xF817, 0xF815, 0xF813, 0xF812, 0xF810, 0xF80F, 0xF80D, 0xF80C, 0xF80A, 0xF808, 0xF807, 0xF805, 0xF804, 0xF802, 0xF800}; | ||
+ | |||
+ | // Informationsanzeige | ||
+ | int displayMode; | ||
+ | bool refreshPeltier = true; // Wird wahr, wenn der Anzeigebereich für das Peltier-Element aktualisiert werden muss | ||
+ | bool refreshTargettemp = true; // Wird wahr, wenn der Anzeigebereich für die Solltemperatur aktualisiert werden muss | ||
+ | //bool refreshActualtemp = true; | ||
+ | bool refreshFan = true; // Wird wahr, wenn der Anzeigebereich für den Lüfter aktualisiert werden muss | ||
+ | int x = 0; | ||
+ | |||
+ | // Instantiiert ButtonEvents-Objekte | ||
+ | ButtonEvents button1; | ||
+ | ButtonEvents button2; | ||
+ | |||
+ | // Instantiiert ein RunningAverage-Objekt zur Bechnung von Mittelwerten | ||
+ | RunningAverage averageRPM(25); | ||
+ | |||
+ | // Instantiirt ResponsiveAnalogRead-Objekte zur Glättung der analogen Inputs | ||
+ | ResponsiveAnalogRead analog(thermistorPin, | ||
+ | |||
+ | // Definiert den PID-Regler | ||
+ | double Setpoint, Input, Output; | ||
+ | double Kp=2, Ki=5, Kd=1; | ||
+ | PID fanPID(& | ||
+ | |||
+ | // Definiert die Tracking-Variablen für die IF-Abfragen | ||
+ | unsigned long previousMillisCalculateTemperatures = 0; // Auslesen der analogen Inputs und Berechnung der Temperaturen | ||
+ | unsigned long previousMillisCalculatePID = 0; // Berechnung der PID-Regler (Lüfter und Peltier-Element) | ||
+ | unsigned long previousMillisCalculateFanSpeed = 0; // Berechnung der Drehzahl des Lüfters | ||
+ | unsigned long previousMillisDisplayActualtemp = 0; // Ausgabe der Ist-Temperatur an das OLED-Display | ||
+ | unsigned long previousMillisDisplayFanSpeed = 0; // Ausgabe der gemittelten Lüfterdrehzahl an das OLED-Display | ||
+ | unsigned long previousMillisDisplayGraph = 0; // Ausgabe der gemittelten Lüfterdrehzahl an das OLED-Display | ||
+ | unsigned long previousMillisSerialPrint = 0; // Ausgabe an die serielle Schnittstelle | ||
+ | |||
+ | // Definiert die Intervalle für die IF-Abfragen in Millisekunden | ||
+ | const unsigned long intervalCalculateTemperatures = 10;// Auslesen der analogen Inputs und Berechnung der Temperaturen | ||
+ | const unsigned long intervalCalculatePID = 10; // Berechnung der PID-Regler (Lüfter und Peltier-Element) | ||
+ | const unsigned long intervalCalculateFanSpeed = 100; // Berechnung der Drehzahl des Lüfters | ||
+ | const unsigned long intervalDisplayActualtemp = 500; // Ausgabe der Ist-Temperatur an das OLED-Display | ||
+ | const unsigned long intervalDisplayFanSpeed = 500; // Ausgabe der gemittelten Lüfterdrehzahl an das OLED-Display | ||
+ | const unsigned long intervalDisplayGraph = 1000; // Ausgabe der gemittelten Lüfterdrehzahl an das OLED-Display | ||
+ | const unsigned long intervalSerialPrint = 500; // Ausgabe an die serielle Schnittstelle | ||
+ | |||
+ | int loopCounter = 0; | ||
+ | |||
+ | |||
+ | // | ||
+ | void setup() { | ||
+ | Serial.begin(115200); | ||
+ | |||
+ | // Initialisiert das OLED-Dispaly | ||
+ | tft.begin(); | ||
+ | | ||
+ | // Definiert die Pins | ||
+ | pinMode(tachoPin, | ||
+ | pinMode(powerPin, | ||
+ | pinMode(fanPin, | ||
+ | pinMode(peltierPin, | ||
+ | pinMode(button1Pin, | ||
+ | pinMode(button2Pin, | ||
+ | |||
+ | // Initialisiert die ButtonEvents-Objekte | ||
+ | button1.attach(button1Pin); | ||
+ | button1.debounceTime(10); | ||
+ | button1.doubleTapTime(70); | ||
+ | button1.holdTime(1000); | ||
+ | button2.attach(button2Pin); | ||
+ | button2.debounceTime(10); | ||
+ | button2.doubleTapTime(70); | ||
+ | button2.holdTime(1000); | ||
+ | | ||
+ | // Initialisiert timer1 und timer2 (timer0 bleibt unberührt) | ||
+ | InitTimersSafe(); | ||
+ | |||
+ | // Definiert die Frequenzen für die angegebenen Pins | ||
+ | bool successFan = SetPinFrequencySafe(fanPin, | ||
+ | bool successPeltier = SetPinFrequencySafe(peltierPin, | ||
+ | |||
+ | /* | ||
+ | //if the pin frequency was set successfully, | ||
+ | if(successFan) { | ||
+ | pinMode(13, OUTPUT); | ||
+ | digitalWrite(13, | ||
+ | Serial.print(" | ||
+ | } | ||
+ | if(successPeltier) { | ||
+ | Serial.print(" | ||
+ | } | ||
+ | */ | ||
+ | // Initialisiert die PID-Regler | ||
+ | fanPID.SetMode(AUTOMATIC); | ||
+ | |||
+ | // Liest die im EEPROM gespeicherten Variablen aus | ||
+ | displayMode = EEPROM.read(addrDisplayMode); | ||
+ | operatingTime = EEPROM.readFloat(addrOperatingTime); | ||
+ | serviceInterval = EEPROM.readFloat(addrServiceInterval); | ||
+ | Setpoint = EEPROM.readDouble(addrTargetTemp); | ||
+ | |||
+ | // | ||
+ | //Setpoint = 0; | ||
+ | // | ||
+ | | ||
+ | // Meldung "Klar zum Start!" | ||
+ | Serial.println("< | ||
+ | Serial.print("< | ||
+ | Serial.print("< | ||
+ | | ||
+ | // Startbildschirm | ||
+ | tft.fillScreen(BLACK); | ||
+ | tft.setCursor(25, | ||
+ | tft.setTextColor(WHITE, | ||
+ | tft.setTextSize(0); | ||
+ | tft.print(" | ||
+ | tft.setCursor(20, | ||
+ | tft.print(" | ||
+ | tft.setCursor(45, | ||
+ | tft.setTextSize(2); | ||
+ | tft.print(" | ||
+ | if (serviceInterval >= 1.00) { | ||
+ | tft.setCursor(0, | ||
+ | tft.setTextColor(RED, | ||
+ | tft.setTextSize(0); | ||
+ | tft.print(" | ||
+ | } | ||
+ | tft.setCursor(10, | ||
+ | tft.setTextColor(WHITE, | ||
+ | tft.setTextSize(0); | ||
+ | tft.print(" | ||
+ | tft.setCursor(10, | ||
+ | tft.print(operatingTime); | ||
+ | | ||
+ | delay(2000); | ||
+ | tft.fillScreen(BLACK); | ||
+ | } | ||
+ | |||
+ | |||
+ | // | ||
+ | void loop() { | ||
+ | // Aktuelle Zeit abfragen | ||
+ | unsigned long currentMillis = millis(); | ||
+ | |||
+ | loopCounter++; | ||
+ | |||
+ | |||
+ | // | ||
+ | // Lesen und entprellen des Tasters | ||
+ | button1.update(); | ||
+ | button2.update(); | ||
+ | |||
+ | |||
+ | if (button1.tapped() == true) { | ||
+ | Setpoint = Setpoint + 0.5; | ||
+ | EEPROM.updateDouble(addrTargetTemp, | ||
+ | // | ||
+ | refreshTargettemp = true; | ||
+ | if (Setpoint >= 30.00) { | ||
+ | Setpoint = 30.00; | ||
+ | } | ||
+ | } | ||
+ | if (button1.held() == true) { | ||
+ | displayMode++; | ||
+ | if (displayMode > 2) { | ||
+ | displayMode = 0; | ||
+ | } | ||
+ | tft.fillScreen(BLACK); | ||
+ | EEPROM.update(addrDisplayMode, | ||
+ | // | ||
+ | refreshPeltier = true; | ||
+ | refreshTargettemp = true; | ||
+ | previousTempHotSide = 150; | ||
+ | refreshFan= true; | ||
+ | x = 0; | ||
+ | } | ||
+ | if (button1.doubleTapped() == true) { | ||
+ | serviceInterval = 0; | ||
+ | EEPROM.updateFloat(addrServiceInterval, | ||
+ | Serial.println(" | ||
+ | serviceIntervalReset = true; | ||
+ | } | ||
+ | | ||
+ | if (button2.tapped() == true) { | ||
+ | Setpoint = Setpoint - 0.5; | ||
+ | EEPROM.updateDouble(addrTargetTemp, | ||
+ | // | ||
+ | refreshTargettemp = true; | ||
+ | if (Setpoint <= 0.00) { | ||
+ | Setpoint = 0.00; | ||
+ | } | ||
+ | } | ||
+ | if (button2.held() == true) { | ||
+ | displayMode--; | ||
+ | if (displayMode < 0) { | ||
+ | displayMode = 2; | ||
+ | } | ||
+ | tft.fillScreen(BLACK); | ||
+ | EEPROM.update(addrDisplayMode, | ||
+ | // | ||
+ | refreshPeltier = true; | ||
+ | refreshTargettemp = true; | ||
+ | previousTempHotSide = 150; | ||
+ | refreshFan= true; | ||
+ | x = 0; | ||
+ | } | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | // | ||
+ | if ((unsigned long)(currentMillis - previousMillisCalculateTemperatures) >= intervalCalculateTemperatures) { | ||
+ | // Lese die analogen Inputs aus | ||
+ | potiValue = analogRead(potiPin); | ||
+ | analog.update(); | ||
+ | |||
+ | thermistorValue = analog.getValue(); | ||
+ | |||
+ | // Berechnung der Temperatur | ||
+ | thermistorValue = 1023 / thermistorValue - 1; | ||
+ | thermistorValue = 10000 / thermistorValue; | ||
+ | | ||
+ | //float temperatureHotSide; | ||
+ | temperatureHotSide = thermistorValue / 10000; | ||
+ | temperatureHotSide = log(temperatureHotSide); | ||
+ | temperatureHotSide /= 3950; // 1/B * ln(R/Ro) | ||
+ | temperatureHotSide += 1.0 / (25 + 273.15); | ||
+ | temperatureHotSide = 1.0 / temperatureHotSide; | ||
+ | temperatureHotSide -= 273.15; | ||
+ | | ||
+ | previousMillisCalculateTemperatures = currentMillis; | ||
+ | } | ||
+ | |||
+ | // | ||
+ | if ((unsigned long)(currentMillis - previousMillisCalculatePID) >= intervalCalculatePID) { | ||
+ | Input = temperatureHotSide; | ||
+ | fanPID.Compute(); | ||
+ | pwmWrite(fanPin, | ||
+ | |||
+ | // Wenn der Output des PID-Reglers Null ist, wird der Lüfter ausgeschaltet. | ||
+ | if (Output > 0) { | ||
+ | digitalWrite(powerPin, | ||
+ | // | ||
+ | } | ||
+ | else { | ||
+ | digitalWrite(powerPin, | ||
+ | // | ||
+ | } | ||
+ | | ||
+ | //use this functions instead of analogWrite on ' | ||
+ | pwmWrite(peltierPin, | ||
+ | | ||
+ | previousMillisCalculatePID = currentMillis; | ||
+ | } | ||
+ | |||
+ | // | ||
+ | // Messung der Pulsweite des Tachosignals | ||
+ | tachoSignal = digitalRead(tachoPin); | ||
+ | if (tachoSignal == HIGH && high != true) { // Zeit in micros bei ansteigender Flanke | ||
+ | pulseOn = micros(); | ||
+ | high = true; | ||
+ | } | ||
+ | else if (tachoSignal == LOW && high == true) { | ||
+ | pulseOff = micros(); | ||
+ | high = false; | ||
+ | duration = pulseOff - pulseOn; | ||
+ | if (duration > 7000 && duration < 150000) { // Liegt die Variable über bzw. unter den angegebenen Werten, liegt ein Messfehler vor | ||
+ | rpm = float(100000 * 2 * 60 / duration); | ||
+ | } | ||
+ | else { | ||
+ | rpm = 0; | ||
+ | } | ||
+ | // | ||
+ | } | ||
+ | |||
+ | // Berechnung der gemittelten Drehzahl des Lüfters | ||
+ | if ((unsigned long)(currentMillis - previousMillisCalculateFanSpeed) >= intervalCalculateFanSpeed) { | ||
+ | averageRPM.addValue(rpm); | ||
+ | | ||
+ | // Wenn der Lüfter angehalten wird, soll die Drehzahl " | ||
+ | if (Output == 0) { | ||
+ | rpm = 0; | ||
+ | averageRPM.addValue(rpm); | ||
+ | } | ||
+ | |||
+ | // Liest die durchschnittliche Drehzahl aus und speichert das Ergebnis in eine Variable | ||
+ | rpmAverage = averageRPM.getAverage(); | ||
+ | |||
+ | // Meldet eine Fehlfunktion des Lüfters, wenn das Tachosignal " | ||
+ | if (millis() >= 10000) { // Diese Funktion wird erst nach 10 Sekunden aktiv. | ||
+ | if (Output > 0) { // Wenn der Lüfter sich drehen sollte ... | ||
+ | if (rpmAverage == 0) { // ... aber die gemittelte Drehzahl gleich " | ||
+ | if (millis() - previousMillis > fanAlertDelay) { // ... und eine definierte Zeit verstrichen ist. | ||
+ | previousMillis = millis(); | ||
+ | fanAlert = true; | ||
+ | fanAlertState = true; | ||
+ | Serial.println(" | ||
+ | refreshFan = true; | ||
+ | } | ||
+ | } | ||
+ | else if (rpmAverage > 0) { // ... und die gemittelte Drehzahl größer " | ||
+ | fanAlert = false; | ||
+ | } | ||
+ | } | ||
+ | else if (Output == 0) { // Wenn der Lüfter sich nicht drehen soll kann nicht festgestellt werden, ob er blockiert ist. | ||
+ | fanAlert = false; | ||
+ | previousMillis = millis(); | ||
+ | if (fanAlert != fanAlertState) { | ||
+ | refreshFan = true; | ||
+ | fanAlertState = false; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | previousMillisCalculateFanSpeed = currentMillis; | ||
+ | } | ||
+ | |||
+ | |||
+ | // | ||
+ | // Die Betriebsstunden werden alle 15 Minuten im EEPROM gespeichert. Die Einheit der Variable operatinTime ist also 0,25 Stunden. | ||
+ | if (millis() - lastTime >= 900000) { | ||
+ | // Betriebsstundenzähler | ||
+ | operatingTime = operatingTime + 0.25; | ||
+ | lastTime = millis(); | ||
+ | EEPROM.updateFloat(addrOperatingTime, | ||
+ | Serial.print(" | ||
+ | // Serviceintervallzähler | ||
+ | serviceInterval = serviceInterval + 0.25; | ||
+ | EEPROM.updateFloat(addrServiceInterval, | ||
+ | } | ||
+ | |||
+ | |||
+ | // | ||
+ | // Anzeige " | ||
+ | if (serviceIntervalReset == true) { | ||
+ | tft.fillScreen(BLACK); | ||
+ | tft.setCursor(15, | ||
+ | tft.setTextColor(WHITE, | ||
+ | tft.setTextSize(0); | ||
+ | tft.print(" | ||
+ | tft.setCursor(26, | ||
+ | tft.print(" | ||
+ | delay(2000); | ||
+ | tft.fillScreen(BLACK); | ||
+ | refreshPeltier = true; | ||
+ | refreshTargettemp = true; | ||
+ | previousTempHotSide = 150; | ||
+ | refreshFan= true; | ||
+ | serviceIntervalReset = false; | ||
+ | } | ||
+ | | ||
+ | // Anzeigemodus " | ||
+ | if (displayMode == 0) { | ||
+ | // Anzeige Infobereich Zieltemperatur | ||
+ | if (refreshTargettemp == true) { | ||
+ | tft.setCursor(15, | ||
+ | int i = Setpoint * 2; // Berechnet den Index für den Array " | ||
+ | if (i < 0) i = 0; // i soll nicht kleiner als " | ||
+ | if (i > 60) i = 60; // i soll nicht größer als " | ||
+ | tft.setTextColor(colors[i], | ||
+ | tft.setTextSize(0); | ||
+ | tft.print(" | ||
+ | tft.setCursor(15, | ||
+ | tft.setTextSize(2); | ||
+ | if (Setpoint < 10.00) { | ||
+ | tft.print(" | ||
+ | } | ||
+ | tft.print(Setpoint); | ||
+ | tft.setTextColor(BLACK, | ||
+ | tft.print((char)218); | ||
+ | refreshTargettemp = false; | ||
+ | } | ||
+ | | ||
+ | // Anzeige Infobereich Isttemperatur | ||
+ | if ((unsigned long)(currentMillis - previousMillisDisplayActualtemp) >= intervalSerialPrint) { | ||
+ | if (temperatureHotSide != previousTempHotSide) { | ||
+ | tft.setCursor(15, | ||
+ | int i = temperatureHotSide * 2; // Berechnet den Index für den Array " | ||
+ | if (i < 0) i = 0; // i soll nicht kleiner als " | ||
+ | if (i > 60) i = 60; // i soll nicht größer als " | ||
+ | tft.setTextColor(colors[i], | ||
+ | tft.setTextSize(0); | ||
+ | tft.print(" | ||
+ | tft.setCursor(15, | ||
+ | tft.setTextSize(2); | ||
+ | if (temperatureHotSide < 10.00) { | ||
+ | tft.print(" | ||
+ | } | ||
+ | tft.print(temperatureHotSide); | ||
+ | tft.setTextColor(BLACK, | ||
+ | tft.print((char)218); | ||
+ | previousTempHotSide = temperatureHotSide; | ||
+ | } | ||
+ | previousMillisDisplayActualtemp = currentMillis; | ||
+ | } | ||
+ | } | ||
+ | | ||
+ | // Anzeigemodus " | ||
+ | if (displayMode == 1) { | ||
+ | // Anzeige Infobereich Peltier-Element | ||
+ | if (refreshPeltier == true) { | ||
+ | tft.setCursor(0, | ||
+ | tft.setTextColor(WHITE, | ||
+ | tft.setTextSize(0); | ||
+ | tft.print(" | ||
+ | refreshPeltier = false; | ||
+ | } | ||
+ | | ||
+ | // Anzeige Infobereich Zieltemperatur | ||
+ | if (refreshTargettemp == true) { | ||
+ | tft.setCursor(15, | ||
+ | int i = Setpoint * 2; // Berechnet den Index für den Array " | ||
+ | if (i < 0) i = 0; // i soll nicht kleiner als " | ||
+ | if (i > 60) i = 60; // i soll nicht größer als " | ||
+ | tft.setTextColor(colors[i], | ||
+ | tft.setTextSize(0); | ||
+ | tft.print(" | ||
+ | tft.setCursor(15, | ||
+ | tft.setTextSize(2); | ||
+ | if (Setpoint < 10.00) { | ||
+ | tft.print(" | ||
+ | } | ||
+ | tft.print(Setpoint); | ||
+ | tft.setTextColor(BLACK, | ||
+ | tft.print((char)218); | ||
+ | refreshTargettemp = false; | ||
+ | } | ||
+ | | ||
+ | // Anzeige Infobereich Isttemperatur | ||
+ | if ((unsigned long)(currentMillis - previousMillisDisplayActualtemp) >= intervalDisplayActualtemp) { | ||
+ | if (temperatureHotSide != previousTempHotSide) { | ||
+ | tft.setCursor(15, | ||
+ | int i = temperatureHotSide * 2; // Berechnet den Index für den Array " | ||
+ | if (i < 0) i = 0; // i soll nicht kleiner als " | ||
+ | if (i > 60) i = 60; // i soll nicht größer als " | ||
+ | tft.setTextColor(colors[i], | ||
+ | tft.setTextSize(0); | ||
+ | tft.print(" | ||
+ | tft.setCursor(15, | ||
+ | tft.setTextSize(2); | ||
+ | if (temperatureHotSide < 10.00) { | ||
+ | tft.print(" | ||
+ | } | ||
+ | tft.print(temperatureHotSide); | ||
+ | tft.setTextColor(BLACK, | ||
+ | tft.print((char)218); | ||
+ | previousTempHotSide = temperatureHotSide; | ||
+ | } | ||
+ | previousMillisDisplayActualtemp = currentMillis; | ||
+ | } | ||
+ | |||
+ | // Anzeige Infobereich Lüfter | ||
+ | if (fanAlert == true) { | ||
+ | if (refreshFan == true) { | ||
+ | tft.setCursor(0, | ||
+ | tft.setTextSize(0); | ||
+ | tft.setTextColor(RED, | ||
+ | tft.print(" | ||
+ | refreshFan = false; | ||
+ | } | ||
+ | } | ||
+ | else if (fanAlert == false) { | ||
+ | if (rpmAverage > 0) { // Wenn die Drehzahl größer " | ||
+ | if ((unsigned long)(currentMillis - previousMillisDisplayFanSpeed) >= intervalDisplayFanSpeed) { | ||
+ | tft.setCursor(0, | ||
+ | tft.setTextSize(0); | ||
+ | tft.setTextColor(WHITE, | ||
+ | tft.print(" | ||
+ | tft.setTextColor(BLACK, | ||
+ | for (int i=0; i<5; i++) { // Füllt die Zeile mit schwarzen Kästchen; i muss ggf. angepasst werden | ||
+ | tft.print((char)218); | ||
+ | } | ||
+ | refreshFan = true; | ||
+ | previousMillisDisplayFanSpeed = currentMillis; | ||
+ | } | ||
+ | } | ||
+ | else if (rpmAverage == 0) { | ||
+ | if (refreshFan == true) { | ||
+ | tft.setCursor(0, | ||
+ | tft.setTextSize(0); | ||
+ | tft.setTextColor(WHITE, | ||
+ | tft.print(" | ||
+ | tft.setTextColor(BLACK, | ||
+ | for (int i=0; i<12; i++) { // Füllt die Zeile mit schwarzen Kästchen; i muss ggf. angepasst werden | ||
+ | tft.print((char)218); | ||
+ | } | ||
+ | refreshFan = false; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | | ||
+ | // Anzeigemodus " | ||
+ | if (displayMode == 2) { | ||
+ | // Anzeige Isttemperatur | ||
+ | if ((unsigned long)(currentMillis - previousMillisDisplayActualtemp) >= intervalDisplayActualtemp) { | ||
+ | if (temperatureHotSide != previousTempHotSide) { | ||
+ | tft.setCursor(0, | ||
+ | tft.setTextSize(0); | ||
+ | int i = temperatureHotSide * 2; // Berechnet den Index für den Array " | ||
+ | if (i < 0) i = 0; // i soll nicht kleiner als " | ||
+ | if (i > 60) i = 60; // i soll nicht größer als " | ||
+ | tft.setTextColor(colors[i], | ||
+ | tft.print(" | ||
+ | if (temperatureHotSide < 10.00) { | ||
+ | tft.print(" | ||
+ | } | ||
+ | tft.print(temperatureHotSide); | ||
+ | tft.setTextColor(BLACK, | ||
+ | tft.print((char)218); | ||
+ | previousTempHotSide = temperatureHotSide; | ||
+ | } | ||
+ | previousMillisDisplayActualtemp = currentMillis; | ||
+ | } | ||
+ | // Anzeige Solltemperatur | ||
+ | if (refreshTargettemp == true) { | ||
+ | tft.setCursor(64, | ||
+ | tft.setTextColor(WHITE, | ||
+ | tft.setTextSize(0); | ||
+ | tft.print(" | ||
+ | if (Setpoint < 10.00) { | ||
+ | tft.print(" | ||
+ | } | ||
+ | tft.print(Setpoint); | ||
+ | refreshTargettemp = false; | ||
+ | } | ||
+ | // Anzeige Graphen | ||
+ | if ((unsigned long)(currentMillis - previousMillisDisplayGraph) >= intervalDisplayGraph) { | ||
+ | |||
+ | x++; | ||
+ | if (x >= 128) { | ||
+ | x = 0; | ||
+ | // | ||
+ | tft.fillRect(0, | ||
+ | // | ||
+ | // | ||
+ | // | ||
+ | // | ||
+ | // | ||
+ | // | ||
+ | } | ||
+ | | ||
+ | // Graph Solltemperatur | ||
+ | int y = 114 - Setpoint * 2; | ||
+ | tft.drawPixel(x, | ||
+ | | ||
+ | // Graph Isttemperatur | ||
+ | int z = 114 - temperatureHotSide *2; | ||
+ | int i = temperatureHotSide * 2; // Berechnet den Index für den Array " | ||
+ | if (i < 0) i = 0; // i soll nicht kleiner als " | ||
+ | if (i > 60) i = 60; // i soll nicht größer als " | ||
+ | tft.drawPixel(x, | ||
+ | |||
+ | // Graph Lüfterdrehzahl | ||
+ | int d = 114 - rpmAverage / 21; | ||
+ | tft.drawPixel(x, | ||
+ | | ||
+ | // | ||
+ | // | ||
+ | // | ||
+ | // | ||
+ | |||
+ | // Anzeige Peltier-Element | ||
+ | if (refreshPeltier == true) { | ||
+ | tft.setCursor(0, | ||
+ | tft.setTextColor(BLUEBERRY, | ||
+ | tft.setTextSize(0); | ||
+ | tft.print(" | ||
+ | refreshPeltier = false; | ||
+ | } | ||
+ | | ||
+ | // Anzeige Lüfter | ||
+ | if (rpmAverage > 0) { | ||
+ | if ((unsigned long)(currentMillis - previousMillisDisplayFanSpeed) >= intervalDisplayFanSpeed) { | ||
+ | tft.setCursor(60, | ||
+ | tft.setTextSize(0); | ||
+ | tft.setTextColor(BLUE, | ||
+ | tft.print(" | ||
+ | tft.setTextColor(BLACK, | ||
+ | for (int i=0; i<3; i++) { // Füllt die Zeile mit schwarzen Kästchen; i muss ggf. angepasst werden | ||
+ | tft.print((char)218); | ||
+ | } | ||
+ | refreshFan = true; | ||
+ | previousMillisDisplayFanSpeed = currentMillis; | ||
+ | } | ||
+ | } | ||
+ | if (rpmAverage == 0) { | ||
+ | if (refreshFan == true) { | ||
+ | tft.setCursor(60, | ||
+ | tft.setTextSize(0); | ||
+ | tft.setTextColor(BLUE, | ||
+ | tft.print(int(rpmAverage)); | ||
+ | tft.setTextColor(BLACK, | ||
+ | for (int i=0; i<3; i++) { // Füllt die Zeile mit schwarzen Kästchen; i muss ggf. angepasst werden | ||
+ | tft.print((char)218); | ||
+ | } | ||
+ | refreshFan = false; | ||
+ | } | ||
+ | } | ||
+ | | ||
+ | previousMillisDisplayGraph = currentMillis; | ||
+ | } | ||
+ | } | ||
+ | // | ||
+ | if ((unsigned long)(currentMillis - previousMillisSerialPrint) >= intervalSerialPrint) { | ||
+ | |||
+ | // Ausgabe für den seriellen Monitor | ||
+ | Serial.print(" | ||
+ | Serial.print("; | ||
+ | Serial.print("; | ||
+ | // | ||
+ | // | ||
+ | // | ||
+ | Serial.print("; | ||
+ | Serial.print("; | ||
+ | // | ||
+ | // | ||
+ | Serial.print("; | ||
+ | Serial.print("; | ||
+ | Serial.print("; | ||
+ | Serial.print("; | ||
+ | |||
+ | loopCounter = 0; | ||
+ | | ||
+ | //Speichere die aktuelle Zeit in die zughörige Variable | ||
+ | previousMillisSerialPrint = currentMillis; | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | Der Sketch verwendet 24248 Bytes (78%) des Programmspeicherplatzes. Das Maximum sind 30720 Bytes. | ||
+ | Globale Variablen verwenden 1504 Bytes (73%) des dynamischen Speichers, 544 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes. | ||
Tags: #Arduino # | Tags: #Arduino # |
arduino/flaschenkuehler/programmversion_0.3.txt · Zuletzt geändert: 18.05.2023 12:34 von 127.0.0.1