rokito konfischild

konfischild

bei uns in der agentur gibt es zwei konferenzräume (konfis). an der türe hing bis jetzt immer ein schild was man rumdrehen konnte, wie so ein türhänger. wie langweilig 😃 ich baue ein digitales konfischild. die idee hatte ich von einem adafruit tutorial, das fand ich richtig praktisch und wollte für uns auch eins haben.

material

vorbereitung

konfischild

zuerst hatte ich die LED matrix getestet. anstecken, adafruit library einbinden und los gehts mit den in der library mitgelieferten beispielsketches. dabei hatte ich mich an den adafruit tutorials orientiert. damit wird auch gleich ein lauftext auf der matrix abgespielt und allerhand witziges zeug eingeblendet. ideal um damit erstmal ein wenig rumzuprobieren. meine kurzversion des testcodes anbei.

#include <Wire.h>
#include "Adafruit_LEDBackpack.h"
#include "Adafruit_GFX.h"

Adafruit_8x8matrix matrix = Adafruit_8x8matrix();

void setup() {
  Serial.begin(9600);
  Serial.println("8x8 LED Matrix Test");

  matrix.begin(0x70);  // pass in the address
}

static const uint8_t PROGMEM
  smile_bmp[] =
  { B00111100,
    B01000010,
    B10100101,
    B10000001,
    B10100101,
    B10011001,
    B01000010,
    B00111100 },
    tri_left[] =
  { B11111111,
    B01111111,
    B00111111,
    B00011111,
    B00001111,
    B00000111,
    B00000011,
    B00000001 };

void loop() {
  matrix.clear();
  matrix.drawBitmap(0, 0, smile_bmp, 8, 8, LED_ON);
  matrix.setBrightness(5);
  matrix.writeDisplay();
}

danach blieb voerst nur noch der bewegungsmelder zu testen. der gibt mir normalerweise ein nullsignal zurück, wenn er eine bewgung erwischt steigt der wert merklich an. aber im grunde kann man sich das auch als an/aus abstrahieren. ich hatte beim bestellen glück und hatte zufälligerweise melder bestellt, beidenen man empfindlichkeit und gleichzeitig auch die pufferdauer noch einstellen kann, dazu hat der melder auf der rückseite zwei stellschrauben. sehr praktisch 👍 die pufferzeit kann ich damit direkt am melder fein einstellen und muss dafür dann nicht den code anpassen. der testcode anbei.

//set pins
int proxPin = 0;
int ledPin = 13;
int level = 300;

void setup(){

  pinMode(ledPin, OUTPUT); //led
  digitalWrite(ledPin, LOW);
  Serial.begin(9600);

}

void loop(){

  delay(100);
  int readProx = analogRead(proxPin);

  if(readProx > level){
    digitalWrite(ledPin, HIGH);
    Serial.println('#');
  }else{
    digitalWrite(ledPin, LOW);
    Serial.println('-');
  }

}

prototyp

dann setze ich nochmal alle komponenten testweise zusammen und stimme die codeschnipsel aufeinander ab. die matrix stelle ich auf zwei dreiecke ein und im code entscheide ich noch wann welche dreiecke angezeigt werden, je nach dem was mir beide sensoren zurückgeben. dann kann ich auch die verkableung nochmal prüfen und ein wenig optimieren. daraus ergibt sich letztendlich auch meine pintabelle fürs löten.

nano VIN GND 3V3 5V A0 A1 A4 A5
matrix - + SDA SCL
sensor l - + OUT
sensor r - + OUT
batterie + -

konfischild

