AZ - Touch Mod Display mit Musik und mehr

Ich hatte bei mir im Bad Oben das Problem das die Luftfeuchtigkeit zu hoch ist nach dem Duschen und ich meine Kids darauch aufmerksam machen wollte. Das sie nach dem Duschen das Fenster aufmachen sollen.
Also habe ich ein ESP32 und einen Feuchtigkeitssensor und einen Buzzer zurecht gebastelt gehabt. Das hat dann auch alles super funktioniert das der Buzzer Star Wars gespielt hat wenn die Luftfeuchtigkeit zu hoch ist.
Die Kids haben auch schön das Fenster dann nach dem Duschen aufgemacht.
Aber das war mir dann auf die dauer etwas zu langweilig , und habe das AZ Touch Mod von AZ Delivery entdeckt.
Jetzt habe ich im Bad oben das Teil.

In dem Displaygehäuse ist ein ESP32 WROOM-32 eine LED und der DF mini mp3 player.
Extern ist ein DHT20 Temperatur und Luftfeuchtigkeitssensor und ein PIR Bewegungsmelder der das Display anschaltet sobald jeamand im Bad ist.

Das ganze Display lässt sich per Touch steuern. Und ich habe insgesammt 5 Seiten die ich aufrufen kann. Und halt die HomePage wo ich die wichtigsten Sensoren Werte mir anzeigen lasse.










Was haltet Ihr davon ?

Materialliste:
1x AZ-Touch MOD Wandgehäuseset mit 2,8 Zoll Touchscreen für ESP8266 und ESP32
1x ESP32 Wroom
1x DFPlayer Mini MP3 player
1x rote led
1x DHT20
1x PIY Bewegungssensor
1x 1x Klinken Buchse 3,5mm Adapter
2x USB-A Buchsen
1x USB-A Stecker zum DHT-20 Sensor
1x Mini Micro JST 2.0 mm 3-Poliger Stecker mit 150mm 22AWG Kabel & Female
2x 2-Pin Connector Plug Male & Female 1x für Stromversorgung und 1x für rote LED

2 „Gefällt mir“

Gut gemacht…. Da werden die Kids eine Freude haben

Sehr schön. Eine Liste mit den verwendeten Komponenten wäre noch cool.

Sieht cool aus, auch wenn das Gehäuse gruselig ist, aber dafür kannst du ja nichts, da hätte sich AZ was moderneres ausdenken können :slight_smile:

Trotz alledem hätte ich ein paar Verbesserungsvorschläge und Fragen

  • Was macht die LED?
  • Sind das HA Dashboards und wie kommen die Dashboards da drauf (Code?)
  • Was macht das USB Kabel rechts?
  • Was macht die Buchse unten rechts

Zu den Verbesserungsvorschlägen:

Danke @der_Micro .

Also die rote LED geht an wenn die Luftfeuchtigkeit im Bad über 95% ist und geht dann auch wieder aus wenn es unter 95% ist.

