Cloudya Montage Anleitung

Diese Anleitung beschreibt den Aufbau der Internetuhr "Cloudya". Sie beinhaltet die Internetzeit, Sommer/Winterzeitumstellung, Weckfunktion, eine RGB-LED Cloud, einen WLAN-Manager und einen WEB-Server. Die Zeit- und Datumsanzeige erfolgt über ein 4-Digit TM1637 Display und ein OLED-Display. Die RGB-LED Cloud ist über den WEB-Server steuerbar, ebenso die Weckzeit, die Helligkeit des Displays und der RGB-LEDs.

Für die Einstellung der WLAN-Daten steht ein WLAN-Manager zur Verfügung. Nachdem in den Netzwerkeinstellungen des Handys/Tablet die "Cloudya" ausgewählt wurde, kann über die IP-Adresse 192.168.4.1 der WLAN-Manger gestartet und die WLAN-Zugangsdaten eingetragen werden. Sind die WLAN-Zugangsdaten korrekt, startet Cloudya automatisch. Über die angezeigte IP-Adresse im OLED-Display ist der WEB-Server aufrufbar. Die Einstellungen sind jetzt über den WEB-Server möglich.

cloudya.png
Die Internetuhr Cloudya

Hardware

Die Stückliste für Cloudya

Aufbau und Montage

Der Aufbau und die Montage von Cloudya ist in mehrere Schritte unterteilt.

Schritt 1: Die Cloud-Vorlage mit Inkscape erstellen

Die Cloud-Vorlage für den Lasercutter besteht aus:

wolke01.png

Die fertige Wolke besteht aus 5 Einzelteile (4mm Sperrholz) und 2 Wolkenfolien:

wolke02.png

Erstelle die Wolkenteile:
Zeichne mit den Abmessungen 140x85mm die Kreise der Wolke und unten ein Rechteck.

wolke03.png

Markiere alles und bilde die Vereinigung. Pfad, Vereinigung (Strg++).

wolke04.png

Dupliziere die Wolke 6x (Strg+D) und lege 2 Wolken deckungsgleich übereinander. Wähle eine Wolke aus und bilde den dynamischen Versatz. Pfad – Dynamischer Versatz (Strg+J). 2 Kopien bilden die Vorlage für die Wolkenfolie.

wolke05.png

Markiere alles und bilde die Differenz – Pfad-Differenz (Strg+-). Dupliziere die Wolke 2x (Strg+D).

wolke06.png

Erstelle die Innenteile. Arbeite mit einer Kopie der letzten Wolke weiter und bilde mit den dynamischen Versatz einen dünnerern Rahmen. Markiere alles und bilde die Differenz – Pfad-Differenz (Strg+-).

wolke09.png

Zeichne ein Rechteck mit den Maßen 70x21mm und lege es unten auf die innere Wolke. Verbinde den schmalen Rahmen mit dem Rechteck– Pfad Vereinigung (Strg++)

wolke10.png

Zeichen ein Rechteck mit 15mm Breite, lege es mittig in die Wolke und bilde die Differenz (Strg+-)

wolke11.png

Kopiere die Wolke 3x

wolke12.png

Jetzt sind alle Einzelteile fertig gezeichnet. Fertige von allen Zeichnungen eine Kopie und lege sie zur Kontrolle übereinander. Die Konturen der Wolken müssen deckungsgleich sein.

wolke13.png

Die Wolken-Elemente liegen jetzt übereinander

wolke14.png

Jetzt sind alle Wolkenteile als Vorlage für den Lasercutter erstellt

wolke01.png

Schritt 2: 3D-Druck, sieben Abstandshalter drucken

Die Abstandshalter tragen den ESP32, das 4-Digit-Display und das OLED-Display. Sie werden auf den ESP32, auf das 4-Digit-Display und auf das OLED-Display geklebt.

Erstelle die Abstandshalter mit Tinkercad.

Der Abstandshalter für das OLED-Display hat die Maße 44x34x2mm
Der 1. Durchbruch hat das Maß 36x24x2 und der 2. Durchbruch hat das Maß 2x17x50

oled-spacer01.png

oled-spacer02.png

oled-spacer03.png

oled-spacer04.png

oled-spacer05.png

Die beiden Abstandshalter für das 4-Digit-Display haben die Maße 4x4x40mm

oled-spacer06.png

Die vier Abstandshalter für den ESP32 haben die Maße D=5x5mm

oled-spacer07.png

Erstelle den DHT11-Halter mit den Maßen 24x8x20,5mm und einer Aussparung mit den Maßen 13x7x18,5mm

dht11-halter.png

Schritt 3: Lötarbeiten


Das ESP32-Shield:

esp32shield.png

Verdrahtung des DHT11:
c_dht11_0.png

Lötstellen am DHT11:

c_dht11.png

Löte den Widerstand auf das Shield und biege eine Öse für die Kabelverbindung
r_oese.png

DHT11 Pullup-Widerstand auf dem Shield:

c_dht11_2.png

Lötstellen am WS2812B LED Strip (NeoPixel):

c_rgb.jpg

Lötstellen am 4-Digit LED Display:

c_4digit.png

Library: fastled-master.zip
Library: tm1637-master.zip

Programm für den Funktionstest

/************************************************************************************************* 
                                      PROGRAMMINFO
************************************************************************************************** 
Funktion: Testprogramm für CLOUDYA      NEO-Pixel-Ring - OLED - Buzzer - TM1637
**************************************************************************************************
Version: 05.12.2022
**************************************************************************************************
Board: ES32 UNO ioT
**************************************************************************************************
C++ Arduino IDE V1.8.19
**************************************************************************************************
Einstellungen:
https://dl.espressif.com/dl/package_esp32_index.json
http://dan.drown.org/stm32duino/package_STM32duino_index.json
https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_dev_index.json
**************************************************************************************************
Librarys:
Adafruit_NeoPixel.h V 1.7.0
fastled-master
tm1637-master
**************************************************************************************************

 **************************************************************************************************/

 
 //----------TM1637------------------------------
#include <TM1637Display.h>
#define CLK 18
#define DIO 5
TM1637Display display = TM1637Display(CLK, DIO);
const uint8_t test1[] = {
  SEG_A | SEG_B | SEG_C | SEG_D |  SEG_G ,    // 3
  SEG_A | SEG_B | SEG_C | SEG_D |  SEG_G ,    // 3  
  SEG_A | SEG_B | SEG_C | SEG_D |  SEG_G ,    // 3   
  SEG_A | SEG_B | SEG_C | SEG_D |  SEG_G ,    // 3    
};

//----------------------------------------------------------

 
//-----OLED-----------------------
#include <Arduino.h>
#include <U8g2lib.h>
//----------------------------

//------------NEOPIXEL ----------------------------------------------
  #include <Adafruit_NeoPixel.h>
  #ifdef __AVR__
    #include <avr/power.h>
  #endif
  
  #define NUMPIXELS 20
  #define PIN 14
  
  Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
//----------------------------------------------------------


// -----Buzzer----------------------------------
#define BUZ 4
int freq = 2000;
int channel = 0;
int resolution = 8;
//------------------------------------------------

//---------OLED-------------------------------------------------
#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif

U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
unsigned long delayTime;


  int BildschirmBreite = u8g2.getDisplayWidth();
  int BildschirmHoehe = u8g2.getDisplayHeight();

