Projekte

Getraenkebezahlmotivationsplakette

*blink* *blink* *regenbogen* *please pay! :3*

To Do

Bessere Dämpfer und bessere Feineinstellung

Motivation

Ab und an vergisst Mensch das Bezahlen. Vielleicht tut Mensch das weniger, wenn er_sie blinked daran erinnert wird? Außerdem: pim wollte gerne den Umgang mit CNC-Fräse, LED-Strips und Mikrokontrollern lernen :3

Ideen

Nur wie misst man, dass jemand ein Getränk entnimmt?

  • Accelerometer
    • War leider keines zur Hand und für Bestellung die Ungeduld zu groß
  • Lichtschranke
    • Kein Platz
  • Kameraüberwachung mit Bewegungsmelder
    • Zu high-tech und creepy
  • Vibrationssensor aus Piezokristall
    • Die gibt es quasi überall wenn man ein bisschen sucht, denn in vielen Piepsern sind Piezo-Lautsprecher verbaut. Für ganz hartgesottene käme auch der Ausbau aus einem Elektrofeuerzeug in Frage
    • unsere Wahl fiel auf diese Variante

Das Schild

Designed in Inkscape und gefräst aus Plexiglas. Dabei gelernt:

  • Auf ein ebenes einspannen achten, sonst wirds mancherorts tiefer als sonstwo
    • Hier zum Glück nicht schlimm gewesen, da das Plexiglas recht dick war
  • Plexiglas schmilzt, der Bohrkopf sollte sich also langsam drehen und langsam fahren
    • Sonst große Ansammlung von Plastik am Bohrkopf, die eine schöne Fräsung unmöglich macht (siehe linkes Auge und Löcher)

Die Platine

Verbaut wurde ein ESP-201, welcher über einen Schaltkreis mit einem Piezokristall aus einem Summer die Vibrationen des Getränkeregals misst und über einem gewissen Threshhold die LEDs auslöst. Geprototyped wurde das ganze auf einem Arduino, was rückblickend Probleme verursachte, da Arduinos, LEDs und Peizoschaltung auf 5V ausgelegt waren, die ESP-Module allerdings auf 3,3V laufen. Die Schaltung wird also mit 3,3V bespielt um das ESP-201 zu versorgen, während 5V an Piezoschaltung und LEDs anliegen

Code

Der Code besteht zu großen Teilen aus Beispielanimationen der Adafruit-Library

#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
  #include <avr/power.h>
#endif

#define LEDpin 3
#define LEDnumber 16

  int i;
  int j;
  int k;

Adafruit_NeoPixel strip = Adafruit_NeoPixel(LEDnumber, LEDpin, NEO_GRB + NEO_KHZ800);

#define vibropin 5

// Input a value 0 to 255 to get a color value.
// The colours are a transition r - g - b - back to r.
uint32_t Wheel(byte WheelPos) {
  WheelPos = 255 - WheelPos;
  if(WheelPos < 85) {
    return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  }
  if(WheelPos < 170) {
    WheelPos -= 85;
    return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  }
  WheelPos -= 170;
  return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
}


void rainbow(uint8_t wait) {
  uint16_t i, j;

  for(j=0; j<256*4; j++) {
    for(i=0; i<strip.numPixels(); i++) {
      strip.setPixelColor(i, Wheel((i+j) & 255));
    }
    strip.show();
    delay(wait);
  }
}


void SetRandomSeed()
{
    uint32_t seed;

    // random works best with a seed that can use 31 bits
    // analogRead on a unconnected pin tends toward less than four bits
    seed = analogRead(0);
    delay(1);

    for (int shifts = 3; shifts < 31; shifts += 3)
    {
        seed ^= analogRead(0) << shifts;
        delay(1);
    }

    // Serial.println(seed);
    randomSeed(seed);
}

uint32_t pickacoolcolor() {
  int rando = random(8);
  if(rando == 0) {
    return strip.Color(255,0,0);
  }
  else if (rando == 1) {
    return strip.Color(0,255,0);
  }
  else if (rando == 2) {
    return strip.Color(0,0,255);
  }
  else if (rando == 3) {
    return strip.Color(255,20,147); //deeppink
  }
  else if (rando == 4) {
    return strip.Color(135,38,87); //raspberry
  }
  else if (rando == 5) {
    return strip.Color(0,255,255); //tuerkis
  }
  else if (rando == 6) {
    return strip.Color(255,255,0); //yellow
  }
  else {
    return strip.Color(255,158,0); //orange
  }
}

void setup(){
// This is for Trinket 5V 16MHz, you can remove these three lines if you are not using a Trinket
  #if defined (__AVR_ATtiny85__)
    if (F_CPU == 16000000) clock_prescale_set(clock_div_1);
  #endif
  // End of trinket special code


  strip.begin();
  strip.show(); // Initialize all pixels to 'off'
}

void loop(){
  if(digitalRead(vibropin) == LOW){
    for (int xy = 0; xy < 8; xy++) {
      for (int xyz = 0; xyz < LEDnumber; xyz++) {
        strip.setPixelColor(xyz, pickacoolcolor());
      }
      strip.show();
      delay(250);
      for (int xyz = 0; xyz < LEDnumber; xyz++) {
        strip.setPixelColor(xyz, strip.Color(0,0,0));
      }
      strip.show();
      delay(70);
    }
    rainbow(2);

    for (int xyz = 0; xyz < LEDnumber; xyz++) {
      strip.setPixelColor(xyz, strip.Color(0,0,0));
    }
    strip.show();
  }
}

Ergebnis

Es funktioniert! :3 *blink* *blink* *regenbogen* *please pay!*