Jede Seite hat ihren eigenen Code (esphome)


      - id: page1
        lambda: |
         int x, y;
         //-------------------------------- Header Bereich --------------Seite 1---------------------------------------------
         it.fill(Color::BLACK);  // Hintergrund in schwarz
         //it.fill(COLOR_BLACK);
         //background image
         it.image(0, 0, id(background_image));
         // Draw a line from [0,0] to [100,50]
         it.line(120, 0, 125, 15, id(my_grey)); 

         // Print "Bad Oben" in top center.
         it.printf(160, 0, id(font1), TextAlign::TOP_CENTER, "Bad Oben");
         // Draw a line from [0,0] to [100,50]
         it.line(195, 15, 200, 0, id(my_grey));       
      
         // Print time in HH:MM:ss format
         it.strftime(0, 0, id(font1), TextAlign::TOP_LEFT, "%H:%M:%S", id(homeassistant_time).now());

         // Print Datum 
         it.strftime(258, 0, id(font1), TextAlign::TOP_LEFT, "%d:%m:%Y", id(homeassistant_time).now());

         // Print Fenster offen oder geschlossen anzeigen
         if(id(fenster_bad_oben).has_state()) {
           x = 210, y = 0;
           if (id(fenster_bad_oben).state >= 0) {
               it.print(x, y, id(materialdesign_icons_10), id(my_green), TextAlign::TOP_LEFT, "\U000F11DB");
               //ESP_LOGI("Fenster", "Geschlossen");
           } else if (id(fenster_bad_oben).state  <= 1) {
               it.print(x, y, id(materialdesign_icons_10), id(my_blue), TextAlign::TOP_LEFT, "\U000F11DC");
               //ESP_LOGI("Fenster", "Offen");
           }
         }

         // Motion Anzeigen
         if(id(bad_oben_motion_sensor).has_state()) {
           x = 75, y = 0;
           if (id(bad_oben_motion_sensor).state >= 1) {
               it.print(x, y, id(materialdesign_icons_15), id(my_green), TextAlign::TOP_LEFT, "\U000F0D91");
               ESP_LOGI("Motion", "Bewegung erkannt");
           } else if (id(bad_oben_motion_sensor).state  <= 1) {
               it.print(x, y, id(materialdesign_icons_15), id(my_grey), TextAlign::TOP_LEFT, "\U000F1435");
           }
         }

         // Print Fenster offen oder geschlossen anzeigen als Text
         if(id(fenster_bad_oben).has_state()) {
           x = 225, y = 0;
           if (id(fenster_bad_oben).state >= 0) {
               it.print(x, y, id(font1), id(my_green), TextAlign::TOP_LEFT, "zu");
           } else if (id(fenster_bad_oben).state  <= 1) {
               it.print(x, y, id(font1), id(my_blue), TextAlign::TOP_LEFT, "offen");
           }
         }

         // Print Fenster offen oder geschlossen anzeigen
         //if (id(fenster_bad_oben).state) {
         //it.printf( 225,  0, id(font1), id(my_green), TextAlign::TOP_LEFT, "zu");
         //} else {
         //it.printf( 225,  0, id(font1), id(my_blue), TextAlign::TOP_LEFT, "offen");
         //}         

         // Draw a line from [0,0] to [100,50]
         it.line(0, 15, 320, 15, id(my_grey));
         //-------------------------------- Sensoren Bereich ----------Seite 1---------------------------------------------------

         // Print bad oben Luftfeuchtigkeit (vom homeassistant sensor)
         it.print(2, 20, id(materialdesign_icons_15), id(my_light_blue), "\U000F058E");
         it.printf(19, 20, id(font2), TextAlign::TOP_LEFT ,"Luftfeuchtigkeit:    %2.1f% %", id(aht_humid).state);

         // Print bad oben Temperatur (vom homeassistant sensor)
         it.print(2, 35, id(materialdesign_icons_15), id(my_orange), "\U000F050F");     
         it.printf(19, 35, id(font2), TextAlign::TOP_LEFT , "Temperatur Bad:  %2.1f °C", id(aht_temp).state);

   

         // Draw a line from [0,0] to [100,50]
         it.line(0, 55, 320, 55, id(my_grey));   

         // Print aktuelle Außen Temperatur (vom homeassistant sensor)
         it.print(2, 60, id(materialdesign_icons_15), id(my_green), "\U000F18D6"); 
         it.printf(19, 60, id(font2), TextAlign::TOP_LEFT , "Aussen Temperatur: %2.1f °C", id(aussen_temperatur).state);

         // Print aktueller Stromverbrauch (vom homeassistant sensor)
         it.print(2, 75, id(materialdesign_icons_15), id(my_orange), "\U000F0241");     
         it.printf(19, 75, id(font2), TextAlign::TOP_LEFT , "Stromverbrauch: %2.1f W", id(stromverbrauch).state);

         // Print aktuelle Solar Produktion (vom homeassistant sensor)
         it.print(2, 90, id(materialdesign_icons_15), id(my_yellow), "\U000F0A72");     
         it.printf(19, 90, id(font2), TextAlign::TOP_LEFT , "Solar: %2.1f W", id(solar_aktuell).state);
         it.print(2, 105, id(materialdesign_icons_15), id(my_orange), "\U000F1904");           
         it.printf(19, 105, id(font2), TextAlign::TOP_LEFT , "Solar Heute: %2.1f kWh", id(solar_komplett_heute).state);
        
         // Print Abfall Abholung
         it.print(2, 120, id(materialdesign_icons_15), id(my_brown), "\U000F0A7A");  
         it.printf(19, 121, id(font2), "Abfall Abholung");
         it.print(2, 136, id(font3), id(my_light_green), id(abfall_naechster_neu).state.c_str());


      
         // --------------------------------------------Navi-Buttons-----------------------------------------------------------
         // Draw a line über den Navi Buttons
         it.line(0, 163, 320, 163, id(my_grey)); 
         // NAVI Buttons
         //id(touch_homepage).publish_state(false);
           x = 10, y = 165;  
               it.printf(x, y, id(materialdesign_icons_50), id(my_grey), TextAlign::TOP_LEFT, "\U000F0150"); //Navi Button 1 (Clock)

           x = 75, y = 165;
               it.print(x, y, id(materialdesign_icons_50), id(my_grey), TextAlign::TOP_LEFT, "\U000F0128"); //Navi Button 2 (Balken Diagramm)

           x = 140, y = 165;
               it.print(x, y, id(materialdesign_icons_50), id(my_grey), TextAlign::TOP_LEFT, "\U000F0590"); //Navi Button 3 (Wetter Icon)

           x = 205, y = 165;
               it.print(x, y, id(materialdesign_icons_50), id(my_grey), TextAlign::TOP_LEFT, "\U000F0AD4"); //Navi Button 4 (Musik Icon)

           x = 260, y = 165;
               it.print(x, y, id(materialdesign_icons_50), id(my_grey), TextAlign::TOP_LEFT, "\U000F0A19"); //Navi Button ganz rechts (Switch Icon)

         // -- Footer ------------------------------------Seite-1--------------Footer---------------------------------------------
         // Draw a line from unten bei Wlan
         it.line(0, 215, 320, 215, id(my_grey));    

         // Print aktuelle WLAN Stärke
         // WiFi Signal Strength
         if(id(bad_oben_wifi_signal).has_state()) {
          x = 3, y = 220;
           if (id(bad_oben_wifi_signal).state >= -50) {
               it.print(x, y, id(materialdesign_icons_12), id(my_green), TextAlign::TOP_LEFT, "\U000F0928");
               //ESP_LOGI("WiFi", "Ausgezeichnet");
           } else if (id(bad_oben_wifi_signal).state  >= -60) {
               it.print(x, y, id(materialdesign_icons_12), id(my_light_green), TextAlign::TOP_LEFT, "\U000F0925");
               //ESP_LOGI("WiFi", "Gut");
           } else if (id(bad_oben_wifi_signal).state  >= -67) {
               it.print(x, y, id(materialdesign_icons_12),  id(my_yellow), TextAlign::TOP_LEFT, "\U000F0922");
               //ESP_LOGI("WiFi", "Mittel");
           } else if (id(bad_oben_wifi_signal).state  >= -70) {
               it.print(x, y, id(materialdesign_icons_12),  id(my_orange), TextAlign::TOP_LEFT, "\U000F091F");
               //ESP_LOGI("WiFi", "Schwach");
           } else {
               it.print(x, y, id(materialdesign_icons_12),  id(my_red), TextAlign::TOP_LEFT, "\U000F092B");
               //ESP_LOGI("WiFi", "Schlecht");
           }
         }

         //it.image(2, 220, id(wlan_icon), id(my_light_grey));  
         //it.printf(20, 220, id(font1), TextAlign::TOP_LEFT , "Wlansignal: %2.1f db", id(bad_oben_wifi_signal).state);
         it.printf(20, 220, id(font1), TextAlign::TOP_LEFT , "Wlan: %2.1f% %", id(bad_oben_wifi_signal_percent).state);
         //IP Adress
         if (id(ip_address).has_state()) {
         it.printf(110, 220, id(font1), TextAlign::TOP_LEFT, "IP: %s", id(ip_address).state.c_str());
         }
         // ESP Home UpTime
         if (id(uptime_human).has_state()) {
             it.printf(224, 220, id(font1), TextAlign::TOP_LEFT, "UP: %s", id(uptime_human).state.c_str());
         }

