Develop an open source simple smart watch with companion smart phone app that can be used by others to make their own
To make the experience fit your profile, pick a username and tell us what interests you.
We found and based on your interests.
20240812_221504.jpgAdafruit Feather nrf52840, two buttons, SSD1327 displayJPEG Image - 1.07 MB - 08/13/2024 at 05:05 |
|
|
Just wanted to add an apology for no updates for a few weeks. As many people would know, having a side project can sometimes take a back seat to other life events, and such is the case this time. However, this project is still on my mental to-do list, so no worries there.
The last work I did on the project successfully transmitted the phone's time to the watch, so there's been progress. I just likely haven't wrapped it up in a nice bow and published it.
I got the new ST7789 display with the microSD drive working! It was roughly the same code as the SSD1327 with the same pin assignments, including setting -1 for the reset pin.
https://www.adafruit.com/product/3787
One odd bit was that the display has much more resolution than the previous one. Since my display shows up on 1/4 of the screen, I'd say the resolution is 4 times as dense, but I could be wrong.
It's been slow making progress, mostly since I have other side projects that I am pursuing, but I did at least migrate over to the new display. This sets up using the microSD for memory storage later.
One tricky bit will be keeping time going with the watch while not connected.
My first thought was "OK, we need a small battery to keep the time ticking", but perhaps we can use a very small bit of power from a battery to keep things running, even if the watch itself doesn't have enough battery power to run.
Lots of stuff to do, but should be fairly simple to do each one.
Current tasks
Future tasks
Side note: I tend to think in lists like this, probably from my programming background, but it works well when presenting information in an easy-to-organize way
It took a ludicrously long time to finally get to a consensus between my device and my React Native app, but I finally sent meaningful data from the app to the device and it was received correctly.
On the device, I used the BLEDevice library among other things, and utilized the Arduino example for BLE -> Write.
However, I was left with an issue: how exactly do I send data over to the device from an app? I wanted to stay in React Native if possible.
The react-native-ble-plx library was what I was using, and I managed to get to the point where it was the Profile.Service.Characteristic I had to write to. But that still left the matter of how to package the data and send it.
const sendData = (str) => {
// THIS IS THE MAGIC SAUCE THAT ENABLES A STRING TO BE SENT TO ARDUINO ESP32 WITH BLE USING BLEDEVICE LIBRARY
const myBuffer = Buffer.from(str).toString("base64");
connectedDevice
.writeCharacteristicWithResponseForService(
SERVICE_UUID,
CHARACTERISTIC_UUID,
myBuffer,
)
.catch((e) => {
console.log("Failed to sendData", JSON.stringify(e));
});
};
As you can see, the code to write to the characteristic was fairly boilerplate, but I didn't know how to send the string to the device so that it would come out decipherable on the other end.
After an agonizing 12 hours or so of research and trial and error, I went from "Buffer.from(str)" to "Buffer.from(str).toString("base64"), and it went over cleanly.
There is a bit of a glitch where if the device doesn't initialize properly, it will throw an error on the app side, but after resetting, it seemed to work without issue.
Here are the repositories for the app and the watch. It's mostly copy and paste code anyway, so I certainly don't mind sharing.
I will need to update my objectives, but this was a huge blocker that I finally managed to clear.
I hate to make it sound more grandiose than it is, but imagine first being able to send data over a network, before the Internet. It kinda felt like that.
I've had a LOT of difficulty bridging the gap between React Native BLE PLX library and the NRF52840 board in terms of sending data from a phone app to the board.
After a bunch of looking around, it looks like I'll have more luck finding examples for an ESP32 based board, such as this awesome writeup: https://www.cjoshmartin.com/blog/bluetooth-low-energy-ble-with-react-native-and-arduino
I'm going to try to set up a "characteristic" that I can then "write" to so that I can send a packet of information to the device.
And while I'm not sure, it looks like the timer I had running on it previously with no issues stops after 2 seconds on the Adafruit ESP32-S3 board.
I will update when I have news!
I've made some progress on the companion app thanks to this nice tutorial from expo that I've linked before: https://expo.dev/blog/how-to-build-a-bluetooth-low-energy-powered-expo-app
It provides not only the finished code for the tutorial, but some started code to follow along as well.
Strictly speaking (not sure if that's the right phrase), this tutorial is very similar to what I'm trying to accomplish with this project: a way for people to start with an idea for a Bluetooth smart device that connects to a phone app.
I also added an objective for myself to receive data from the watch. In terms of an open source project someone can pick up and run with, this would be a good thing to have available as a starting point.
I am back to using Expo and React Native, for three reasons: 1) Expo is an easier way for me to generate apps for both Android and iOS, 2) I'm familiar with React and React Native, and 3) I actually got an app to work, and there may be hope yet.
I had success getting a sample project to work with this post: https://blog.theodo.com/2023/07/ble-integration-for-rn-apps/
Long story short, I did not use EAS to make a package then use on my phone, I used USB debugging. It didn't QUITE do what I wanted, but 1) it didn't crash and 2) once I manually turned on bluetooth on my phone, it popped up the bluetooth selection menu. I also had to use Node 16 due to this setup using an outdated SSL setup.
I also found this blog post on the Expo web site I'm going to try to get working: https://expo.dev/blog/how-to-build-a-bluetooth-low-energy-powered-expo-app
The main goal is to make an Android app (for now) that connects via bluetooth to my homemade smart watch.
I had trouble getting a Bluetooth app to work with Expo going to Android, so I'm going to try making a native Android app. I figure it doesn't matter if I submit the app, so I don't need Expo's system to do that.
The main point is to make an app people can download and use, even if they have to build it and install it themselves.
To give an idea of what I'm trying to accomplish with this project, here are the epics I have thus far, and their completion rates
watch responds to bluetooth | 100% |
create and publicize code respository (both arduino and react native app) | 100% |
make a simple bluetooth app in react native that watch responds to (all mock data) | 25% |
functioning physical watch buttons | 20% |
send time to watch via bluetooth | 0% |
send display to watch via bluetooth | 0% |
receive data coming from watch | 0% |
full test of watch functionality | 0% |
compartmentalize watch code for easy add/removal of functions | 0% |
code cleanup and possible unit tests | 0% |
PROJECT COMPLETE |
Short update, I successfully copied some older Arduino code to connect the Feather board to the Adafruit bluetooth app, and the buttons on the controller (1 through 4) come through just fine, so it has basic bluetooth connectivity working.
I wanted to post a picture of it, but since the display wipes after the button is released AND I am holding the phone taking pictures, not doable.
The next challenge has two main parts
- Make a basic phone app with the ability to connect to the board
- Have that app send data that can be read by the board and acted on. For initial proof of concept, I will try to have it send the same data that the Adafruit app is sending, with a stream of "B4949" for "button 1 pressed", "B4948" for "button 1 released" and so on.
Note the use of ascii numbers for both the number of the button and the status of the button, with 48 being zero and 49 being one.
To some people reading this, this is very basic stuff, but it's a learning experience for me, and possibly for other people reading this very post.
Create an account to leave a comment. Already have an account? Log In.
Looks like there's a similar project here: https://hackaday.io/project/170205-rubble-watch
There are some Open Source projects that are kind of similar-ish. Healthy Pi Move comes to mind. Not the same, but similar. Could you take a look?
Become a member to follow this project and never miss any updates
There is also the ongoing Open Source ReflectionsOS project but that uses ESP32.