nerdyKat
Published © GPL3+

Deadpool Air Freshener

Talking and Farting Deadpool Air Freshener

IntermediateFull instructions providedOver 2 days59
Deadpool Air Freshener

Story

Read more

Schematics

mp3

Deadpool base

Deadpool spiderman

Code

Deadpool air freshener

Arduino
#include <LowPower.h>
#include <SoftwareSerial.h>
#include <DFPlayerMini_Fast.h>
#include <stdlib.h>  // for random()

SoftwareSerial mySerial(11, 12);  // RX, TX for DFPlayer Mini
DFPlayerMini_Fast myMP3;

const int ledPin = 13;    //LED
const int pirPin = 2;     //PIR sensor
const int buttonPin = 3;  //button
const int PWMA = 6;       // speed and direction control motor A (left)
const int AIN1 = 5;
const int AIN2 = 4;
const int dfPlayerPowerPin = 7;  // Pin to control power to DFPlayer Mini

int pirState = 0;    // variable for reading the PIR sensor status
int sleepFor = 225;  //225 cycles * 8 seconds = 1,800 seconds / 60 = roughly 30 minutes
unsigned long sleepCount = 0;

volatile bool motionDetected = false;
volatile bool buttonPressed = false;


void setup() {

  pinMode(ledPin, OUTPUT);           //set LED pin as output
  pinMode(pirPin, INPUT);            //set PIR pin as input
  pinMode(buttonPin, INPUT_PULLUP);  //set button pin as input
  pinMode(AIN1, OUTPUT);             //set all pins as output
  pinMode(AIN2, OUTPUT);
  pinMode(PWMA, OUTPUT);
  pinMode(dfPlayerPowerPin, OUTPUT);

  attachInterrupt(digitalPinToInterrupt(pirPin), motionISR, RISING);
  attachInterrupt(digitalPinToInterrupt(buttonPin), buttonISR, FALLING);

  digitalWrite(ledPin, LOW);

  Serial.begin(115200);
  mySerial.begin(9600);
  if (!myMP3.begin(mySerial)) {
    Serial.println("Unable to begin DFPlayer.");
    while (true)
      ;
  }
  myMP3.volume(5);  // Set initial volume

  //Serial.println("System initialized.");
  digitalWrite(dfPlayerPowerPin, HIGH);  // Turn on power to dfPlayer
  digitalWrite(ledPin, HIGH);            //turn the LED on
  delay(1000);                           //wait for a second
  digitalWrite(ledPin, LOW);             //turn the LED off
  playSong(2);                           //play song number 2
  delay(60000);                          //wait for a minute 60000
  digitalWrite(dfPlayerPowerPin, LOW);   // Turn off power to dfPlayer
}

void loop() {
  //Serial.flush();                                  // Force all serial data to be sent
  LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);  // Sleep for 8 seconds

  //Serial.print("Sleep count: ");
  //Serial.println(sleepCount);
  //delay(500);


  if (buttonPressed || (motionDetected && sleepCount > sleepFor)) {
    //Serial.println("Fart!!");
    fart();          // Release fart
    sleepCount = 0;  // Reset the sleep counter
  }

  // Reset motion and button states
  motionDetected = false;
  buttonPressed = false;

  // Increment sleep count
  sleepCount++;
}

void motionISR() {
  motionDetected = true;
}

void buttonISR() {
  buttonPressed = true;
}

void playSong(int songNumber) {
  if (songNumber >= 1 && songNumber <= 41) {
    myMP3.play(songNumber);
    //Serial.print("Playing song #");
    //Serial.println(songNumber);
  }
}

void playRandomSong(int minSong, int maxSong) {
  int randomSong = random(minSong, maxSong + 1);  // +1 to include maxSong
  playSong(randomSong);
}

void fart() {
  delay(500);
  digitalWrite(ledPin, HIGH);            //turn the LED on
  delay(200);                            //wait for 200 milliseconds
  digitalWrite(ledPin, LOW);             //turn the LED off
  delay(200);                            //wait for 200 milliseconds
  digitalWrite(ledPin, HIGH);            //turn the LED on
  delay(200);                            //wait for 200 milliseconds
  digitalWrite(ledPin, LOW);             //turn the LED off
  digitalWrite(dfPlayerPowerPin, HIGH);  // Turn on power
  delay(3000);                           //wait for 3 seconds
  playSong(1);                           //play the fart sound - song number 1
  delay(1000);                           //wait for 1 second
  digitalWrite(AIN1, LOW);               //run the motor to release the air freshner
  digitalWrite(AIN2, HIGH);
  analogWrite(PWMA, 70);

  delay(1000);  //wait 1 second
  digitalWrite(AIN1, HIGH);
  digitalWrite(AIN2, LOW);
  analogWrite(PWMA, 70);

  digitalWrite(AIN1, LOW);
  digitalWrite(AIN2, LOW);
  analogWrite(PWMA, 0);

  delay(1000);
  playRandomSong(3, 40);  //play a random song after fart

  //Serial.println("Song playing");

  delay(10000);
  digitalWrite(dfPlayerPowerPin, LOW);  // Turn off power to dfPlayer

  //Serial.println("Fart ended");
  delay(200);
  digitalWrite(ledPin, HIGH);  //turn the LED on
  delay(1000);                  //wait for 200 milliseconds
  digitalWrite(ledPin, LOW);   //turn the LED off
  delay(1000);                 //wait for 200 milliseconds
}

Credits

nerdyKat
18 projects • 7 followers
My name is Katarina. I'm an IT technician and I like to make stuff ;-)
Contact

Comments

Please log in or sign up to comment.