We’ve had a huge problem in the IM lab of people not washing their dishes. We’ve tried just telling people to wash their dishes but that does not seem to work, so we needed to resort to more creative solutions.
Introducing, the Mateo dishwasher:
It’s the machine that shames people into washing their dishes using Mateo’s angry and shaming voice. You can’t hear this and not reevaluate your life choices that lead you up to this point. However, Mateo is forgiving if you come back to do your dishes:
I am using the Adafruit MP3 shield for this and playing the sounds from an SD card, with an external amplifier between the shield and the speaker in order to make the sound louder.
Here’s the code:
// include SPI, MP3 and SD libraries
#include <SPI.h>
#include <Adafruit_VS1053.h>
#include <SD.h>
// These are the pins used for the breakout example
#define BREAKOUT_RESET 9 // VS1053 reset pin (output)
#define BREAKOUT_CS 10 // VS1053 chip select pin (output)
#define BREAKOUT_DCS 8 // VS1053 Data/command select pin (output)
// These are the pins used for the music maker shield
#define SHIELD_RESET -1 // VS1053 reset pin (unused!)
#define SHIELD_CS 7 // VS1053 chip select pin (output)
#define SHIELD_DCS 6 // VS1053 Data/command select pin (output)
// These are common pins between breakout and shield
#define CARDCS 4 // Card chip select pin
// DREQ should be an Int pin, see http://arduino.cc/en/Reference/attachInterrupt
#define DREQ 3 // VS1053 Data request, ideally an Interrupt pin
Adafruit_VS1053_FilePlayer musicPlayer =
// create breakout-example object!
// Adafruit_VS1053_FilePlayer(BREAKOUT_RESET, BREAKOUT_CS, BREAKOUT_DCS, DREQ, CARDCS);
// create shield-example object!
Adafruit_VS1053_FilePlayer(SHIELD_RESET, SHIELD_CS, SHIELD_DCS, DREQ, CARDCS);
int sensorpin = A1;
int currenttime = 0;
int triggertime = 0;
void setup() {
Serial.begin(9600);
Serial.println("Adafruit VS1053 Simple Test");
if (! musicPlayer.begin()) { // initialise the music player
Serial.println(F("Couldn't find VS1053, do you have the right pins defined?"));
while (1);
}
Serial.println(F("VS1053 found"));
if (!SD.begin(CARDCS)) {
Serial.println(F("SD failed, or not present"));
while (1); // don't do anything more
}
musicPlayer.setVolume(1, 1);
// If DREQ is on an interrupt pin (on uno, #2 or #3) we can do background
// audio playing
musicPlayer.useInterrupt(VS1053_FILEPLAYER_PIN_INT); // DREQ int
// musicPlayer.sineTest(0x44, 500);
}
int cutoff = 250;
void loop() {
currenttime = millis();
int x = analogRead(sensorpin);
// Serial.println(x);
if (x > cutoff && (currenttime - triggertime) > 2000) {
musicPlayer.playFullFile("greatjob.mp3");
// delay(100);
if (analogRead(sensorpin) > cutoff) {
triggertime = millis();
return;
} else {
musicPlayer.playFullFile("heyhey.mp3");
if (analogRead(sensorpin) > cutoff) {
musicPlayer.playFullFile("right.mp3");
triggertime = millis();
return;
}
musicPlayer.playFullFile("comeback.mp3");
if (analogRead(sensorpin) > cutoff) {
musicPlayer.playFullFile("right.mp3");
triggertime = millis();
} else {
musicPlayer.playFullFile("insult.mp3");
triggertime = millis();
return;
}
}
}
}
I ran into a few problems. PWM is extremely limiting, as in it could only play 8-bit sounds, therefore I couldn’t have played the sound of blowing. Which I could’ve worked through, if it actually worked. I tried multiple speakers and multiple wiring set ups, but I could not get it to work. So I moved on.

You blow on the hanging piece of cardboard wrapped in foil, and it’ll make contact with the stationary piece of cardboard wrapped in foil. In order to not make the hanging piece of cardboard hefty, the current is transferred through copper tape to the top wooden stick, also wrapped in foil, where the alligator clips connects this piece to the rest of the circuit.