Projekte

LedMatrix

Noch so ein Projekt was gefühlt schon ewig (zwei Jahre) zurückliegt, aber ich noch keine Zeit gefunden habe darüber zu schreiben. Eigentlich seit ich etwas mit Computer mache, wollte ich mir schon immer eine LED Matrix bauen.

 

Mir macht Löten keinen Spaß, darum hab ich das immer gescheut. Aber mit LED-Stripes ist das nun einfach und sogar relativ günstig. Man braucht eigentlich nur folgendes:

  • LED-Stripes: 16×16=256 (hab WS2812b genommen, sind nur 3-Leiter)
  • Netzteil: In meinem Fall 20A
  • Mikrocontroller: Muss schnell genug sein. Hab nen Tensy genommen
  • Optional Rapsberry Pi: Damit kann ich Ihn vom Netzwerk aus steuern
  • Optional USB-Umschalter: Damit kann ich zwischen Raspberry Pi und Standalone umschalten

Nun hab ich mir eine MDF-Platte hergeschnitten und Fächer aus Kunststoff erstellt. Hier wenn möglich was leichteres nehmen. Die LED-Matrix ist sehr schwer geworden. Hatte noch bisl Holz rumliegen. Das hab ich geflämmt. Milch-Plexiglas hab ich fertig bestellt.

Den Tensy kann man mit Arduino programmieren. In meinem Fall läuft ne Laufschrift durch bis ein Signal von Serial kommt. Hier nutze ich auf dem Pi Glediator. Über Screens kann ich vom iPad aus auch auf den Pi per VNC und das bequem bedienen (oder per Handy was auf einer Party praktisch ist).

#include <FastLED.h>
#include <LEDMatrix.h>
#include <LEDText.h>
#include <Font12x16.h>

#define LED_PIN            4

#define COLOR_ORDER         GRB
#define CHIPSET             WS2812B

// initial matrix layout (to get led strip index by x/y)
#define MATRIX_WIDTH   16
#define MATRIX_HEIGHT  16
#define MATRIX_TYPE    HORIZONTAL_ZIGZAG_MATRIX
#define MATRIX_SIZE    (MATRIX_WIDTH*MATRIX_HEIGHT)
#define NUMPIXELS      MATRIX_SIZE

#define WAITMAX      100000

// create our matrix based on matrix definition
cLEDMatrix<MATRIX_WIDTH, MATRIX_HEIGHT, MATRIX_TYPE> leds;
cLEDText ScrollingMsg;

int waitCount = 0;


const unsigned char TxtDemo[] = { EFFECT_SCROLL_LEFT " Hello World "};

void setup()
{
  Serial.write("Setup...\n");
  

  pinMode(13, OUTPUT);
  digitalWrite(13, HIGH);

  FastLED.addLeds<CHIPSET, LED_PIN, COLOR_ORDER>(leds[0], leds.Size());
  FastLED.setBrightness(255);
  FastLED.clear(true);
  FastLED.show();   
     
  FastLED.showColor(CRGB::Red);  
  delay(500);
  
  FastLED.showColor(CRGB::Green);  
  delay(500);
  
  FastLED.showColor(CRGB::Blue);
  delay(500);

  ScrollingMsg.SetFont(Font12x16Data);
  ScrollingMsg.Init(&leds, leds.Width(), ScrollingMsg.FontHeight(), 0, 0);
  ScrollingMsg.SetText((unsigned char *)TxtDemo, sizeof(TxtDemo) - 1);
  ScrollingMsg.SetTextColrOptions(COLR_RGB | COLR_SINGLE, 0xff, 0x00, 0xff);  
  
}

int serialReadBlocking() {
while (!Serial.available()) {}
    return Serial.read(); 
}

void loop()
{
  if (Serial.available())
  {
    waitCount = 0;
    while (serialReadBlocking() != 1) {} 
    digitalWrite(13, HIGH);
    for (long i=0; i < MATRIX_SIZE; i++) {
      leds(i).r = serialReadBlocking();
      leds(i).g = serialReadBlocking();
      leds(i).b = serialReadBlocking();
    }
    FastLED.show(); 
    digitalWrite(13, LOW);
  }
  else
  {    
    waitCount++;
    if(waitCount > WAITMAX)
    {
      waitCount = WAITMAX; // Fix no overflow
      if (ScrollingMsg.UpdateText() == -1)
      {
        digitalWrite(13, HIGH);      
        ScrollingMsg.SetText((unsigned char *)TxtDemo, sizeof(TxtDemo) - 1);          
      }
      else
      {      
        FastLED.show();      
        digitalWrite(13, LOW);
      }
      delay(50);
    }    
  }  
}

Für die Elektronik hab ich (verzeiht es mir) PE-Brücken genommen und dort immer die Spannungsversorgung der Stripes parallel drauf geschalten. Das Signal vom Tensy muss aber durchgeschleift werden.

Machte echt Spaß und sieht super aus!

Von |2018-07-26T06:00:07+02:002018-07-25|Projekte, Raspberry Pi|

Zuberhütte

Das Projekt ist schon über vier Jahre alt… und ich hab es seit dem auf der Todo-Liste um mal was zu bloggen.
Aus diesem Grund wird der Beitrag auch kurz, da er sonst nie fertig wird.

Wir haben uns in den Bergen in den Zuber verliebt… Für uns einfach der “Pool”.
Ich persönlich bin kein Sauna-Freund, aber so bisl Wellness daheim wäre schon schön.

