Alle Beiträge von Sango

Webcam auf Augenhöhe mit IPhone and Android

Letztes gab es von DIY Perks ein nettes Video, dass über die Probleme bei Videokonferenzen und einer Lösung sprach um ungestört Augenkontakt halten zu können.

Diese Lösung, so schön sie ist, sie ist nichts fürs Homeoffice mit einem großen Monitor. Leider haben diese Monitore auch meist keine Kamera. Wir haben recht wenige “echten” Videokonferenzen, mehr Telefonkonferenzen, aber wenn dann eine kommt, wäre es gut, den besten Eindruck zu machen. Also auch den Augenkontakt zu halten.

Folgende Rahmenbedingungen sollen erfüllt werden:

  • Günstig, weitgehend bestehende Hardware verwenden (iPhone/Work, Fairphone/Privat)
  • Muss auch im VPN funktionieren.
  • Möglichst die Kamera nah an die Augen des Gegenübers bringen.

Telefonhalter

Dafür habe ich einen Telefonhalter entworfen, den man 3D Drucken kann. Erhältlich bei Thingiverse. Designed in Fusion 360.

Diese haben den Vorteil, sie halten das Telefon in die Bildfläche hinein, sind leicht zu montieren, bzw. demontieren und können wenn sie nicht gebraucht werden auf die Rückseite gehängt werden.

Gedruckt wurde auf dem kleinen Monoprice Mini Select Pro. Es passen gleich 2 auf einmal aufs Bett und hat ca. 1,5h. Filament ist das wunderschöne DASFILAMENT Blue Pearl.

Smartphones als Webcam

Es gibt einige Apps die es erlauben das Kamerabild per WLAN zu verteilen. Das funktioniert bei mir leider nicht, da wir im VPN sind und lokale IPs nicht erreichen können.

Um das iPhone zu verwenden verwende ich daher iVCam mit USB. Auf dem Computer muss die iVCam Software installierbar sein (Administratorrechte notwendig). Und iTunes muss auch vorhanden sein.

https://cdn.thingiverse.com/assets/45/08/48/d4/63/large_display_IMG_20210118_215238_k.jpg

Je nachdem wie die Kamera eingeschoben wird, ist sie eben näher am Sprecher.  Da auch der Monitor höher ist als der Laptop, schaut man auch gerader in die Kamera, nicht nach unten.

Works…. its something. Have fun.

Einfache Server Status-LED durch ESP-12F Witty Cloud Board

Das Witty Cloud Board ist ein kleines und günstiges ESP-12F Wifi Board. Es kommt, z.B. von hier, für ca. 2,50€ pro Board aus dem China portofrei nach Deutschland. Das Board umfasst nicht nur den ESP-12F, eine RGB LED, einen Lichtempfindlichen Widerstand (LDR), sondern kommt auch mit Programmer Board für USB.

Node
Node in seiner Kaugummibox

Das Board besteht aus zwei Teilen. Unten ist der Programmierer, welcher in der IDE als … ausgewählt wird. Der obere Teil ist der eigentliche ESP. Dieser kann auch Standalone betrieben werden, ebenfalls über USB.

Video hier

Die Anwendung die ich schon ewig umsetzen wollte, doch nie richtig die Zeit fand war eine optische Rückmeldung was auf meiner Seite www.kalenderA4.de passiert. Dort kann man sich kostenlos Kalender im PDF Format herunterladen. Die Seite wird von mir eigentlich nur zum Spaß betrieben, da die Werbung dort bei weitem nicht einmal die Domainkosten deckt. Aber es macht eben Spaß und die Rückmeldungen der User ist bisher auch immer sehr positiv gewesen. Die Idee war daher, ich würde gerne sehen, wenn ein User gerade wieder einen Kalender heruntergeladen hat. Das schenkt mir immer ein kleines Lächeln. Genug der rührseeligen Worte, hier nun der Aufbau.

Zuerst brauchen wir einen Code für den Witty Node: (gefunden und geändert von hier)

/**
 * Webstatus.ino
 *
 *
 */

#include <Arduino.h>

#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>

#include <ESP8266HTTPClient.h>

#define USE_SERIAL Serial

