arduino:flaschenkuehler:programmversion_0.2
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende Überarbeitung | ||
arduino:flaschenkuehler:programmversion_0.2 [08.07.2017 17:47] – Frickelpiet | arduino:flaschenkuehler:programmversion_0.2 [18.05.2023 12:34] (aktuell) – Externe Bearbeitung 127.0.0.1 | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
====== Flaschenkühler - Programmversion 0.2 ====== | ====== Flaschenkühler - Programmversion 0.2 ====== | ||
- | Diese Programmversion bindet das OLED-Display ein. Es sollen exemplarisch ein paar Variablen angezeigt | + | Diese Programmversion bindet das OLED-Display ein. Für MISO und SCLK werden die Hardwarepins verwendet. Es könnten auch andere digitale Pins verwendet |
+ | Der Code wurde hier und da optimiert, so dass er schneller ausgeführt wird. Beispielsweise wird der Thermistor nun nur noch alle 10 Millisekunden ausgelesen und die Isttemperatur berechnet. Außerdem werden nur die Bereiche auf dem Display neu aufgebaut, die sich geändert haben. | ||
- | https://github.com/pkourany/Adafruit_mfGFX_Library | + | ===== OLED-Display ===== |
+ | Das OLED-Display ist an den folgenden Pins angeschlossen: | ||
+ | < | ||
+ | Arduino Nano Adafruit OLED Breakout Board | ||
+ | GND GND (G) | ||
+ | 5V VIN (+) | ||
+ | D13 SCLK (CL) | ||
+ | D11 MOSI (SI) | ||
+ | D5 DC | ||
+ | D6 OLEDCS (OC) (besser bekannt als Chip Select (CS)) | ||
+ | D7 RST (R) | ||
+ | </ | ||
+ | |||
+ | Um das OLED zu testen werden verschiedene Variablen angezeigt: die Solltemeratur, | ||
+ | |||
+ | Hilfreiche Webseiten: | ||
+ | * Anleitung GTX-Bibliothek: | ||
+ | * Character Map: https:// | ||
+ | |||
+ | Die Datenübertragung zum Display ist ziemlich langsam. Um die Ausführung des Codes zu beschleunigen, | ||
+ | |||
+ | ===== Betriebsstunden, | ||
+ | Außerdem werden die Betriebsstunden viertelstundengenau gezählt und im EEPROM gespeichert. Die viertelstundengenaue Zählweise schont das EEPROM. Später soll eine Funktion programmiert werden, die z.B. alle 100 Stunden zur Reinigung des Geräts (insbesondere des Lüfters) auffordert. | ||
+ | |||
+ | Das Programm fragt einmal pro Schleife die beiden Taster ab. Diese Lösung ist gegenüber der Nutzung von Interrupts nicht die erste Wahl, weil der Arduino Nano jedoch nur zwei interruptfähige Pins hat (Pin 2 und Pin 3) und einer der beiden Pins (3) für die PWM-Ansteuerung des Peltier-Elements verwendet wird, fällt diese Variante aus. Die Taster sind entprellt und lösen erst beim Loslassen aus. Die Solltemperatur wird im EEPROM gespeichert. | ||
+ | |||
+ | Sowohl für den Betriebsstundenzähler als auch für die Speicherung der Solltemperatur müssen Variablen mit dem Dateityp float bzw. double im EEPROM gespeichert werden. Zu diesem Zweck wurde die Bibliothek [[https:// | ||
+ | |||
+ | |||
+ | To dos: | ||
+ | * Es soll eine Sicherungsschaltung programmiert werden, die das Peltierelement ausschaltet, | ||
+ | * Es soll zwischen verschiedenen Anzeigemodi gewechselt werden können, indem die Taster länger gedrückt werden. | ||
+ | |||
+ | < | ||
+ | // Flaschenkühler - Programmversion 0.2 | ||
+ | // 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 < | ||
+ | |||
+ | // | ||
+ | #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 0x001F | ||
+ | #define RED | ||
+ | #define GREEN | ||
+ | #define CYAN 0x07FF | ||
+ | #define MAGENTA | ||
+ | #define YELLOW | ||
+ | #define WHITE | ||
+ | |||
+ | // | ||
+ | int button1state = HIGH; // aktuelles Signal vom Tasterpin | ||
+ | int button1pressed = 0; // abfragen ob Taster gedrückt war | ||
+ | int button2state = HIGH; // aktuelles Signal vom Tasterpin | ||
+ | int button2pressed = 0; // abfragen ob Taster gedrückt war | ||
+ | int debouncetime = 5; // Zeit für Entprellung ggf. anpassen | ||
+ | unsigned long button1time = 0; | ||
+ | unsigned long button2time = 0; | ||
+ | |||
+ | |||
+ | 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; | ||
+ | |||
+ | // Betriebszeit | ||
+ | float operatingTime; | ||
+ | long lastTime = 0; | ||
+ | |||
+ | // 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!) | ||
+ | |||
+ | // Definiert das OLED | ||
+ | Adafruit_SSD1351 tft = Adafruit_SSD1351(cs, | ||
+ | |||
+ | // Informationsanzeige | ||
+ | bool refreshPeltier = true; | ||
+ | bool refreshTargettemp = true; | ||
+ | //bool refreshActualtemp = true; | ||
+ | bool refreshFan = true; | ||
+ | |||
+ | // Instantiiert RunningAverage-Objekte zur Bechnung von Mittelwerten | ||
+ | RunningAverage averageRPM(25); | ||
+ | RunningAverage averageThermistor(10); | ||
+ | |||
+ | // 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;// Berechnung der Temperaturen | ||
+ | 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 previousMillisSerialPrint = 0; // Ausgabe an die serielle Schnittstelle | ||
+ | |||
+ | // Definiert die Intervalle für die IF-Abfragen in Millisekunden | ||
+ | const unsigned long intervalCalculateTemperatures = 10; | ||
+ | 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 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 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 | ||
+ | operatingTime = EEPROM.readFloat(addrOperatingTime); | ||
+ | Setpoint = EEPROM.readDouble(addrTargetTemp); | ||
+ | |||
+ | // Stellt sicher, dass im ersten Durchlauf der Programmschleife nicht fälschlicherweise eine Lüfterfehlfunktion gemeldet wird | ||
+ | previousMillis = fanAlertDelay; | ||
+ | |||
+ | // Meldung "Klar zum Start!" | ||
+ | Serial.println("< | ||
+ | Serial.print("< | ||
+ | |||
+ | // Startbildschirm | ||
+ | tft.fillScreen(BLACK); | ||
+ | tft.setCursor(25, | ||
+ | tft.setTextColor(WHITE, | ||
+ | tft.setTextSize(0); | ||
+ | tft.print(" | ||
+ | tft.setCursor(22, | ||
+ | tft.print(" | ||
+ | tft.setCursor(45, | ||
+ | tft.setTextSize(2); | ||
+ | tft.print(" | ||
+ | tft.setCursor(10, | ||
+ | tft.setTextSize(0); | ||
+ | tft.print(" | ||
+ | tft.setCursor(10, | ||
+ | tft.print(operatingTime); | ||
+ | |||
+ | delay(1000); | ||
+ | tft.fillScreen(BLACK); | ||
+ | } | ||
+ | |||
+ | |||
+ | // | ||
+ | void loop() { | ||
+ | // Aktuelle Zeit abfragen | ||
+ | unsigned long currentMillis = millis(); | ||
+ | |||
+ | loopCounter++; | ||
+ | |||
+ | |||
+ | // | ||
+ | // Lesen und entprellen des Tasters | ||
+ | button1state = digitalRead(button1Pin); | ||
+ | button2state = digitalRead(button2Pin); | ||
+ | |||
+ | // Wenn der Taster 1 gedrückt ist... | ||
+ | if (button1state == LOW) | ||
+ | { | ||
+ | button1time = millis(); | ||
+ | button1pressed = 1; // speichert, dass Taster gedrückt wurde | ||
+ | } | ||
+ | |||
+ | // Wenn die gewählte entprellZeit vergangen ist und der Taster gedrückt war... | ||
+ | if ((millis() - button1time > debouncetime) && button1pressed == 1) { | ||
+ | button1pressed = 0; // setzt gedrückten Taster zurück | ||
+ | Setpoint = Setpoint + 0.5; | ||
+ | EEPROM.updateDouble(addrTargetTemp, | ||
+ | Serial.print(" | ||
+ | refreshTargettemp = true; | ||
+ | if (Setpoint == 30) { | ||
+ | Setpoint = 30; // setzt die NeoPixel zurück | ||
+ | } | ||
+ | // | ||
+ | } | ||
+ | |||
+ | // Wenn der Taster 2 gedrückt ist... | ||
+ | if (button2state == LOW) | ||
+ | { | ||
+ | button2time = millis(); | ||
+ | button2pressed = 1; // speichert, dass Taster gedrückt wurde | ||
+ | } | ||
+ | |||
+ | // Wenn die gewählte entprellZeit vergangen ist und der Taster gedrückt war... | ||
+ | if ((millis() - button2time > debouncetime) && button2pressed == 1) { | ||
+ | button2pressed = 0; // setzt gedrückten Taster zurück | ||
+ | Setpoint = Setpoint - 0.5; | ||
+ | EEPROM.updateDouble(addrTargetTemp, | ||
+ | Serial.print(" | ||
+ | refreshTargettemp = true; | ||
+ | if (Setpoint == 0) { | ||
+ | Setpoint = 0; // setzt die NeoPixel zurück | ||
+ | } | ||
+ | // | ||
+ | } | ||
+ | |||
+ | |||
+ | // | ||
+ | if ((unsigned long)(currentMillis - previousMillisCalculateTemperatures) >= intervalCalculateTemperatures) { | ||
+ | // Lese die analogen Inputs aus | ||
+ | potiValue = analogRead(potiPin); | ||
+ | thermistorValue = analogRead(thermistorPin); | ||
+ | averageThermistor.addValue(thermistorValue); | ||
+ | |||
+ | // Berechnung der Temperatur | ||
+ | thermistorValue = averageThermistor.getAverage(); | ||
+ | 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; | ||
+ | } | ||
+ | |||
+ | // | ||
+ | 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, | ||
+ | |||
+ | |||
+ | // | ||
+ | // 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 (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) { | ||
+ | operatingTime = operatingTime + 0.25; | ||
+ | lastTime = millis(); | ||
+ | EEPROM.updateFloat(addrOperatingTime, | ||
+ | Serial.print(" | ||
+ | } | ||
+ | |||
+ | |||
+ | // | ||
+ | // 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, | ||
+ | tft.setTextColor(YELLOW, | ||
+ | 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) { | ||
+ | tft.setCursor(15, | ||
+ | tft.setTextColor(RED, | ||
+ | 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); | ||
+ | // | ||
+ | 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; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | |||
+ | // | ||
+ | if ((unsigned long)(currentMillis - previousMillisSerialPrint) >= intervalSerialPrint) { | ||
+ | |||
+ | 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 19020 Bytes (61%) des Programmspeicherplatzes. Das Maximum sind 30720 Bytes. | ||
+ | Globale Variablen verwenden 1054 Bytes (51%) des dynamischen Speichers, 994 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes. | ||
Tags: #Arduino # | Tags: #Arduino # |
arduino/flaschenkuehler/programmversion_0.2.1499528826.txt.gz · Zuletzt geändert: 18.05.2023 12:16 (Externe Bearbeitung)