Ambient Connected House
This is a light blue bean+ project that uses the light sensor to detect the light in your room. There are two mini houses with two windows each. When your light is on, your window lights up, and when the room that the other house is in is on, their window lights up. This way you can know if your friend is home, and feel like you are in the same house from afar.
Documentation: http://bit.ly/2mHWhXx
Password Protected Door Alarm
If you don’t disarm it before you set off the ultrasonic sensor, it will sound an alarm and record your entry time.
/* title: Password Protected Door Sensor
date: 02/14/2016
course: Physical Computing and Alternative Interfaces
author: Jasmine Pazer
email: jgp5980@rit.edu
*/
//import and initalize the lcd screen
#include <LiquidCrystal.h>
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);
//set pins
int potPin = A0;
int buttonPin = 13;
int piezoPin = 6;
int ultrasonicPin = A1;
//set password, and password holder
String passString = "";
String password = "12345";
//notes and frequencies for conversion for the piezo buzzer
char names[] = { 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'C' };
int frequencies[] = {262, 294, 330, 349, 392, 440, 494, 523};
//button debounce variables
long lastDebounceTime = 0;
long debounceDelay = 50;
int currentButtonState;
int lastButtonValue = LOW;
//ultrasonic sensing variable
int lastUltrasonicValue = 0;
//number of times the alarm goes off
int alarmTimes = 10;
//number of times the alert has been triggered
int entranceAttempts = 0;
//the state the program is in
int state = 0;
//bool to keep a tone playing more than once
bool tonePlayed = false;
void setup() {
/*description: setup, only runs once
Variables used:
buttonPin,
piezoPin,
ultrasonicPin,
lastUltrasonicValue
dependencies:
none
args: none
returns: none
*/
//start lcd
lcd.begin(16, 2);
//start Serial monitor
Serial.begin(9600);
//set pinModes
pinMode(buttonPin, INPUT);
pinMode(piezoPin, OUTPUT);
//set the first reading of the ultrasonic sensor to compare off of.
delay(100);
lastUltrasonicValue = analogRead(ultrasonicPin);
}
int noteToFreq(char note) {
/*description: to convert notes (char) into frequencies (int)
variables used:
names[],
frequencies[]
dependencies:
none
args: note (char)
returns: (int)
*/
//go through names looking for a match to note
for (int i = 0; i < sizeof(names); i++)
{
if (names[i] == note)
{
//return the freq that is in the same spot the note was
return (frequencies[i]);
}
}
//return nothing if not a valid note
return (0);
}
bool buttonPressed() {
/*description: to determine if the button has been pressed.
variables used:
buttonPin,
lastButtonValue,
lastDebounceTime,
debounceDelay,
currentButtonState
dependencies:
none
args: none
returns: (bool)
*/
//get buttonValue
int buttonValue = digitalRead(buttonPin);
//if it's not the same as lastButtonValue, start the timer
if (buttonValue != lastButtonValue) {
lastDebounceTime = millis();
}
//if the delay time has elapsed
if ((millis() - lastDebounceTime) > debounceDelay) {
//still not equal to last time?
if (buttonValue != currentButtonState) {
currentButtonState = buttonValue;
//is it being pushed?
if (currentButtonState == HIGH) {
//return true
return true;
}
}
}
lastButtonValue = buttonValue;
//or return false
return false;
}
bool ultrasonicTriggered() {
/*description: to determine if the ultrasonic sensor has been triggered
variables used:
ultrasonicPin,
lastUltrasonicValue,
alarmTimes
dependencies:
none
args: none
returns: (bool)
*/
int ultrasonicValue = analogRead(ultrasonicPin);
if (abs(ultrasonicValue - lastUltrasonicValue) > 30)
{
alarmTimes = 10;
return true;
}
return false;
}
void enterCode() {
/*description: The state of the program where the password is entered
variables used:
potPin,
piezoPin,
passString,
password,
state,
tonePlayed,
dependencies:
buttonPressed(),
ultrasonicTriggered()
args: none
returns: none
*/
//read the potentiometer value and convert it from pot numbers to 0-9
int potValue = analogRead(potPin);
int value = (int)map(potValue, 0, 1023, 0, 9);
//if the button is pressed make a beep and add the number they chose to the password string they are building
if (buttonPressed()) {
tone(piezoPin, noteToFreq('g'), 100);
delay(90);
passString += value;
}
//time to print what they are doing on screen
String printer;
//print a '*' for all of the numbers they have already entered
for (int i = 0; i < passString.length(); i++) {
Serial.println(passString.length());
printer += "*";
}
//display on screen
lcd.setCursor(0, 0);
lcd.print("Enter passcode:");
lcd.setCursor(0, 1);
//printing the '*' for what they've entered and showing the value for their next choice
lcd.print(printer + value);
//if they have entered the same number of characters as the original password
if (passString.length() >= password.length()) {
//clear the screen and move to the response sate
lcd.clear();
state = 1;
//set it up to play the tone once
tonePlayed = false;
}
//if someone enters before the password is submitted, the alarm goes off, and progress is deleted
if (ultrasonicTriggered()) {
passString = "";
lcd.clear();
state = 2;
}
}
void response() {
/*description: The state where the password is accepted or denied
variables used:
piezoPin,
passString,
password,
state,
tonePlayed,
dependencies:
buttonPressed(),
ultrasonicTriggered(),
noteToFreq()
args: none
returns: none
*/
//if they entered the correct password
if (passString == password) {
//give feedback that it was correct
lcd.setCursor(0, 0);
lcd.print("Access Granted");
lcd.setCursor(0, 1);
lcd.print("Please Enter.");
//play the you can enter tone once
if (tonePlayed == false) {
tone(piezoPin, noteToFreq('g'), 200);
delay(200);
tone(piezoPin, noteToFreq('C'), 500);
tonePlayed = true;
}
} else { //if it was the wrong password
//tell them it failed
lcd.setCursor(0, 0);
lcd.print("Access Denied.");
//play the you can't enter tone once
if (tonePlayed == false) {
tone(piezoPin, noteToFreq('g'), 300);
delay(300);
tone(piezoPin, noteToFreq('d'), 500);
tonePlayed = true;
}
//and if they push the button, they can try again
if (buttonPressed()) {
state = 0;
passString = "";
lcd.clear();
}
}
//if the ultrasonic sensor is triggered
if (ultrasonicTriggered()) {
//and they had been accepted
if (passString == password) {
//send them back to the enter code screen and do not sound the alarm
state = 0;
delay(350);
passString = "";
lcd.clear();
} else { //if they had been denied
//sound the alarm!
state = 2;
passString = "";
lcd.clear();
}
}
}
void alert() {
/*description: The state where the alarm has been sounded
variables used:
piezoPin,
state,
entranceAttempts,
alarmTimes,
lastUltrasonicValue,
ultrasonicPin
dependencies:
noteToFreq()
args: none
returns: none
*/
//record the entrance attempt (or the actual entrance)
entranceAttempts++;
//display that an intruder has entered
lcd.setCursor(0, 0);
lcd.print("Intruder Alert");
lcd.setCursor(0, 1);
//and how many times the alarm has been triggered in the past
lcd.print((String)entranceAttempts + " attempt/s");
//play the alarm for a certain number of times
while (alarmTimes > 0) {
tone(piezoPin, noteToFreq('g'), 170);
delay(170);
tone(piezoPin, noteToFreq('d'), 170);
delay(170);
alarmTimes--;
}
//reset the ultrasonic sensor reading
lastUltrasonicValue = analogRead(ultrasonicPin);
lcd.clear();
//go back to the enter code screen
state = 0;
}
void loop() {
/* description: loop, repeats for the entire program
* variables used:
state
dependencies:
enterCode(),
response(),
alert()
args: none
returns: none
*/
//call the appropriate function for each screen/state
switch (state) {
case 0://enter passcode
enterCode();
break;
case 1://status accepted/denied
response();
break;
case 2://sound alarm
alert();
break;
default:
break;
}
}
Seeing Blind
A hat that lets the user see through the use of ultrasonic sensors and tiny vibration motors. The vibration motors will be against the user’s head and will vary in strength according to the distance of the user from objects. The ultimate goal will be for someone to be able to navigate around a space without the use of their eyes.
Now I understand why the Arduino was such a breakthrough. Prototyping circuits quickly and neatly on an Arduino Uno and a breadboard are a walk in the park compared to fussing with soldering and stuff.
/* title: Seeing Blind - Hat (one half)
date: 4/2/2016
course: Physical Computing and Alternative Interfaces
author: Jasmine Pazer
email: jgp5980@rit.edu
*/
int ultrasonicPin = A1;
int vibratePin = 0;
void setup()
{
pinMode(vibratePin, OUTPUT);
}
void loop()
{
int ultrasonicValue = analogRead(ultrasonicPin);
if (ultrasonicValue < 300) {
int motorValue = map(ultrasonicValue, 300, 0, 0, 255);
analogWrite(vibratePin, motorValue);
}
delay(10);
}
Electric Flute
For the audio project I decided to make an electric flute. I used a piezo vibration sensor, and 4 buttons for input and a small speaker for output. In order for sound to be made a button must be pressed and you must blow on the piezo sensor. Each button has a different pitch.
Picture: (coming soon)
/* title: Electric Flute
date: 4/18/2016
course: Physical Computing and Alternative Interfaces
author: Jasmine Pazer
email: jgp5980@rit.edu
*/
#include "pitches.h"
// these constants won't change:
const int ledPin = 10; // led connected to digital pin 13
const int vibePin = A3; // the amplifier output is connected to analog pin 0
const int speakerPin = 5;
const int button1 = 9;
const int button2 = 8;
const int button3 = 7;
const int button4 = 6;
int vibeTotal = 0;
int i = 0;
void setup() {
pinMode(ledPin, OUTPUT); // declare the ledPin as as OUTPUT
Serial.begin(9600); // use the serial port
}
void loop() {
// read the sensor and store it in the variable sensorReading:
if (i < 10) {
int vibeValue = analogRead(vibePin);
int ledValue = map(vibeValue, 0, 1023, 0, 255);
analogWrite(ledPin, ledValue);
vibeTotal += vibeValue;
i++;
} else {
if (vibeTotal / i > 0) {
if (digitalRead(button1) == 1) {
tone(speakerPin, NOTE_C3);
} else if (digitalRead(button2) == 1) {
tone(speakerPin, NOTE_D3);
} else if (digitalRead(button3) == 1) {
tone(speakerPin, NOTE_E3);
} else if (digitalRead(button4) == 1) {
tone(speakerPin, NOTE_F3);
} else {
noTone(speakerPin);
}
} else {
noTone(speakerPin);
}
i = 0;
vibeTotal = 0;
}
delay(2); // Better for Processing showing data
}
——–pitches.h———
/************************************************* * Public Constants *************************************************/ #define NOTE_C3 131 #define NOTE_D3 147 #define NOTE_E3 165 #define NOTE_F3 175
Etch-a-Sketch
An Etch-a-Sketch made with C.H.I.P. (a full linux computer). This proect is written in processing using the Hardware I/O library. Processing is great, you can use classes unlike in Arduino. I thoroughly enjoyed being able to use classes again. 🙂
Picture: (coming soon)
/* title: Etch-a-Sketch on C.H.I.P.
date: 5/15/2016
course: Physical Computing and Alternative Interfaces
author: Jasmine Pazer
email: jgp5980@rit.edu
*/
import processing.io.*;
PVector pos, moveBy;
RotaryEncoder rot1;
RotaryEncoder rot2;
void setup()
{
size(500, 500);
rot1 = new RotaryEncoder(408, 409);
rot2 = new RotaryEncoder(410, 411);
pos = new PVector(width/2, height/2);
strokeWeight(3);
}
void draw()
{
rot1.update();
rot2.update();
moveBy = new PVector(rot1.Move, rot2.Move);
line(pos.x, pos.y, pos.x + moveBy.x, pos.y + moveBy.y);
pos.add(moveBy);
println("pos: " + pos + " moveBy: " + moveBy); //print it out in the console
}
———–RotaryEncoder (class tab)————-
class RotaryEncoder {
int CLK;
int DT;
int rotation;
int value;
int Move;
RotaryEncoder(int clk, int dt) {
CLK = clk;
DT = dt;
GPIO.pinMode (CLK, GPIO.INPUT);
GPIO.pinMode (DT, GPIO.INPUT);
rotation = GPIO.digitalRead(CLK);
}
void update() {
Move = 0;
value = GPIO.digitalRead(CLK);
if (value != rotation) { // we use the DT pin to find out which way we turning.
if (GPIO.digitalRead(DT) != value) { // Clockwise
Move = 1;
} else { //Counterclockwise
Move = -1;
}
}
rotation = value;
}
}