ESP8266WiFiMulti WiFiMulti;

const int BUTTON = 4;
const int RED = 15;    // Pin for red LED
const int GREEN = 12;  // Pin for green LED
const int BLUE = 13;   // Pin for blue LED

void flashColor(int color); // declaration for flasher

void setup() {

    USE_SERIAL.begin(115200);
    USE_SERIAL.setDebugOutput(true);

flashColor(RED);
flashColor(GREEN);
flashColor(BLUE);
    USE_SERIAL.println();
    USE_SERIAL.println();
    USE_SERIAL.println();

    for(uint8_t t = 4; t > 0; t--) {
        USE_SERIAL.printf("[SETUP] WAIT %d...\n", t);
        USE_SERIAL.flush();
        delay(1000);
    }

    WiFiMulti.addAP("SSID", "PASSWORD"); // CHANGE FOR YOUR PLEASURE
    

}
 
void flashColor(int color) // LED should blink slowly... its nicer
{
  for(int i = 0; i <256; i+=25)
  {
    analogWrite(color, i);
    delay(100);
  }
  delay(800);
  for(int i = 0; i <256; i+=25)
  {
    analogWrite(color, 256-i);
    delay(100);
  }
  analogWrite(color, 0);
}

void loop() {
    // wait for WiFi connection
    if((WiFiMulti.run() == WL_CONNECTED)) {
        HTTPClient http;

        USE_SERIAL.print("[HTTP] begin...\n");
        // configure traged server and url
        
        http.begin("YOURDOMAIN.COM/SCRIPT.php?token=YOURTOKEN"); //HTTP

        USE_SERIAL.print("[HTTP] GET...\n");
        // start connection and send HTTP header
        int httpCode = http.GET();

        // httpCode will be negative on error
        if(httpCode > 0) {
            // HTTP header has been send and Server response header has been handled
            USE_SERIAL.printf("[HTTP] GET... code: %d\n", httpCode);

            // file found at server
            if(httpCode == HTTP_CODE_OK) {
                String payload = http.getString();
                USE_SERIAL.println(payload);
                char chars[payload.length()+1];
 
  payload.toCharArray(chars, payload.length()+1);
                for(int i = 0; i < payload.length()+1; i++)
                {
                  char c = chars[i];
                  USE_SERIAL.println(c);
                  if(c=='D') // jeder Download gruen
                    {
                      flashColor(GREEN);
                      delay(1000);
                    } else if(c=='H') // Jeder Visit blau
                    {
                      flashColor(BLUE);
                      delay(1000);
                    }
                }
                flashColor(RED);
                
            }
        } else {
            USE_SERIAL.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str());
        }

        http.end();
    }
    

    delay(5*60*1000); // TODO SLEEP MODE... 
    USE_SERIAL.printf("end loop...");
}

Der Code bringt den Node dazu sich mit dem WLan zu verbinden, erstmal kurz anzuzeigen, dass alles läuft und dann geht er in den ewigen Loop. Dieser ruft eine Webseite auf und erhält dort als Content einfach nur einen String von Buchstaben. Wenn ein solcher String da ist, wird dieser nach und nach abgearbeitet. Am Ende, sofern ein String da war, wird die rote LED kurz angeschaltet, damit man weiß der String ist fertig. Bei H wird die blaue LED kurz angeschaltet, bei D die grüne. Nach 5 Minuten Pause wird der Server erneut angefragt. Das ist bei meinem Besucheraufkommen völlig ausreichend. Wenn Ihr mehr Besucher habt, einfach die Pause kürzer machen, bzw. auch die Dauer des Aufleuchtens verkürzen.

Dann brauchen wir noch das PHP Skript. Dieses ist sehr einfach gestrickt. In meinem Fall holt es Besucher der Webseite und Downloads. Diese sind in einer Datenbank gespeichert, zusammen mit einem Datum wann ich zuletzt abgefragt habe. Das Ergebnis ist dann entweder ein H für Hit und D für Download.

<?php
$token = $_GET["token"];

if($token != "THETOKENYOUSETFORSECURITY") die("YOU SCUM!");

/*
* ADD CODE WHICH GENERATES AN ARRAY OF CHARACTERS...
*/
foreach($result AS $r)
{
 echo $r;
}

