Schematics Programs, and Transducers
<-back to errata for Physical Computing.
MultiTasking (p191)
/* * The defines below allow you to normalize which way you build the circuit. * in general it is easier to pull and led current down than it is to source it. * also since the avr has built in pull ups you can do a normally open switch to * ground with less components. * */ #define INPUT_PIN 7 #define LED_PIN 8 #define LED_ON LOW #define LED_OFF HIGH #define SWITCH_ON LOW #define SWITCH_OFF HIGH bool needFlashingFlag; uint8_t timesFlashed; bool ledState; uint16_t counter =1; void setup() { pinMode (INPUT_PIN, INPUT); digitalWrite(INPUT_PIN, HIGH); // enable pullup. pinMode (LED_PIN, OUTPUT); digitalWrite(LED_PIN, LED_OFF); } void loop(){ if (digitalRead(INPUT_PIN)==SWITCH_ON) { needFlashingFlag=true; } if (needFlashingFlag) { counter-=1; if (!counter){ counter=1000; if (timesFlashed < 3) { if (ledState==LED_OFF) { timesFlashed += 1; ledState=LED_ON; digitalWrite(LED_PIN,ledState); } else { ledState=LED_OFF; digitalWrite(LED_PIN,ledState); } } else { timesFlashed=0; needFlashingFlag=false; counter=1; ledState=LED_OFF; digitalWrite(LED_PIN,ledState); } } } }
Edge Detection (p195):
#define INPUT_PIN 7 #define SWITCH_ON LOW #define SWITCH_OFF HIGH #include "debug.h" bool buttonState; bool lastButtonState; uint8_t buttonCount; void setup(){ pinMode(INPUT_PIN, INPUT);; digitalWrite(INPUT_PIN, HIGH); } void loop (){ buttonState=digitalRead(INPUT_PIN); if (buttonState != lastButtonState) { if (buttonState == SWITCH_ON) { buttonCount++; DEBUG("Button is pressed"); } else { DEBUG("Button is nos pressed"); DEBUG("Button hits: %d", buttonCount); } lastButtonState=buttonState; } }
Finding Peeks in an Analog Signal (P202)
#define ANALOG_PIN 0 #include "debug.h" uint16_t peakValue=0; uint16_t noise=7; uint16_t sensorValue; uint16_t lastSensorValue=0; uint16_t threshold=300; void setup(){ INIT_DEBUG(); } void loop (){ sensorValue=analogRead(ANALOG_PIN); DEBUG("%d",sensorValue); if (sensorValue>=threshold+noise){ if (sensorValue>=lastSensorValue+noise){ peakValue=sensorValue; } } else { if(peakValue >= threshold){ DEBUG("peak reading: %d", peakValue); } peakValue = 0; } lastSensorValue=sensorValue; }
Button Debouncing (P205)
#define SWITCH_ON LOW void setup () { pinMode(SWITCH_PIN, INPUT); digitalWrite(SWITCH_PIN, HIGH); } void loop(){ if(digitalRead(SWITCH_PIN) == SWITCH_ON){ delay(10); if(digitalRead(SWITCH_PIN) == SWITCH_ON) { switchOn=true; }else{ switchOn=false; } } }
Smoothing, Sampling, and Averaging(P207)
#define ANALOG_PIN 0 #define HISTORY_SIZE 4 #include "debug.h" uint8_t positionInPastArray=HISTORY_SIZE; uint16_t past[HISTORY_SIZE]; uint16_t sortedPast[HISTORY_SIZE]; uint16_t averageArray(); uint16_t medianArray(); void setup(){ INIT_DEBUG(); delay(500); } void loop (){ uint16_t temp; uint16_t average; uint16_t median; temp=analogRead(ANALOG_PIN); if (++positionInPastArray >= HISTORY_SIZE) { positionInPastArray=0; } past[positionInPastArray]=temp; average=averageArray(); median=medianArray(); DEBUG("Average = %d Median = %d", average,median); } uint16_t averageArray() { long int total = 0; int i; for (i=0;i<=HISTORY_SIZE;i++){ total+=past[i]; } return (uint16_t)(total/HISTORY_SIZE); } uint16_t medianArray() { long int total = 0; int i,j; int finger=-1; for (i=0;i<=HISTORY_SIZE;i++){ for (i=0;j<=HISTORY_SIZE;j++){ if (past[i]>=past[j]){ finger++; } } sortedPast[finger]=past[i]; } for (i=0;i<=HISTORY_SIZE;i++){ DEBUG("sortedPast[%d]=%d",i,sortedPast[i]); } return (uint16_t)sortedPast[HISTORY_SIZE/2]; }