Hallo!
Wie man unschwer gleich merken wird, bin ich neu hier und generell beim Arduino programmieren.
Ich benötige das für ein Ausbildungsprojekt und befasse mich erst seit sehr kurzer Zeit damit und beziehe fast alles aus Videos und Programmen und kopiere mir das so raus und in meines hinein, dass es irgendwie läuft (auch wenn das dem einen oder anderen jetzt sicher die letzten Haare rauben wird) ^^
Kurz und knapp:
Ich möchte mir auf einem u8g2 Display Werte anzeigen lassen mit Grafik, während nur die Werte gelöscht werden sollen SOFERN sich diese ändern...
Meine Wunschfunktion sieht wie folgt aus (sofern das überhaupt richtig ist):
if ("Temperatur_Innen" ODER "Temperatur_Aussen" ODER "Sollwert" ungleich "letztem Zyklus") {
u8g2.drawBox(box_area_x_pos, box_area_y_pos, box_area_width, box_area_height);
}
die box_area Koordinaten habe ich bereits natürlich oben hinterlegt bei den Definitionen, die hab ich also bereits getroffen...
Ich poste euch hier mal meinen Code den ich bis jetzt zusammengebracht habe (steinigt mich nicht ^^)
#include <U8g2lib.h> //Datenbank für Grafikdisplay KS0108 128x64 Pixel
#include <DS18B20.h> //DS18B20 Temperatursensor Bibliothek laden
#include <OneWire.h> //Bibliothek für 1-Kabel Sensoren
#include <DallasTemperature.h>
void isrUpbutton();
void isrDownbutton();
DS18B20 tempSensorin(16); //4,7k Ohm Pullup Widerstand zwischen Plusleitung (Rot) + Datenleitung (Gelb)
DS18B20 tempSensorout(17); //4,7k Ohm Pullup Widerstand zwischen Plusleitung (Rot) + Datenleitung (Gelb)
char temperature_inside[5]; //Benennung der String-Variable für Innentemperatur
char temperature_outside[5]; //Benennung der String-Variable für Außentemperatur
char Setvariable_str[5]; //Benennung der String-Variable für Setvariable
const char DEGREE_SYMBOL[] = { 0xB0, '\0' }; //Grad Symbol "°" (in Kombination mit unten angeführtem Schriftstil)
int Setvariable = 20;
#define Upbutton 2 //Upbutton angeschlossen Pin 2
#define Downbutton 3 //Downbutton angeschlossen Pin 3
#define relayPin 12 //Relais angeschlossen Pin 12
double counter1 = 0;
U8G2_ST7920_128X64_F_SW_SPI u8g2(U8G2_R0, 13, 11, 10); //Displayinterface, angeschlossen an Pin 13, 11, 10; Pinaufgaben: clock=13, data=11, CS=10
static const unsigned char image_paint_0_bits[] U8X8_PROGMEM = { 0x49, 0x2a, 0x1c, 0x7f, 0x1c, 0x2a, 0x49 }; //Sternsymbole Kopfzeile
//+ und - Symbole neben Sollwert Fußzeile
static const unsigned char image_paint_1_bits[] U8X8_PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08 };
//Schneeflockensymbol Groß
static const unsigned char image_paint_2_bits[] U8X8_PROGMEM = { 0x00, 0xaa, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x48, 0x10, 0x24, 0x00, 0x50, 0x10, 0x14, 0x00, 0x20, 0x11, 0x09, 0x00, 0x58, 0x11, 0x35, 0x00, 0x80, 0x28, 0x02, 0x00, 0x60, 0x45, 0x0d, 0x00, 0x01, 0x82, 0x00, 0x01, 0x02, 0x01, 0x81, 0x00, 0x85, 0x00, 0x42, 0x01, 0x7a, 0x00, 0xbc, 0x00, 0x85, 0x00, 0x42, 0x01, 0x02, 0x01, 0x81, 0x00, 0x01, 0x82, 0x00, 0x01, 0x60, 0x45, 0x0d, 0x00, 0x80, 0x28, 0x02, 0x00, 0x58, 0x11, 0x35, 0x00, 0x20, 0x11, 0x09, 0x00, 0x50, 0x10, 0x14, 0x00, 0x48, 0x10, 0x24, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0xaa, 0x00, 0x00 };
void setup() {
Serial.begin(9600); //Beginn Serielle Verbindung 9600 Baud
u8g2.begin(); //Display Start
pinMode(relayPin, OUTPUT); //Relaispin als Ausgang gesetzt
digitalWrite(relayPin, HIGH);
pinMode(Upbutton, INPUT_PULLUP); //Upbutton als Eingang definiert und mit einem Software Pullup-Widerstand gesetzt
attachInterrupt(digitalPinToInterrupt(Upbutton), isrUpbutton, FALLING); //Buttoninterrupt eingefügt damit der Button zu jeder Zeit
//im Loop gedrückt werden kann
pinMode(Downbutton, INPUT_PULLUP); //Downbutton als Eingang definiert und mit einem Software Pullup-Widerstand gesetzt
attachInterrupt(digitalPinToInterrupt(Downbutton), isrDownbutton, FALLING); //Buttoninterrupt eingefügt damit der Button zu jeder Zeit
//im Loop gedrückt werden kann
//Einmaliges Schreiben des Grafikhintergrundes beim Start des Arduino
u8g2.clearBuffer(); //Interner Displayspeicher löschen
u8g2.setFontMode(1);
u8g2.setBitmapMode(1);
u8g2.setFont(u8g2_font_profont11_tr); //Schriftart einstellen für Display
u8g2.drawStr(22, 8, "Cooling Box 42"); //Überschrift
u8g2.drawLine(0, 11, 127, 11); //Unterstrich unter "Cooling Box 42"
u8g2.drawXBMP(118, 1, 7, 7, image_paint_0_bits); //Sternsymbol links
u8g2.drawXBMP(3, 1, 7, 7, image_paint_0_bits); //Sternsymbol rechts
u8g2.drawStr(44, 23, "Inside"); //Geschriebenes Wort in Zeile
u8g2.drawStr(44, 34, "Outside"); //Geschriebenes Wort in Zeile
u8g2.drawStr(44, 45, "Soll"); //Geschriebenes Wort in Zeile
u8g2.drawStr(41, 60, "Sollwert"); //Geschriebenes Wort in Zeile
u8g2.drawEllipse(19, 56, 6, 6); //Kreisumrandung für - Symbol
u8g2.drawEllipse(108, 56, 6, 6); //Kreisumrandung für + Symbol
u8g2.drawXBMP(17, 54, 94, 5, image_paint_1_bits); //+ und - Symbol
u8g2.drawXBMP(95, 18, 25, 25, image_paint_2_bits); //Schneeflockensymbol
u8g2.drawStr(32, 23, "C"); //"C" Symbol in Zeile 1
u8g2.drawStr(32, 34, "C"); //"C" Symbol in Zeile 2
u8g2.drawStr(32, 45, "C"); //"C" Symbol in Zeile 3
u8g2.setFont(u8g2_font_helvR12_tf); //Schriftart ändern für "°" Symbol
u8g2.drawStr(25, 25, DEGREE_SYMBOL); //"°" Symbol in Zeile 1
u8g2.drawStr(25, 36, DEGREE_SYMBOL); //"°" Symbol in Zeile 2
u8g2.drawStr(25, 47, DEGREE_SYMBOL); //"°" Symbol in Zeile 3
u8g2.sendBuffer(); //oben geschriebenes an Displayspeicher schicken und somit anzeigen lassen
}
void loop() {
Serial.print("Temperatur innen: "); //Im seriellen Monitor den Text und
Serial.print(tempSensorin.getTempC()); //die Dazugehörigen Werte anzeigen
Serial.println(" °C"); //}
//Serial.print("Temperatur außen: "); //Im seriellen Monitor den Text und
//Serial.print(tempSensorout.getTempC()); //die Dazugehörigen Werte anzeigen
//Serial.println(" °C");//}
Serial.print("Sollwert: "); //Im seriellen Monitor den Text und
Serial.print(Setvariable); //die Dazugehörigen Werte anzeigen
Serial.println();
if (counter1 >= 2) { //Wenn Zähler eingestellten Wert erreicht oder überschreitet wird darunter stehende Aktion ausgeführt
float ti = tempSensorin.getTempC();
dtostrf(ti, 2, 1, temperature_inside); //Umwandlung Innentemperatur in String
if (ti < Setvariable) { //Innentemperatur wird mit Sollwert verglichen und sofern dieser größer ist
digitalWrite(relayPin, LOW); //wird Relaispin ausgeschalten
}
if (ti > Setvariable) { //Innentemperatur wird mit Sollwert verglichen und sofern dieser größer ist
digitalWrite(relayPin, HIGH); //wird Relaispin eingeschalten
}
float to = tempSensorout.getTempC();
dtostrf(to, 2, 1, temperature_outside); //Umwandlung Außentemperatur in String
float st = Setvariable;
dtostrf(st, 2, 1, Setvariable_str); //Umwandlung Sollwert in String
u8g2.setFont(u8g2_font_profont11_tr);
u8g2.drawStr(0, 23, temperature_inside); //Temperaturwert in Zeile 1
u8g2.drawStr(0, 34, temperature_outside); //Temperaturwert in Zeile 2
u8g2.drawStr(0, 45, Setvariable_str); //Sollwert in Zeile 3
u8g2.sendBuffer(); //oben geschriebenes an Displayspeicher schicken und somit anzeigen lassen
counter1 = 0;
}
counter1++;
}
void isrUpbutton() { //Buttoninterrupt Upbutton
if (digitalRead(Upbutton) == 0) Setvariable = Setvariable + 1; //Wenn gedrückt, wird der Sollwert +1 angehoben
//for(int i=0; i<40; i++) { // delay 40x500uSek=20mSek //Taster entprellung (so kurz wie möglich das keine doppel Werte übernommen werden)
//delayMicroseconds(500);
}
void isrDownbutton() { //Buttoninterrupt Upbutton
if (digitalRead(Downbutton) == 0) Setvariable = Setvariable - 1; //Wenn gedrückt, wird der Sollwert -1 angehoben
//for(int i=0; i<40; i++) { // delay 40x500uSek=20mSek //Taster entprellung (so kurz wie möglich das keine doppel Werte übernommen werden)
//delayMicroseconds(500);
}
Ich nehme auch gerne Verbesserungsvorschläge an
Hoffe mir kann hier einer weiterhelfen, da mir eigentl. nur mehr dieser Teil fehlt, der Rest läuft bereits
Danke im Voraus!