From 11e623eadd103a5c2c12ca2691dbefb71876df94 Mon Sep 17 00:00:00 2001 From: prjmaurya <42910891+prjmaurya@users.noreply.github.com> Date: Thu, 19 Dec 2019 03:51:27 +0530 Subject: [PATCH 1/3] Update blind_stick.ino --- blind_stick.ino | 109 ++++++++++++++++++++++++------------------------ 1 file changed, 54 insertions(+), 55 deletions(-) diff --git a/blind_stick.ino b/blind_stick.ino index 633aa3e..a388a42 100644 --- a/blind_stick.ino +++ b/blind_stick.ino @@ -1,56 +1,55 @@ -/* -* Ultrasonic Sensor HC-SR04 and Arduino Tutorial -* -* by Dejan Nedelkovski, -* www.HowToMechatronics.com -* -*/ -// defines pins numbers -const int trigPin = 9; -const int echoPin = 10; -int buzzer = 11; -// defines variables -long duration; -int distance; -void setup() { -pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output -pinMode(echoPin, INPUT); // Sets the echoPin as an Input -pinMode(buzzer, OUTPUT); -Serial.begin(9600); // Starts the serial communication -} -void loop() { -// Clears the trigPin -digitalWrite(trigPin, LOW); -delayMicroseconds(2); -// Sets the trigPin on HIGH state for 10 micro seconds -digitalWrite(trigPin, HIGH); -delayMicroseconds(10); -digitalWrite(trigPin, LOW); -// Reads the echoPin, returns the sound wave travel time in microseconds -duration = pulseIn(echoPin, HIGH); -// Calculating the distance -distance= duration*0.034/2; -// Prints the distance on the Serial Monitor -Serial.print("Distance: "); -Serial.println(distance); -if(distance <= 100){ - tone(buzzer , 2000 , 500); -} -else if(distance <= 200){ - tone(buzzer , 2000 , 500); - delay(500); -} -else if(distance <= 300){ - tone(buzzer , 2000 , 500); - delay(1000); -} -else if(distance <= 400){ - tone(buzzer , 2000 , 500); - delay(1500); -} -//else{ -// digitalWrite(buzzer, LOW); -// delay(100); -//} - +//Ultrasonic Sensor HC-SR04 and Arduino are the major components used + +// defines pins numbers +const int trigPin = 9; +const int echoPin = 10; +int buzzer = 11; + +// defines variables +long duration; +int distance; + +void setup() { + pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output + pinMode(echoPin, INPUT); // Sets the echoPin as an Input + pinMode(buzzer, OUTPUT); //Sets the buzzer as an Output + Serial.begin(9600); // Starts the serial communication +} +void loop() { + + // Clears the trigPin + digitalWrite(trigPin, LOW); + delayMicroseconds(2); + + // Sets the trigPin on HIGH state for 10 micro seconds + digitalWrite(trigPin, HIGH); + delayMicroseconds(10); + digitalWrite(trigPin, LOW); + + // Reads the echoPin, returns the sound wave travel time in microseconds + duration = pulseIn(echoPin, HIGH); + + // Calculating the distance + distance= duration*0.034/2; + + // Prints the distance on the Serial Monitor + Serial.print("Distance: "); + Serial.println(distance); + + //According to the distance measured by sensor , the frequency of beep sound is modified + if(distance <= 100){ + tone(buzzer , 2000 , 500); + } + else if(distance <= 200){ + tone(buzzer , 2000 , 500); + delay(500); + } + else if(distance <= 300){ + tone(buzzer , 2000 , 500); + delay(1000); + } + else if(distance <= 400){ + tone(buzzer , 2000 , 500); + delay(1500); + } } From 4443d224ca859ec246ce6a06e7e743d2045d0325 Mon Sep 17 00:00:00 2001 From: prjmaurya <42910891+prjmaurya@users.noreply.github.com> Date: Thu, 19 Dec 2019 04:00:06 +0530 Subject: [PATCH 2/3] Update heart_rate_sensor.ino --- heart_rate_sensor.ino | 404 +++++++++++++++++++++--------------------- 1 file changed, 203 insertions(+), 201 deletions(-) diff --git a/heart_rate_sensor.ino b/heart_rate_sensor.ino index 8500938..821544d 100644 --- a/heart_rate_sensor.ino +++ b/heart_rate_sensor.ino @@ -1,202 +1,204 @@ -#include -int pulsePin = A0; // Pulse Sensor purple wire connected to analog pin A0 -int blinkPin = 13; // pin to blink led at each beat - -// Volatile Variables, used in the interrupt service routine! -volatile int BPM; // int that holds raw Analog in 0. updated every 2mS -volatile int Signal; // holds the incoming raw data -volatile int IBI = 600; // int that holds the time interval between beats! Must be seeded! -volatile boolean Pulse = false; // "True" when User's live heartbeat is detected. "False" when not a "live beat". -volatile boolean QS = false; // becomes true when Arduoino finds a beat. - -Servo servo_test; - -static boolean serialVisual = true; // Set to 'false' by Default. Re-set to 'true' to see Arduino Serial Monitor ASCII Visual Pulse - -volatile int rate[10]; // array to hold last ten IBI values -volatile unsigned long sampleCounter = 0; // used to determine pulse timing -volatile unsigned long lastBeatTime = 0; // used to find IBI -volatile int P = 512; // used to find peak in pulse wave, seeded -volatile int T = 512; // used to find trough in pulse wave, seeded -volatile int thresh = 525; // used to find instant moment of heart beat, seeded -volatile int amp = 100; // used to hold amplitude of pulse waveform, seeded -volatile boolean firstBeat = true; // used to seed rate array so we startup with reasonable BPM -volatile boolean secondBeat = false; // used to seed rate array so we startup with reasonable BPM - -void setup() -{ - servo_test.attach(3); - pinMode(blinkPin,OUTPUT); // pin that will blink to your heartbeat! - Serial.begin(115200); // we agree to talk fast! - interruptSetup(); // sets up to read Pulse Sensor signal every 2mS - // IF YOU ARE POWERING The Pulse Sensor AT VOLTAGE LESS THAN THE BOARD VOLTAGE, - // UN-COMMENT THE NEXT LINE AND APPLY THAT VOLTAGE TO THE A-REF PIN - // analogReference(EXTERNAL); -} - - -// Where the Magic Happens -void loop() -{ - serialOutput(); - - if (QS == true) // A Heartbeat Was Found - { - // BPM and IBI have been Determined - // Quantified Self "QS" true when arduino finds a heartbeat - serialOutputWhenBeatHappens(); // A Beat Happened, Output that to serial. - QS = false; // reset the Quantified Self flag for next time - } - - delay(20); // take a break -} - - -void interruptSetup() -{ - // Initializes Timer2 to throw an interrupt every 2mS. - TCCR2A = 0x02; // DISABLE PWM ON DIGITAL PINS 3 AND 11, AND GO INTO CTC MODE - TCCR2B = 0x06; // DON'T FORCE COMPARE, 256 PRESCALER - OCR2A = 0X7C; // SET THE TOP OF THE COUNT TO 124 FOR 500Hz SAMPLE RATE - TIMSK2 = 0x02; // ENABLE INTERRUPT ON MATCH BETWEEN TIMER2 AND OCR2A - sei(); // MAKE SURE GLOBAL INTERRUPTS ARE ENABLED -} - -void serialOutput() -{ // Decide How To Output Serial. - if (serialVisual == true) - { - arduinoSerialMonitorVisual('-', Signal); // goes to function that makes Serial Monitor Visualizer - } - else - { - sendDataToSerial('S', Signal); // goes to sendDataToSerial function - } -} - -void serialOutputWhenBeatHappens() -{ - if (serialVisual == true) // Code to Make the Serial Monitor Visualizer Work - { - Serial.print(" Heart-Beat Found "); //ASCII Art Madness - Serial.print("BPM: "); - Serial.println(BPM); - if(BPM > 120){ - servo_test.write(90); - } - else{ - servo_test.write(4); - } - } - else - { - sendDataToSerial('B',BPM); // send heart rate with a 'B' prefix - sendDataToSerial('Q',IBI); // send time between beats with a 'Q' prefix - } -} - -void arduinoSerialMonitorVisual(char symbol, int data ) -{ - const int sensorMin = 0; // sensor minimum, discovered through experiment - const int sensorMax = 1024; // sensor maximum, discovered through experiment - int sensorReading = data; // map the sensor range to a range of 12 options: - int range = map(sensorReading, sensorMin, sensorMax, 0, 11); - // do something different depending on the - // range value: -} - - -void sendDataToSerial(char symbol, int data ) -{ - Serial.print(symbol); - Serial.println(data); -} - -ISR(TIMER2_COMPA_vect) //triggered when Timer2 counts to 124 -{ - cli(); // disable interrupts while we do this - Signal = analogRead(pulsePin); // read the Pulse Sensor - sampleCounter += 2; // keep track of the time in mS with this variable - int N = sampleCounter - lastBeatTime; // monitor the time since the last beat to avoid noise - // find the peak and trough of the pulse wave - if(Signal < thresh && N > (IBI/5)*3) // avoid dichrotic noise by waiting 3/5 of last IBI - { - if (Signal < T) // T is the trough - { - T = Signal; // keep track of lowest point in pulse wave - } - } - - if(Signal > thresh && Signal > P) - { // thresh condition helps avoid noise - P = Signal; // P is the peak - } // keep track of highest point in pulse wave - - // NOW IT'S TIME TO LOOK FOR THE HEART BEAT - // signal surges up in value every time there is a pulse - if (N > 250) - { // avoid high frequency noise - if ( (Signal > thresh) && (Pulse == false) && (N > (IBI/5)*3) ) - { - Pulse = true; // set the Pulse flag when we think there is a pulse - digitalWrite(blinkPin,HIGH); // turn on pin 13 LED - IBI = sampleCounter - lastBeatTime; // measure time between beats in mS - lastBeatTime = sampleCounter; // keep track of time for next pulse - - if(secondBeat) - { // if this is the second beat, if secondBeat == TRUE - secondBeat = false; // clear secondBeat flag - for(int i=0; i<=9; i++) // seed the running total to get a realisitic BPM at startup - { - rate[i] = IBI; - } - } - - if(firstBeat) // if it's the first time we found a beat, if firstBeat == TRUE - { - firstBeat = false; // clear firstBeat flag - secondBeat = true; // set the second beat flag - sei(); // enable interrupts again - return; // IBI value is unreliable so discard it - } - // keep a running total of the last 10 IBI values - word runningTotal = 0; // clear the runningTotal variable - - for(int i=0; i<=8; i++) - { // shift data in the rate array - rate[i] = rate[i+1]; // and drop the oldest IBI value - runningTotal += rate[i]; // add up the 9 oldest IBI values - } - - rate[9] = IBI; // add the latest IBI to the rate array - runningTotal += rate[9]; // add the latest IBI to runningTotal - runningTotal /= 10; // average the last 10 IBI values - BPM = 60000/runningTotal; // how many beats can fit into a minute? that's BPM! - QS = true; // set Quantified Self flag - // QS FLAG IS NOT CLEARED INSIDE THIS ISR - } - } - - if (Signal < thresh && Pulse == true) - { // when the values are going down, the beat is over - digitalWrite(blinkPin,LOW); // turn off pin 13 LED - Pulse = false; // reset the Pulse flag so we can do it again - amp = P - T; // get amplitude of the pulse wave - thresh = amp/2 + T; // set thresh at 50% of the amplitude - P = thresh; // reset these for next time - T = thresh; - } - - if (N > 2500) - { // if 2.5 seconds go by without a beat - thresh = 512; // set thresh default - P = 512; // set P default - T = 512; // set T default - lastBeatTime = sampleCounter; // bring the lastBeatTime up to date - firstBeat = true; // set these to avoid noise - secondBeat = false; // when we get the heartbeat back - } - - sei(); // enable interrupts when youre done! -}// end isr +#include //Header file to use predefined functions for Servo motor +int pulsePin = A0; // Pulse Sensor purple wire connected to analog pin A0 +int blinkPin = 13; // pin to blink led at each beat + +// Volatile Variables, used in the interrupt service routine! +volatile int BPM; // int that holds raw Analog in 0. updated every 2mS +volatile int Signal; // holds the incoming raw data +volatile int IBI = 600; // int that holds the time interval between beats! Must be seeded! +volatile boolean Pulse = false; // "True" when User's live heartbeat is detected. "False" when not a "live beat". +volatile boolean QS = false; // becomes true when Arduoino finds a beat. + +Servo servo_test; + +static boolean serialVisual = true; // Set to 'false' by Default. Re-set to 'true' to see Arduino Serial Monitor ASCII Visual Pulse + +volatile int rate[10]; // array to hold last ten IBI values +volatile unsigned long sampleCounter = 0; // used to determine pulse timing +volatile unsigned long lastBeatTime = 0; // used to find IBI +volatile int P = 512; // used to find peak in pulse wave, seeded +volatile int T = 512; // used to find trough in pulse wave, seeded +volatile int thresh = 525; // used to find instant moment of heart beat, seeded +volatile int amp = 100; // used to hold amplitude of pulse waveform, seeded +volatile boolean firstBeat = true; // used to seed rate array so we startup with reasonable BPM +volatile boolean secondBeat = false; // used to seed rate array so we startup with reasonable BPM + +void setup() +{ + servo_test.attach(3); // pin that will give control signals to servo motor + pinMode(blinkPin,OUTPUT); // pin that will blink to your heartbeat! + Serial.begin(115200); // we agree to talk fast! + interruptSetup(); // sets up to read Pulse Sensor signal every 2mS + // IF YOU ARE POWERING The Pulse Sensor AT VOLTAGE LESS THAN THE BOARD VOLTAGE, + // UN-COMMENT THE NEXT LINE AND APPLY THAT VOLTAGE TO THE A-REF PIN + // analogReference(EXTERNAL); +} + + +// Where the Magic Happens +void loop() +{ + serialOutput(); + + if (QS == true) // A Heartbeat Was Found + { + // BPM and IBI have been Determined + // Quantified Self "QS" true when arduino finds a heartbeat + serialOutputWhenBeatHappens(); // A Beat Happened, Output that to serial. + QS = false; // reset the Quantified Self flag for next time + } + + delay(20); // take a break (in microseconds) +} + + +void interruptSetup() +{ + // Initializes Timer2 to throw an interrupt every 2mS. + TCCR2A = 0x02; // DISABLE PWM ON DIGITAL PINS 3 AND 11, AND GO INTO CTC MODE + TCCR2B = 0x06; // DON'T FORCE COMPARE, 256 PRESCALER + OCR2A = 0X7C; // SET THE TOP OF THE COUNT TO 124 FOR 500Hz SAMPLE RATE + TIMSK2 = 0x02; // ENABLE INTERRUPT ON MATCH BETWEEN TIMER2 AND OCR2A + sei(); // MAKE SURE GLOBAL INTERRUPTS ARE ENABLED +} + +void serialOutput() +{ // Decide How To Output Serial. + if (serialVisual == true) + { + arduinoSerialMonitorVisual('-', Signal); // goes to function that makes Serial Monitor Visualizer + } + else + { + sendDataToSerial('S', Signal); // goes to sendDataToSerial function + } +} + +void serialOutputWhenBeatHappens() +{ + if (serialVisual == true) // Code to Make the Serial Monitor Visualizer Work + { + Serial.print(" Heart-Beat Found "); //ASCII Art Madness + Serial.print("BPM: "); + + //According to values of BPM measured , the attached servo motor is controlled(which is attached to a syringe) + Serial.println(BPM); + if(BPM > 120){ + servo_test.write(90); // makes angle of servo motor as 90 degree + } + else{ + servo_test.write(4); // makes angle of servo motor as 4 degree + } + } + else + { + sendDataToSerial('B',BPM); // send heart rate with a 'B' prefix + sendDataToSerial('Q',IBI); // send time between beats with a 'Q' prefix + } +} + +void arduinoSerialMonitorVisual(char symbol, int data ) +{ + const int sensorMin = 0; // sensor minimum, discovered through experiment + const int sensorMax = 1024; // sensor maximum, discovered through experiment + int sensorReading = data; // map the sensor range to a range of 12 options: + int range = map(sensorReading, sensorMin, sensorMax, 0, 11); + // do something different depending on the + // range value: +} + + +void sendDataToSerial(char symbol, int data ) +{ + Serial.print(symbol); + Serial.println(data); +} + +ISR(TIMER2_COMPA_vect) //triggered when Timer2 counts to 124 +{ + cli(); // disable interrupts while we do this + Signal = analogRead(pulsePin); // read the Pulse Sensor + sampleCounter += 2; // keep track of the time in mS with this variable + int N = sampleCounter - lastBeatTime; // monitor the time since the last beat to avoid noise + // find the peak and trough of the pulse wave + if(Signal < thresh && N > (IBI/5)*3) // avoid dichrotic noise by waiting 3/5 of last IBI + { + if (Signal < T) // T is the trough + { + T = Signal; // keep track of lowest point in pulse wave + } + } + + if(Signal > thresh && Signal > P) + { // thresh condition helps avoid noise + P = Signal; // P is the peak + } // keep track of highest point in pulse wave + + // NOW IT'S TIME TO LOOK FOR THE HEART BEAT + // signal surges up in value every time there is a pulse + if (N > 250) + { // avoid high frequency noise + if ( (Signal > thresh) && (Pulse == false) && (N > (IBI/5)*3) ) + { + Pulse = true; // set the Pulse flag when we think there is a pulse + digitalWrite(blinkPin,HIGH); // turn on pin 13 LED + IBI = sampleCounter - lastBeatTime; // measure time between beats in mS + lastBeatTime = sampleCounter; // keep track of time for next pulse + + if(secondBeat) + { // if this is the second beat, if secondBeat == TRUE + secondBeat = false; // clear secondBeat flag + for(int i=0; i<=9; i++) // seed the running total to get a realisitic BPM at startup + { + rate[i] = IBI; + } + } + + if(firstBeat) // if it's the first time we found a beat, if firstBeat == TRUE + { + firstBeat = false; // clear firstBeat flag + secondBeat = true; // set the second beat flag + sei(); // enable interrupts again + return; // IBI value is unreliable so discard it + } + // keep a running total of the last 10 IBI values + word runningTotal = 0; // clear the runningTotal variable + + for(int i=0; i<=8; i++) + { // shift data in the rate array + rate[i] = rate[i+1]; // and drop the oldest IBI value + runningTotal += rate[i]; // add up the 9 oldest IBI values + } + + rate[9] = IBI; // add the latest IBI to the rate array + runningTotal += rate[9]; // add the latest IBI to runningTotal + runningTotal /= 10; // average the last 10 IBI values + BPM = 60000/runningTotal; // how many beats can fit into a minute? that's BPM! + QS = true; // set Quantified Self flag + // QS FLAG IS NOT CLEARED INSIDE THIS ISR + } + } + + if (Signal < thresh && Pulse == true) + { // when the values are going down, the beat is over + digitalWrite(blinkPin,LOW); // turn off pin 13 LED + Pulse = false; // reset the Pulse flag so we can do it again + amp = P - T; // get amplitude of the pulse wave + thresh = amp/2 + T; // set thresh at 50% of the amplitude + P = thresh; // reset these for next time + T = thresh; + } + + if (N > 2500) + { // if 2.5 seconds go by without a beat + thresh = 512; // set thresh default + P = 512; // set P default + T = 512; // set T default + lastBeatTime = sampleCounter; // bring the lastBeatTime up to date + firstBeat = true; // set these to avoid noise + secondBeat = false; // when we get the heartbeat back + } + + sei(); // enable interrupts when youre done! +}// end isr From 804e57a3e8d8390f3e0f843624cfdd4c3dbbf531 Mon Sep 17 00:00:00 2001 From: prjmaurya <42910891+prjmaurya@users.noreply.github.com> Date: Thu, 19 Dec 2019 04:11:55 +0530 Subject: [PATCH 3/3] Update hydroffice.ino --- hydroffice.ino | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/hydroffice.ino b/hydroffice.ino index ab827b9..5e9e343 100644 --- a/hydroffice.ino +++ b/hydroffice.ino @@ -1,22 +1,24 @@ +// code for hydro-office + void setup() { - pinMode(A4,INPUT); - pinMode(A5,INPUT); - pinMode(11,OUTPUT); - Serial.begin(9600); + pinMode(A4,INPUT); // sets A4 pin as input pin + pinMode(A5,INPUT); // sets A5 pin as input pin + pinMode(11,OUTPUT); // sets 11 pin as output + Serial.begin(9600); // Sets the data rate in bits per second (baud) for serial data transmission } void loop() { - int value1=analogRead(A4); - int value2=analogRead(A5); - Serial.println(value1); - delay(1000); - //Serial.println(value2); + // initializing variables with analog values sensed by the sensor + int value1=analogRead(A4); + int value2=analogRead(A5); + Serial.println(value1); // prints value1 on Serial monitor + delay(1000); // creates a delay of 1 second if(value2>1000) //max value - digitalWrite(11,HIGH); + digitalWrite(11,HIGH); // pump connected to relay if(value1<800) //min value digitalWrite(11,LOW); // pump connected to relay