A p5.js library for using the Web Serial API to access devices like Arduino, no setup required.
This library is a wrapper for the Web Serial API, which enables you to communicate with devices like Arduino without having to run a local server!
The Web Serial API is available on all desktop platforms (Chrome OS, Linux, macOS, and Windows) in Chrome 89. More about compatibliity can be found here.
To use this library, create a new p5.js sketch and import the library in the index.html
file.
You can download p5.web-serial.js
and use it directly in your code:
<script language="javascript" type="text/javascript" src="p5.web-serial.js"></script>
Or, you can also use a CDN link available via jsdelivr:
<script language="javascript" type="text/javascript" src="https://cdn.jsdelivr.net/gh/ongzzzzzz/p5.web-serial/lib/p5.web-serial.js"></script>
After importing the library, head over to your script.js
file, and make sure the setup()
function looks like:
let port, reader, writer;
async function setup() {
createCanvas(windowWidth, windowHeight);
// additional code here...
noLoop();
({ port, reader, writer } = await getPort());
loop();
}
Note the async
keyword, definitions of port, reader, writer
and the noLoop()
and loop()
function calls.
Check out the examples folder for more details.
make sure to put \n
at the end of every writer.write()
! (so arduino can know where it needs to read until)
async function draw() {
if (port) {
try {
if (mouseIsPressed) {
// do something...
await writer.write("clicked!\n");
}
else {
// do something...
await writer.write("not clicked!\n");
}
} catch (e) { console.error(e) }
}
}
void loop() {
val = "";
if (Serial.available()) {
val = Serial.readStringUntil('\n');
val.trim();
}
if (val == "clicked!") digitalWrite(ledPin, HIGH);
else if (val == "not clicked!") digitalWrite(ledPin, LOW);
}
reading data on the p5js side is a little uhhhh messy (lol) for now, but it works!
async function draw() {
try {
while (true) {
const { value, done } = await reader.read();
if (done) {
// Allow the serial port to be closed later.
reader.releaseLock();
break;
}
if (value == "69420") {
// do something...
console.log("nice");
}
}
} catch (e) { console.error(e) }
}
remember to use Serial.println()
and not Serial.print()
- this is to let the browser know where it needs to read until!
void loop() {
if (digitalRead(buttonPin) == LOW) {
Serial.println("69420");
delay(150);
}
}
Report issues in the issues tab :3
just open a pull request :D free labour contributions always welcome!