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!*