0

For my project, I have 3 ultrasonic sensors and 3 vibrating motors; the motors need to buzz for a small amount of time, then wait for a specific time that corresponds whith the range of the ultrasonic sensor, then muzz again.

The problem I'm having is that I used delays at first but that would cause the third motor only to buzz after the first two already waited.

I basically need something like "digitalWrite(motorPin_1, HIGH) for X amount of time;" and at the same moment it has to start "digitalWrite(motorPin_2, HIGH) for X amount of time;".

Sadly I can't get the motors to vibrate any softer or harder, so I use these intervals.

jfpoilpret
9,1627 gold badges38 silver badges54 bronze badges
asked Mar 7, 2015 at 14:50
2
  • Did you check the Blink Without Delay Arduino tutorial? Commented Mar 7, 2015 at 16:24
  • oh, thanks i had no idea it was so simple. with the blink it works just as i wanted! :) Commented Mar 7, 2015 at 18:51

1 Answer 1

0

Like Edgar commented, you need to check out Blink Without Delay (http://arduino.cc/en/Tutorial/BlinkWithoutDelay). Learn what they are doing and you will get this just fine.

Also, I recommend you learn to use libraries. This library can do exactly what you are asking for: http://playground.arduino.cc/Main/LibraryList#Timing --> click on the "Timer" library by Simon Monk & J Christensen. Follow the examples there. This library works great!

Here is a complete set of code to answer your question. It should work perfectly for you.

/*
buzz3Motors.ino
By Gabriel Staples
http://electricrcaircraftguy.blogspot.com/
7 March 2015
To help this person here: http://arduino.stackexchange.com/questions/9089/vibriting-motors-with-different-intervals
*/
#include "Timer.h"
Timer t;
boolean buzzMotor1Now = false, buzzMotor2Now = false, buzzMotor3Now = false;
unsigned int buzzTime = 1000; //ms
byte buzzPin1 = 11;
byte buzzPin2 = 12;
byte buzzPin3 = 13;
void setup()
{
 //set pins to outputs
 pinMode(buzzPin1, OUTPUT);
 pinMode(buzzPin2, OUTPUT);
 pinMode(buzzPin3, OUTPUT);
}
void loop()
{
 //UPDATE YOUR BUZZMOTOR BOOLEANS HERE, and set to true if necessary
 /**
 * This method will generate a pulse of pulseValue, starting immediately and of
 * length period. The pin will be left in the !pulseValue state
 */
 //Function format: int8_t pulseImmediate(uint8_t pin, unsigned long period, uint8_t pulseValue);
 //see here: https://github.com/JChristensen/Timer/blob/master/Timer.h
 if (buzzMotor1Now==true)
 {
 buzzMotor1Now = false; //reset
 t.pulseImmediate(buzzPin1,buzzTime,HIGH);
 }
 if (buzzMotor2Now==true)
 {
 buzzMotor2Now = false; //reset
 t.pulseImmediate(buzzPin2,buzzTime,HIGH);
 }
 if (buzzMotor3Now==true)
 {
 buzzMotor3Now = false; //reset
 t.pulseImmediate(buzzPin3,buzzTime,HIGH);
 }
 t.update(); //update all timer events
}

Note that only 10 timer events can be ongoing at any given time. If you want to have more you must increase the MAX_NUMBER_OF_EVENTS value in the Timer.h (https://github.com/JChristensen/Timer/blob/master/Timer.h) file.

PS. Also look into the "oscillate", "after", "every", and "pulse" functions, that the library also supports.

If this answer meets your needs please mark the green check beside it to indicate accepted answer. Thanks.

answered Mar 7, 2015 at 18:08
1
  • you are completely right, the timer library works great, thanks for your replie. :p Commented Mar 7, 2015 at 18:52

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.