Alles in allem sehr simpel. Das Gehäuse, damit die LEDs auch schön zu sehen sind, ist eine leere Kaugummipackung. Sie steht neben dem Fernseher, und wenn sie aufleuchtet, weiß ich, dass meine Seite wieder jemandem geholfen hat. Praktischerweise hat mein TV Receiver eine USB Schnittstelle über die ich den Witty Node betreiben kann.

 

AliExpress und die Packstation

sjwpkmb9u-k-maico-amorim
Maico Amorim – https://unsplash.com/photos/SJWPKMb9u-k

AliExpress ist einer der Online Plattformen um günstig Artikel direkt aus Asien zu sourcen. Der Nachteil ist, die Artikel benötigen meist sehr unterschiedlich lange Zeit um geliefert zu werden. Aber alle haben eins gemeinsam, es ist nie planbar wann sie kommen. Nicht alle sind dauernd zuhause und viele können sich auch nicht dauernd die kleinen Päckchen ins Büro liefern lassen. Gerade bei Kleinstmengen kann dies schon eine beachtliche Anzahl werden.

Daher habe ich ein paar Probebestellungen durchgeführt und an meine Packstation schicken lassen.

Artikel Artikelstandort Bestellt Geliefert Versandmethode
50 Edelstahlkugeln China / China Post 30. Juni 2016
20. Juli 2016 in die Packstation China Post Ordinary Small Packet Plus
 Auto Ladegerät Shzenzhen / China Post  27. Juni 2016  09. August 2016 in die Packstation China Post Ordinary Small Packet Plus
Jumper Caps China 24. Juni 2016 Dispute gestartet

(Ging wohl zurück)

China Post Registered Air Mail
Abstandshalterschrauben China / China Post 30. Juni 2016 26. Juli 2016 in die Packstation Seller’s Shipping Method/Keine weiteren Angaben
12000mAh Solar Powerbank China / China Post 07. Juli 2016 Dispute gestartet

(Ging wohl zurück)

China Post Registered Air Mail
Max7219 Dot Matrix Module China / China Post 30. Juni 2016 Dispute gestartet

(Ging wohl zurück)

China Post Registered Air Mail
Anti Statische Beutel China 07. Juli 2016 Dispute gestartet

(Ging wohl zurück)

China Post Registered Air Mail
 Power SP10T Drehschalter  China / China Post  24. Juni 2016 Buyer Protection extended—

Dispute gestartet (Ging wohl zurück)

Betrag rückerstattet

China Post Registered Air Mail

Die Tabelle wird geupdated sollte sich etwas tun.

Bisher sind von den 8 Bestellungen eine in der Packstation gelandet.

UPDATE: 2 von 8 Bestellungen sind erfolgreich in der Packstation gelandet. Also 25%.

UPDATE: 3 von 8 Bestellungen sind erfolgreich in der Packstation gelandet. Es scheint sich abzuzeichnen, dass Registered Air Mail nicht in Packstationen landet. Ordinary Packets scheinen kein Problem zu sein.

UPDATE: Bei einer Bestellung habe ich die Buyer Protection verlängern lassen. Das ist nicht umbedingt unüblich, muss nicht an der Packstation liegen.

UPDATE: Habe bei 3 Paketen die Dispute Resolution gestartet. Laut Tracking sind diese wohl zurück nach China geschickt worden. Wie befürchtet kommt die Packstation mit Registered Air Mail nicht klar. 2 Registered Pakete sollten noch unterwegs sein, diese haben aber noch bis September “Zeit”.

UPDATE: Alle “Registered” Pakete kamen nie an, wurden zurück geschickt und dementsprechend rückerstattet. 

Zusammenfassung: Wenn ihr an eine Packstation schicken wollt achtet auf “Ordinary Packets Plus” und Finger weg von “Registered” Optionen. Wie es sich mit “Standard Shipping Method” aussieht, bzw. was dahinter steckt, ist leider nicht so richtig klar, darum einfach nur “Ordinary Packets” an die Packstation schicken lassen. Das hab ich nun noch ein paarmal gemacht mit Erfolg.