Final Project Code
Final Project Code
// TMP36 Pin V a r i a b l e s
int sensorPin = 0;
// t h e a n a l o g p i n t h e TMP36 s Vout ( s e n s e ) p i n i s c o n n e c t e d t o
// t h e r e s o l u t i o n i s 10 mV / d e g r e e c e n t i g r a d e with a 500 mV o f f s e t t o
allow f o r negative temperatures
/
s e t u p ( ) t h i s f u n c t i o n r u n s once when you t u r n your Arduino on
We i n i t i a l i z e t h e s e r i a l c o n n e c t i o n with t h e computer
/
void setup ( )
{
S e r i a l . begin (9600) ;
}
// run o v e r and o v e r a g a i n
void loop ( )
1
f l o a t tempArray [ 2 0 0 ] ;
int i = 0;
f o r ( i = 0 ; i < 2 0 0 ; i ++) {
// g e t t i n g t h e v o l t a g e r e a d i n g from t h e t e m p e r a t u r e s e n s o r
i n t r e a d i n g = analogRead (A0) ;
// c o n v e r t i n g t h a t r e a d i n g t o v o l t a g e
f l o a t voltage = reading 5 . 0 ;
v o l t a g e /= 1 0 2 4 . 0 ;
// p r i n t out t h e v o l t a g e
Serial . print ( voltage ) ; Serial . println ( volts ) ;
// now p r i n t out t h e t e m p e r a t u r e
// c o n v e r t i n g from 10 mv p e r d e g r e e with 500 mV o f f s e t t o d e g r e e s ( ( v o l t a g e
500mV) t i m e s 1 0 0 )
f l o a t temperatureC = ( v o l t a g e 0 . 5 ) 100 ;
// S e r i a l . p r i n t ( temperatureC ) ; S e r i a l . p r i n t l n ( d e g r e e s C ) ;
// now c o n v e r t t o F a h r e n h e i t
f l o a t temperatureF = ( temperatureC 9 . 0 / 5 . 0 ) + 3 2 . 0 ;
S e r i a l . p r i n t ( temperatureF ) ; S e r i a l . p r i n t l n ( d e g r e e s F ) ;
tempArray [ i ] = temperatureF ;
// w a i t i n g . 1 s e c o n d s
delay (100) ;
int criticalPoint [ 7 ] ;
// S e t a c o n d i t o n t h a t d e s c r i b e s t h e b e h a v i o r o f t h e data
boolean i s I n c r e a s i n g ;
// An a l t e r n a t e i n d e x f o r t h e c r i t i c a l p o i n t a r r a y
int k ;
// The t e m p e r a t u r e i n a i r f l o w p a s t t h e t e m p e r a t u r e s e n s o r c o r r e s p o n d s t o t h e
respiratory cycle .
// For each i n h a l e , a i r w i l l r u s h o v e r t h e s e n s o r , c o o l i n g i t o f f , w h i l e f o r
each e x h a l e , a i r
2
// t h a t has been warmed by t h e body w i l l f l o w o v e r t h e s e n s o r , c a u s i n g i t t o
warm up . We would
// e x p e c t t h i s data t o a c t r o u g h l y l i k e a s i n e o r c o s i n e wave . So , i n o r d e r
t o a n a l y z e t h e amount
// o f b r e a t h taken i n a g i v e n p e r i o d o f time , I thought t h a t i t would be
c l e v e r t o f i n d t h e peaks
// and t r o u g h s o f each o f t h e s i n e waves c a t a l o g u e t h e i n d e x a t where t h i s
data p o i n t o c c u r s .
// Then , I would c o n s i d e r e v e r y o t h e r p o i n t a t which t h i s o c c u r s s o a s t o
o n l y c o n s i d e r peaks o r
// t r o u g h s , two o f which c o n s t i t u t e a p e r i o d , o r a f u l l b r e a t h c y c l e .
Because t h e data were
// taken a r e g u l a r i n t e r v a l s , i t i s e a s y t o c o n v e r t t h e d i f f e r e n c e i n i n d i c e s
to a d i f f e r e n c e
// i n time . This i s t h e s e c t i o n o f code t h a t I had h e l p with . I d i d not
know any C++ u n t i l
// about a week b e f o r e t h i s p r o j e c t and I hadn t had t o do any i n t e n s e
programming i n about a y e a r .
while ( true )
{
i f ( tempArray [ i ] < tempArray [ i + 1 ] ) {
isIncreasing = true ;
break ;
}
i f ( tempArray [ i ] > tempArray [ i + 1 ] ) {
isIncreasing = false ;
break ;
}
i f ( tempArray [ i ] == tempArray [ i + 1 ] ) {
i = i + 1;
}
}
f o r ( i n t i = 1 ; i < 2 0 0 ; i ++)
{
3
// i s In c r e as i n g = true ;}
//
// i f ( tempArray [ i 1 ] > tempArray [ i ] ) {
// isIncreasing = false ;}
//
// i f ( tempArray [ i + 1 ] < tempArray [ i ] ) {
// isIncreasing = false ;}
//
// i f ( tempArray [ i + 1 ] > tempArray [ i ] ) {
// i s In c r e as i n g = true ;
// }
// }
// Here s t h e good s t u f f .
// This p r o c e s s t u r n e d out t o be a b i t s i m p l e r than my f i r s t attempt above .
// So , i n o r d e r t o f i n d a c r i t i c a l p o i n t , t h e r e a r e two c o n d i t i o n s t h a t
must apply
// I s t h e data i n c r e a s i n g / d e c r e a s i n g ?
// and
// Do we e x p e c t t h e data t o i n c r e a s e / d e c r e a s e ?
// For example , i f t h e s i n e wave i n i n c r e a s i n g , and we e x p e c t t h e next
data p o i n t
// t o d e c r e a s e , then we have found one o f our p o i n t s o f i n t e r e s t .
if ( i != 0 )
i f ( k >= 7 )
4
// i f ( c r i t i c a l P o i n t . s i z e == 7 )
break ;
}
}
// Averaging the p e r i o d s .
float period1 = criticalPoint [3] criticalPoint [1];
float period2 = criticalPoint [5] criticalPoint [3];
float period3 = criticalPoint [7] criticalPoint [5];
// I used t h e a b s o l u t e v a l u e f u n c t i o n b e c a u s e I kept g e t t i n g n e g a t i v e
numbers f o r some r e a s o n
// C o n v e r t i n g t o time !
f l o a t timePeriod = avgPeriod . 1 ;
S e r i a l . p r i n t l n ( timePeriod ) ;
// C o n v e r t i n g p e r i o d t o f r e q u e n c y !
f l o a t frequency = ( 1 . 0 / timePeriod ) 1000;
// Report f r e q u e n c y t o u s e r !
S e r i a l . p r i n t ( frequency , 10) ; S e r i a l . p r i n t l n ( breaths per second ) ;
// Aaaaaand we r e done .
// Again s p e c i a l thanks t o August D a i l e y f o r h e l p i n g out with t h e l o g i c .
return ;
}