TVShow S03E04X76 Arduino Back Scratcher Plotter
00:49.15 43-17 OTC
Digitally ditch the itch --



Currently embracing a sans-work shop and poverty driven cardboard kick for the gluttony of least-interesting of novelty projects now done solely for critical thinking posterity -- other wise known as boredom.

Unable to reach that nook and/or cranny? Open the Back Scratcher Plotter app on your mobile device and identify the spot where then the X/Y axis is sent via bluetooth to the Arduino Uno affixed to the BSP prototype (sly analogy for rubbish) which then actuates to your -- you know what? Stop wasting your time sitting there even reading this nonsense and go some where -- like Typhoon Lagoon!

Ingredients
1. Arduino Uno
2. Bluetooth Module
3. (2) Servos
4. Motor
5. Cardboard
6. String
7. Masking Tape
8. Power Supply
9. Pulley
10. MIT App Inventor

Back-end Code
// Back Scratcher Plotter
// @VijeMiller
// TVMiller.com

#include <Servo.h>
#include <Stepper.h>

// Scratcher
const int stepsrev = 32;
Stepper scratch(stepsrev, 2, 4, 3, 5);

// For Bluetooth Data
String readString, xaxisdata, yaxisdata;

// X Axis
Servo xaxis;
// Y Axis
Servo yaxis;

int xpos = 90;
int ypos = 90; // Stall
int stall = 90;
int yup = 75;
int ydown = 105;
int pos = 90;

void setup() {
Serial.begin(9600);
// Max(?) Speed
scratch.setSpeed(800);
xaxis.attach(6);
yaxis.attach(7);
xaxis.write(xpos);
yaxis.write(ypos);
}

void loop() {

// Bluetooth Data X-Y Axis String?
while (Serial.available()) {
delay(10);
if (Serial.available() > 0) {
char c = Serial.read();
readString += c;
}
}

if (readString.length() > 0) {
// Serial.println(readString);
// X-Y Axis Combined Sent (ex. 368124)
// First 3 Digits
xaxisdata = readString.substring(0, 3);
// Next 3 Digits
yaxisdata = readString.substring(4, 6);

// Convert String to Int
int prexpos = xaxisdata.toInt();
int preypos = yaxisdata.toInt();

// X-Y Based on 480x800 Phone Dimension & MIT App
// X 100 to 350 High 170 to 320 Low
// Y 220 to 560
// Map X to xPos (Actual)
xpos = map(prexpos, 100, 350, 120, 60);
// Map Y to yPos (Delay)
ypos = map(preypos, 220, 560, 0, 6300);

}

// Final Routine
if (readString.length() > 0) {
if (xpos > 90) {
for (pos = 90; pos <= xpos; pos += 1) {
xaxis.write(pos);
delay(40);
}
}
else if (xpos < 90) {
for (pos = 90; pos >= xpos; pos -= 1) {
xaxis.write(pos);
delay(40);
}
}
yaxis.write(yup);
delay(ypos);
yaxis.write(stall);
// Scratch 2048 Steps = 1 Revolution (2 Up/Down)
// Used Stepper bcz Spare Parts -- Sigh!
// 2048 x 7 Seconds = 14336 Steps
scratch.step(14336);

// Return to Start
if (xpos > 90) {
for (pos = xpos; pos >= xpos; pos -= 1) {
xaxis.write(pos);
delay(40);
}
}
else if (xpos < 90) {
for (pos = xpos; pos <= xpos; pos += 1) {
xaxis.write(pos);
delay(40);
}
}
yaxis.write(ydown);
delay(ypos);
yaxis.write(stall);
}

// Reset
readString = "";
}

Archive
http://hackaday.com/2017/05/07/anatomic ... atch-fever
https://hackaday.io/project/21527-arduino-back-scratcher-plotter
https://vid.me/K3Tx
TVShow S03E03X75 Simone Slouchy
20:57.21 27-17 OTC
After several dismissive attempts (3) -- we have haphazardly weaved together an Arduino Uno with cardboard, ultrasonic sensor, servo(s) and stepper(s) to remind, pester and intolerate your posture.



