Announcements
Framing Workshop
There will be a Workshop on Making Frames next week, on Friday, February 6th from 10 a.m. until 12 noon. It will take place at the woodshop Baskin C-101.
The workshop will include the basic construction of wood frames using solid milled lumber, and other general aspects of picture framing. Open to all students
Code Examples
Update to delay-free timing 03
Download delay-free_timing03.txt file
// Delay-Free Timing 03
//
// In this case, we will set up a bunch of independent timers
// And, we'll use only one function instead of 6!
// Set variables
// Set up three timers, each with a different offset to check against.
long timer1 = 0;
int timer1offset = 1000;
long timer2 = 0;
int timer2offset = 900;
long timer3 = 0;
int timer3offset = 800;
long timer4 = 0;
int timer4offset = 700;
long timer5 = 0;
int timer5offset = 600;
long timer6 = 0;
int timer6offset = 500;
// Setup pins
int ledPin1 = 11; // Note: needed to change the number of the pins
int ledPin2 = 10; // from Delay-Free Timing 02, but the idea is the same.
int ledPin3 = 9;
int ledPin4 = 6;
int ledPin5 = 5;
int ledPin6 = 3;
void setup() { // The standard stuff...
Serial.begin(9600); // Setup the serial communications so we can debug
// Save some vertical space by combining lines
pinMode(ledPin1, OUTPUT); pinMode(ledPin2, OUTPUT); pinMode(ledPin3, OUTPUT);
pinMode(ledPin4, OUTPUT); pinMode(ledPin5, OUTPUT); pinMode(ledPin6, OUTPUT);
timer1 = millis(); timer2 = millis(); timer3 = millis();
timer4 = millis(); timer5 = millis(); timer6 = millis();
// Start with all pins on
digitalWrite(ledPin1,HIGH); digitalWrite(ledPin2,HIGH); digitalWrite(ledPin3,HIGH);
digitalWrite(ledPin4,HIGH); digitalWrite(ledPin5,HIGH); digitalWrite(ledPin6,HIGH);
}
// Das Loop...
void loop() {
if((timer1 + timer1offset) < millis() ) { //Timer 1
doLED(ledPin1);
timer1 = millis();
}
if((timer2 + timer2offset) < millis() ) { //Timer 2
doLED(ledPin2);
timer2 = millis();
}
if((timer3 + timer3offset) < millis() ) { //Timer 3
doLED(ledPin3);
timer3 = millis();
}
if((timer4 + timer4offset) < millis() ) { //Timer 4
doLED(ledPin4);
timer4 = millis();
}
if((timer5 + timer5offset) < millis() ) { //Timer 5
doLED(ledPin5);
timer5 = millis();
}
if((timer6 + timer6offset) < millis() ) { //Timer 6
doLED(ledPin6);
timer6 = millis();
}
}
// The doLED functions
void doLED(int whichLED) {
Serial.print("LED");Serial.print(whichLED);Serial.print(": ");
Serial.println(!digitalRead(whichLED));
digitalWrite(whichLED,!digitalRead(whichLED));
}
Timer/ Fader
Download timer-fader01.txt file
// Timer/Fader 01
//
// A delay-free timer for a single LED that fades in and out
// Timer variables
long timer = 0;
int offset = 10; // Change this for faster or slower fades
// Pin variable
int pwm = 11;
// Direction variable
int upDown = 1;
// pwm value holding variable
int val1 = 0;
//Setup
void setup() { // The standard stuff...
Serial.begin(9600); // Setup the serial communications so we can debug
pinMode(pwm, OUTPUT);
timer = millis();
}
// Das Loop...
void loop() {
// Timer
if((timer + offset) < millis() ) {
doFade();
timer = millis();
}
}
// Fade function
void doFade() {
if(val1 >= 50) { upDown = -1; } // The LED on my board only appears to be getting
if(val1 <= 0) { upDown = 1; } // brighter on pwm values up to 50 (out of 255)
val1 = val1 + ( 1 * upDown); // so, I've set the max value to change the direction
analogWrite(pwm, val1); // to 50.
}
Download timer-fader02.txt file
// Timer/Fader 02
//
// A delay-free timer for a single LED that fades in and out
// and cascades 6 faders
// Timer variables
long timer1 = 0; long timer2 = 0; long timer3 = 0;
long timer4 = 0; long timer5 = 0; long timer6 = 0;
int offset = 10; // Change this for faster or slower fades
// Pin variables
int pwm1 = 11; int pwm2 = 10; int pwm3 = 9;
int pwm4 = 6; int pwm5 = 5; int pwm6 = 3;
// Direction variable
int upDown1 = 1; int upDown2 = 1; int upDown3 = 1;
int upDown4 = 1; int upDown5 = 1; int upDown6 = 1;
// pwm value holding variable
int val1 = 1; int val2 = 1; int val3 = 1;
int val4 = 1; int val5 = 1; int val6 = 1;
// flag variables
boolean flag1 = 0; boolean flag2 = 0; boolean flag3 = 0;
boolean flag4 = 0; boolean flag5 = 0; boolean flagDoOver = 0;
//Setup
void setup() { // The standard stuff...
Serial.begin(9600); // Setup the serial communications so we can debug
pinMode(pwm1,OUTPUT); pinMode(pwm2,OUTPUT); pinMode(pwm3,OUTPUT);
pinMode(pwm4,OUTPUT); pinMode(pwm5,OUTPUT); pinMode(pwm6,OUTPUT);
timer1 = millis();
}
// Das Loop...
void loop() {
// Timer
if( (timer1 + offset) < millis() ) {
doFade1();
timer1 = millis();
}
if(flagDoOver) {
resetFade();
}
}
// Reset Fade Function
void resetFade() {
Serial.println("Resetting fade...");
// pwm value variables
val1 = 1; val2 = 1; val3 = 1;
val4 = 1; val5 = 1; val6 = 1;
// Direction variables
upDown1 = 1; upDown2 = 1; upDown3 = 1;
upDown4 = 1; upDown5 = 1; upDown6 = 1;
// flag variables
flag1 = 0; flag2 = 0; flag3 = 0;
flag4 = 0; flag5 = 0; flagDoOver = 0;
}
// Fade function
void doFade1() {
if(val1 >= 70) { upDown1 = -1; }
if(val1 <= 0) { upDown1 = 0; }
if(val1 == 30) { flag1 = 1; }
val1 = val1 + ( 1 * upDown1);
analogWrite(pwm1, val1);
if(flag1) {
if(val2 >= 70) { upDown2 = -1; }
if(val2 <= 0) { upDown2 = 0; }
if(val2 == 30) { flag2 = 1; }
val2 = val2 + ( 1 * upDown2);
analogWrite(pwm2, val2);
}
if(flag2) {
if(val3 >= 70) { upDown3 = -1; }
if(val3 <= 0) { upDown3 = 0; }
if(val3 == 30) { flag3 = 1; }
val3 = val3 + ( 1 * upDown3);
analogWrite(pwm3, val3);
}
if(flag3) {
if(val4 >= 70) { upDown4 = -1; }
if(val4 <= 0) { upDown4 = 0; }
if(val4 == 30) { flag4 = 1; }
val4 = val4 + ( 1 * upDown4);
Serial.println(val4);
analogWrite(pwm4, val4);
}
if(flag4) {
if(val5 >= 70) { upDown5 = -1; }
if(val5 <= 0) { upDown5 = 0; }
if(val5 == 30) { flag5 = 1; }
val5 = val5 + ( 1 * upDown5);
analogWrite(pwm5, val5);
}
if(flag5) {
if(val6 >= 70) { upDown6 = -1; }
if(val6 <= 0) {
upDown6 = 0;
flagDoOver = 1;
}
val6 = val6 + ( 1 * upDown6);
analogWrite(pwm6, val6);
}
}
Adding Interactivity
Download interactive_timer-fader01.txt file
// Interactive Timer/Fader 01
//
// A delay-free timer for a single LED that fades in and out
// and cascades 6 faders.
// Added a switch to reset and added a poteniometer to
// change the timing.
// Timer variables
long timer1 = 0; long timer2 = 0; long timer3 = 0;
long timer4 = 0; long timer5 = 0; long timer6 = 0;
int offset = 10; // Change this for faster or slower fades
// Pin variables
int pwm1 = 11; int pwm2 = 10; int pwm3 = 9;
int pwm4 = 6; int pwm5 = 5; int pwm6 = 3;
// Direction variable
int upDown1 = 1; int upDown2 = 1; int upDown3 = 1;
int upDown4 = 1; int upDown5 = 1; int upDown6 = 1;
// pwm value holding variable
int val1 = 1; int val2 = 1; int val3 = 1;
int val4 = 1; int val5 = 1; int val6 = 1;
// flag variables
boolean flag1 = 0; boolean flag2 = 0; boolean flag3 = 0;
boolean flag4 = 0; boolean flag5 = 0;
boolean constantOn = 0;
//Setup
void setup() { // The standard stuff...
Serial.begin(9600); // Setup the serial communications so we can debug
timer1 = millis();
// Set the pin for the digital switch to INPUT
pinMode(12,INPUT);
// Set pinModes for PWMs
pinMode(pwm1,OUTPUT); pinMode(pwm2,OUTPUT); pinMode(pwm3,OUTPUT);
pinMode(pwm4,OUTPUT); pinMode(pwm5,OUTPUT); pinMode(pwm6,OUTPUT);
}
// Das Loop...
void loop() {
// Timer
if( (timer1 + offset) < millis() ) {
doFade1();
timer1 = millis();
}
// DIGITAL SWITCH
if(!digitalRead(12)) {
constantOn = 0;
resetFade();
}
// ANALOG SWITCH
if(analogRead(1)>1000) {
constantOn = 1;
}
// EXPERIMENT WITH DIFFERENT SENSORS
// Use one of the following senors to modify the
// value of "offset", and thereby make the LED's
// flash faster or slower
// POTENTIOMETER
// This pot has a range from ~650 to 1023.
// Serial.println(analogRead(2));[
// Change that to a range from 0 to 50 or so
// then set offset to change the fade timer
// offset = (analogRead(2) - 650)/10;
// PHOTORESISTOR
// This photoresistor has a range from ~10 to ~225.
// Serial.println(analogRead(4));
// Change that range to 1 to 10 or so
// offset = analogRead(4)/20;
}
// Reset Fade Function
void resetFade() {
Serial.println("Resetting fade...");
// pwm value variables
val1 = 1; val2 = 1; val3 = 1;
val4 = 1; val5 = 1; val6 = 1;
// Direction variables
upDown1 = 1; upDown2 = 1; upDown3 = 1;
upDown4 = 1; upDown5 = 1; upDown6 = 1;
// flag variables
flag1 = 0; flag2 = 0; flag3 = 0;
flag4 = 0; flag5 = 0;
}
// Fade function
void doFade1() {
if(val1 >= 70) { upDown1 = -1; }
if(val1 <= 0) { upDown1 = 0; }
if(val1 == 30) { flag1 = 1; }
val1 = val1 + ( 1 * upDown1);
analogWrite(pwm1, val1);
if(flag1) {
if(val2 >= 70) { upDown2 = -1; }
if(val2 <= 0) { upDown2 = 0; }
if(val2 == 30) { flag2 = 1; }
val2 = val2 + ( 1 * upDown2);
analogWrite(pwm2, val2);
}
if(flag2) {
if(val3 >= 70) { upDown3 = -1; }
if(val3 <= 0) { upDown3 = 0; }
if(val3 == 30) { flag3 = 1; }
val3 = val3 + ( 1 * upDown3);
analogWrite(pwm3, val3);
}
if(flag3) {
if(val4 >= 70) { upDown4 = -1; }
if(val4 <= 0) { upDown4 = 0; }
if(val4 == 30) { flag4 = 1; }
val4 = val4 + ( 1 * upDown4);
analogWrite(pwm4, val4);
}
if(flag4) {
if(val5 >= 70) { upDown5 = -1; }
if(val5 <= 0) { upDown5 = 0; }
if(val5 == 30) { flag5 = 1; }
val5 = val5 + ( 1 * upDown5);
analogWrite(pwm5, val5);
}
if(flag5) {
if(val6 >= 70) { upDown6 = -1; }
if(val6 <= 0) {
upDown6 = 0;
if(constantOn){
resetFade();
}
}
val6 = val6 + ( 1 * upDown6);
analogWrite(pwm6, val6);
}
}
Download if-then_interactivity01.txt file
// IF-THEN INTERACTIVITY 01
//
// Testing for a value as it changes to
// trigger interativity
// pin variable
int p1 = 11; // These can be anything we want. my board
int p2 = 10; // just happens to be set up with PWM pins...
int p3 = 9;
int p4 = 6;
int p5 = 5;
int p6 = 3;
// variables to hold values to test for
int lightVal = 0;
int minVal = 70; // Last time I tested, my range from the
int maxVal = 240; // photoresistor was 70 to 245. I'll use
// these min and max variables to divide
// the lightVal into 6 even parts
//Setup
void setup() {
Serial.begin(9600);
// Set pins to output
pinMode(p1, OUTPUT); pinMode(p2, OUTPUT); pinMode(p3, OUTPUT);
pinMode(p4 ,OUTPUT); pinMode(p5 ,OUTPUT); pinMode(p6, OUTPUT);
}
// Das Loop...
void loop() {
// On every loop, read the value of the lignt sensor on analog
// pin 4. I know that with my hardware setup I get values from
// around 70 to 245.
lightVal = analogRead(4);
Serial.println(lightVal);
// Test for increasing values and turn on the six lights as they get higher.
// LED 1
if(lightVal - minVal > maxVal/6) {
digitalWrite(p1,HIGH);
}else{
digitalWrite(p1,LOW);
}
// LED 2
if(lightVal - minVal > ((maxVal - minVal) * 2)/6) {
digitalWrite(p2,HIGH);
}else{
digitalWrite(p2,LOW);
}
// LED 3
if(lightVal - minVal > ((maxVal - minVal) * 3)/6) {
digitalWrite(p3,HIGH);
}else{
digitalWrite(p3,LOW);
}
// LED 4
if(lightVal - minVal > ((maxVal - minVal) * 4)/6) {
digitalWrite(p4,HIGH);
}else{
digitalWrite(p4,LOW);
}
// LED 5
if(lightVal - minVal > ((maxVal - minVal) * 5)/6) {
digitalWrite(p5,HIGH);
}else{
digitalWrite(p5,LOW);
}
// LED 6
if(lightVal - minVal > (maxVal - minVal)) {
digitalWrite(p6,HIGH);
}else{
digitalWrite(p6,LOW);
}
}