als kleines gimmick hatte ich noch ein paar "boot" animation geschrieben, denn ich wollte dass die LED matrix noch ein wenig zeigt was sie kann! eine ist von apple bootscreens inspiriert, die regelt das display auf volle helligkeit und wieder runter. dann gibt es noch die retro animation, die erzeugt eine welle aud quadraten auf dem display. und zueltzt noch die zufallsfunktion, hier lasse ich wahllos alle pixel füllen, und dann wahllos alle pixel leeren. wahllos ist aber einfacher gesagt als getan, denn wahllos würde bedeuten dass die pixel zufällig ausgewählt werden. der zufall vom nano ist dabei aber kein echter zufall. es gibt zwar eine random funktion, aber um die ordentlich zu nutzen müsste man noch irgendeine variable auch nach dem ausschalten dauerhaft speichern und dann beim einschalten wieder als seed verwenden, das war mir dann aber doch etwas zu viel für den effekt, ich belasse es bei der random funktion, dass die pixel immer in der gleichen (nur augenscheinlich wirren) reihenfolge geschaltet werden bekommen man nur mit viel aufmerksamkeit mit 😃 hier der finale code.

//include libraries
#include <Wire.h>
#include "Adafruit_LEDBackpack.h"
#include "Adafruit_GFX.h"

//setup
Adafruit_8x8matrix matrix = Adafruit_8x8matrix();
int left_prox = 0; //A0
int right_prox = 1; //A1
int ledPin = 13;
int side = 1; //Rotation
int brightness = 10; //default brightness
int threshold = 100;

//set graphics
static const uint8_t PROGMEM
  tri_left[] =
  { B10000000,
    B11000000,
    B11100000,
    B11110000,
    B11111000,
    B11111100,
    B11111110,
    B11111111 },
  tri_right[] =
  { B11111111,
    B01111111,
    B00111111,
    B00011111,
    B00001111,
    B00000111,
    B00000011,
    B00000001 };

//setup
void setup(){

  matrix.begin(0x70);
  matrix.clear();
  matrix.setBrightness(brightness);
  matrix.setRotation(side);

  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, LOW);
  Serial.begin(9600);

  //boot_retro();
  boot_random();
  //boot_apple();

}

//program
int left = 0;
int right = 0;

void loop(){

  delay(10);
  left = analogRead(left_prox);
  right = analogRead(right_prox);

  if(left > threshold && right > threshold){
    /*both*/
    digitalWrite(ledPin, HIGH);
    matrix.fillRect(0, 0, 8, 8, LED_ON);
    matrix.writeDisplay();
  }else if(left > threshold && right < threshold){
    /*left*/
    digitalWrite(ledPin, HIGH);
    matrix.drawBitmap(0, 0, tri_left, 8, 8, LED_ON);
    matrix.writeDisplay();
  }else if(left < threshold && right > threshold){
    /*right*/
    digitalWrite(ledPin, HIGH);
    matrix.drawBitmap(0, 0, tri_right, 8, 8, LED_ON);
    matrix.writeDisplay();
  }else if(left < threshold && right < threshold){
    /*none*/
    digitalWrite(ledPin, LOW);
    matrix.fillRect(0, 0, 8, 8, LED_OFF);
    matrix.writeDisplay();
  }

}

//retro boot animation
void boot_retro(){

  int center = 3;

  //in
  for (int i=0; i <= 4; i++){
    matrix.drawRect(center-i, center-i, 2+(i*2), 2+(i*2), LED_ON);
    matrix.writeDisplay();
    delay(50);
  }

  //out
  for (int i=0; i <= 4; i++){
    matrix.drawRect(center-i, center-i, 2+(i*2), 2+(i*2), LED_OFF);
    matrix.writeDisplay();
    delay(50);
  }

}

//random boot animation
void boot_random(){

  matrix.setBrightness(5);

  /*create array*/
  int list[64];
  for (int n=0; n<64; n++){
    list[n] = n;
  }

  /*shuffle array*/
  for (int a=0; a<64; a++){
    int r = random(a,64);
    int temp = list[a];
    list[a] = list[r];
    list[r] = temp;
  }

  /*turn on*/
  for (int a=0; a<64; a++){

    /*get coords*/
    int pos = list[a];
    int y = pos/8;
    int x = pos-(y*8);

    /*set*/
    matrix.drawRect(x, y, 1, 1, LED_ON);
    matrix.writeDisplay();
    delay(15);
  }

  delay(200);

  /*re shuffle array*/
  for (int a=0; a<64; a++){
    int r = random(a,64);
    int temp = list[a];
    list[a] = list[r];
    list[r] = temp;
  }

  /*turn off*/
  for (int a=0; a<64; a++){

    /*get coords*/
    int pos = list[a];
    int y = pos/8;
    int x = pos-(y*8);

    /*set*/
    matrix.drawRect(x, y, 1, 1, LED_OFF);
    matrix.writeDisplay();
    delay(15);
  }

}

