How to make the vibration sound only when the sensor measurement value is maintained for a certain period of time

The value measured by the ultrasonic sensor is displayed as object detection or non-detection based on 10cm, and vibration occurs when an object is detected. How can I make it vibrate from when this object detection stays for 20 seconds?(sry the language may be strange using a translator....)

You need an extra global variable to record the milliseconds from 1970 (study the clock docs) of when the last non-sounding reading arrived followed by a sounding level.

Subtract that from Clock1.Systemtime to get the current sounding streak length in milliseconds.

Use another variable for prior reading to help detect the transition.

You also need this advice...

Be sure to use println() at the end of each message to send from the sending device, to signal end of message.

Only use print() in the middle of a message.

Be sure not to println() in the middle of a message, or you will break it into two short messages and mess up the item count after you split the message in AI2.

Do not rely on timing for this, which is unreliable.

In the AI2 Designer, set the Delimiter attribute of the BlueTooth Client component to 10 to recognize the End of Line character.
Also, return data is not immediately available after sending a request,
you have to start a Clock Timer repeating and watch for its arrival in the Clock Timer event. The repeat rate of the Clock Timer should be faster than the transmission rate in the sending device, to not flood the AI2 buffers.

In your Clock Timer, you should check

  Is the BlueTooth Client still Connected?
  Is Bytes Available > 0?
     IF Bytes Available > 0 THEN
       set message var  to BT.ReceiveText(-1) 

This takes advantage of a special case in the ReceiveText block:

Receive text from the connected Bluetooth device. If numberOfBytes is less than 0, read until a delimiter byte value is received.

If you are sending multiple data values per message separated by | or comma, have your message split into a local or global variable for inspection before trying to select list items from it. Test if (length of list(split list result) >= expected list length) before doing any select list item operations, to avoid taking a long walk on a short pier. This bulletproofing is necessary in case your sending device sneaks in some commentary messages with the data values.

Some people send temperature and humidity in separate messages with distinctive prefixes like "t:" (for temperature) and "h:" (for humidity).
(That's YAML format.)

The AI2 Charts component can recognize these and graph them. See Bluetooth Client Polling Rate - #12 by ABG

To receive YAML format messages, test if the incoming message contains ':' . If true, split it at ':' into a list variable, and find the prefix in item 1 and the value in item 2.

And here is a special value for screen initialization for that alarm start time...


That should be always in the future.

It took me some time to think of the simplest approach...

Init global last_safe_reading_ms to 0

Screen initialization:
Set last_safe_reading_ms to 2 * clock system time

After new reading arrived:
If reading is safe then
Set last_safe_reading_ms to clock system time
Else if (clock system time - last_safe_reading_ms) > 20000. Then
Alert the user

And here is the dramatic bomb squad approach ...

Add a Label lblCountdown with a countdown value in its .Text, initially 20.

Also add an extra clock, CountdownClock, repeating continually one per second.

Have CountdownClock.Timer check the last received reading for detection.

If detected, then
  set lblCountdown.Text to lblCountdown.Text - 1
  set lblCountdown.Text to 20
If lblCountdown.Text <= 0 then
  sound the alarm.

I didn't understand it well, but I'll try
thank you

"Object detection!" To vibrate when display is displayed for 20 seconds
Should I put it under the block"Object detection!" ?

First take care of the Delimiter to insure you are receiving exactly one number at a time.

Here is a simple BlueTooth text receiver sample, for single value per line:
initialize global message to

thanks you solved the problem :slight_smile: b

This topic was automatically closed 7 days after the last reply. New replies are no longer allowed.