Darum haben wir uns auf die Suche gemacht. Kriterien waren:

  • Kunststoffwanne: Leichter zu reinigen & dicht
  • Whirlpoolsystem: Wunsch der Frau
  • Tief: Bin ziemlich groß. Bei normaler Höhe würden meine Schulter rausschauen.

Wir sind dann hier fündig geworden. Leider kann ich aber den Hersteller nicht empfehlen. Nach dreimaliger Reparatur war der Zuber undicht und einige Teile einfach mangelhaft. Naja… Selbst ist der Mann und ich habe ihn dann abgedichtet, isoliert und die kaputten Holzteile ausgetauscht.

An dieser Stelle möchte ich jedem empfehlen KEIN Whirlpoolsystem zu kaufen. Ist schwierig das dicht zu halten bzw. dass es nicht auffriert.

Soweit so gut. Nun brauchten wir aber noch eine Überdachung für den Zuber. Mit Pavillon usw. überlegt, aber irgendwann hatten wir die Idee von einem “Gartenhäusschen”. Wir brauchen aber dann eines mit großer überdachten Terrasse, was nicht so einfach ist. Hier sind wir dann fündig geworden. Lustigerweise ist die Ausstellung ca. 20 Minuten von uns daheim entfernt und so konnten wir einiges anschauen. Das Modell was wir uns aussuchten war im Abverkauf und somit vergleichsweise günstig.
Innen sollte ein Kühlschrank und eine Sitzgelegenheit sein. Als Ofen haben wir einen kleinen Elektroofen gekauft der einen schönen Feuerstellen-Effekt hat. Ansonsten soll alles rustikal und eher im Hüttenstil sein. Darum haben wir das Holz auch geflämmt. Was super einfach ist und toll aussieht.

Alles in allem kann ich jedem aber so einen Zuber empfehlen. Macht einfach Spaß draußen zu sitzen. Vor allem wenn es draußen bitter kalt ist :^)

 

Von |2018-07-26T05:55:57+02:002018-07-25|Garten, Projekte|

FritzboxOnAir – Whitelist

Es gibt Nummern (Freunde & Kollegen), da darf man ruhig mal im Büro stören. Aus diesem Grund hab ich meine OnAir-Lampe auf eine farbige aufgerüstet. Ist die Nummer in der Whitelist, LAMP == green, wenn nicht LAMP == red.

Hab auch den Code bisl objektorientierter gestaltet. Python macht mir aber immer noch nicht Spaß…

# Whitelist
converter = Converter() # for color
foundInWhitelist = False
for w in Whitelist:
    if w in str(details):
        foundInWhitelist = True
        break
if foundInWhitelist == True:
    print(Fore.LIGHTBLUE_EX + 'Whitelist: True' + Style.RESET_ALL)
    xy = converter.rgbToCIE1931(0,255,0) # green
else:
    print(Fore.LIGHTBLUE_EX + 'Whitelist: False' + Style.RESET_ALL)
    xy = converter.rgbToCIE1931(255,0,0) # red
def Calling():
    global LAMP
    global xy
    print(Back.GREEN + 'Calling' + Style.RESET_ALL)
    os.system("osascript -e 'set volume output muted true'") # mute system volume
    LAMP.on = True
    LAMP.brightness = 254
    LAMP.transitiontime = 0
    LAMP.xy = xy
Von |2018-03-02T14:12:38+01:002018-03-05|FritzboxOnAir, Projekte|

FritzboxOnAir – Skype

Ich liebe ja mein Setup im Büro… Telefon klingelt, Musik wird leise gestellt. Telefonat beendet, Musik geht wieder an. Vor der Tür geht die Lampe an und jeder weiß ich telefoniere.

Leider aber nicht wenn ich ein Skype-Meeting habe… Das habe ich aber hiermit geändert:

while(True):
    # Skype
    skypeFound = False
    for p in psutil.process_iter():
        if "skype" in p.name().lower():
            skypeFound = True;
            if IsSkypeActive == False:
                print(Fore.LIGHTBLUE_EX + 'Skype open' + Style.RESET_ALL)
                Calling()
                IsSkypeActive = True
    if skypeFound == False:
        if IsSkypeActive == True:
            Sleeping()
            IsSkypeActive = False
            print(Fore.LIGHTBLUE_EX + 'Skype close' + Style.RESET_ALL)

Bisl was noch in den Subroutinen geändert damit wenn jemand währenddessen anruft nicht das Licht ausgeht und die Musik an.

Von |2018-03-02T10:11:19+01:002018-03-02|FritzboxOnAir, Projekte|

Doorbell – Pushover

Ich bin ja damals von Pushover weg, weil das mit den Bildern nicht so geklappt hat.
Mit dem neuen Update funktioniert das aber grandios. Zusätzlich klappt der Push bei Slack nicht immer… liegt aber wohl an Slack.

Nun hab ich das mal ausprobiert und Pushover hat derzeit paar Vorteile:

  • Vorschau in der Push Notification
  • Push funktioniert zuverlässig
  • Größere Übersicht der Fotos

Ich hab das mal wie folgt mit Requests implementiert:

import requests

...

r = requests.post("https://api.pushover.net/1/messages.json", data = {
  "token": "-- API Token --",
  "user": "-- User Key --",
  "message": "Knock Knock Knock"
},
files = {
  "attachment": ("image.jpg", open('/home/pi/Desktop/doorbell/web/photos/' +  filename, "rb"), "image/jpeg")
})
print(r.text)

  

Von |2018-02-26T07:12:49+01:002018-02-26|Doorbell, Projekte|
Nach oben