Damit schließe ich meinen Luftsensor/Temperatursensor (DHT-20) an
daneben ist eine Buchse für den Bewegungsmelder (Der Das Display anschaltet sobald jemand in reichweite ist)

Da kommt der USB Stick rein für mp3ś

Ja vielleicht bei meinem nächsten Projeckt :slight_smile:

Wow, ist ja doch ne Menge Code, ich liebäugel ja auch mit solchen Displays, aber auf solche Codeblöcke hab ich nicht so wirklich Lust, das mach ich den ganzen Tag schon beruflich (aber in Powershell) :laughing:

Ja, die meisten meiner Projekte mach ich auch 2mal :wink:

Das war nur ein Bruchteil vom Code.
Der ganze Code hat 2503 Zeilen.

Hallo Lice,
Schönes Projekt!
Ich habe auch mehrere von den Teilen im Einsatz und zeige Temperaturen, PV-Anlage, usw. an.
Was ich noch nicht hin bekommen habe sind die Touchbuttons.
Den Code für die Anzeige hast Du ja oben schon gekostet.
Kannst Du bitte auch mal schreiben wie die Auswertung geht?
Danke!

Hallo @haemmerl
ich habe als hilfestellung diesen Code mit eingebaut.

touchscreen:
  platform: xpt2046
  id: my_touchscreen
  cs_pin: GPIO14 
  #update_interval: 50ms
  #report_interval: 1s
  threshold: 400  
  on_touch:
    then:
    - light.turn_on: back_light
    - lambda: |- 
          ESP_LOGI("cal", "x=%d, y=%d, x_raw=%d, y_raw=%0d",
              touch.x,
              touch.y,
              touch.x_raw,
              touch.y_raw
              );
 