This project was hobbled together as a slight against the current incarnation of the maker community that at one time had been invested in improving humanity -- now succumbed to vanity and novelty. This project demonstrates that even with little to nothing applied, useless can harbor solution. Plaguing social venues with the antithesis breeds a consequence of evolutionary latency.

Ingredients
1. Arduino Uno
2. Stepper Motor (28BYJ-48)
3. Stepper Driver (ULN2003)
4. Ultrasonic Sensor (HC-SR04)
5. (2) Servos (High Torque)
6. Cardboard
7. Spite

Notations
1. 28BYJ-48 are cheap bcz they are in fact, rubbish -- do not be fooled by reviews documenting "high torque" and "power" bcz they fail to mention they only used these stepper motors to propel insignificantly sized wheeled robots a few paces before over heating and seizing.

2. Per my review above (Notation 1) may I suggest the alternative of either the purchase of or the modification of a servo to operate at 360 degree rotation -- ref. http://tvmiller.com/index.php?entry=entry160123-071155

3. A modified version of this code applied distance reference to alter the position of the shoulder servo relative to the actual distance of the sloucher -- due to impatience, disinterest and coherence of my typical distance, the code is commented but easily accessible.

Slouchy Codey
// Simone Slouchy (3)
// Vije Miller
// TVMiller.com

#include <Servo.h>
#include <Stepper.h>

// Hand
const int stepsPerRevolution = 64;
Stepper hander(stepsPerRevolution, 19, 17, 18, 16);
// Shoulder
Servo shoulder;
// Elbow (
Servo elbow;

// Sensor
#define trigPin 2
#define echoPin 3

// Servo Position
int pos = 30;

// What Action Next?
int state = 0;

// Distance Adjust (Version 2)
// int newdis = 0;

// Serial For Testing
char incom = 0;

void setup() {
Serial.begin(9600);
shoulder.attach(12);
elbow.attach(5);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
// Set Start Position (Servo)
shoulder.write(15);
elbow.write(30);
// Stepper Starts 0
}

void loop() {

// Sensor Sequence
long duration, distance;
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
// Centimeter Conversion
distance = (duration / 2) / 29.1;
// Print for Testing
Serial.print(distance); Serial.println(" cm");

// IF Slouching || > 5cm
// But Not NOT In Chair || < 40cm
if (distance > 5 && distance < 40) {
if (state == 0) {
tap();
// Change State
state = 1;
}
else if (state == 1) {
grab();
state = 2;
}
else if (state == 2) {
assault();
// Reset
state = 0;
}
}
delay(5000);

// Serial For Testing
// if (Serial.available() > 0) {
// incom = Serial.read();
// if (incom == '1') {
// tap();
// }
// else if (incom == '2') {
// grab();
// }
// else if (incom == '3') {
// assault();
// }
// }

// Reset Value (Else)
incom = 0;
}

void tap() {
// Map Distance for Extension (Coming Soon)
// newdis = map(distance, 5, 20, 70, 110);

// Extend Shoulder and Forearm
// Open Hand
for (int i = 0; i <= 600; i++) {
hander.step(-1);
Serial.println("Open");
}
for (pos = 15; pos <= 30; pos += 1) {
shoulder.write(pos);
delay(20);
}
for (pos = 30; pos <= 90; pos += 1) {
shoulder.write(pos);
elbow.write(pos);
delay(20);
}
for (pos = 90; pos <= 145; pos += 1) {
elbow.write(pos);
delay(20);
}
for (pos = 90; pos <= 110; pos += 1) {
shoulder.write(pos);
delay(20);
}
delay(1000);
// Tap
for (pos = 145; pos >= 110; pos -= 1) {
elbow.write(pos);
delay(10);
}
for (pos = 110; pos <= 145; pos += 1) {
elbow.write(pos);
delay(10);
}
for (pos = 145; pos >= 110; pos -= 1) {
elbow.write(pos);
delay(10);
}
for (pos = 110; pos <= 145; pos += 1) {
elbow.write(pos);
delay(10);
}
// Fold Back
for (pos = 110; pos >= 70; pos -= 1) {
shoulder.write(pos);
delay(50);
}
delay(750);
for (pos = 145; pos >= 70; pos -= 1) {
elbow.write(pos);
delay(20);
}
for (pos = 70; pos >= 30; pos -= 1) {
shoulder.write(pos);
elbow.write(pos);
delay(30);
}
for (pos = 30; pos >= 15; pos -= 1) {
shoulder.write(pos);
delay(30);
}
for (int i = 0; i <= 600; i++) {
hander.step(1);
Serial.println("Close");
}
}