//---------Smiley-------------------------------------------------
#define smiley_width 64
#define smiley_height 64
  static unsigned char smiley[] = {
    0x00, 0x00, 0x00, 0xd0, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff,
    0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, 0x07, 0x00, 0x00,
    0x00, 0x00, 0xfc, 0x5f, 0xfd, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00,
    0x80, 0x7f, 0x00, 0x00, 0x00, 0x80, 0x1f, 0x00, 0x00, 0xfc, 0x01, 0x00,
    0x00, 0xe0, 0x07, 0x00, 0x00, 0xe0, 0x07, 0x00, 0x00, 0xf0, 0x01, 0x00,
    0x00, 0xc0, 0x0f, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00,
    0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x1e, 0x00, 0x00,
    0x00, 0x00, 0x7c, 0x00, 0x00, 0x1f, 0x00, 0x03, 0x80, 0x01, 0xf8, 0x00,
    0x80, 0x07, 0x80, 0x03, 0xc0, 0x03, 0xf0, 0x00, 0xc0, 0x07, 0x80, 0x07,
    0xc0, 0x03, 0xe0, 0x01, 0xc0, 0x03, 0xc0, 0x07, 0xc0, 0x07, 0xc0, 0x03,
    0xe0, 0x01, 0xc0, 0x07, 0xe0, 0x07, 0x80, 0x07, 0xe0, 0x00, 0xc0, 0x0f,
    0xe0, 0x07, 0x80, 0x07, 0xf0, 0x00, 0xc0, 0x0f, 0xe0, 0x07, 0x00, 0x0f,
    0x70, 0x00, 0xc0, 0x0f, 0xe0, 0x07, 0x00, 0x0e, 0x78, 0x00, 0xc0, 0x0f,
    0xe0, 0x07, 0x00, 0x1e, 0x38, 0x00, 0xe0, 0x0f, 0xe0, 0x07, 0x00, 0x1e,
    0x3c, 0x00, 0xc0, 0x0f, 0xe0, 0x07, 0x00, 0x1c, 0x1c, 0x00, 0xc0, 0x07,
    0xe0, 0x07, 0x00, 0x3c, 0x1c, 0x00, 0xc0, 0x07, 0xe0, 0x07, 0x00, 0x38,
    0x1c, 0x00, 0xc0, 0x07, 0xc0, 0x03, 0x00, 0x38, 0x1e, 0x00, 0x80, 0x07,
    0xc0, 0x03, 0x00, 0x38, 0x1e, 0x00, 0x80, 0x03, 0x80, 0x01, 0x00, 0x38,
    0x0e, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x78, 0x0e, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x38, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78,
    0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x78, 0x0e, 0x7c, 0x00, 0x00,
    0x00, 0x00, 0x3e, 0x70, 0x0e, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x18, 0x38,
    0x1e, 0x10, 0x00, 0x00, 0x00, 0x00, 0x18, 0x78, 0x1e, 0x30, 0x00, 0x00,
    0x00, 0x00, 0x08, 0x38, 0x1e, 0x30, 0x00, 0x00, 0x00, 0x00, 0x08, 0x38,
    0x1c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x38, 0x1c, 0x20, 0x00, 0x00,
    0x00, 0x00, 0x04, 0x38, 0x1c, 0x60, 0x00, 0x00, 0x00, 0x00, 0x06, 0x3c,
    0x3c, 0x40, 0x00, 0x00, 0x00, 0x00, 0x06, 0x1c, 0x38, 0xc0, 0x00, 0x00,
    0x00, 0x00, 0x03, 0x1c, 0x78, 0x80, 0x01, 0x00, 0x00, 0x00, 0x01, 0x1e,
    0x78, 0x00, 0x01, 0x00, 0x00, 0x80, 0x01, 0x0e, 0xf0, 0x00, 0x07, 0x00,
    0x00, 0xc0, 0x00, 0x0f, 0xf0, 0x00, 0x04, 0x00, 0x00, 0x60, 0x00, 0x07,
    0xe0, 0x01, 0x1c, 0x00, 0x00, 0x38, 0x80, 0x07, 0xc0, 0x03, 0x70, 0x00,
    0x00, 0x0c, 0xc0, 0x03, 0xc0, 0x03, 0xc0, 0x01, 0x00, 0x07, 0xe0, 0x03,
    0x80, 0x07, 0x80, 0x17, 0xf0, 0x01, 0xe0, 0x01, 0x00, 0x0f, 0x00, 0xfc,
    0x3f, 0x00, 0xf0, 0x00, 0x00, 0x1f, 0x00, 0x40, 0x01, 0x00, 0x78, 0x00,
    0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0xfc, 0x00, 0x00,
    0x00, 0x00, 0x1f, 0x00, 0x00, 0xf8, 0x01, 0x00, 0x00, 0x80, 0x0f, 0x00,
    0x00, 0xe0, 0x07, 0x00, 0x00, 0xe0, 0x07, 0x00, 0x00, 0xc0, 0x1f, 0x00,
    0x00, 0xf8, 0x03, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00,
    0x00, 0x00, 0xfe, 0x2f, 0xf4, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff,
    0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x03, 0x00, 0x00,
    0x00, 0x00, 0x00, 0xfa, 0x5f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
  };
//---------------------------------------------
  
void setup() {
  
//-------Buzzer--------------
  ledcSetup(channel, freq, resolution);
  ledcAttachPin(BUZ, channel);
//---------------------------------

//---NEOPIXEL-------------------------------------------
  strip.begin();
  strip.setBrightness(50);

//-----OLED----------------------------------------
  u8g2.begin();
  u8g2.setFont(u8g2_font_courR10_tf);
  u8g2.firstPage();

  do {
    u8g2.clearBuffer();
    u8g2.drawXBM(32, 1, smiley_width, smiley_height, smiley);
  } while ( u8g2.nextPage() );
  delay(1000);
//-----------------------------------------------


//----------Buzzer-------------------------------------
    ledcWrite(channel, 150);
    ledcWriteTone(channel, 4000);
    delay(200);
    ledcWriteTone(channel, 0);
    delay(200);
    ledcWriteTone(channel, 4000);
    delay(200);
    ledcWriteTone(channel, 0);
    delay(10);
//------------------------------------------------------

//--------NEOPIXEL------------------------------
  colorWipe(strip.Color(255, 0, 0), 50); // Rot
  colorWipe(strip.Color(0, 255, 0), 50); // Gruen
  colorWipe(strip.Color(0, 0, 255), 50); // Blau
//-----------------------------------------------

}

void loop() {
// -------- TM1637-------------
  display.setBrightness(1);

 for (int i=0; i <= 9999; i++){
     display.showNumberDec(i, true);  // i=value, true to padd the blank segments with 0
     delay(25);
  };
 //--------------------------------
}

void colorWipe(uint32_t c, uint8_t wait) {
  for(uint16_t i=0; i<strip.numPixels(); i++) {
    strip.setPixelColor(i, c);
    strip.show();
    delay(wait);
      }
}

Schritt 4: Lasercutter, die Cloud

wolke01.png

Schritt 5: Mit Boxes.Py und Inkscape das Gehäuse erstellen

basebox.png

claudya_front.png


Schritt 6: Inbetriebnahme

webserver.png

Fertig!


Version #2
Erstellt: 31 März 2025 16:10:59 von Joel Hatsch
Zuletzt aktualisiert: 31 März 2025 21:36:14 von Joel Hatsch