Der Zeigt dann an wo gerade gedrückt wird , das ist sehr hilfreich.

Den Touch Bereich habe ich als Binären Sensor gemacht.
binary_sensor:
    #-------------------Navi--------Buttons----auf-HomePage-----------------------------------------------------

  - platform: touchscreen
    id: page2_touch
    page_id: page1                  #Von Page1 zu Page2
    x_min: 210
    x_max: 270
    y_min: 30
    y_max: 70
    internal: True
    filters:
      - delayed_on_off: .1s
    on_press:
      then:
        - display.page.show: page2


  - platform: touchscreen
    id: graph_stats_touch
    page_id: page1                  #Von Page1 zu Graph-Stats-Page
    x_min: 210
    x_max: 270
    y_min: 80
    y_max: 120
    internal: True 
    filters:
      - delayed_on_off: .1s
    on_press:
      then:
        - display.page.show: page_graph_stats   #graph-stats

  - platform: touchscreen
    id: wetter_page_touch
    page_id: page1                  #Von Page1 zu Wetter-Page
    x_min: 210
    x_max: 270
    y_min: 130
    y_max: 160
    internal: True 
    filters:
      - delayed_on_off: .1s
    on_press:
      then:
        - display.page.show: wetter_page   #wetter

  - platform: touchscreen
    id: music_page_touch
    page_id: page1                  #Von Page1 zu musik Page
    x_min: 210
    x_max: 270
    y_min: 161
    y_max: 189
    internal: True 
    filters:
      - delayed_on_off: .1s
    on_press:
      then:
        - display.page.show: music_page   #musik

  - platform: touchscreen
    id: switch_page_touch
    page_id: page1                  #Von Page1 zu Switch-Page
    x_min: 210
    x_max: 270
    y_min: 190
    y_max: 240
    internal: True 
    filters:
      - delayed_on_off: .1s
    on_press:
      then:
        - display.page.show: switch_page   #page2 = Seite 2

Damit wird dann der Bereich wo die Unteren Navigations Button sind definiert.
Das Schwierige daran , finde ich die genauen Werte für den Bereich zu bestimmen.
Also x_min bis x_max und y_min und y_max.
Man muss sich halt so ein Unsichtbares Rechteck auf dem Display vorstellen was man damit definiert. Wo dann der Touch bereich ist.
Ich habe da auch eine gefühlte Ewigkeit für gebraucht. Aber jetzt funktioniert alles.

Danke, das hilft mir bestimmt. Werde ich bei Gelegenheit mal testen.