void grab() {
// Open Hand
for (int i = 0; i <= 600; i++) {
hander.step(-1);
Serial.println("Open");
}
for (pos = 15; pos <= 30; pos += 1) {
shoulder.write(pos);
delay(20);
}
for (pos = 30; pos <= 90; pos += 1) {
shoulder.write(pos);
elbow.write(pos);
delay(20);
}
for (pos = 90; pos <= 145; pos += 1) {
elbow.write(pos);
delay(20);
}
for (pos = 90; pos <= 110; pos += 1) {
shoulder.write(pos);
delay(20);
}
delay(1000);
// Close Hand
for (int i = 0; i <= 250; i++) {
hander.step(1);
Serial.println("Close");
}
// Lower On Sloucher
for (pos = 145; pos >= 115; pos -= 1) {
elbow.write(pos);
delay(30);
}
// Pull Back
for (pos = 115; pos >= 80; pos -= 1) {
shoulder.write(pos);
elbow.write(pos);
delay(30);
}
// Open Hand
for (int i = 0; i <= 250; i++) {
hander.step(-1);
Serial.println("Open");
}
// Extend Forearm
for (pos = 80; pos <= 145; pos += 1) {
elbow.write(pos);
delay(30);
}
// Fold Back
for (pos = 80; pos >= 50; pos -= 1) {
shoulder.write(pos);
delay(40);
}
for (pos = 145; pos >= 50; pos -= 1) {
elbow.write(pos);
delay(30);
}
for (pos = 50; pos >= 30; pos -= 1) {
elbow.write(pos);
shoulder.write(pos);
delay(40);
}
for (pos = 30; pos >= 15; pos -= 1) {
shoulder.write(pos);
delay(40);
}
// Close Hand
for (int i = 0; i <= 600; i++) {
hander.step(1);
Serial.println("Close");
}
}

void assault() {
for (int i = 0; i <= 600; i++) {
hander.step(-1);
Serial.println("Open");
}
for (pos = 15; pos <= 30; pos += 1) {
shoulder.write(pos);
delay(20);
}
for (pos = 30; pos <= 90; pos += 1) {
shoulder.write(pos);
elbow.write(pos);
delay(20);
}
for (pos = 90; pos <= 145; pos += 1) {
elbow.write(pos);
delay(20);
}
for (pos = 90; pos <= 110; pos += 1) {
shoulder.write(pos);
delay(20);
}
delay(1000);
for (int i = 0; i <= 250; i++) {
hander.step(1);
Serial.println("Close");
}
for (pos = 145; pos >= 115; pos -= 1) {
elbow.write(pos);
delay(30);
}
for (pos = 115; pos >= 60; pos -= 1) {
shoulder.write(pos);
elbow.write(pos);
delay(30);
}
for (int i = 0; i <= 250; i++) {
hander.step(-1);
Serial.println("Open");
}
for (pos = 60; pos <= 80; pos += 1) {
elbow.write(pos);
delay(30);
}
delay(1500);
for (pos = 60; pos <= 80; pos += 1) {
shoulder.write(pos);
delay(20);
}
for (pos = 80; pos <= 115; pos += 1) {
shoulder.write(pos);
elbow.write(pos);
delay(5);
}
for (pos = 115; pos <= 135; pos += 1) {
elbow.write(pos);
delay(5);
}
delay(500);
for (pos = 115; pos >= 80; pos -= 1) {
shoulder.write(pos);
delay(10);
}
for (pos = 135; pos <= 80; pos += 1) {
elbow.write(pos);
delay(30);
}
for (pos = 80; pos >= 30; pos -= 1) {
shoulder.write(pos);
elbow.write(pos);
delay(40);
}
for (pos = 30; pos >= 15; pos -= 1) {
shoulder.write(pos);
delay(40);
}
for (int i = 0; i <= 600; i++) {
hander.step(1);
Serial.println("Close");
}
}