//apple inspired boot animation
void boot_apple(){

  matrix.fillRect(0,0,8,8, LED_ON);
  matrix.writeDisplay();

  //in
  for (int i=0; i <= 15; i++){
    matrix.setBrightness(i);
    delay(50);
  }

  delay(1200);

  //out
  for (int i=15; i >= 0; i--){
    matrix.setBrightness(i);
    delay(50);
  }

  delay(50);
  matrix.clear();
  matrix.setBrightness(brightness);

}

fertigung

konfischild

jetzt kommt alles zusammen, ins gehäuse passt alles optimal rein. dann teste ich auch nochmal, wie ich den nano it einem 9V block betreiben kann. ein wenig recherchieren zeigt, dass es gar nicht so kompliziert ist. die anleitung ist sehr einfach, also augen zu und durch, kontakte dranhalten, ui! 👍 diesmal löte ich auch die kabel direkt auf den nano. isoliert ist ja alles, ich muss nur schauen dass ich die kabellängen optimal wähle. funktioniert prima und man hat nicht das gemehre mit irgendwelchen lochrasterplatten. dann hatte ich überlegt, wie ich alles im gehäuse befestigen könnte. letztlich hatte ich einige kommentare gelesen, die das alles mit heißkleber machen und ich fand das war eine prima idee. ich nehme jetzt eigentlich immer heißkleber mit schwarzen sticks, dann sieht die klebestelle auch nicht so hässlich aus. an die enden der kabel für die sensoren habe ich die steckverbindungen gelötet, damit kann man die verbindungen später einfach lösen, falls man mal was ändern muss oder so, auch muss ich ja erst noch zig meter kabel durch die halbe agentur legen und somit habe ich es später leichter alles zu verbinden.

konfischild

ein tip noch dazu, achtet auf die kabel die ihr ggf. legen müsst! die arbeit muss man nur einmal haben, dazu müsst ihr euch aber im klaren sein, welche kabel benötigt werden, wie lang die distanzen sind, wieviele melder es gibt und wo der strom herkommen soll. ich hatte zuerst einfachen klingeldraht gelegt, also jeweils drei einzelne stränge. dann hab ich die stecker festgelötet, alles getestet, und natürlich ging es nicht! 😃 💩 bei uns sind die kabelkanäle rappelvoll mit ethernet kabeln und laufen wahrscheinlich auch an stromführenden leitungen vorbei. ich hab mich dann ein wenig unterhalten mit leuten die was davon verstehen und die meinten da sind einfach die einstreuungen zu groß. logisch scheint mir das schon, dass dann offenbar irgendwo spannung induziiert wird, so wie beim herd oder so... wir haben dann nochmal geschirmtes kabel organisiert und das rate ich auf jedem. dabei sind die eigentlichen leitungen umeinander verzwirbelt, was die streuung reduziert und gleichzeitig ist alles mit einem geflecht umwickelt, das sorgt für die abschirmung. damit geht es. ich musste nur leider nochmal die ganzen kabel durchziehen und die stecker neu anlöten, aber was solls 😃

konfischild

fertig. im nachgang hatte sich herausgestellt, dass der betrieb über batterien doch mehr energie verbraucht als ich erwartet hatte, die batterie war nach ein paar tagen dauerbetrieb leer. und natürlich schaltet das schild auch keiner aus wenn er als letzter geht, wie das halt so ist. weil ich aber nich zweimal die woche das gehäuse aufschrauben will um die batterie zu wechseln hab ich den batterieclip gegen ein ein altes 5V Netzteil getauscht. das läuft jetzt besser, aber man muss natürlich zum 3. mal ein extra kabel zur steckdose ziehen (boar alter) 😳