I have been having trouble creating an app to read the values from two potentiometers on my teensy board. It seems like this has been discussed a lot but the answers don’t seem that clear to me.
I attached the blocks that I have so far. These seem to work for reading the value of one potentiometer just fine. Trying to map this to two sensors is were I keep running into issues. I know that I probably should create a list but so far I haven’t had any luck with that approach. Any hits or direction to other posts would be appreciated thank you.
Right Click in Blocks Editor and select “Download Blocks as Image”
for the best image of your blocks.
Also post your transmit code.
Be aware that every time you do a BlueTooth Receive block, you get the next incoming datum, so remember to examine the global variable that caught the datum instead of blindly wasting it by asking for the next datum.
I see from your screen shots you are using an IDE for Arduino with your teensy board.
There exist JSON libraries like https://arduinojson.org/ that can packup your potentiometer readings into a JSON string and send it as text thru your BlueTooth output.
JSON is perfect for sending multiple readings in the same message. All the readings are labelled and in readable text.
The AI2 web component has blocks that can take a text from your BlueTooth Text input and decode the passed data.
AI2 also has dict blocks that can extract values by name from decoded JSON-based dictionaries.
Please see the Delimiter article in FAQ
Be sure to use println() at the end of each message to send from the sending device, to signal end of message. Do not rely on timing for this, which is unreliable.
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:
ReceiveText(numberOfBytes)
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 Comma Separated Values and not JSON)...
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.
There is no need for you to use stone knives to format your data for transmission.
Thank you for all of the help. I changed my blocks accordingly but I think there may be something wrong with my arduino code. I understand that you have to use the .println command but do you also need to use the .write command as well?
Okay. I’m still trying to work through what could be wrong with my code. If I’m understanding the logic correctly my arduino code is printing to the serial monitor two values which are separated by a “|”. These values are type int. Looking at my blocks in app inventor when I open the screen it enables the clock. It then checks if the bluetooth device is connected and if there are bytes available to receive. I then have the receive text which should be receiving my int as text since I am using serial.println in arduino. But my values still aren’t appearing in the screen. Could this issue maybe be because I don’t have a delay in my code?
In your Clock Timer event, you immediately clear the global variables text and list each cycle, making it impossible to see their contents directly.
Here is a logging technique you can use to show the incoming text when it arrives, in an inactive multiline textbox…
Also, I see you set
Serial.begin(9600)
MyBT.begin(9600)
but you do not refer to MyBT after that in your loops.
Where does Serial.print() go, and
where would MyBT.print() go, if you were to use that?
Thank you so much for your help I was able to get it to work!
The trick was exactly your point I never referred to MyBT again. changing Serial.print to MyBT.print and commenting out everything that referred to Serial. seemed to work.