Archive
Hackaday.io - Simone Slouchy
Instructables - Simone Slouchy
Kathrine Becker (Suzy Sellout) - Gone For A While
Failed Simone Slouchy Endeavor 1 and 2
14:25.5 19-17 OTC
Pursuing an attempt at spite, ironically -- the humorous self deprecating variety -- we have now twice failed at constructing an Arduino project to which we shall explain in detail further following a hypothetical successful third attempt soon...and subsequent fourth attempt. Son of a-- any who -- our first attempt was interrupted by time and our second venture was deterred by stepper motors (28BYJ-48) proving to be far more feeble than anticipated.



TVShow S03E02X74 Arduino Splash Resistant Toilet Foamer
13:23.0 10-17 OTC




Splash back is a scourge of our archaic crapping technology. As alternative to perching several feet above the bowl comes the Arduino Toilet Foamer -- permitting a user to create a more splash-resistant, sanitary and refreshing bowl environment.

Bowels a-grumblin'? Activate the Arduino Toilet Foamer from your phone app -- triggering the Arduino relay(s) for the aerator and solenoid value which injects a specified dosage of glycerin and soap in to the bowl water where it becomes en-frothed by gyrating bubbling action. Exhume waste as necessary.

Ingredients
1. Arduino Uno
2. 1/8ID 1/4OD Vinyl Tube
3. TIP120 (2)
4. 2.2K R (2)
5. 4001 Diode (2)
6. 5V Relay
7. Aerator (40 Gal)
8. 1/8 Tee for Two
9. 12V Solenoid Valve
10. Plastic Container
11. 1/8 Check Valve
12. 12V Power Supply
13. Glycerin
14. Liquid Dish Soap
15. Aerator Bubbler
16. Bluetooth or WiFi
(Optional)
Adafruit Neopixel Strip
1Knf C
47 R

Notations

1. Advice to straighten vinyl tubing is to boil water and quickly submerge.
Dry in the desired angle. Cure shorter pieces by submerging in cold water.

2. Do not use concentrated liquid dish or hand soap -- aka "Ultra" brand.

3. Would-a could-a shd-a larger aerator, (2) more valves and a variant bubbler to increase foaming efficiency.

4. Hypothetically, water reduction could be obtained by foaming water in a toilet.
Elon Musk, you can send a check or money order to...

Bubble Recipe
Soap 4:1 Glycerin

Foam Code (Bluetooth and Neopixel Version)
// Toilet Foamer
// VijeMiller
// TVMiller.com

// Neopixel
#include <Adafruit_NeoPixel.h>
#define PINSTRIP 10
Adafruit_NeoPixel strip = Adafruit_NeoPixel(5, PINSTRIP, NEO_GRB + NEO_KHZ800);

// Aerator
int aerator = 7;
// Valve
int valve = 8;

void setup() {

Serial.begin(9600);

// Pin Values
pinMode(aerator, OUTPUT);
pinMode(valve, OUTPUT);

// Load Neopixel
strip.begin();
strip.show();

digitalWrite(aerator, LOW);
digitalWrite(valve, LOW);

}

void loop() {

// Listen
if (Serial.available() > 0)
{
digitalWrite(aerator, HIGH);
// Prime Soap Container
delay(3000);
digitalWrite(valve, HIGH);
// FOR to Delay w/ LED
for (int i = 0; i < 15; i++) {
colorWipe(strip.Color(255, 0, 0), 70);
colorWipe(strip.Color(0, 255, 0), 70);
colorWipe(strip.Color(0, 0, 255), 70);
}
digitalWrite(valve, LOW);
// FOR to Delay w/ LED
for (int i = 0; i < 1000; i++) {
colorWipe(strip.Color(255, 0, 0), 70);
colorWipe(strip.Color(0, 255, 0), 70);
colorWipe(strip.Color(0, 0, 255), 70);
}
digitalWrite(aerator, LOW);
}

}

void colorWipe(uint32_t c, uint8_t wait) {
for (uint16_t i = 0; i < strip.numPixels(); i++) {
strip.setPixelColor(i, c);
strip.show();
delay(wait);
}
}

Archive
HackaDay - http://hackaday.com/2017/05/04/hackaday ... let-foamer
Hackaday.io - Arduino Splash Resistant Toilet Foamer
Instructables - Arduino Splash Resistant Toilet Foamer
TVShow S03E01X73 Arduino Motion Mute
22:12.54 2-17 OTC




Every male and occasional female (send nu--never mind) has been caught, for so many nefarious things. Puberty often needs a helping hand--wait--I mean to say that there is a solution to secure your dignity from prying ears -- or eyes depending on applied hex code.

Ingredients
1. Arduino Uno (2)
2. PIR Motion Sensor Module
3. Nerf Walkie Talkies (5$US on eBay)
4. IR LED Transmitter
5. IR Receiver (Salvaged)
6. 47 R
7. 2.2K R
8. TIP120
9. 330 R
10. 5V Relay
11. 4001 D
(Optional) Adafruit NeoPixel LED Strip, 1Knf C and 47 R

As the motion sensor is activated, the host MCU triggers the high tone pulse (morse code button) to the other walkie talkie which in turn, the alternate MCU analog reads (A0) voltage from the receiving speaker. When elevated beyond a threshold (identified here as 25) the MCU signals the IR to mute the television and optionally display a LED alert.

A note on refinement for alternative applications -- reduce the delay and transmit pulses (on/off) in Morse so as to reproduce data streams for a broader exchange.

Uh hem, adult entertainment industry, uh hem -- this thing. Eh?!

Sensor Code
// Motion Mute
// Sensor Code
// VijeMiller

int pir = 3;
int beep = 4;

int state = 0;

void setup()
{
pinMode(pir, INPUT);
pinMode(beep, OUTPUT);
}

void loop()
{
state = digitalRead(pir);
if (state == 1) {
digitalWrite(beep, HIGH);
delay(2000);
digitalWrite(beep, LOW);
} else {
digitalWrite(beep, LOW);
}
delay(100);
}

Mute Code
// Motion Mute
// Mute Code
// @VijeMiller

// IRLED pin 3
#include <IRremote.h>
IRsend irsend;

// Neopixel
#include <Adafruit_NeoPixel.h>
#define PINSTRIP 9
Adafruit_NeoPixel strip = Adafruit_NeoPixel(3, PINSTRIP, NEO_GRB + NEO_KHZ800);

int rec = 0;
int recpin = A0;

void setup()
{
Serial.begin(9600);
// Load Neopixel
strip.begin();
strip.show();
// Loading Alert
colorWipe(strip.Color(0, 255, 0), 100);
colorWipe(strip.Color(0, 0, 0), 70);
}

void loop()
{
// Read Speaker
rec = analogRead(recpin);
// 0 to 1023
if (rec > 25) {
// Send Mute Signal
for (int i = 0; i < 3; i++) {
// Designated by IRRecDemo
// Mute for Samsung
irsend.sendSony(0xF0A01BE, 12);
delay(40);
}
// Red Alert
colorWipe(strip.Color(255, 0, 0), 100);
colorWipe(strip.Color(0, 0, 0), 100);
// Reduce Redundancy
delay(3000);
} else {
// Light Blue
colorWipe(strip.Color(0, 0, 10), 100);
}
delay(100);
}

void colorWipe(uint32_t c, uint8_t wait) {
for (uint16_t i = 0; i < strip.numPixels(); i++) {
strip.setPixelColor(i, c);
strip.show();
delay(wait);
}
}

Archive
Hackaday.io - Arduino Motion Mute
Instructables - Arduino Motion Mute